전체 글 280

WAS와 Web Server 차이

Web Server란웹 브라우저로부터 HTTP 요청을 받아 경로와 일치하는 정적 컨텐츠(file contents)를 Filesystem에서 읽어와 제공하는 프로그램이다.ex) Apache Server, Nginx정적 컨텐츠어느 사용자 요청이든 항상 동일한 컨텐츠를 말한다.ex) HTML, CSS, JS, Image Web Server의 기능정적 컨텐츠 요청 시 정적 컨텐츠를 제공한다.동적 컨텐츠 요청 시 Web Application Server(WAS)로 전단하여 WAS가 처리한 결과를 클라이언트에 전달한다.Web Application Server(WAS)란DB 조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 프로그램 동적 컨텐츠요청 인자에 따라 바뀔 수 있는 컨텐츠이다.ex)..

카테고리 없음 2024.06.06

Gradle이란

Gradle이란거의 모든 유형의 소프트웨어를 빌드할 수 있을 만큼 유연한 빌드 자동화 도구  빌드 자동화 도구소스코드를 컴파일하고 의존성을 추가해 실행 가능한 파일. jar,. war로 패키징을 해주어야 한다.즉 소스 코드를 실행 가능한 파일로 변환해 주는것을 빌드라고 한다. 빌드 도구는 코드를 실행 가능한 파일로 만들어주는 과정 및 라이브러리 관리, 테스팅 등을 자동화하여 수행한다. 빌드 도구를 사용하지 않을 때 문제점반복적인 작업을 수작업으로 진행해야 하므로 비효율적이다.라이브러리를 직접 다운로드 및 버전 업데이트를 해야한다.프로젝트의 의존성을 파악하기 어렵다.APACHE ANT기본적인 컴파일, 패키징, 배포 작업 수행 가능XML 기반의 스크립트 사용작성에 정해진 규칙이 없어 유연성을 가짐라이브러리 ..

카테고리 없음 2024.06.03

[백준] 바이러스 공격 31791번 우선순위 큐 (python)

출처 : https://www.acmicpc.net/problem/31791풀이 방법일반적인 bfs 문제에서 퍼질 수 있는 시간이 정해진 문제이다.바이러스의 시간이 많은 것부터 처리하기 위해 map heap의 우선순위 큐를 사용했다. 그러기 위해 남은 시간을 음수로 하여 저장했다.그 후 시간이 많이 남은 바이러스 부터 전파를 시작해 빈 곳이면 시간 - 1을 우선순위 큐에 넣어주고만약 건물이라면 남은 바이러스 시간 - 건물 전파시간 - 1을 해주어서 이 수가 만약 양수이면 건물이 감염된 것이고 음수이면 건물이 감염이 안 된 것으로 처리했다. 그 후 계산한 값을 우선순위 큐에 넣어주었다. bfs를 탐색하며 우선순위 큐에서 값을 꺼내어 남은 시간이 양수이면 전파를 시작했고 0 이하라면 전파를 멈췄다.   전체..

Algorithm 2024.06.03

Spring Security, JWT를 이용한 인증/인가

스프링 시큐리티 프레임워크와 JWT를 이용해서 인증/인가를 구현해 보자.버전 및 의존성Spring Boot 3.2.5Security 6.2.4LombokSpring Data JPA = MySQLCradle - GroovyintelliJ UltimateJWT 0.12.3먼저 위해 SecurityConfig 파일을 작성해야 한다.  @Configuration@EnableWebSecurity // 시큐리티를 위한 config라는 걸 위해public class SecurityConfig { //AuthenticationManager가 인자로 받을 AuthenticationConfiguraion 객체 생성자 주입 private final AuthenticationConfiguration authenti..

[백준] 집합의 표현(유니온 파인드) 1717번 (python)

출처 : https://www.acmicpc.net/problem/1717풀이 방법일반적인 유니온 파인드 문제로 해결할 수 있다. 실수한 부분문제를 풀 때 union 함수에서 큰 실수를 했다.def union(a, b): temp1 = min(find(a), find(b)) parents[a], parents[b] = temp1, temp1위와 같은 실수를 했는데 코드를 자세하게 보면 a와 b의 부모를 찾아 작은 부모로 모두 바꾸어 주었는데이렇게 코드를 작성하게 된다면 인덱스가 큰 부모를 갖는 원소가 작은 부모를 갖는 원소의 부모로 교체되며 원래 자신의 부모와는 연결이 끊기게 되는 문제가 발생한다. 그래서 아래와 같이 코드를 수정했다. def union(a, b): a = fin..

