전체 글 83

[Spring] ModelMapper 대신 Mapstruct 사용하기

Entity와 DTO간의 객체 매핑시 사용하는 라이브러리로 ModelMapper와 Mapstruct가 있습니다. 기존에는 ModelMapper를 사용하고 있었지만 Mapstruct가 속도와 성능, 기능면에서 더 우수하다는 글을 보고 구글링하면서 리팩토링을 진행하게 되었습니다. 직접 사용한 부분만 정리하여서 부족한 내용이 많이 있습니다. Mapstuct의 특징 컴파일 시 오류를 확인할 수 있다. 리플렉션(Reflction)을 사용하지 않기 때문에 매핑 속도가 빠르다. (ModelMapper는 런타임 시점에 매핑을 시도합니다.) 디버깅이 쉽다. 생성된 매핑 코드를 눈으로 직접 확인할 수 있다. (생성된 구현체로 직접 접근하여 확인할 수 잇습니다.) 참조) Java - Model(Object) mapping을..

Spring 2021.10.17

[Security] Remember Me 인증 필터 (RememberMeAuthenticationFilter)

rememberMe기능을 활성화하여 로그인할 경우 사용자는 인증 객체를 담은 session과 함께 remember-me 쿠키를 받아 자원에 접근하게 된다. * rememberMe의 다양한 설정의 api들은 차후에 다뤄보자. 이후로 사용자의 세션이 만료되거나 사용자 브라우저 종료로 인하여 세션이 끊긴 경우 즉, 세션이 활성화되지 않아 인증 객체를 SecurityContext에서 찾지 못하는 경우 자동적으로 사용자의 인증을 유지하기 위하여 RememberMeAuthenticationFilter가 실행된다. 즉, 정리해보면 다음과 같이 2가지 조건이 충족해야 RememberMeAuthenticationFilter가 실행된다. * 필터가 작동하는 경우 1. Authentication 객체가 null일 경우. (..

Spring Security 2021.10.05

[Security] Logout 처리 필터 (LogoutFilter)

원칙적으로 로그아웃 시 스프링 시큐리티에서는 post 요청을 처리한다. logout을 실행하면 logout 처리와 logout과 관련된 요청을 처리하는 필터가 LogoutFilter이다. 전체적인 로그아웃 처리의 흐름을 살펴보자. 사용자가 로그아웃을하면 post방식으로 요청을 하고 LogoutFilter가 요청을 받는다. AntPathRequestMatcher(/logout)에서 해당 경로로 요청한 것이 맞는지 매칭을 한다. 매칭 실패 시 chain.doFilter을 호출하게 되고 (Default는 "/logout" 이다.) 매칭 성공시 인증 객체를 담고 있는 SecurityContext에서 인증 객체를 꺼내 SecurityContextLogoutHandler 로 전달한다. SecurityContextL..

Spring Security 2021.10.04

[Security] Form Login 인증 필터 (UsernamePasswordAuthenticationFilter)

사용자가 로그인을 실행하면 인증처리가 이루어지는데 인증처리를 담당하고 그에 관련된 요청을 처리하는 필터가 UsernamePasswordAuthenticationFilter 이다. UsernamePasswordAuthenticationFilter 내부적으로 각각의 인증처리의 역할에 따라서 여러 클래스를 호출하여 처리하게 되며 전체적인 인증처리의 흐름을 살펴보자. 1. 인증 처리 전 작업 우선 처음 사용자 인증 시도를 하면 UsernamePasswordAuthenticationFilter가 요청을 받는다 그리고 AntPathRequestMatcher(/login)에서 사용자가 요청한 요청 정보가 매칭이 되는지 확인한다. (Default는 "/login"이다.) 매칭 실패 시 chain.doFilter으로 호..

Spring Security 2021.10.04

[Algorithm] 백준1463_1로 만들기(DFS, DP)

1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 설명 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입력 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. 출력 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다. 예시 입력 / 출력 입력 출력 2 1 10 3 풀이 과정) 1. 재귀함수를 이용하여 풀이 완전탐색으로 진행하되 구한 카운트(cnt)값이 이전에..

