hstory0208의 등록된 링크

키자드에 등록된 총 346개의 포스트를 확인하실 수 있습니다.

Tistory

[Spring] 스프링부트 엑츄에이터(Actuator)란?

엑츄에이터란? 서비스를 운영하면서 장애는 언제든지 발생할 수 있지만, 이 장애를 잘 대응하는 것이 중요하다. 서비스에 문제가 없는지 모니터링하고 지표들을 심어서 감시하여 장애에 대응할 수 있다. 운영 환경에서 서비스할 때 필요한 이런 기능들을 프로덕션 준비 기능이라 한다. 프로덕션 준비 기능을 통해 애플리케이션이 현재 살아있는지, 로그 정보는 정상 설정 되었는지, 커넥션 풀은 얼마나 사용되고 있는지 등을 확인하여 장애 발생에 미리 대응할 수 있어야 한다. 스프링 부트가 제공하는 액츄에이터는 이런 프로덕션 준비 기능을 매우 편리하게 사용할 수 있는 다양한 편의 기능들을 제공한다. 더 나아가서 마이크로미터, 프로메테우스, 그라파나 같은 최근 유행하는 모니터링 시스템과 매우 쉽게 연동할 수 있는 기능도 제공한..

Tistory

[Spring] 마이크로미터(Micrometer)와 메트릭(Matric) 확인