Algorithm 2024.05.25

[자바] Reflection

Reflecti의 어원reflect은 반사하다, 비추다는 의미를 가지고 있다. 이를 객체지향에서의 관점에서 보면 예를 들어 강아지를 클래스 거울에 속에 비친 강아지를 JVM 메모리 영역의 정보라고 볼 수 있다.즉 강아지를 직접 조작하는 것이 아니라 거울에 비친 강아지의 모습을 보고 클래스를 검사하고 조작하는 기술이라고 볼 수 있다. reflect의 정의런타임에 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능 런타임: 컴파일된 코드를 실행시키며 외부 링크와 운영체제 사용자와 상호작용하는 단계 리플랙션의 동작 원리 JAVA source(.java)코드를 Java Compiler가 컴파일하면. class파일인 (Java Byte Code)가 된다. 이를 Class Loader가 Runtime Data ..

자바 2024.05.23

[백준] 가장 긴 증가하는 부분 수열 2 12015번 (python)

출처 : https://www.acmicpc.net/problem/12015 풀이 방법LIS 알고리즘 중 binary search를 이용한 방법으로 풀이하면 된다. LIS의 binary search가 기존의 binary search와 다른 점은 기존의 binary search는 특정 값을 찾아야 하지만 LIS에서의 binary search는 특정 값을 찾는 거뿐만 아니라 찾아야 하는 값이 없다면 자신보다 작은 수 중에 가장 큰 수의 인덱스에 +1 한 인덱스를 찾아주어야 한다.  def binary(num): left = 0 right = len(temp)-1 mid = 0 while (left  위의 binary search 코드처럼 해당 값이 존재한다면 해당 값의 idx를..

Algorithm 2024.05.20

enum 타입(key-value)의 Json 반환, 객체를 Json 직렬화

개요프로젝트에서 enum 타입을 key-value로 사용하고 있었다. 이를 원하는 Json형식으로 변경하는 과정을 담으려고 한다. 본문프로젝트에서 지하철 라인을 enum 타입으로 관리하고 있었다.public enum SubwayLine { LINE_1("1호선"), LINE_2("2호선"), LINE_3("3호선"), LINE_4("4호선"), DONGHAE("동해선"), GIMHAE_LIGHT_RAIL("부산김해경전철"); private String lineName; 지하철 라인을 담은 Dto를 아래와 같이 작성했다고 가정하자.public class TestDto { private Long id; private String name; ..

스프링 2024.05.17

@Profile("local") 사용

개요embedded redis를 사용하기 위해 local환경에서는 embeddedRedisConfig클래스를 @Configuration으로 등록해 주어야 하 할 일이 생겼다. 이를 local환경에서만 등록되도록 설정해 보자 Profile보통 애플리케이션은 여러 환경에서 실행될 수 있다. 예를 들어 개발, 테스트, 운영 등의 환경이 있을 수 있다. 각 환경마다 필요한 설정이나 빈들이 달라질 수 있다. @Profile 어노테이션은 이러한 환경에 따라 다른 설정을 제공할 때 사용된다. @Profile("local")@Configurationpublic class EmbeddedRedisConfig {위 코드와 같이 클래스 위에 Profile 어노테이션을 추가해 준다.그 후 application.properti..

스프링 2024.05.09

[백준] 평범한 배낭 12865번 DP (python)

출처 : https://www.acmicpc.net/problem/12865풀이 방법일반적인 냅색 문제로 DP를 이용해서 풀이할 수 있다.하지만 문제를 풀이할 때 엄청난 실수를 했다.top-down 방식을 사용했는데 이를 잘 못 적용한 것이다.DP의 핵심은 문제를 분리할 때 서로 영향을 받지 않아야 한다. 하지만 처음 코드는 서로가 영향을 받는 코드를 작성했다.  N, K = map(int, input().split())arr = [[0, 0] for _ in range(N)]dp = [[-1 for _ in range(100001)] for _ in range(N) ]for i in range(N): arr[i][0], arr[i][1] = map(int, input().split())def ka..

Algorithm 2024.04.28