본문 바로가기
  • 개발하는 곰돌이

2023/059

[Spring Security] Spring Security 예외를 @ControllerAdvice와 @ExceptionHandler를 사용하여 전역으로 처리해보자 이 글은 이전의 [Spring Security] Spring Security와 JWT를 사용하여 사용자 인증 구현하기(Spring Boot 3.0.0 이상)에서 진행했던 예제 프로젝트에서 이어집니다. [수정사항] 2023-05-25 : 스프링 시큐리티 설정이 잘못되어 발생했던 문제의 필터 관련 내용 제거 목차 들어가기 전에 예외 처리를 해놓지 않은 예제 프로젝트 Github : Kotlin, Java 애플리케이션을 개발하다 보면 다양한 이유로 예외 처리를 하게 된다. 그중 스프링이나 스프링부트로 개발되는 경우라면 중복되는 try-catch를 줄이기 위해 @ControllerAdvice 또는 @RestControllerAdvice에서 @ExceptionHandler를 사용하여 API 호출 과정에서 발생하는.. 2023. 5. 24.
[Spring Security] Spring Security와 JWT를 사용하여 사용자 인증 구현하기(Spring Boot 3.0.0 이상) [수정사항] 스프링 시큐리티 6.1부터 SecurityFilterChain의 일부 설정들을 메소드체이닝으로 설정하는 방식이 Deprcated 되고 7부터 삭제될 예정이어서 람다를 사용한 방식으로 코드 수정 목차 시작하기 전에 글을 작성한 계기 예전에 REST API만 제공하는 백엔드 프로젝트를 진행하는 과정에서 API 사용 권한을 제한하기 위해 스프링 시큐리티와 JWT를 사용한 적이 있다. 이 때는 스프링 시큐리티와 JWT에 대한 지식이 전무해서 해당 부분은 다른 분이 작성해주신 것을 사용했다. 프로젝트 개발이 종료되고 관련 내용을 알아두는게 좋을 것 같아서 이리저리 관련 내용을 뒤적거리면서 해당 내용을 적용한 예제 프로젝트를 진행했다. 이 과정에서 진행한 과정들을 정리해보았다. 다만, 스프링 시큐리티와.. 2023. 5. 22.
[Spring Security] Spring Boot 3.0 이상에서 스프링 시큐리티 적용 시 H2 콘솔에 접속되지 않는 문제 해결 목차 문제의 상황 스프링부트 3.0.X 버전을 공부하면서 스프링 시큐리티와 JWT로 사용자 인증 기능을 설정해보기 위해 H2 DB에 사용자 정보를 저장해서 DB에 저장된 데이터를 토대로 테스트해보려고 했다. JWT를 사용했기 때문에 SessionCreationPolicy는 STATELESS로 설정했고, 로그인도 로그인 API를 호출해서 사용하기 위해 따로 formlogin() 없이 시큐리티 설정을 했다. @Configuration class SecurityConfig { private val allowedUrls = arrayOf("/", "/swagger-ui/**", "/v3/**", "/sign-up", "/sign-in", "/h2-console/**") @Bean fun filterChain(h.. 2023. 5. 19.
[Kotlin] 백준 14943 : 벼룩 시장 문제 링크 14943번: 벼룩 시장 벼룩시장에서 사람들이 벼룩을 사고 판다. 놀랍게도 각 사람들이 사려고 하는 벼룩의 합과 파는 벼룩의 합은 같다. 벼룩을 사거나 파는 사람들은 서로 일렬로 길게 서 있으며, 인접한 가게 사이 www.acmicpc.net 문제 해설 각 사람들이 사려고 하는 벼룩의 합과 파는 벼룩의 합이 같다는 점이 문제 풀이에 큰 도움이 된다. 벼룩을 가장 저렴하게 배달하려면 결국 가장 가까운 사람들에게 벼룩을 배달해야 한다. 문제에서 양수는 벼룩을 파는 사람, 음수는 벼룩을 사는 사람이라는 조건이 있다. 사려고 하는 벼룩의 합이 파는 벼룩의 합과 같고, 벼룩을 가장 저렴하게 배달하려면 가장 가까운 사람에게 배달해야 하기 때문에 시작점에서 출발하여 각 지점의 모든 벼룩을 배달할 벼룩에 추.. 2023. 5. 15.
[WebClient] Mono에 담긴 List를 하나로 합치기 문제 상황 Spring WebClient를 통해 외부 API를 호출하는 과정에서 파라미터만 바꿔서 동일한 API를 여러 번 호출할 일이 있었다. 이 과정에서 각 API 호출 응답으로 받은 JSON을 DB에 저장하기 위해 엔티티 형태에 맞게 변경하여 엔티티의 리스트로 만들었다. 문제는 모든 API 호출을 비동기로 진행했기 때문에 실제 반환값은 엔티티의 리스트가 담긴 Mono 객체였다. 평범한 리스트였다면 그냥 List.addAll()을 통해 합칠 수 있겠지만 Mono 객체라서 불가능했다. 해결 방법 그렇게 방법을 찾던 중에 Stack Overflow에서 방법을 찾았다. Mono의 flatMapMany()와 Flux의 fromIterable()을 사용하면 Mono 객체를 Flux 객체로 변환할 수 있다. M.. 2023. 5. 14.
방문자수 1만명 달성한 김에 하는 회고 첫 글이 작년 11월 18일이었으니 173일만에 누적 방문수 1만을 찍었다. 사실 글재주도 별로 없고 글을 써본적도 거의 없어서 그냥 머릿속에 생각나는대로 정리해서 글을 쓰는 경우가 많았다. 그러다보니 글을 다 쓰고 이렇게 써도 되나? 싶다가도 냅다 쓰는 편이었다. 아직 실무 경력이 짧기도 하고 접해보지 못한 것도 많아서 그런지 최근에는 글을 쓸 주제가 마땅히 떠오르지 않을 때가 많다. 막히는 문제가 생겼을 때 구글링을 해보면서 발견하는 흥미로운 해결법들은 나중에 자세히 봐야겠다고 저장해놨다가 까먹는 경우도 꽤 있다. 4월 중순까지는 꾸준히 우상향을 찍다가 요즘 주춤하고 있긴 한데 좀 더 마음을 다잡아야할 것 같다. 뭐 그래도 매일 150분 내외로 방문해주시는건 다행이라고 해야할까...? 부족한 내용들이.. 2023. 5. 10.
[Kotlin] 확장 함수와 람다를 사용해서 중복 코드를 제거해보자! 목차 확장 함수 확장 함수는 특정 타입에 실제로 존재하는 메소드는 아니지만, 해당 타입의 메소드 처럼 사용할 수 있는 함수이다. 예를 들어, 문자열의 \(i\)번째 문자와 \(j\)번째 문자를 맞바꾼 새로운 문자열을 반환하는 확장 함수는 아래와 같이 작성할 수 있다. fun String.swapChar(i: Int, j: Int): String { val sb = StringBuilder(this) sb[i] = this[j] sb[j] = this[i] return sb.toString() } 여기서 String.은 String 타입에 대한 확장 함수라는 것을 나타내며 확장 함수 내부의 this는 이 확장 함수를 사용하는 객체를 의미한다. 이렇게 작성한 확장 함수는 다음과 같이 사용할 수 있다. fun.. 2023. 5. 8.
[Kotlin] 백준 1700 : 멀티탭 스케줄링 문제 링크 1700번: 멀티탭 스케줄링 기숙사에서 살고 있는 준규는 한 개의 멀티탭을 이용하고 있다. 준규는 키보드, 헤어드라이기, 핸드폰 충전기, 디지털 카메라 충전기 등 여러 개의 전기용품을 사용하면서 어쩔 수 없이 각종 전 www.acmicpc.net 문제 해설 OS의 페이징 기법을 모티브로 한 문제인 것 같다. 멀티탭 구멍의 개수는 메모리의 크기를, 각 전기용품은 메모리에 적재되는 페이지라고 볼 수 있다. 페이징 기법을 위한 페이지 교체 알고리즘은 FIFO, LRU, LFU 등 다양한 종류가 있는데, 이 문제에서 사용할 알고리즘은 OPT(Optimal) 알고리즘이다. OPT 알고리즘은 아래와 같이 동작한다. 이미 메모리에 페이지가 적재되어 있으면 다음 페이지로 넘어간다. 메모리에 페이지가 적재되어.. 2023. 5. 4.