마이크로미터란? 서비스를 운영할 때는 애플리케이션의 CPU, 메모리, 커넥션 사용, 고객 요청수 같은 수 많은 지표들을 확인하는 것이 필요하다. 그래야 어디에 어떤 문제가 발생했는지 사전에 대응도 할 수 있고, 실제 문제가 발생해도 원인을 빠르게 파악해서 대처할 수 있다. 모니터링 툴은 시스템의 다양한 정보를 받아 우리가 모니터링할 수 있도록 도와준다. 모니터링 툴이 작동하려면 시스템의 다양한 지표들을 각각의 모니터링 툴에 맞도록 만들어서 보내주어야 하는데, 모니터링 툴마다 정해진 포멧방식이 다 다르다. 만약 기존에 사용하던 모니터링 툴에서 모니터링 툴을 변경하면 기존에 측정했던 코드를 모두 변경한 툴에 맞도록 다시 변경해야 하는 번거로움이 발생한다. 이런 문제를 해결하는 것이 바로 마이크로미터라(Mic..

Tistory

[Prometheus/Spring] 프로메테우스와 스프링 연결

프로메테우스와 스프링 연결하기 애플리케이션 설정 스프링의 마이크로미터가 프로메테우스가 사용하는 포멧에 맞추어 메트릭을 만들어 준다. 각각의 메트릭들은 내부에서 마이크로미터 표준 방식으로 측정되고 있기 때문에 우리는 어떤 구현체를 사용할지 지정만 해주면 된다. build.gradle에 다음 내용 추가 마이크로미터 프로메테우스 구현 라이브러리를 추가하여 어떤 구현체를 사용할지 지정해준다. 이러면 스프링 부트와 액츄에이터가 자동으로 마이크로미터 프로메테우스 구현체를 등록해서 동작하도록 설정해준다. implementation 'org.springframework.boot:spring-boot-starter-actuator' // 엑츄에이터 implementation 'io.micrometer:micrometer..

Tistory

[Grafana] 그라파나 설치 방법 (Window)

1. 아래의 링크로 접속해 그라파나 다운로드 페이지로 이동한다. Download Grafana | Grafana Labs Overview of how to download and install different versions of Grafana on different operating systems. grafana.com 2. 자신에게 맞는 운영체제를 클릭하여 다운로드한다. 3. 보안상 아래와 같은 문구가 뜰것이다. 추가 정보를 클릭한 뒤 실행을 클릭한다. 4. 실행이 된다면 그라파나 다운로드 exe가 실행되는데 next로 넘어간 뒤 install을 클릭하여 설치한다. 5. 이제 모든 설치가 완료되었다. 그라파나 서버 주소로 들어간다. http://localhost:3000 ID와 Password에 "..

Tistory

[Grafana] 그라파나 - 프로메테우스 연동 방법

그라파나는 프로메테우스를 통해서 데이터를 조회하고 보여주는 역할을 한다. 그렇기 때문에 먼저 프로메테우스가 실행되어 있어야 한다. 1. 그라파나 대쉬보드로 이동한다. http://localhost:3000 대쉬보드 왼쪽 삼선줄을 클릭하면 Connections항목이 보인다. 이것을 클릭한다. 2. Data sources 카테고리를 클릭후 Add Data source를 클릭한다. 3. 프로메테우스를 검색하여 클릭한다. 4. 그러면 다음과 같은 설정화면이 나오게 되는데 URL 부분에 프로메테우스의 주소인 http://localhost:9090을 입력한다. 그리고 맨 밑의하여 저장한다. 5. 맨 아래의 Save & test를 클릭하여 다음과 같은 문구가 나온다면 연동에 성공한 것이다.

Tistory

[Python/파이썬] 백준 7562 - 나이트의 이동

문제 설명 입출력 예제 풀이 코드 전형적인 bfs (너비 우선 탐색) 문제 이지만 딱 한가지 다른점이 있다. 바로 이동방향이다. 문제의 이동 방향을 보면 실제 체스의 나이트가 이동할 수 있는 것 처럼 대각선으로 2칸씩 8방향으로 움직인다. 나이트의 이동방향을 표현하면 다음과 같이 표현할 수 있다. 정답 코드 from collections import deque import sys input = sys.stdin.readline dx = [1, 1, 2, 2, -1, -1, -2, -2] dy = [-2, 2, -1, 1, -2, 2, -1, 1] def bfs(x, y): q = deque() q.append((x, y)) while q: x, y = q.popleft() if x == ex and y ..

Tistory

[Prometheus] 프로메테우스 설치하기 (Window 설치)

아래의 프로메테우스 다운로드 링크에 접속 Download | Prometheus An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach. prometheus.io 1. OS에 맞는 파일을 클릭하여 다운로드 받는다. (Mac은 drawin) 2. 다운로드 받은 압출 폴더를 압축 해제하고 해당 폴더에 들어가 prometheus.exe를 실행 3. 그러면 다음과 같은 화면이 나올 것이다. 추가 정보를 클릭 한뒤, 실행을 클릭한다. 4. 실행이되면 아래와 같은 cmd 창이 뜨게 된다. 5. 위의 cmd ..

Tistory

[Prometheus] 프로메테우스란? 사용방법

프로메테우스란? 애플리케이션에서 발생한 메트릭(지표)을 그 순간만 확인하는 것이 아니라 과거 이력까지 함께 확인하려면 메트릭을 보관하는 DB가 필요하다. 프로메테우스가 바로 이러한 메트릭을 지속해서 수집하고 저장하는 DB 역할을 담당한다. 프로메테우스의 기능 아래는 프로메테우스의 검색창에 http_server_requests_seconds_count (특정 URI의 HTTP 요청 수)를 입력해 실행한 결과이다. 보면 각 URL의 요청 마다 끝에 얼마의 요청이 왔는지 분리가 되어있다. 그리고 마이크로미터에서 메트릭 정보를 구분하는 태그를 프로메테우스에는 레이블(Lable)이라고 한다. 이 결과에서 해당하는 레이블을 보면 "error , exception , instance , job , method , o..

Tistory

YAML이란? (JSON, XML과 비교)

XML과 JSON 기존에는 XML, JSON 파일 포맷으로 데이터를 저장하고 주고 받는데 했었다. 하지만 이 두 파일 포맷은 정해진 포맷 규칙 때문에 데이터가 많아진다면 작성하기가 번거롭고 읽기가 힘들다는 불편함이 있다. 다음은 같은 데이터를 XML과 JSON로 작성하여 비교해본 것 이다. 물론 JSON이 XML의 태그 문법같은 불편함을 해소하고자 나온 파일 포맷이라 XML보다는 좀더 편리하지만 그래도 열고 닫는 괄호 {}, []들로 인해 불편함이 있다. YAML이란? YAML은 XML과 JSON이 사용하기 복잡하고 불편함 점을 해결하기 위해 2001년 Clark Evans에 의해 최초 제안되었다. 원래는 "YAML Ain't Markup Language" "마크업 언어가 아니다" 라는 뜻으로 불렸으며 ..

Tistory

[Spring] @ConfigurationProperties 사용법 (설정 값 바인딩)

@ConfigurationProperties *.properties , *.yml 파일에 있는 property를 자바 클래스에 값을 가져와서(바인딩) 사용할 수 있게 해주는 어노테이션이다. ConfigurationProperties 장점 외부 설정을 객체로 편리하게 변환해서 사용할 수 있다. 외부 설정의 계층을 객체로 편리하게 표현할 수 있다. 외부 설정을 타입 안전하게 사용할 수 있다. (타입 오류시 컴파일 오류로 확인할 수 있음) (Bean Validation) 검증기를 적용할 수 있다. 사용법 *.properties, *.yml 파일의 설정 값을 @Value 을 사용하여 바인딩할 수 있다. 만약 application.properties의 설정 값이 다음과 같다면 my.test.url=test.db...

Tistory

[Spring] @Profile - 각 환경마다 서로 다른 빈 등록

스프링에서 각 환경마다 서로 다른 설정 값을 사용하도록 "프로필" 기능을 지원한다. 그런데 설정 값 뿐만 아니라 각 환경마다 서로 다른 빈을 등록해야할 경우가 있을 수도 있다. 예를 들어서 결제 기능을 붙여야 하는데, 로컬 개발 환경에서는 실제 결제가 발생하면 문제가 되니 가짜 결제 기능이 있는 스프링 빈을 등록하고 운영 환경에서는 실제 결제 기능을 제공하는 스프링 빈을 등록한다고 가정해보자. @Profile 을 사용하여 아래처럼 등록되는 스프링 빈도 분리할 수 있다. @Slf4j @Configuration public class PayConfig { @Bean @Profile("default") // 기본값 프로필일 경우 이 빈이 등록 public LocalPayClient localPayClient(..

Tistory

[Python/파이썬] 백준 14502 연구소 - (BFS + 백트래킹)

문제 설명 입력과 출력 입출력 예제 풀이 코드 풀이 핵심 벽의 개수가 3개를 설치한 모든 2차원 배열(경우의 수)를 구한다. 3개의 벽이 설치된 2차원 배열마다 bfs()로 탐색하여 가장 큰 안전지대 개수로 갱신한다. 정답 코드 pypy3로 제출하여야 시간초과 없이 통과 from collections import deque import sys import copy input = sys.stdin.readline n, m = map(int, input().split()) # 행, 열 virus_map = [list(map(int, input().split())) for _ in range(n)] result = 0 dx = [1, -1, 0, 0] dy = [0, 0, -1, 1] # 백트래킹으로 3개의 ..

Tistory

[Python/파이썬] 백준 7569 - 토마토

문제 설명 입출력 예제 풀이 코드 이 문제는 이전의 7576번 토마토 문제와 유사하지만 3차원 배열을 사용한다는 점이 다르다. [Python/파이썬] 백준 7576 - 토마토 문제 설명 입출력 예제 풀이 코드 처음에는 시작지점의 인덱스 값을 bfs(x, y) 이런식으로 넘겨 탐색하도록 했지만 "예제 입력3"번 케이스에서만 계속 전혀 다른값이 나왔다. 이유는 다음과 같았다 hstory0208.tistory.com 3차원 배열을 사용한다는 점과, 6방향(앞,뒤,상,하,좌,우)로 움직인다는 점에 유의하자 정답 코드 from collections import deque import sys input = sys.stdin.readline m, n, h = map(int, input().split()) # 열, 행..

Tistory

[Spring] 스프링에서 YAML(application.yml) 설정 파일 사용

YAML이란? YAML이란? (JSON, XML과 비교) XML과 JSON 기존에는 XML, JSON 파일 포맷으로 데이터를 저장하고 주고 받는데 했었다. 하지만 이 두 파일 포맷은 정해진 포맷 규칙 때문에 데이터가 많아진다면 작성하기가 번거롭고 읽기가 힘들다 hstory0208.tistory.com application.yml 스프링은 설정 데이터를 사용할 때 application.properties 뿐만 아니라 application.yml 이라는 형식도 지원한다. application.properties에 다음과 같은 옵션 설정이 있을 때 YAML로 변환하면 다음과 같다. 주의할점 application.properties , application.yml 을 같이 사용하면 application.prop..

Tistory

[Spring] 배포 환경 별로 설정파일 분리하기 (프로필)

개발환경과 운영환경의 설정 분리 하나의 애플리케이션을 여러 다른 환경에서 사용해야 할 때가 있다. 예를 들어 개발환경과 운영환경이 필요할 경우 어플리케이션이 개발환경 DB에 접근하는 설정 정보와, 운영환경 DB에 접근하는 설정 정보가 다르다. 이를 해결 하기 위한 방법으로 하나의 내부 설정 파일 "application.properties"에서 스프링이 지원하는 "프로필"으로 각 환경 별 설정을 작성하여 관리 할 수 있다. application.properties spring.config.activate.on-profile=dev url=dev.db.com my_username=dev_user password=dev_pw #--- spring.config.activate.on-profile=prod url..

Tistory

[Python/파이썬] 백준 7576 - 토마토

문제 설명 입출력 예제 풀이 코드 처음에는 시작지점의 인덱스 값을 bfs(x, y) 이런식으로 넘겨 탐색하도록 했지만 "예제 입력3"번 케이스에서만 계속 전혀 다른값이 나왔다. 이유는 다음과 같았다. field[x][y]의 값이 1일 때 bfs(x,y)를 시작해 한칸씩 이동하는데, 예제 입력3번 케이스는 시작점이 2개이기 때문에 첫 번째 시작지점 탐색을 시작 할 때 field의 값을 +1씩 추가하고, 또 두번 째 시작지점에서도 bfs(x,y)를 시작해 field의 값을 +1 씩 추가하게 되어서 발생하는 문제였다. 이 부분을 해결하기 위해서는 queue의 특징을 이용해서 걍 시작점마다 한번씩 벌어가면서 탐색하도록 해야하는데 그러기 위해서는 시작점에 해당할 경우 먼저 queue에 시작점을 다 추가해놓고, 그..

Tistory

[Python/파이썬] 백준 1068 - 트리

문제 설명 입력과 출력 입출력 예제 # 입력 5 -1 0 0 1 1 2 # 출력 2 풀이 코드 정답 코드 import sys input = sys.stdin.readline n = int(input()) tree = list(map(int, input().split())) delete = int(input()) def dfs(del_node): tree[del_node] = -10 # 의미없는 숫자를 부여해 제거함을 의미 for i in range(n): if del_node == tree[i]: # tree[i]가 del_node의 자식이면 재귀를 통해 삭제 dfs(i) dfs(delete) cnt = 0 for i in range(n): if tree[i] != -10 and i not in tree..

Tistory

[Python/파이썬] 백준 1167 - 트리의 지름 (DFS / BFS)

문제 설명 입출력 예제 # 입력 5 1 3 2 -1 2 4 4 -1 3 1 2 4 3 -1 4 2 4 3 3 5 6 -1 5 4 6 -1 # 출력 11 풀이 코드 이전 포스팅한 백준 1967 트리의 지름 문제와 별 차이가 없습니다. 주어진 입력값으로 그래프를 초기화하는 방법만 다를 뿐입니다. 트리의 지름을 구하는 방법은 다음과 같습니다. 1. 시작 정점에서 임의의 정점까지의 거리를 구하여 가장 먼 거리를 구합니다. 2. 1에서 찾은 가장 먼 거리를 시작 지점으로 하여 다시 한번 가장 긴 거리를 찾습니다. 정답 코드 (DFS) import sys input = sys.stdin.readline sys.setrecursionlimit(10 ** 9) V = int(input()) graph = [[] for..

Tistory

[Spring] 특정상황에 스프링 AOP 적용하기

Spring AOP를 이용하여 특정상황에 AOP를 적용할 수 있습니다. 이번 포스팅에서 설명할 내용은 다음과 같습니다. ---------------------------------------------------------- 직접 만든 @Trace 어노테이션이 붙은 메소드에 AOP 적용하기 예외가 발생했을 경우 재시도를 하는 AOP 적용하기 메소드의 실행시간이 일정 시간을 초과했을 경우 AOP 적용하기 @Trace 어노테이션이 붙은 메소드에 AOP 적용 먼저 직접 만든 @Trace 어노테이션이 붙은 메소드에 AOP 적용하는 방법을 알아 보겠습니다. 1. @Trace 어노테이션을 생성합니다. @Trace 어노테이션 package hello.aop.exam.annotation; ... @Target(Elem..

Tistory

[Spring] 스프링 AOP 주의사항 - 프록시 내부호출

스프링은 프록시 방식의 AOP를 사용합니다. 스프링 AOP를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록하고, 스프링은 의존관계 주입시에 항상 프록시 객체를 주입합니다. 프록시 객체가 주입되기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생하지 않지만 대상 객체의 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생하게 됩니다. 어떤 문제가 발생하는지 간단한 예시를 통해 알아보겠습니다. CallService에서 external() 메서드를 호출하는데 그 안에서 CallService 자기 자신의 메서드인 internal()을 호출하는 상황 package hello.aop.internalcall.aop; ... @Slf4j @Componen..

Tistory

[Spring] 스프링 AOP - Pointcut 표현식

AspectJ는 포인트컷을 편리하게 표현하기 위한 특별한 표현식을 제공합니다. 스프링에서는 포인트컷 표현식에서 사용하기 위해 AspectJ가 제공하는 포인트컷 지시자(Pointcut Designator) 줄여서 PCD를 지원합니다. 포인트컷 지시자의 종류 포인트컷 지시자는 아래와 같이 여러개가 있지만, 주로 execution을 자주 사용합니다. execution : 메소드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다. within : 특정 타입 내의 조인 포인트를 매칭한다. args : 인자가 주어진 타입의 인스턴스인 조인 포인트 this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 target : Target 객체(스프링 AOP 프록시..

Tistory

[Spring] 프록시 패턴과 데코레이터 패턴

프록시란 ? 우리가 일반적으로 클라이언트가 서버를 호출할 때는 아래와 같은 그림을 떠올립니다. 직접 호출의 경우에는 클라이언트가 서버를 직접 호출하고, 그 결과를 받습니다. 그런데 클라이언트가 요청한 결과를 서버에 직접 요청하는 것이 아닌 "대리자"를 통해 대신 간접적으로 서버에 요청을 할 수도 있습니다. 여기서 "대리자"의 역할을 하는 것은 프록시(Proxy)로, 클라이언트는 프록시를 통해 간접적으로 서버에 요청합니다. 이렇게만 보면 굳이 프록시를 중간에 둬서 요청을 해야하나 ? 라는 생각이 들 수 있는데 프록시를 중간에 둘 경우 여러 기능을 추가로 얻을 수 있습니다. 프록시의 주요 기능 접근 제어 권한에 따른 접근 차단 캐싱 지연 로딩 - 접근 제어의 캐싱 예시 철수가 메로나가 먹고 싶어 형한테 올 ..

Tistory

[Spring] 스프링 AOP(Aspect Oriented Programming)란? - @Aspect

AOP를 사용하지 않는다면 ? AOP에 대해 설명하기 전에 AOP를 사용하는 이유에 대해 먼저 알아 봅시다. 애플리케이션 로직은 크게 핵심 기능과 부가 기능으로 나눌 수 있습니다. 핵심 기능 : 해당 객체가 제공하는 고유의 기능 부가 기능 : 핵심 기능을 보조하기 위해 제공되는 기능 ( ex: 로그 추적 기능, 트랜잭션 기능 ) 보통 기존 프로젝트에 부가 기능을 추가하게 되면 하나의 클래스가 아닌 여러 클래스에 부가 기능을 추가하게 됩니다. 예를 들어서 프로젝트의 모든 클래스에 로그 기능을 추가 한다면 하나의 부가 기능(로그 추적)을 여러 곳에 동일하게 사용하게 됩니다. 이러한 부가 기능을 바로 횡단 관심사(cross-cutting concerns) 라고 합니다. 부가 기능 적용시 문제점 그런데 이러한 ..

Tistory

[Spring] 스프링 AOP (@Aspect) 사용법

스프링 AOP 적용법 스프링 AOP를 사용하기 위해서는 build.gradle에 아래의 라이브러리를 의존성 추가해줘야합니다. implementation 'org.springframework.boot:spring-boot-starter-aop' // aop 추가 스프링 AOP를 적용하기 위해서는 @Aspect 어노테이션을 사용합니다. @Slf4j @Aspect @Component public class AspectExample @Around("execution(* hello.aop.test..*(..))") // AspectJ 표현식 public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPo..

Tistory

IntelliJ (인텔리제이) Window 유용 단축키 모음

ctrl + O 오버라이딩 메서드 생성 alt + insert 생성자 및 여러 컨트롤 자동 생성 ctrl + alt + v 해당 메서드에 대한 반환 타입과 변수 자동 작성 ctrl + shift + T 해당 클래스의 경로와 똑같고 클래스이름 끝에 Test가 붙은 테스트 코드 생성 ctrl + alt + M 해당 부분 메서드 추출 ctrl + shift + Enter ; 자동 입력 작성중인 코드에; 를 붙여서 완성 후 다음 줄 ctrl + p 해당 메서드 파라미터 정보 보기 ctrl + e 최근 이용 파일 보기 ctrl + e 후에 enter를 입력하면 이전 파일로 이동 ctrl + alt + T 다음으로 둘러싸기. shift + F6 변수명 전체 변경. shift + F10 이전 실행 파일 재실행 F2 ..

Tistory

[Java/자바] 프로그래머스 Lv2 - 조이스틱 (Greedy/탐욕법)

문제 설명 Solution.java 정답 코드 class Solution { public int solution(String name) { int answer = 0; // 조이스틱 조작 횟수 int len = name.length(); int move = name.length() - 1; // 기본 최소 좌우이동 횟수 (좌, 우 커서) // 해당 커서 알파벳 변경 최솟값 (위, 아래 커서) for (int i = 0; i < len; i++) { answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1); // 연속된 'A'가 끝나는 지점 찾기 int next = i + 1; while(next < len && name.charAt(next)..

Tistory

[intellij] finished with non-zero exit value 1 오류

인텔리제이 실행 시 다음과 같은 오류를 만났습니다. 이 오류는 인텔리제이의 "빌드 및 실행" 환경의 설정이 Gradle로 되어 있을 시 위와 같은 오류가 발생한다고 합니다. 해결 방법은 아주 간단합니다. "빌드 및 실행"환경 설정을 IntelliJ IDEA로 변경해줍시다. 해결 방법 경로 : 파일 -> 설정 -> 빌드, 실행, 배포 -> 빌드 도구 -> Gradle

Tistory

[Spring] 스프링 인터셉터(Interceptor)

스프링 인터셉터(Interceptor)란? interceptor는 위 처럼 가로챈다는 뜻을 갖습니다. 즉, 스프링 interceptor란 요청을 가로채서 개발자가 원하는 동작을 추가하는 역할을 합니다. 왜 interceptor를 사용해야하는 가? 스프링 interceptor는 웹과 관련된 공통 관심사를 해결하기 위한 기술로 대표적으로 공통 로그 처리, 권한 체크에 사용될 수 있습니다. 권한 체크를 예를 들면, 로그인을 해야 이용할 수 있는 페이지는 비로그인 사용자가 이용할 수 없어야 합니다. interceptor를 이용해 요청을 받아 들이기 전, 세션에서 로그인한 사용자가 있는지 확인해보고 없다면 로그인 페이지로 redirect 시킬 수 있습니다. 스프링 인터셉터 구현하기 (HandlerIntercept..

Tistory

[Spring] DAO, DTO, VO란? 각각의 개념에 대해 알아보자.

DAO(Data Transfer Object) "실제로 DB의 데이터에 접근하는 객체" DAO는 Service와 DB를 연결하는 역할을 하며, 실제로 DB에 접근하여 data를 삽입, 삭제, 조회, 수정 등 CRUD 기능을 수행합니다. JPA에서는 DB에 데이터를 CRUD 하는 JpaRepository를 상속받는 Repository 객체들이 DAO라고 볼 수 있습니다. public interface itemRepository extends JpaRepository { } DTO(Data Access Object) "계층 간 데이터 교환을 위한 객체" 로직을 가지지 않고 getter/setter 메소드만 가진 순수한 데이터 객체 클래스(Java Beans)로 DB에서 데이터를 얻어 Service나 Cont..

Tistory

[Spring] 동시성 문제와 해결 (쓰레드 로컬)

동시성이란? 여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제를 동시성 문제라고 합니다. 이런 동시성 문제는 여러 쓰레드가 같은 인스턴스의 필드에 접근해야 하기 때문에 트래픽이 많을 때 자주 발생하게 됩니다. 특히 자바의 스프링은 기본적으로 스프링 빈을 싱글톤으로 등록하기 때문에 싱글톤 객체의 필드를 변경하며 사용할 때 이러한 동시성 문제를 조심해야 합니다. ( 동시성 문제는 값을 읽기만 하면 발생하지 않고, 값을 변경하기 때문에 발생 ) 동시성 문제는 쓰레드마다 각각 다른 메모리 영역이 할당 지역 변수에서는 발생하지 않고, 동시성 문제가 주로 발생하는 곳은 같은 인스턴스의 필드(주로 싱글톤에서 자주 발생) 접근, 또는 static 같은 공용 필드에 접근할 때 발생합니다. 동시성 ..

Tistory

[Spring] 스프링 부트 - 요청 타입변환(Converter), 포맷터(Formatter)

스프링 타입 컨버터(Converter) 웹 개발을 하다보면 문자를 숫자로 변환하거나, 숫자를 문자로 변환해야 하는 일이 상당히 많습니다. 특히, HTTP 요청 파라미터는 모두 문자로 처리되기 때문에 요청 파라미터를 자바에서 다른 타입으로 변환해서 사용하고 싶으면 다음과 같이 숫자 타입으로 변환하는 과정을 거쳐야 합니다. 그런데! 스프링의 요청 파라미터인 @RequestParam , @ModelAttribute , @PathVariable 어노테이션을 사용하면 스프링이 중간에 해당 요청 파라미터의 반환 타입을을 보고, 타입 변환기를 사용해서 타입을 변환해줍니다. public String hello(@RequestParam Integer data) { ... } (@RequestParam 요청 파라미터의 반..

Tistory

[Spring] 스프링에서 API 예외(오류) 처리하기 (@ExceptionHandler, @ControllerAdvice)

@ExceptionHandler 스프링은 API 예외 처리 문제를 해결하기 위해 @ExceptionHandler 라는 애노테이션을 사용하는 매우 편리한 예외 처리 기능을 제공합니다. 사용방법은, 잡을 예외를 파라미터로 갖는 메서드를 만들고 메서드 위에 @ExceptionHandler 애노테이션을 선언하여 사용합니다. 해당 컨트롤러에서 처리하고 싶은 예외를 지정해주면 해당 컨트롤러에서 예외가 발생할 경우 이 메서드가 호출됩니다. (발생한 예외를 잡으면 지정한 예외 또는 그 예외의 자식 클래스는 모두 잡습니다.) 에러 코드와 메세지를 갖는 객체 오류가 발생하면 단순하게 오류 코드와 메시지를 JSON 데이터로 보내는 단순한 구조를 갖는 예제로 설명하겠습니다. @Data @AllArgsConstructor pu..

Tistory

체크 예외(Exception)와 언체크 예외(RuntimeException)

자바 예외에 대해 예외 설 명 Object 예외도 객체다. 모든 객체의 최상위 부모는 Object 이므로 예외의 최상위 부모도 Object 이다. Throwable 최상위 예외. Throwable 하위에 Exception 과 Error 가 있다. Error 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외 (언체크 예외) 이미 처리가 불가능한 오류 이므로 이 오류를 잡으려 해서는 안된다. Exception 체크 예외 애플리케이션 로직에서 사용할 수 있는 실질적인 최상위 예외 Exception 과 그 하위 예외는 모두 컴파일러가 체크하는 체크 예외 RuntimeException 런타임 예외 컴파일러가 체크 하지 않는 언체크 예외 RuntimeException 과 그 자식..

Tistory

[Spring] @Transactional 옵션 알아보기 + 트랜잭션 전파

@Transactional에 대해 궁금하다면 아래 포스팅을 읽어보는 것을 추천드립니다. 트랜잭션이란? 특징과 사용법에 대해 쉽게 알아보자 트랜잭션(Transaction) 트랜잭션은 DB의 상태를 변경시키기 위해 수행하는 작업 단위입니다. 여기서 DB의 상태를 변경시킨다는 SELECT, UPDATE, INSERT, DELETE 와 같은 쿼리를 날려 연산을 수행하는 것입니 hstory0208.tistory.com 트랜잭션 전파 트랜잭션을 각각 사용하는 것이 아니라, 트랜잭션이 이미 진행중인데, 여기에 추가로 트랜잭션을 진행 시킬 수 있습니다. 이런 경우 어떻게 동작할지 결정하는 것을 트랜잭션 전파(propagation)라 합니다. 트랜잭션이 하나일 경우 먼저 트랜잭션이 하나 있을 경우를 봅시다. 트랜잭션 처..

Tistory

[Spring] 스프링에서 HTML 오류 페이지 처리하기

정적 오류 페이지를 보여주고 싶다면, resources/static 동적 오류 페이지를 보여주고 싶다면, 뷰 템플릿 경로인 resources/templates 둘 중 자기가 보여주고자 하는 경로에 /error 폴더를 만들어 이 error 폴더에 발생하는 HTTP 상태 코드 이름의 HTML파일을 만들어서 넣어두기만 하면 됩니다. 5xx, 4xx는 500번 대, 400번 대 오류를 처리 해주며, 구체적인 오류코드 (ex: 404, 500)이 있다면 이 구체적인 오류코드 이름의 페이지가 우선순위가 더 높습니다. Controller @Controller public class ErrorPageTestController { @GetMapping("/error-ex") public void errorEx() { t..

Tistory

프레임워크? 라이브러리? 쉽게 이해하기

프레임워크(Framwork) 이미 완성되어 있는 뼈대, 틀을 의미하며, 우리는 제공된 틀안에서 주어진 규칙을 지켜가며 사용합니다. 쉽게 예를 들면 우리가 성공해서 건물을 하나 올린다고 생각해봅시다. 건물으 세운다면 그저 우리가 원하는데로 막 지울 수 있는 것이 아니라 나라에서 정한 건축법에 따라 그 규칙에 맞게 지을 수 있습니다. Java의 Spring에서 규칙 하나를 예를 들면 정적 리소스는 resources/static 폴더에, 동적 리소스는 resources/template 폴더에 담는 규칙이 있죠. 우리는 이미 완성되어 있는 프레임워크를 정해진 규칙에 맞게 사용하여 필요한 기능을 직접 구현할 필요 없이 원하는 기능을 구현하는데 더 집중할 수 있습니다. 프레임워크 예 Java 서버 개발에 사용되는 ..

Tistory

SQL 예약어 매핑 오류 (SQL Error: 42001, SQLState: 42001)

@Entity @Getter @Setter public class Order { @Id @GeneratedValue private Long id; @Column private String username; @Column private String payStatus; } Order라는 Entity 객체를 매핑하여 테스트를 돌렸을 시 아래와 같은 오류가 발생했습니다. 알아보니 이러한 오류가 발생한 문제는 다음과 같습니다. 오류 원인 Hibernate 는 JPA 엔티티 클래스를 보고 데이터베이스 테이블을 자동 생성해 줍니다. 만약 엔티티 클래스의 이름이 Item 이라면 Item이라는 테이블을 생성해줍니다. 그런데 여기서 문제가 있습니다. 데이터베이스 키워드/예약어(ORDER, GROUP, SELECT, WHE..

Tistory

[Spring] 트랜잭션 AOP 주의 사항

프록시 방식의 AOP 한계 @Transactional 어노테이션을 사용하는 트랜잭션 AOP는 프록시를 사용하는데 이 프록시를 사용하면 메서드 내부 호출에 프록시를 적용할 수 없는 한계를 갖습니다. 어떠한 한계가 생기는지 자세히 알아보기 위해 먼저 스프링 컨테이너에서 트랜잭션 프록시가 등록되는 것을 그림으로 봅시다. 스프링 컨테이너에 트랜잭션 프록시 등록 @Transactional 애노테이션이 특정 클래스나 메서드에 하나라도 있으면 있으면 트랜잭션 AOP는 위 그림처럼 프록시를 만들어서 스프링 컨테이너에 등록합니다. 이 때, 실제 TxService 객체 대신에 프록시인 TxService$$CGLIB 를 스프링 빈에 등록합니다. 그리고 프록시는 내부에 실제 TxService 를 참조합니다. 여기서 핵심은 실..

Tistory

[JPA] JPA란 ? 그리고 Spring Data JPA

JPA(Java Persistent API)란 ? ORM (Object Relational Mapping) 객체 관계 매핑 기술의 표준으로 인터페이스의 모음입니다. 따라서 실제로 동작하는 것이 아니기 때문에 구현체가 필요한데, JPA 표준을 구현한 구현체는 아래와 같이 Hibernate, EclipseLink, DataNucleus가 있으며 대표적으로 Hibernate를 사용합니다. ORM 이란 ? ORM 기술은 말 그대로 객체와 관계형 데이터 베이스를 매핑해 주는 기술으로 객체는 객체대로 설계할 수 있고 관계형 데이터베이스는 관계형 데이터베이스대로 설계가 가능하도록 ORM 프레임워크가 중간에서 매핑을 해줍니다. JPA의 동작 과정 JPA는 JAVA 애플리케이션과 JDBC 사이에서 동작하는데 JAVA 애..

Tistory

[Python/파이썬] 프로그래머스 Lv2 - 우박수열 정적분

문제 설명 제한사항 입출력 예 Solution.py 초항 K가 5일 때 콜라츠 추측으로 계산하면 다음과 같은 수열이 나옵니다. [5, 16, 8, 4, 2, 1] 나온 수열 대로 그래프를 그려보면 아래와 같은 그림이 나옵니다. 여기서 각 꼭지점마다 선을 그어서 사다리꼴 사각형을 만들 수 있습니다. 여기서 기억나지 않는 사람들 위해 사다리꼴 사각형이란 무엇인지에 대해 설명하자면 평행한 변이 있는 사각형, 즉 마주 보는 한 쌍의 변이 서로 평행한 사각형을사다리꼴이라고 합니다. 이제 문제의 답을 구하기 위한 각 구간의 넓이를 구해야하는데 그림을 보면 사다리꼴 넓이로 구간의 넓이를 구할 수 있어 보입니다. 각 사다리골 사각형들의 넓이를 구해 구간의 넓이를 구해 봅시다. 사다리꼴 넓이는 ((윗변+아랫변) * 높이..

Tistory

[JPA] QueryDSL이란? 그리고 설정 방법

QueryDSL이란 ? SQL, JPQL 등을 코드로 작성할 수 있도록 해주는 프레임워크로 쿼리를 type-safe(컴파일시 에러 체크 가능)하게 Java 코드로 작성할 수 있습니다. QueryDSL은 동적 쿼리를 아주 편리하게 작성할 수 있어 복잡한 동적 쿼리를 사용해야 할 때 QueryDSL을 사용하고 단순한 경우에는 Spring Data JPA를 사용합니다. QueryDSL은 JPA가 제공하는 JPQL을 코드로 작성할 수 있도록 도와주는 빌더 역할을 하기 때문에 JPQL의 문법에 대한 이해가 필요합니다. SQL과 JPQL의 문제점 QueryDSL을 이해하기 전에 먼저 SQL과 JPQL의 문제점을 알아봅시다. # SQL String sql = "select id, item_name, price, qu..

Tistory

DB 락(Lock)과 Lock의 종류에 대해 알아보자.

우선 Lock에 대해 알아보기 전에 트랜잭션에 대한 이해가 필요하므로 트랜잭션에 대해 모른다면 아래 포스팅을 참고하시길 바랍니다. 트랜잭션이란? 특징과 사용법에 대해 쉽게 알아보자 트랜잭션(Transaction) 트랜잭션은 DB의 상태를 변경시키기 위해 수행하는 작업 단위입니다. 여기서 DB의 상태를 변경시킨다는 SELECT, UPDATE, INSERT, DELETE 와 같은 쿼리를 날려 연산을 수행하는 것입니 hstory0208.tistory.com 락(Lock)이란 ? 두 명의 사용자가 DB에 접근해 아래 처럼 2개의 DB 세션을 사용한다고 가정해봅시다. ( 여기서는 H2 DB 사용 ) 편의상 두 개의 세션을 나눠서 세션1, 세션2라고 부르겠습니다. 세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안..

Tistory

[Python/파이썬] 프로그래머스 Lv1 - 바탕화면 정리

문제 설명 제한사항 입출력 예 Solution.py 정답률이 낮은 문제이지만 생각보다 간단하게 풀 수 있습니다. 입출력 예제 2번 그림을 통해 설명해보겠습니다. 1. 첫 행부터 ~ 마지막 행에 있는 파일 중에 제일 처음 파일이 있는 행과 마지막에 파일이 있는 행을 찾아봅시다. 그러면 다음과 같이 표시 됩니다. 2. 첫 열부터 ~ 마지막 열에 있는 파일 중에 제일 처음 파일이 있는 열과 마지막에 파일이 있는 열을 찾아봅시다. 그러면 다음과 같이 표시 됩니다. 3. 표시된 파일을 사각형의 경계로 하여 사각형을 그려봅니다. 그러면 사각형은 다음과 같이 그릴 수 있습니다. 4. 이제 이 사각형의 시작 점 (1, 3 ) 끝나는 점(5, 8) 을 result로 반환하면 [1, 3, 5, 8] 이 됩니다. 이제 아래..

Tistory

[Python/파이썬] 프로그래머스 Lv1 - 달리기 경주

문제 설명 제한사항 입출력 예 Solution.py 이 문제를 풀기 위해 2개의 딕셔너리를 활용했는데 하나는 달리기 순위를 key로 갖고 선수 이름을 value로 갖는 rank_Dic 다른 하나는 선수 이름을 key로 갖고 달리기 순위를 value로 갖는 player_Dic 으로 만들었습니다. 두 개의 딕셔너리를 활용하는 이유는 아래의 코드를 보면 이해되겠지만, 순위가 변경될 때 서로의 value값을 참조하기 때문입니다. 서로의 value값을 참조하며 callings 배열에 있는 선수들 정보를 가지고 이름을 불린 선수와 그 선수의 앞에 있는 선수를 서로 변경하여 마지막으로 result 에 맞도록 rank_Dic의 value들을 반환합니다. 정답 코드 def solution(players, callings..

Tistory

java: warning: source release 17 requires target release 17

인텔리제이로 테스트 코드를 테스트 돌리던 와중 기존엔 발생하지 않던 에러가 갑자기 발생했습니다. java: warning: source release 17 requires target release 17 해당 에러는 설정만 조금 건들여주면 쉽게 해결 가능합니다. 참고로 제가 사용하고 있는 자바 버전은 JAVA 11 입니다. 오류 해결 1. "파일 -> 설정 -> 빌드, 실행, 배포 -> 컴파일러 -> Java 컴파일러" 경로로 들어갑니다. 2. 모듈당 바이트코드 버전: 밑에 + 버튼을 클릭해 현재 프로젝트를 선택하여 추가합니다. 3. 그 다음 대상 바이트코드 버전을 현재 사용하고 있는 JAVA 버전과 똑같이 설정하고 적용합니다. 버전과 관련된 호환성 체크 및 버전 정보 설정 만약 새 JAVA 버전을 다운..

Tistory

트랜잭션이란? 특징과 사용법에 대해 쉽게 알아보자

트랜잭션(Transaction) 트랜잭션은 DB의 상태를 변경시키기 위해 수행하는 작업 단위입니다. 여기서 DB의 상태를 변경시킨다는 SELECT, UPDATE, INSERT, DELETE 와 같은 쿼리를 날려 연산을 수행하는 것입니다. 트랜잭션을 좀 더 쉽게 풀이해서 이야기 하자면, 트랜잭션을 한국어로 번역하면 "거래" 즉, DB에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것이라고 할 수 있습니다. 그런데 여기서 거래를 안전하게 처리하도록 보장해준다는 말이 무엇일까요? 이 얘기를 쉽게 이해하기 위해 우리가 일상속에서 자주 이용하는 계좌이체를 예시로 들 수 있습니다. 계좌이체 예시 ( 트랜잭션이 없을 경우 ) 짱구와 철수가 있습니다. 짱구와 철수는 각각 계좌에 10000원씩 있습니다. 짱..

Tistory

[Thymeleaf] 메시지 적용하기

상품명 가격 수량 아래의 HTML 코드를 보면 상품명 또는 가격, 수량으로 각 구분자의 표시되는 이름들이 하드코딩 되어있습니다. 지금이야 간단한 HTML 이라서 상관은 없겠지만, 만약 여러 HTML에 동일하게 적용되어있는 상품명, 가격, 수량의 이름이 변경되어야 한다면 어떨까요? 일일히 HTML을 다 들어가서 하나씩 지우고 수정하고 해야 할 것입니다. 이러한 번거로움 작업을 메시지 기능을 통해 관리하는 방법을 알아봅시다. 메시지 기능 적용하기 먼저 messages.properties 라는 메시지 관리용 프로퍼티 파일을 만들어 줍니다. 그리고 key , value 형식으로 값을 입력합니다. ( {0}, {1} ... 등 파라미터도 적용 가능) item=상품 item.id=상품 ID item.itemName..

Tistory

[Spring] 유효성 검증하기 (Validation)

웹 애플리케이션을 만들고 유효성 검증을 추가 하지 않는다면, 사용자가 폼에 잘못된 값을 입력할 시 아래와 같은 오류화면을 만나게 될 것 입니다. 이렇게 되면 클라이언트 입장에서는 상당히 당황스러울 것이고 입력한 값이 모두 날라가 처음부터 다시 작성해야 하는 일이 생깁니다. 또한 우리가 웹 사이트에서 값을 잘못입력했다고 이런 오류화면을 본적도 없죠. 우리는 웹 서비스를 할 때 이렇게 클라이언트가 해결하지 못하는 오류 화면을 보여줄 것이 아니라 클라이언트가 잘 못 입력했을 시 무엇을 잘못 입력했는지, 어떻게 입력해야하는 지를 알려줘야합니다. 그래서 Validation 검증 기능을 추가해 어떤 값을 잘못 입력했는지 알 수 있도록 해봅시다. 결과물과 주의점 이 포스팅은 검증 설명에 중점을 뒀기 때문에 예제에 사..

Tistory

[Spring] Bean Validation - 유효성 검증

이전 포스팅에서 유효성 검증하는 법에 대해 알아봤었습니다. (이전 포스팅에서 다룬 내용들은 이번 포스팅에서는 생략) [Spring] 유효성 검증하기 (Validation) 웹 애플리케이션을 만들고 유효성 검증을 추가 하지 않는다면, 사용자가 폼에 잘못된 값을 입력할 시 아래와 같은 오류화면을 만나게 될 것 입니다. 이렇게 되면 클라이언트 입장에서는 상당히 hstory0208.tistory.com 하지만 이 전처럼 검증 기능을 매번 코드로 작성하는 것은 상당히 번거로운 작업입니다. 스프링은 이런 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고, 표준화한 Bean Validation을 제공합니다. Bean Validation을 잘 활용하면, 애노테이션 하나로 검증 로직을 매우 편리하게 적용할 수 있습..

Tistory

[Thymeleaf] 입력 폼(Form) 처리

타임리프는 스프링과 통합을 위한 다양한 기능을 편리하게 제공합니다. 스프링 통합으로 추가되는 기능들 스프링의 SpringEL 문법 통합 ${@myBean.doSomething()} 처럼 스프링 빈 호출 지원 편리한 폼 관리를 위한 추가 속성 th:object (기능 강화, 폼 커맨드 객체 선택) th:field , th:errors , th:errorclass 폼 컴포넌트 기능 checkbox, radio button, List 등을 편리하게 사용할 수 있는 기능 지원 스프링의 메시지, 국제화 기능의 편리한 통합 스프링의 검증, 오류 처리 통합 스프링의 변환 서비스 통합(ConversionService) 입력 폼 처리 th:object 커맨드 객체를 지정 *{...} 선택 변수 식 (th:object 에..

Tistory

[Python/파이썬] 프로그래머스 Lv2 - 숫자 나누기 (유클리드호제법)

문제 설명 제한사항 입출력 예 Solution.py 첫 번째, 두 번째 조건을 보면 철수가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고 영희가 가진 카드들에 적힌 모든 숫자들 중에 하나도 나눌수 없는 양의 정수 a => 철수가 가진 카드들의 최대 공약수 영희가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고 철수가 가진 카드들에 적힌 모든 숫자들 중에 하나도 나눌수 없는 양의 정수 a => 영희가 가진 카드들의 최대 공약수 로 해석할 수 있습니다. 유클리드 호제법을 사용해 철수와 영희의 카드뭉치 최대공약수를 구하기 구한 최대공약수로 두 조건들을 적용 두 최대공약수 중 가장 큰 값을 반환 정답 코드 def solution(arrayA, arrayB): answer = 0 # array의 첫 번째 값이 최대..

Tistory

[Spring] PRG(Post-Redirect-Get) 패턴이란?

PRG(Post-Redirect-Get) 웹 개발 패턴 중 자주 사용되는 패턴으로 HTTP POST 요청에 대한 응답이 GET 요청을 위한 URI로 리다이렉트되는 것 입니다. PRG 패턴을 사용하는 이유를 사용하는 이유는 사용하지 않았을 경우 다음과 같은 문제점이 있기 때문입니다. PRG패턴을 사용하지 않았을 경우 문제점 1. 새로고침으로 인해 동일한 요청을 연속적으로 보내지는 이슈 발생 웹 브라우저의 새로 고침은 마지막에 서버에 전송한 데이터를 다시 전송하게 됩니다. 그래서 만약 결제 같은 중요한 로직을 POST 방식으로 구현을 했다면, 마지막으로 서버에 전송한 데이터가 POST 요청에 대한 응답 결과물이기 때문에 새로고침을 한다면 계속 중복 결제가 되는 심각한 문제점이 발생하게 됩니다. 2. POST..

Tistory

Thymeleaf(타임리프)란 ? 타임리프의 기본 기능알아보기

Thymeleaf(타임리프)란 ? 타임리프는 JSP, Freemarker와 같은 템플릿 엔진의 일종으로 다음과 같은 특징을 갖고 있습니다. 서버 사이드 HTML 렌더링 (SSR) 백엔드 서버에서 HTML을 동적으로 렌더링 하는 용도로 사용합니다. 네츄럴 템플릿 타임리프는 순수 HTML을 최대한 유지하는 특징을 가지기 때문에, 타임리프로 작성한 파일은 HTML을 유지해서 웹 브라우저에서 파일을 직접 열어도 내용을 확인할 수 있고, 서버를 통해 뷰 템플릿을 거치면 동적으로 변경된 결과를 확인할 수도 있습니다. 이렇게 순수 HTML을 그대로 유지하면서 뷰 템플릿도 사용할 수 있는 타임리프의 특징을 네츄럴 템플릿 (natural templates)이라고 합니다. 스프링 통합 지원 스프링과 통합되어 있어, 스프링..

Tistory

[Thymeleaf] 템플릿 레이아웃 적용하기

레이아웃을 사용하는 이유? 레아아웃을 사용하는 이유는 만약 100개의 페이지에 똑같은 header와 footer가 들어갈 경우 각각의 HTML마다 똑같은 header와 footer를 추가하는 것은 상당히 비효율적이고 유지보수면에서도 좋지 않습니다. 그래서 반복되는 화면이 있어 HTML 코드를 줄일 때 레이아웃을 적용하면 상당히 효과적입니다. 템플릿 조각 템플릿 조각은 공통으로 적용할 부분을 조각조각으로 만들어 필요한 공통의 부분들에 가져다 쓰는 방식입니다. 가 있는 태그는 다른곳에 포함되는 코드 조각으로 코드 조각을 사용할 때는 조각 표현식 ~{...}를 사용합니다. Controller @Controller @RequestMapping("/template") public class TemplateCont..

Tistory

[Spring] HTTP 요청 방법과 관련 어노테이션(Annotation)

HTTP 요청 방법 3가지 스프링 HTTP 요청 방법 3가지는 다음과 같이 이뤄져있습니다. GET 방식 메시지 바디 없이, URL의 “쿼리 파라미터”를 사용해 데이터를 전달합니다. ( EX : 검색, 필터, 페이징 등에서 많이 사용 ) 쿼리 파라미터는 URL에 다음과 같이 ? 를 시작으로 보낼 수 있습니다. 추가 파라미터는 & 로 구분합니다. http://localhost:8080/request-param?username=hello&age=2 POST 방식 - HTML Form HTML의 Form을 사용해서 클라이언트에서 서버로 데이터를 전송하는 방식으로 , 주로 회원 가입, 상품 주문 등에서 사용합니다. 컨텐츠 타입은 다음과 같으며 application/x-www-form-urlencoded 메시지 바..

Tistory

[Spring] HTTP 응답 방법과 관련 어노테이션(Annotation)

HTTP 응답 방법 3가지 스프링에서 응답 데이터를 만드는 방법은 크게 3가지가 있습니다. 정적 리소스 스프링 부트는 클래스 패스의 아래 디렉토리에 있는 정적 리소스를 제공합니다. /static , /public , /resources , /META-INF/resources src/main/resources는 리소스를 보관하는 곳이고, 또는 클래스패스의 시작 경로입니다. 스프링은 정적 리소스를 담을 다음과 같은 경로를 제공하고, 이 디렉토리에 리소스를 넣어두면 스프링 부트가 정적 리소스로 서비스를 제공합니다. src/main/resources/static 만약 src/main/resources/static/test/index.html 경로에 파일이 들어있으면 웹 브라우저에서 다음과 같이 실행하면 정정 파..

Tistory

HTTP 메서드 종류 및 속성

HTTP 메서드 종류 HTTP 메서드란 클라이언트와 서버 사이에 이뤄지는 요청과 응답 데이터를 전송하는 방식입니다. HTTP 메서드는 총 9가지가 있으며 주로 GET, POST, PUT, PATCH, DELETE를 사용합니다. 메서드 이름 설 명 GET 리스소 조회 POST 등록, 요청 데이터 처리 PUT 리소스 덮어쓰기 (해당 리소스가 없으면 생성) PATCH 리소스 부분 분경 (PUT은 전체 변경이지만, PATCH는 일부만 변경) DELETE 리소스 삭제 HEAD GET과 동일하나 메시지 부분(Body)를 제외하고, 상태 줄과 헤더만 반환 OPTIONS 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명 (주로 CORS에서 사용) CONNECT 대상 자원으로 식별되는 서버에 대한 터널을 설정 TRAC..

Tistory

Web과 WAS란 ? 웹 서비스의 구조에 대해 알아보자

Web Server (웹 서버) 웹 서버란, HTTP 프로토콜을 기반으로 동작하는 서버로, 동작하는 방식은 클라이언트가 웹 서버에 HTTP 요청을 보내면 웹 서버는 HTTP로 응답하여 정적 리소스를 제공합니다. 대표적인 웹 서버 - Nginx - Apache WAS - Web Application Server (웹 어플리케이션 서버) WAS도 Web 서버처럼 HTTP 프로토콜을 기반으로 동작하고 웹 서버 기능을 포함하여 동적 리소스도 제공 할 수 있는 Application 서버입니다. WAS는 서블릿 컨테이너 또는 웹 컨테이너를 제공하고 컨테이너를 통해 프로그램 코드를 실행해 애플리케이션 로직을 수행하거나 DB 조회 등.. 동적 리소스를 제공합니다. 대표적인 WAS - Tomcat (톰캣) - Jetty..

Tistory

Tread Pool(쓰레드 풀)이란?

클라이언트가 서버에 요청을 할 때 다음과 같은 동작 과정이 있습니다. 클라이언트가 WAS에 요청 서버는 TCP/IP 커넥션 연결 후 서블릿을 호출 그런데 이 서블릿 객체는 누가 호출하는 걸 까요?? 이 서블릿 객체는 바로 Tread(쓰레드)가 호출합니다. Tread (쓰레드) 자바 Main 메서드를 실행하면 main이라는 이름의 쓰레드가 실행되는 것을 볼 수 있는데, 애플리케이션 코드를 하나하나 순차적으로 실행하는 것을 쓰레드라고 볼 수 있습니다. 만약 쓰레드가 없다면 자바 애플리케이션이 실행이 불가능합니다. 쓰레드는 한번에 하나의 코드 라인만 수행하며 동시 처리가 필요하면 쓰레드를 추가로 생성하게 됩니다. 단일 요청 - 쓰레드 하나 사용 시 WAS는 요청이 오면 쓰레드를 할당하고 그 쓰레드가 서블릿을 ..

Tistory

[Spring] @PostConstruct와 @PreDestory 스프링 빈 생명주기 관리

Spring Bean의 생명 주기 Spring Bean은 다음과 같은 생명 주기를 갖습니다. 스프링 컨테이너 생성 => 스프링 빈 생성 => 의존 관계 주입(DI) => 초기화 콜백 => 사용 => 소멸전 콜백 => 스프링 종료 위 생명 주기를 보면 스프링 빈(Spring Bean)은 객체를 생성하고, 의존관계 주입이 다 끝난 후에야 필요한 데이터를 사용할 수 있는 준비가 완료 됩니다. 즉, 생성자가 호출되었을 때 스프링 빈은 초기화 전이고 DI(의존관계 주입)이 이루어 지고 나서야 스프링 빈이 초기화 됩니다. 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출하게 되는데, 개발자가 의존관계 주입이 완료된 시점이 언제인지 알 수 있는 방법이 없습니다. 그래서 Spring은 다음과 같은 빈 생명주..

Tistory

[Spring] Lombok(롬복)이란 ? 설치부터 사용법까지

Lombok 이란? Java의 라이브러리로 반복되는 메서드를 Anntation을 사용해 자동으로 작성해주는 아주 편리한 라이브러리입니다. Java에서 보통 Model 클래스나 Entity같은 도메인 클래스 등에는 여러 속성이 존재하고 이들이 갖는 프로퍼티에 대해서 Getter, Setter, 생성자 등을 매번 작성해줘야하지만 Lombok을 이용한다면 어노테이션을 이용하는 것 만으로 자동으로 Getter, Setter, 생성자 등의 코드를 작성해줘 번거로운 과정을 제거해줍니다. 인텔리제이 Lombok 설치 및 적용 방법 1. 파일 -> 설정 -> 플러그인 에서 lombok을 검색 후 플러그인을 설치합니다. 2. build.gradle의 dependency에 아래 코드를 추가합니다. dependencies ..

Tistory

HTTP란? 무상태성과 비연결성에 대해 알아보자.

HTTP (HyperText Transfer Protocol) 인터넷에서 데이터를 주고받을 수 있는 프로토콜(규칙)으로 이렇게 규칙을 정해두었기 때문에, 모든 프로그램이 이 규칙에 맞춰 개발해서 서로 정보를 교환할 수 있습니다. 지금은 HTTP 시대라 할 만큼 모든 형태의 데이터를 HTTP를 사용해 전송할 수 있습니다. HTML, TEXT IMAGE, 음성, 영상, 파일 JSON, XML 서버간의 데이터를 주고 받을 때 거의 모든 형태의 데이터 전송 가능 HTTP의 역사 HTTP/0.9 - 1991년 : GET 메서드만 지원, HTTP 헤더 X HTTP/1.0 - 1996년 : 메서드, 헤더 추가 HTTP/1.1 - 1997년 : 현재 가장 많이 사용하는 버전 HTTP/2 - 2015년 : 성능 개선 H..

Tistory

[Python/파이썬] 프로그래머스 Lv2 - 줄 서는 방법

Solution.py 처음에는 permutations로 순열을 이용해 문제를 풀었는데 Lv2 답게 간단하게 문제가 풀릴일이 없이 효율성, 시간 초과로 실패했습니다. 이 문제를 풀기 위해서는 수학적으로 접근해야하는데, 먼저 맨 앞의 숫자가 1일 때, 1을 맨 앞의 원소로 갖는 순열은 [1, 2, 3] , [1, 3, 2] 로 총 두 가지 입니다. 이 경우의 수는 (n - 1)!을 계산했을 시 나올 수 있는 경우의 수가 됩니다. 파이썬의 math 모듈에서 factorial() 팩토리얼 메서드를 제공 해줍니다, 그 다음으로는 이 문제에서 k 번째 방법을 반환하라고 했는데, k의 수를 인덱스 값으로 변환하여 k - 1 을 해줘야합니다. k 번째에 있는 수를 구하기 위해서 (k - 1) // math.factor..

Tistory

Spring(스프링)과 Spring Boot(스프링부트)를 왜 사용하는가?

Spring이 나오기 이전엔 ? Java로 개발을 하던 초기에는 EJB(Enterprise Java Beans) 라는 기술을 사용했었습니다. 하지만 EJB는 이론적인 부분은 매력적이였지만 상당히 가격이 비쌌고, 복잡하고 어렵고 느리다는 단점이 있어 EJB로 개발하는 것은 지옥과 같다는 말이 나올 정도로 부정적인 말이 많았습니다. 그래서 차라리 EJB를 쓸 빠에는 POJO(Plain Old Java Object) 순수한 옛날 자바로 돌아가자라는 말이 나오기도 했었습니다. 그러다 EJB에 지친 개발자들이 오픈소스 프로젝트로 Spring이라는 오픈소스 기술을 개발하였고 이 Spring은 EJB의 복잡하고 어렵고 느리고 비싼 단점들을 개선하고 수 많은 편의기능들을 제공하여 Spring이라는 이름은 "EJB라는 ..

Tistory

Servlet으로 접속시 HTTP 404 에러 해결 방법

Intelij에서 서블릿 컨테이너로 Tomcat을 사용 시 아래 처럼 JSP로 접속 시 200, servlet으로 접속 시 404 에러를 반환하는 경우가 있습니다. servlet만 404가 뜨는 이유는 Tomcat 버전과 Java EE 버전이 맞지 않아서 그런것인데 아래와 같이 Java EE 버전과 Tomcat 버전을 맞추면 정삭적으로 Servlet 접속 시 작동하게 됩니다. JAVA EE 8 + Apache Tomcat 9.0.X JAVA EE 7 + Apache Tomcat 8.5.X JAVA EE 7 + Apache Tomcat 8.0.X Java EE의 버전 확인 아래 방법은 버전 확인만 가능하고 변경은 하지 못합니다. 버전을 변경하고 싶다면 글을 아래로 스크롤해주세요. 프로젝트 우클릭 + Add..

Tistory

spring-boot-devtools - 서버 재시작 없이 프론트 반영하는 법

Sping boot를 이용하면서 어플리케이션의 프론트 변경사항이 변경될 때 서버를 종료했다 다시 시작했다 하는 건 상당히 귀찮은 부분 입니다... 하지만 이 귀찮은 부분을 spring-boot-devtools 라이브러리로 재시작하지 않고 페이지를 새로고침함으로써 변경사항을 반영시킬 수 있습니다. 적용 방법은 정말 간단합니다. 1. build.gradle에 의존성 추가 아래의 코드를 build.gradle의 dependencies에 추가합니다. developmentOnly 'org.springframework.boot:spring-boot-devtools' 2. IntelliJ 환경 설정 1. File -> Setting -> Advanced Settings -> Compiler안의 아래 항목 활성화 2...

Tistory

[Python/파이썬] 프로그래머스 Lv2 - 수식 최대화 (카카오 인턴쉽)

문제 설명 IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과 같은 방식으로 결정하려고 합니다. 해커톤 대회에 참가하는 모든 참가자들에게는 숫자들과 3가지의 연산문자(+, -, *) 만으로 이루어진 연산 수식이 전달되며, 참가자의 미션은 전달받은 수식에 포함된 연산자의 우선순위를 자유롭게 재정의하여 만들 수 있는 가장 큰 숫자를 제출하는 것입니다. 단, 연산자의 우선순위를 새로 정의할 때, 같은 순위의 연산자는 없어야 합니다. 즉, + > - > * 또는 - > * > + 등과 같이 연산자 우선순위를 정의할 수 있으나 +,* > - 또는 * > +,-처럼 2개 이상의 연산자..

Tistory

[Python/파이썬] 프로그래머스 Lv2 - 두 큐 합 같게 만들기 (카카오 인턴쉽)

문제 설명 길이가 같은 두 개의 큐가 주어집니다. 하나의 큐를 골라 원소를 추출(pop)하고, 추출된 원소를 다른 큐에 집어넣는(insert) 작업을 통해 각 큐의 원소 합이 같도록 만들려고 합니다. 이때 필요한 작업의 최소 횟수를 구하고자 합니다. 한 번의 pop과 한 번의 insert를 합쳐서 작업을 1회 수행한 것으로 간주합니다. 큐는 먼저 집어넣은 원소가 먼저 나오는 구조입니다. 이 문제에서는 큐를 배열로 표현하며, 원소가 배열 앞쪽에 있을수록 먼저 집어넣은 원소임을 의미합니다. 즉, pop을 하면 배열의 첫 번째 원소가 추출되며, insert를 하면 배열의 끝에 원소가 추가됩니다. 예를 들어 큐 [1, 2, 3, 4]가 주어졌을 때, pop을 하면 맨 앞에 있는 원소 1이 추출되어 [2, 3, ..

Tistory

[Python/파이썬] 프로그래머스 Lv2 - 방금그곡 (카카오 블라인드)

문제 설명 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV, 라디오 등에서 나온 음악에 관해 제목 등의 정보를 제공하는 서비스이다. 네오는 자신이 기억한 멜로디를 가지고 방금그곡을 이용해 음악을 찾는다. 그런데 라디오 방송에서는 한 음악을 반복해서 재생할 때도 있어서 네오가 기억하고 있는 멜로디는 음악 끝부분과 처음 부분이 이어서 재생된 멜로디일 수도 있다. 반대로, 한 음악을 중간에 끊을 경우 원본 음악에는 네오가 기억한 멜로디가 들어있다 해도 그 곡이 네오가 들은 곡이 아닐 수도 있다. 그렇기 때문에 네오는 기억한 멜로디를 재생 시간과 제공된 악보를 직접 보면서 비교하려고..

Tistory

Gradle이란? 왜 사용하는지에 대해 알아 보자.

Gradle이란 ? Gradle은 CI/CD를 위해 아래 작업들을 자동화 시켜 주는 Groovy 기반의 오픈소스 빌드 도구입니다. Compile - Java 파일의 소스 코드를 컴퓨터가 이해할 수 있도록 바이트 코드로 변환 Test - 유닛 테스트, UI 테스트 Packaging - 스프링 코드를 패키징 해 .jar 파일이나 .war 파일로 생성 Deploy & Run - 서버 실행 빌드 도구란? 소프트웨어 개발에 있어서 소스 코드를 실행 가능한 어플리케이션으로 만들어주는 도구를 말합니다. 빌드 과정을 자동화하여 관리하는 기능을 하기 때문에 빌드 관리 도구 도는 빌드 자동화 도구라고 불리기도합니다. Gradle Project 구성 .gradle - gradle 버전 별 엔진 및 설정 파일 .idea - ..

Tistory

[Python/파이썬] 프로그래머스 Lv2 - 괄호 변환 (카카오 블라인드 테스트)

문제 설명 카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 컴파일하여 로그를 보니 대부분 소스 코드 내 작성된 괄호가 개수는 맞지만 짝이 맞지 않은 형태로 작성되어 오류가 나는 것을 알게 되었습니다. 수정해야 할 소스 파일이 너무 많아서 고민하던 "콘"은 소스 코드에 작성된 모든 괄호를 뽑아서 올바른 순서대로 배치된 괄호 문자열을 알려주는 프로그램을 다음과 같이 개발하려고 합니다. 용어의 정의 '(' 와 ')' 로만 이루어진 문자열이 있을 경우, '(' 의 개수와 ')' 의 개수가 같다면 이를 균형잡힌 괄호 문자열이라고 부릅니다. 그리고 여기에 '('와 ')'의 괄호의 짝..

Tistory

JSP(JavaServer Pages)와 Servlet(서블릿)이란?

JSP와 Servlet은 레거시 시스템에 주로 사용되어 왔고, 요즘 프로젝트에서는 잘 사용되지 않는다고 합니다. 하지만 어느정도에 대한 이해는 필요하기 때문에 포스팅을 다뤄보려합니다. JSP와 Servlet은 모두 웹 애플리케이션 개발에 사용되는 Java 기술으로 웹(Web)을 조금 더 쉽게 다룰 수 있도록 해주는 확장 기능입니다. 이 둘은 서로 비슷한 점이 많지만 목적과 구현에서 근본적으로 다릅니다. 그래서 이번 포스팅에서는 이 둘의 개념과 차이점에 대해 포스팅해보려합니다. Servlet servlet은 웹 서버에서 실행되고 HTTP 요청에 대한 동적인 처리가 가능한 파일 확장자가 .java인 Java 프로그램으로, 웹을 다룰 수 있도록 해주는 "HttpServlet" 클래스를 상속받은 클래스들을 se..

Tistory

[Python/파이썬] 프로그래머스 Lv2 - 덧칠하기 (deque)

문제 설명 어느 학교에 페인트가 칠해진 길이가 n미터인 벽이 있습니다. 벽에 동아리 · 학회 홍보나 회사 채용 공고 포스터 등을 게시하기 위해 테이프로 붙였다가 철거할 때 떼는 일이 많고 그 과정에서 페인트가 벗겨지곤 합니다. 페인트가 벗겨진 벽이 보기 흉해져 학교는 벽에 페인트를 덧칠하기로 했습니다. 넓은 벽 전체에 페인트를 새로 칠하는 대신, 구역을 나누어 일부만 페인트를 새로 칠 함으로써 예산을 아끼려 합니다. 이를 위해 벽을 1미터 길이의 구역 n개로 나누고, 각 구역에 왼쪽부터 순서대로 1번부터 n번까지 번호를 붙였습니다. 그리고 페인트를 다시 칠해야 할 구역들을 정했습니다. 벽에 페인트를 칠하는 롤러의 길이는 m미터이고, 롤러로 벽에 페인트를 한 번 칠하는 규칙은 다음과 같습니다. 롤러가 벽에..

Tistory

[Python/파이썬] 프로그래머스 Lv2 - 롤케이크 자르기

문제 설명 예를 들어, 롤케이크에 4가지 종류의 토핑이 올려져 있다고 합시다. 토핑들을 1, 2, 3, 4와 같이 번호로 표시했을 때, 케이크 위에 토핑들이 [1, 2, 1, 3, 1, 4, 1, 2] 순서로 올려져 있습니다. 만약 세 번째 토핑(1)과 네 번째 토핑(3) 사이를 자르면 롤케이크의 토핑은 [1, 2, 1], [3, 1, 4, 1, 2]로 나뉘게 됩니다. 철수가 [1, 2, 1]이 놓인 조각을, 동생이 [3, 1, 4, 1, 2]가 놓인 조각을 먹게 되면 철수는 두 가지 토핑(1, 2)을 맛볼 수 있지만, 동생은 네 가지 토핑(1, 2, 3, 4)을 맛볼 수 있으므로, 이는 공평하게 나누어진 것이 아닙니다. 만약 롤케이크의 네 번째 토핑(3)과 다섯 번째 토핑(1) 사이를 자르면 [1, 2..

Tistory

Spring Security 기본 로그인 화면 제거하는 간단한 방법

spring을 실행시켜 localhost:8080으로 접속 시 만들지도 않은 아래와 같은 로그인 화면이 나와서 당황스러웠었습니다. 검색해서 알아 본 결과, 해당 페이지는 build.gradle에 스프링 시큐리티 의존성을 주입하면 자동으로 추가되는 화면 이라고 합니다. 이전에 책으로 실습했던 프로젝트의 의존성을 그대로 갖고왔다보니 OAuth2의 의존성도 같이 가져와 해당 페이지가 나오는 것이였습니다. implementation('org.springframework.boot:spring-boot-starter-oauth2-client') // 스프링 시큐리티 의존성 이 기본 로그인 페이지를 없애려면 어플리케이션이 실행되는 Main.java 클래스 파일에 다음과 같이 @SpringBootApplication ..

Tistory

[Java/자바] 프로그래머스 Lv2 - 2 x n 타일링(DP 알고리즘)

문제 설명 가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다. 타일을 가로로 배치 하는 경우 타일을 세로로 배치 하는 경우 예를들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다. 직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요. 제한사항 가로의 길이 n은 60,000이하의 자연수 입니다. 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요. 입출력 예 n result 4 5 ..

Tistory

Utterances - 댓글 기능 추가하기

Utterances란? 직접 댓글 기능을 구현하지 않고 Utterances 오픈소스를 이용해 쉽고 간단하게 댓글 기능을 추가 할 수 있습니다. Utterances는 Github 이슈 기능을 이용했기 때문에 우리가 Github에서 흔히 볼 수 있던 댓글과 똑같이 생겼습니다. 또한 Github의 마크다운 에디터를 그대로 사용하고 있어 댓글을 마크다운으로도 작성이 가능 합니다. 댓글 기능을 추가할 수 있는 오픈소스가 이 외에도 더 있지만 Utterances는 다음과 같은 장점을 갖습니다. 오픈 소스. , 추적 없음, 광고 없음, 항상 무료. Github issue 기반 (GitHub issue 에 저장된 모든 데이터. ) css 툴킷인 Primer로 스타일이 지정. 어두운 테마 사용가능. 가벼..

Tistory

[Python/파이썬] 프로그래머스 Lv2 - 메뉴 리뉴얼 (Combinations)

문제 설명 레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서 새로운 메뉴를 제공하기로 결정했습니다. 어떤 단품메뉴들을 조합해서 코스요리 메뉴로 구성하면 좋을 지 고민하던 "스카피"는 이전에 각 손님들이 주문할 때 가장 많이 함께 주문한 단품메뉴들을 코스요리 메뉴로 구성하기로 했습니다. 단, 코스요리 메뉴는 최소 2가지 이상의 단품메뉴로 구성하려고 합니다. 또한, 최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합에 대해서만 코스요리 메뉴 후보에 포함하기로 했습니다. 예를 들어, 손님 6명이 주문한 단품메뉴들의 조합이 다음과 같다면, (각 손님은 단품메뉴를 2개 이상 주문해야 ..

Tistory

[Java/자바] 프로그래머스 Lv2 - [3차]파일명 정렬

문제 설명 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램의 과거 버전을 모두 담고 있어, 이름 순으로 정렬된 파일 목록은 보기가 불편했다. 파일을 이름 순으로 정렬하면 나중에 만들어진 ver-10.zip이 ver-9.zip보다 먼저 표시되기 때문이다. 버전 번호 외에도 숫자가 포함된 파일 목록은 여러 면에서 관리하기 불편했다. 예컨대 파일 목록이 ["img12.png", "img10.png", "img2.png", "img1.png"]일 경우, 일반적인 정렬은 ["img1.png", "img10.png", "img12.png", "img2.png"] 순이 되지만, 숫자 순으로 정렬..

Tistory

[Java/자바] 프로그래머스 Lv2 - 2개 이하로 다른 비트

문제 설명 양의 정수 x에 대한 함수 f(x)를 다음과 같이 정의합니다. x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수 예를 들어, f(2) = 3 입니다. 다음 표와 같이 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 3이기 때문입니다. 수 비트 다른 비트의 개수 2 000...0010 3 000...0011 1 f(7) = 11 입니다. 다음 표와 같이 7보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 11이기 때문입니다. 수 비트 다른 비트의 개수 7 000...0111 8 000...1000 4 9 000...1001 3 10 000...1010 3 11 000...1011 2 정수들이 담긴 배열 numbers가 매개변수로 ..

Tistory

[Java/자바] 프로그래머스 Lv2 - 소수 찾기 (완전탐색/DFS)

문제 설명 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요. 제한사항 numbers는 길이 1 이상 7 이하인 문자열입니다. numbers는 0~9까지 숫자만으로 이루어져 있습니다. "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다. 입출력 예 numbers return "17" 3 "011" 2 입출력 예 설명 예제 #1 [1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다. 예제 #2 [0, 1, 1]으로는 소수 [11, ..

Tistory

[Java/자바] 프로그래머스 Lv2 - 방문 길이 (HashSet)

문제 설명 게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다. U: 위쪽으로 한 칸 가기 D: 아래쪽으로 한 칸 가기 R: 오른쪽으로 한 칸 가기 L: 왼쪽으로 한 칸 가기 캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다. 예를 들어, "ULURRDLLU"로 명령했다면 1번 명령어부터 7번 명령어까지 다음과 같이 움직입니다. 8번 명령어부터 9번 명령어까지 다음과 같이 움직입니다. 이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다. 예를 들어 위의 예시에서 게임 캐릭터가 움직인 길이는 9이지만,..

Tistory

[Java/자바] 프로그래머스 Lv2 - 프렌즈4블록

문제 설명 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다. 만약 판이 위와 같이 주어질 경우, 라이언이 2×2로 배치된 7개 블록과 콘이 2×2로 배치된 4개 블록이 지워진다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워진다. 블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 된다. 만약 빈 공간을 채운 후에 다시 2×2 형태로 같은 모양의 블록이 모이면 다시 지워지고 떨어지고를 반복하게 된다. 위 초기 배치를 문자로 표시하면 아래와 같..

Tistory

[Java/자바] 프로그래머스 Lv2 - 할인 행사

문제 설명 XYZ 마트는 일정한 금액을 지불하면 10일 동안 회원 자격을 부여합니다. XYZ 마트에서는 회원을 대상으로 매일 한 가지 제품을 할인하는 행사를 합니다. 할인하는 제품은 하루에 하나씩만 구매할 수 있습니다. 알뜰한 정현이는 자신이 원하는 제품과 수량이 할인하는 날짜와 10일 연속으로 일치할 경우에 맞춰서 회원가입을 하려 합니다. 예를 들어, 정현이가 원하는 제품이 바나나 3개, 사과 2개, 쌀 2개, 돼지고기 2개, 냄비 1개이며, XYZ 마트에서 15일간 회원을 대상으로 할인하는 제품이 날짜 순서대로 치킨, 사과, 사과, 바나나, 쌀, 사과, 돼지고기, 바나나, 돼지고기, 쌀, 냄비, 바나나, 사과, 바나나인 경우에 대해 알아봅시다. 첫째 날부터 열흘 간에는 냄비가 할인하지 않기 때문에 첫..

Tistory

[Java/자바] 프로그래머스 Lv2 - 가장 큰 수 (정렬)

문제 설명 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요. 제한 사항 numbers의 길이는 1 이상 100,000 이하입니다. numbers의 원소는 0 이상 1,000 이하입니다. 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다. 입출력 예 numbers return [6, 10, ..

Tistory

[Java/자바] 프로그래머스 Lv2 - 주식 가격(Queue 큐)

문제 설명 초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,000 이하인 자연수입니다. prices의 길이는 2 이상 100,000 이하입니다. 입출력 예 prices return [1, 2, 3, 2, 3] [4, 3, 1, 1, 0] 입출력 예 설명 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다. 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다. 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다. 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다. 5초 시점의 ₩3은..

Tistory

[알고리즘] 비트마스크(BitMask)란?

비트마스크(BitMask)란? 비트마스크는 이진수를 사용하는 컴퓨터의 연산 방식을 이용해, 정수의 이진수 표현을 자료 구조로 쓰는 기법을 말합니다. 이진수는 0 또는 1을 이용하므로 하나의 비트(bit)가 표현할 수 있는 2가지 경우가 있는데, 비트가 1이면 "켜져 있다"라고 말하며, 0이면 "꺼져 있다"라고 말합니다. 비트마스크를 사용하는 이유 c 빠른 수행시간 원소의 수가 많지 않을 때 사용되며, bit연산이기 때문에 시간복잡도 O(1)에 구현되는 것이 많습니다. c 작은 메모리 사용량 만약 bit가 10개인 경우, 각 bit당 두 가지의 경우를 가지기 때문에 2^10가지의 경우를 10bit 이진수 하나로 표현 가능합니다. 그렇기 때문에 하나의 정수로 매우 많은 경우의 수를 표현할 수 있기 때문에 메..

Tistory

[Java/자바] 프로그래머스 Lv2 - 스킬트리 (정규식 사용)

문제 설명 선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다. 예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다. 위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다. 선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요. 제한 조건 ..

Tistory

[알고리즘] 라인 스위핑 (Sweeping)

Line Sweeping Sweeping이라는 단어를 번역하면 "싹슬이 하는"이라는 뜻을 가집니다. 즉, "한 쪽 방향부터 시작해서 다른 방향으로 스캔해가면서 쓸어가는 것"입니다. 보통 라인스위핑 알고리즘은 좌표 문제에 많이 사용되며 O(nlogN)의 시간 복잡도를 가집니다. 라인 스위핑 알고리즘 문제 (백준 2170 : 선 긋기) 문제 설명 매우 큰 도화지에 자를 대고 선을 그으려고 한다. 매우 큰 도화지에 자를 대고 선을 그으려고 한다. 선을 그을 때에는 자의 한 점에서 다른 한 점까지 긋게 된다. 선을 그을 때에는 이미 선이 있는 위치에 겹쳐서 그릴 수도 있는데, 여러 번 그은 곳과 한 번 그은 곳의 차이를 구별할 수 없다고 하자. 이와 같은 식으로 선을 그었을 때, 그려진 선(들)의 총 길이를 구..

Tistory

[알고리즘] 다익스트라(Dijkstra) - 최단거리 알고리즘

다익스트라(Dijkstra) 다익스트라 알고리즘은 음의 가중치(음의 간선, 음의 값)가 없는 그래프에서 최단 거리를 구하는 알고리즘입니다. 가장 짧은 경로를 찾으므로 "길 찾기" 문제에 많이 사용됩니다. 이전 다익스트라의 경우 O(n^2)의 시간복잡도를 가졌었지만, 현재는 우선순위 큐를 이용한 개선된 다익스트라 알고리즘이 탄생해 O(ElogE)의 시간복잡도를 가집니다. ( E는 Node의 간선의 수 ) 만약 음의 간선이 존재한다면 "벨만-포드 알고리즘"을 활용해야 합니다. 다익스트라 알고리즘은 그리디 알고리즘과 다이나믹 프로그래밍 기법을 사용한 알고리즘입니다. 그 이유는 아래의 알고리즘 특징에서 설명하겠습니다. 다익스트라 알고리즘 특징 각 지점은 그래프에서 '노드' 또는 정점으로 표현되고 지점간 연결된 ..

Tistory

[Java/자바] 프로그래머스 Lv2 - 주차 요금 계산 (HashMap, TreeMap)

문제 설명 주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다. 요금표 기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원) 180 5000 10 600 입/출차 기록 시각(시:분) 차량 번호 내역 05:34 5961 입차 06:00 0000 입차 06:34 0000 출차 07:59 5961 출차 07:59 0148 입차 18:59 0000 입차 19:09 0148 출차 22:59 5961 입차 23:00 5961 출차 자동차별 주차 요금 차량 번호 누적 주차 시간(분) 주차 요금(원) 0000 34 + 300 = 334 5000 + ⌈(334 - 180) / 10⌉ x 600 = 14600 014..

Tistory

[Java/자바] 프로그래머스 Lv2 - 더 맵게(우선순위 큐)

문제 설명 매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다. 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다. Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요. 제한 사항 scovil..

Tistory

[Java/자바] 프로그래머스 Lv2 - 오픈채팅방 (HashMap)

문제 설명 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다. "[닉네임]님이 들어왔습니다." 채팅방에서 누군가 나가면 다음 메시지가 출력된다. "[닉네임]님이 나갔습니다." 채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다. 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다. 채팅방에서 닉네임을 변경한다. 닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메시지의 닉네임도 전부 변경된다. 예를 들어, 채팅방..

Tistory

[Java/자바] 프로그래머스 Lv2 - n진수 게임

문제 설명 튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다. 숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다. 10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다. 이렇게 게임을 진행할 경우, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, … 순으로 숫자를 말하면 된다. 한편 코딩 동아리 일원들은 컴퓨터를 다루는 사람답게 이진수로 이 게임을 진행하기도 하는데, 이 경우에는 0, ..

Tistory

[Java/자바] 프로그래머스 Lv2 - [3차]압축

문제 설명 신입사원 어피치는 카카오톡으로 전송되는 메시지를 압축하여 전송 효율을 높이는 업무를 맡게 되었다. 메시지를 압축하더라도 전달되는 정보가 바뀌어서는 안 되므로, 압축 전의 정보를 완벽하게 복원 가능한 무손실 압축 알고리즘을 구현하기로 했다. 어피치는 여러 압축 알고리즘 중에서 성능이 좋고 구현이 간단한 LZW(Lempel–Ziv–Welch) 압축을 구현하기로 했다. LZW 압축은 1983년 발표된 알고리즘으로, 이미지 파일 포맷인 GIF 등 다양한 응용에서 사용되었다. LZW 압축은 다음 과정을 거친다. 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다. 사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다. w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다. 입력에서..

Tistory

[Java/자바] 프로그래머스 Lv2 - 피로도 (완전탐색/dfs)

문제 설명 XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던전 탐험을 마쳤을 때 소모되는 "소모 피로도"가 있습니다. "최소 필요 피로도"는 해당 던전을 탐험하기 위해 가지고 있어야 하는 최소한의 피로도를 나타내며, "소모 피로도"는 던전을 탐험한 후 소모되는 피로도를 나타냅니다. 예를 들어 "최소 필요 피로도"가 80, "소모 피로도"가 20인 던전을 탐험하기 위해서는 유저의 현재 남은 피로도는 80 이상 이어야 하며, 던전을 탐험한 후에는 피로도 20이 소모됩니다. 이 게임에는 하루에 한 번씩 탐험할 수 있는 던전이 여러개 있는데, 한 유저가 오늘 이 던전들..

Tistory

[알고리즘] LIS(최장 증가 부분 수열)이란 ?

LIS (Longest Increasing Subsequence) 최장 증가 부분 수열 최장 증가 부분 수열은 말 그대로 가장 길게 증가하는 부분 수열으로 즉, 어떤 수열에서 만들 수 있는 부분 수열 중에서 가장 길면서 오름차순을 유지하는 수열을 LIS라고 합니다. 좀 더 이해하기 쉽도록 아래 그림을 봅시다. 만약 위와 같은 배열이 있을 때 만들수 있는 증가 부분 수열은 위와 같으며 최장 증가 부분 수열은 만들 수 있는 증가 부분 수열 중 길이가 가장 긴 [1, 2, 6]이 됩니다. LIS를 구현하는 방법으로는 두가지가 있습니다. DP [알고리즘] 동적 프로그래밍 (DP) 란? feat.동적 계획법 동적 프로그래밍(Dynamic programming) 란? 동적 프로그래밍은 "큰 문제"를 "부분 문제"로..

Tistory

[Java/자바] 프로그래머스 Lv2 - 연속 부분 수열 합의 개수 (Set)

문제 설명 철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같습니다. 원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요. 제한사항 3 ≤ elements의 길이 ≤ 1,000 1 ≤ el..

Tistory

[알고리즘] 투 포인터(Two Pointers)란?

투 포인터(Two Pointers) 투 포인터는 말 그대로 두 개의 포인터를 사용하여 문자열, 배열, List에서 원하는 값을 찾는 것 입니다. 투 포인터를 활용하기 위한 조건은 주어진 배열에서 연속된(정렬이 아닌) 부분 배열을 통해 문제를 해결할 수 있어야 합니다. 투 포인터 알고리즘을 활용하는 대표적인 예로는 배열에서 특정한 합을 갖는 부분 연속 수열을 찾을 때가 있습니다. 만약 이중 반복문을 통해 부분 연속 수열을 찾는다면 O(n^2)의 시간복잡도가 소요되는 반면 투 포인터를 활용한다면 O(n)의 시간복잡도로 시간을 단축 시킬 수 있습니다. 투 포인터는 두 개의 포인터를 사용하기 때문에 두 개의 인덱스를 가르키는 변수가 필요합니다. 그 변수를 하나는 "시작점을 가르키는 start", 다른 하나는 "..

Tistory

[Java/자바] 프로그래머스 Lv2 - 귤 고르기 (getOrDefault 활용)

문제 설명 경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다. 예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다. 경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가..

1 2 3 4