Algorithm 2021.10.04

[Security] 스프링 시큐리티 설정 및 사용자 정의 보안기능 구현

의존성 추가 (gradle) implementation 'org.springframework.boot:spring-boot-starter-security' 스프링 시큐리티 의존성을 추가 후 서버를 기동하면 기본적으로 시큐리티의 초기화 작업 및 보안설정이 이루어진다. 별도의 설정이나 구현을 하지 않아도 기본적인 웹 보안 기능이 현재 시스템에 연동이 되어 작동한다. WebSecurityConfigurerAdapter 클래스는 기본적인 웹보안 기능의 활성화 및 설정등.. 모든 처리를 한다. HttpSecurit 클래스는 세부적인 기능을 설정할 수 있는 인증API, 인가API를 제공한다. 사용자 임의 설정이 없을 경우 기본으로 아래의 api들을 호출하여 설정을 초기화 한다. (Default) private vo..

Spring Security 2021.10.03

[Algorithm] 백준1018_체스판 다시 칠하기(브루트포스)

1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다. www.acmicpc.net 설명 지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M*N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8*8 크기의 체스판으로 만들려고 한다. 체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판..

Algorithm 2021.09.28

[JPA] 변경 감지(Dirty Checking) 와 병합(merge)

변경 감지(Dirty Checking) 와 병합( merge ) * 준영속 상태? - 영속 상태였다가 더는 영속성 컨텍스트가 관리하지 않는 상태 - 영속성 컨텍스트로부터 분리된 상태 * 준영속 상태를 만드는 3가지 방법 - em.detach(entity) : 특정 엔티티만 준영속 상태로 전환 - em.clear() : 영속성 컨텍스트를 완전히 초기화 - em.close() : 영속성 컨텍스트를 종료 * 준영속 엔티티? - 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. - 엔티티의 데이터를 가지고 있는 클라이언트 사이드로 넘기기 위한 객체 * 준영속 엔티티를 수정하는 2가지 방법 1. 변경 감지 기능 사용 2. 병합( merge ) 사용 * 변경 감지 기능을 사용하면 원하는 속성만 선택해서 변경할..

JPA 2021.09.16

[Algorithm] 백준1541_잃어버린 괄호(수학, 문자열, 그리디, 파싱)

1541번: 잃어버린 괄호 첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 www.acmicpc.net 문제 세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다. 그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다. 괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.] 입력 첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자..

Algorithm 2021.09.15

[Git] fork, 버전 관리, pull request

fork? 다른 사람의 repository를 그대로 내 git으로 가져오는 작업. 즉 협업을 위해 어떤 부분을 수정하거나 추가 기능을 넣기 위해 해당 원본 repository를 나의 git repository로 그대로 복제하는 기능이다. fork한 저장소는 기존 원본 저장소와 연결되어 있어 아래와 같이 사용하게 된다. 1. 작업 전 fork한 소스를 최신 버전으로 업데이트를 해야 한다. * fork한 후 시간이 지나 원본repo가 업데이트 됬을 경우에 해당한다. (repo를 삭제 후 다시 새로 fork해도 된다. 기록들은 빠이) 2. 작업 후 pull request로 요청한다. 관리자의 merge(합병)을 승인 받으면 나의 소스들이 원본과 합쳐지게 된다. * 1. 작업 전 fork repository 업..

Git 2021.09.15

[Algorithm] 프로그래머스_소수 찾기_완전탐색(순열 알고리즘 사용)

코딩테스트 연습 - 소수 찾기 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 programmers.co.kr 소수 찾기 [문제 설명] 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요. [제한사항] numbers는 길이 1 이상 7 이하인 문자열입니다. numbers는 0~9까지 숫자만으로 이루어져 있습니다. "0..

Algorithm 2021.09.07

