본문 바로가기

분류 전체보기

(125)
SpringSecurity + CustomAuthenticationProvider 만들기 Rest API로 만든 메서드에 로그인 시도를 하면 아이디와 비밀번호가 틀렸을 때 어느 부분이 틀렸는지를 알려주려 하는데, 스프링 시큐리티에서는 AuthenticationProvider 디폴트 구현체가 내부적으로 인증을 수행하여 반환한다. 따라서 아이디와 비번이 틀린 경우에 따라 오류 메시지를 다르게 하기 위해서는 AuthenticationProvider를 커스텀하여 인증을 직접 수행해야 한다. 다행히도 스프링 시큐리티에선 이러한 부분들을 구조화 해놓았기 때문에, 인터페이스만 맞추어 구현하기만 하면 된다. 내가 수행하는 부분은 4이다. AuthenticationManager가 AuthenticationProvider에게 인증 책임을 넘기게 되는데, CustomAuthenticationProvider 구현..
스프링부트 AWS에 배포 실습 후기 책 스프링부트와 AWS로 혼자 구현하는 웹서비스 (이동욱 저)를 실습하고 수정된 부분과 후기를 적어보려 한다. 코드 타이핑 후기를 적는게 아니라 실수한거나 변경된 점들을 적는 것이니 오해없길 바란다. Travis CI UI가 달라져서 헷갈렸는데 매칭되는 부분을 잘 읽어봐야 한다. 그리고 Organization은 유료로만 적용이 가능한가보다. 그래서 개인용으로 부랴부랴 옮겼다. .travis.yml 파일을 정의해야 하는데, 보안상 중요한 키 값은 설정에서 환경변수로 정의할 수 있다. 각 동작을 정의할 수 있는데, 언어, 브랜치, 배포 등등의 행동을 정의하여 원하는 동작을 수행시키면 된다. 그리고 메일로 알림이 오도록 했는데, 처음 한 두번은 오더니 그 이후부턴 안온다. 타이핑 오류가 발생하면 에러로그가 디..
11062 카드 게임 https://www.acmicpc.net/problem/11062 11062번: 카드 게임 근우와 명우는 재미있는 카드 게임을 하고 있다. N개의 카드가 일렬로 놓여 있다. 각 카드에는 점수가 적혀있다. 근우부터 시작하여 번갈아가면서 턴이 진행되는데 한 턴에는 가장 왼쪽에 있는 www.acmicpc.net N이 1000이기 때문에 브루트포스를 수행하면 2^500으로 시간초과가 난다. 어떻게 연산을 줄일 수 있을까 고민하다 다이나믹 프로그래밍까지 떠올리긴 했지만 점화식을 세우기 어려웠다. 우선 이 문제는 모든 경우의 수를 탐색해야 한다. 왼쪽과 오른쪽을 고른 경우가 각각 최대 점수를 얻는게 달라지기 때문이다. 즉, 근우의 차례엔 근우의 점수가 최대가 되게 하고, 명우의 차례엔 근우의 점수가 최소가 되도록..
22254 공정 컨설턴트 호석 https://www.acmicpc.net/problem/22254 22254번: 공정 컨설턴트 호석 거듭된 창업 성공을 이룬 류진국 사장은 이번에는 맞춤형 선물을 제작해주는 공장을 만들기로 했다. 현재 들어온 맞춤형 선물 주문은 총 $N$개이며, 각 맞춤형 선물마다 제작에 필요한 시간이 정 www.acmicpc.net 접근 1. X시간 내에 모든 선물을 완성할 수 있는 최소 라인 수를 요구한다. 1부터 N까지 선형탐색으로 찾을 수 있지만, N이 10만이고, X가 10억이기 때문에 시간 초과가 발생할 수 있다. 따라서 log의 복잡도로 줄이기 위해 이분탐색을 사용해야 한다. 2. 최적해를 찾기 위해서는 가장 작은 라인의 공정 시간 + i번째 선물의 공정 시간으로 계산해야 한다. 따라서 우선순위 큐를 사용..
1938 통나무 옮기기 문제: https://www.acmicpc.net/problem/1938 1938번: 통나무 옮기기 첫째 줄에 주어진 평지의 한 변의 길이 N이 주어진다. (4 ≤ N ≤ 50) 주어진다. 이어서 그 지형의 정보가 0, 1, B, E로 이루어진 문자열로 주어진다. 한 줄에 입력되는 문자열의 길이는 N이며 입력 문 www.acmicpc.net 통나무 옮기는 방향을 상하좌우, 회전 5가지로 구분할 수 있다. 각각의 방향으로 이동한 상태를 기억하기 위해 BFS를 사용하기 적합하다 판단했고, 다음 상태로 이동하기 전에 나무가 있는지, 범위를 벗어나지 않는지를 확인하여 탐색하면 답을 구할 수 있다. 범위를 벗어나는 경우를 좀 더 쉽게 처리하기 위해 기존의 맵을 감싸는 영역을 나무로 저장하도록 했다. import ..
9205 맥주 마시면서 걸어가기 문제: https://www.acmicpc.net/problem/9205 9205번: 맥주 마시면서 걸어가기 송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다. www.acmicpc.net 시작 지점부터 근처의 편의점을 들를 수 있다면, 탐색하여 진행하는 과정이 BFS와 유사했고, N의 크기가 100이하로 작기 때문에, BFS로도 충분히 해결할 수 있다고 판단했다. 음수 좌표 값을 간편하게 처리하기 위해서 시작 지점과, 편의점, 도착 지점들을 클래스의 인스턴스로 생성하여 hashmap의 형태로 키에 넣었다. 이후 맨해튼 거리가 1000이하라면 큐에 넣어 탐색하도록 구현했..
16987 계란으로 계란치기 문제: https://www.acmicpc.net/problem/16987 16987번: 계란으로 계란치기 원래 프로그래머의 기본 소양은 팔굽혀펴기를 단 한 개도 할 수 없는 것이라고 하지만 인범이는 3대 500을 넘기는 몇 안되는 프로그래머 중 한 명이다. 인범이는 BOJ에서 틀린 제출을 할 때마다 턱 www.acmicpc.net 문제의 조건이 복잡하게 되어 있어 헷갈렸던 문제였다. 조건을 살펴보면 상태를 기억하기 위한 재귀 호출이 필요하다는걸 눈치챌 수 있는데, 계란을 치고 내구도가 감소된 상태에서 다음 계란을 칠 지 판단하는 것, 내구도가 0이하인 계란은 더 이상 치지 않고 다음 계란으로 넘어가는 조건을 통해 판단했다. N의 크기가 작기 때문에 브루트포스로 전부 탐색해도 무리가 없다. import ..
16197 두 동전 문제를 풀기 위해 조건에 유의하여 접근해야 한다. 1. 두 개의 동전이 빠져나가는 경우는 제외한다. 2. 동전의 다음 방향에 벽이 있다면, 이동할 수 없다. 3. 두 동전은 함께 이동한다. 4. 동전의 이동 횟수가 10번을 초과하면 취소한다. 정답을 찾기 위해서는 위의 조건을 만족하는 모든 경우를 탐색해야 한다. 따라서 DFS와 유사하게 접근했다. 접근 방식 1. base case로 10번을 초과하는 경우라면 탐색을 종료한다. 2. 두 동전의 다음 좌표를 계산한다. 2.1 두 동전이 모두 범위를 벗어난다면 탐색을 종료한다. 2.2 하나의 동전만 범위를 벗어난다면 최소 이동 횟수를 저장하고, 탐색을 종료한다. 3. 다음 칸이 벽이라면, 원래 좌표로 값을 갱신한다. 4. 상하좌우로 탐색을 진행한다. impo..
Filter, Interceptor, AOP 차이에 대한 정리 공통 프로세스에 대한 고민 자바 웹 개발을 하다보면, 공통적으로 처리해야 할 업무들이 많다. 예를들어 로그인 관련(세션체크)처리, 권한체크, XSS(Cross site script)방어, pc와 모바일웹의 분기처리, 로그, 페이지 인코딩 변환 등이 있다. api마다 공통 로직을 작성하게 되면 코드 중복으로 인해 관리하기 까다로워지고, 다른 도메인 로직에 섞여들기 때문에 가독성을 해친다. 따라서 공통 로직을 한 곳에 모으고, 선택적으로 적용하는 것이 필요하다. Spring에서 위와 같은 상황에 적용하기 위한 3가지 방법이 있다. Filter, Interceptor, AOP의 흐름 - Interceptor와 Filter는 Servlet 단위에서 실행된다. 반면 AOP는 Proxy 패턴으로 실행된다. - 요청..
2251 물통 https://www.acmicpc.net/problem/2251 2251번: 물통 각각 부피가 A, B, C(1≤A, B, C≤200) 리터인 세 개의 물통이 있다. 처음에는 앞의 두 물통은 비어 있고, 세 번째 물통은 가득(C 리터) 차 있다. 이제 어떤 물통에 들어있는 물을 다른 물통으로 쏟아 부 www.acmicpc.net 각 물통의 특징에 유의해서 보자. 모든 물통의 용량이 200이하 이고, 3개이다. 즉, 3가지 물통의 상태를 3차원 배열로 나타낼 수 있다. 이를 바탕으로 bfs를 수행하면 모든 상태를 탐색할 수 있다. 방문한 상태를 다시 탐색하지 않기 때문이다. 답을 구하는 과정은 중간에 첫 번째 물통의 용량이 0일 때 TreeSet에 넣도록 했다. 고찰: 물통의 물을 다른 물통에 옮기는 과..