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

spring boot32

[Spring] WebClient로 외부 API를 호출하여 받은 JSON을 객체로 역직렬화할 때 대문자 필드가 바인딩되지 않는 문제 문제의 배경 기존에 WebClient로 외부 API를 호출하여 받은 JSON을 Gson 라이브러리를 통해 JsonObject로 받아서 사용하고 있던 것을 좀 더 객체지향스럽게(?) 변경하기 위해 자바 객체로 받아서 처리하도록 리팩토링하는 작업을 하고 있었다. 아래는 API의 응답으로 받는 JSON과 기존에 JSON을 JsonObject로 받아서 사용하던 코드의 일부이다. { "status": "success", "error": null, "listData": [ { "CLIENT_CODE": "123456", "DATE": "2023-06-01", "AMOUNT": 12345 }, ... ] } public Mono apiResponse(Map params) { MultiValueMap formData .. 2023. 6. 29.
[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.
[Spring Boot] 스프링부트 실행 시 나타나는 배너를 바꿔보자 목차 시작하기 전에 스프링부트로 애플리케이션을 개발하는 개발자라면 굉장히 익숙할 스프링 배너. 하지만 너무 자주 보는 배너라 그런지 가끔씩 질린다는 느낌이 들 때가 있다. 이런 경우에 새로운 기분을 느끼기 위해 콘솔에 찍히는 배너를 마음껏 커스텀해보자. 스프링부트 배너 교체 스프링부트는 기본적으로 프로젝트 경로 내부의 resources/banner.txt 파일에 작성된 내용을 출력하고, 해당 파일이 없을 경우에는 위의 아주 익숙한 스프링 배너를 출력한다. banner.txt를 만들고 아무 내용도 입력하지 않으면 이렇게 아예 배너가 나오지 않고 ============ 스프링부트 배너! ============ 내용을 입력하면 이렇게 입력한 내용이 출력되는 것을 볼 수 있다. 하지만 단순 텍스트만 출력되니까 .. 2023. 4. 14.
[WebClient] WebClient를 사용하여 외부API 호출 후 처리할 비즈니스 로직을 비동기로 처리해보기 목차 문제의 상황 프로젝트를 진행하다 보면 여러 개의 외부 API를 호출하고 그 응답을 토대로 어떤 동작을 수행하는 경우가 있다. 일반적으로 많이 사용하던 RestTemplate의 경우에는 스프링 5.0부터 사소한 변경이나 버그 수정만 반영된다고 하길래 사실상 deprecated된게 아닌가 생각한다. 마침 스프링 5.0에 새로 추가된 WebClient가 비동기 방식도 지원한다고 하여 RestTemplate 대신 사용하고 있었다. WebClient를 사용하여 외부 API를 비동기 방식으로 호출하는 예제는 찾기 쉬웠지만 정작 외부 API의 응답을 토대로 추가적인 로직을 수행하는 예제는 사실상 없다시피 했다. 그래서 비동기 방식을 지원한다는 WebClient의 특성이 무색하게 CompletableFuture를.. 2023. 4. 12.
[Kotlin + Spring Boot] 코틀린 + 스프링부트에서 Slf4j를 사용하여 로그 찍기 목차 서론 자바 + 스프링부트를 사용할 때는 대부분 Lombok을 사용하여 각종 어노테이션으로 객체나 메소드들을 생성하게 된다. Slf4j의 Logger 객체 역시 클래스 위에 Lombok의 @Slf4j를 붙여주는 것으로 편하게 생성할 수 있다. 그러나 코틀린에서는 아직 Lombok을 제대로 지원하지 않는다. 따라서 @Slf4j 어노테이션을 사용하여 Logger 객체를 생성하는 방법 역시 사용할 수 없다. 그렇다면 직접 Logger 객체를 생성해야 하는데 코틀린 + 스프링부트에서 Slf4j의 Logger 객체를 생성하는 방법이 여러 가지 있어서 한 번 정리해보려고 한다. Logger 객체 생성방법 기본 Slf4j의 Logger 객체를 생성하는 가장 기본적인 방법은 아래와 같이 클래스 내부에서 Logger.. 2023. 4. 6.
[Kotlin/JPA] 코틀린과 JPA를 함께 사용할 때 추가적으로 설정해야 하는 것들과 Data class 목차 개요 JPA는 자바 진영에서 DB와 연동하기 위해 사용하는 기술 중 하나이다. 자바와 100% 호환되는 코틀린의 특성상 JPA 역시 사용할 수 있긴 하지만 기본적으로 자바에 맞춰진 기술이다 보니 코틀린과 JPA를 함께 사용할 때 문제없이 사용하기 위해선 추가적으로 설정해야 할 것들이 있다는 것을 알게 되었다. 이 글에서는 코틀린과 JPA를 함께 사용할 때 추가적으로 설정해야 하는 것들과 그 외의 주의사항에 대해 정리한다. JPA의 구현체는 가장 많이 사용되는 하이버네이트를 따른다. JPA의 Entity가 갖는 요구사항 우선 왜 이러한 설정을 사용해야 하는지, 또 왜 이런 사항을 주의해야 하는지를 이해하기 위해선 JPA의 엔티티가 갖는 요구사항을 알 필요가 있었다. 하이버네이트 사용자 가이드에서 이야.. 2023. 3. 29.