[Algorithm] 프로그래머스_가장 큰 수_정렬(Comparator 사용)

코딩테스트 연습 - 가장 큰 수 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 programmers.co.kr 가장 큰 수 [문제 설명] 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가..

Algorithm 2021.09.06

[Algorithm] 프로그래머스_튜플_2019 카카오 개발자 겨울 인턴십

코딩테스트 연습 - 튜플 "{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1] programmers.co.kr 설명 셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다. (a1, a2, a3, ..., an) 튜플은 다음과 같은 성질을 가지고 있습니다. 중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2) 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로..

Algorithm 2021.09.01

[Algorithm] 프로그래머스_메뉴 리뉴얼_2021 KAKAO BLIND RECRUITMENT

코딩테스트 연습 - 메뉴 리뉴얼 레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서 programmers.co.kr 설명 레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서 새로운 메뉴를 제공하기로 결정했습니다. 어떤 단품메뉴들을 조합해서 코스요리 메뉴로 구성하면 좋을 지 고민하던 "스카피"는 이전에 각 손님들이 주문할 때 가장 많이 함께 주문한 단품메뉴들을 코스요리 메뉴로 구성하기로 했습니다. 단, 코스요리 메뉴는 최소 2가지 이상의 단품메뉴로 구성..

Algorithm 2021.08.31

[Spring] HiddenHttpMethodFilter로 GET,POST를 DELETE,PUT등 으로 받기_Spring Boot설정

브라우저 VIEW단에서 서버로 데이터를 전송할 경우 FORM으로 GET 또는 POST로 전송이 가능하다. FORM에서 전송된 GET 또는 POST 타입은 서버에서 @GetMapping 또는 @PostMapping으로 받을 수 있지만 나머지 DELETE, PUT, PATCH 타입들은 FORM에서 지원하지 않기 떄문에 기존에는 ajax로 타입을 명시하여 전달한 후 @DeleteMapping, @PutMapping, @PatchMapping으로 받았었다. 하지만 HiddenHttpMethodFilter를 사용하면 기존 FORM 방식으로 전송하고 서버에서는 원하는 타입으로 받을 수 있다. 즉, VIEW단에서 기존 FORM의 GET 또는 POST로 전송한 후 서버에서 PUT, DELETE, PATCH등으로 타입을..

Spring 2021.08.26

[Algorithm] 프로그래머스_멀쩡한 사각형_Summer/Winter Coding(2019)

코딩테스트 연습 - 멀쩡한 사각형 가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을 programmers.co.kr 설명 가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을 따라 1cm × 1cm의 정사각형으로 잘라 사용할 예정이었는데, 누군가가 이 종이를 대각선 꼭지점 2개를 잇는 방향으로 잘라 놓았습니다. 그러므로 현재 직사각형 종이는 크기가 같은 직각삼각형 2개로 나누어진 상태입니다. 새로운..

Algorithm 2021.08.25

[Algorithm] 프로그래머스_카카오프렌즈 컬러링북_2017 카카오코드 예선

코딩테스트 연습 - 카카오프렌즈 컬러링북 6 4 [[1, 1, 1, 0], [1, 2, 2, 0], [1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 3], [0, 0, 0, 3]] [4, 5] programmers.co.kr 카카오프렌즈 컬러링북 설명 출판사의 편집자인 어피치는 네오에게 컬러링북에 들어갈 원화를 그려달라고 부탁하여 여러 장의 그림을 받았다. 여러 장의 그림을 난이도 순으로 컬러링북에 넣고 싶었던 어피치는 영역이 많으면 색칠하기가 까다로워 어려워진다는 사실을 발견하고 그림의 난이도를 영역의 수로 정의하였다. (영역이란 상하좌우로 연결된 같은 색상의 공간을 의미한다.) 그림에 몇 개의 영역이 있는지와 가장 큰 영역의 넓이는 얼마인지 계산하는 프로그램을 작성해보자. 위의 그..

Algorithm 2021.08.24