Spring Framework
-
Webflux란?Spring Framework/WebFlux 2023. 12. 2. 00:01
Webflux란? Spring 5에서 추가된 웹 프레임워크이며 클라이언트/서버에서 reactive programming 기반의 애플리케이션을 만들 수 있도록 지원합니다. Reactive Programming이란? reactive라는 용어는 변화에 반응하는 것을 중심을 두고 만든 프로그래밍 모델을 의미합니다. 데이터가 변경될 때마다 이벤트를 발생시켜서 데이터를 전달합니다. 데이터를 비동기적으로 처리하며 이벤트 기반 아키텍처를 통해 실시간으로 데이터의 변화에 반응할 수 있게 프로그래밍을 수행합니다. 주요하게 나오는 개념으로 옵저버 패턴이 있으며 Subscriber와 Publisher가 존재합니다. Reactive Programming이 non-blokcing인 이유도 작업이 완료될 때까지 기다리기보다 데이터..
-
FeignClient Response로 Http status 제어하기Spring Framework 2023. 12. 1. 00:01
개요 FeignClient를 다루다 보면 200~300번대가 아닌 상태코드에 대하여 ErrorHandling을 수행해야 할 경우가 있습니다. 하지만 ErrorDecoder에 의해 FeignClient Exception이 발생하곤 하는데 이에 대해서 대응하는 방법을 찾아보고자 합니다. Response객체 public final class Response implements Closeable { private final int status; private final String reason; private final Map headers; private final Body body; private final Request request; private final ProtocolVersion protocolV..
-
FeignClient DecodeException JsonToken.START_OBJECTSpring Framework 2023. 11. 27. 00:01
개요 FeignClient를 사용하다 실수한 부분을 파악하고 공유해보고자 합니다. 에러발생 feign.codec.DecodeException: Error while extracting response for type [java.util.List] and content type [application/json]] with root cause com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList` from Object value (token `JsonToken.START_OBJECT`) DecodeException이 발생하였고, 주된 내용으로는 JsonTok..
-
Kotlin ObjectMapper 주의사항Spring Framework 2023. 11. 14. 00:01
개요 Kotlin에서는 직렬화 역직렬화를 위해 Jackson을 지원합니다. 의존성 추가 Maven com.fasterxml.jackson.module jackson-module-kotlin 2.15.3 Gradle(Kotlin) implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.15.3") 테스트 클래스 data class Movie( var name: String, var studio: String, var rating: Float? = 1f, ) jacksonObjectMapper 테스트 @Test fun `kotlin에서 지원하는 jacksonObjectMapper를 사용해보기`(){ val objectMapper = jack..
-
Spring Boot proxy-target-class 속성Spring Framework 2023. 11. 10. 00:01
개요 관례적으로 클래스를 인터페이스로 구현하는 이유에 대해 찾아보게 되었고 이후 proxy-target-class라는 것을 알게 되었습니다. 따라서 해당 설정을 실험해보고자 합니다. application.yml spring: aop: proxy-target-class: false 기본값이 true입니다. 해당값을 false로 바꾸면 어떤 일이 일어날까요? false - Jdk Dynamic Proxy를 사용한다는 의미로 인터페이스로 구현되어 있지 않다면 AOP가 적용되지 않음! true - CGLIB가 대상 클래스를 상속받아 프락시를 구현해서 인터페이스가 없어도 된다, 클래스가 final인 경우 프락시 생성이 불가능하다. proxy-target-class 속성이란? "description": "Wheth..
-
Spring Boot Graceful shutdown 동작과정Spring Framework 2023. 11. 3. 20:22
개요 Spring Boot Application에서 Controller가 요청을 처리하고 응답이 되지 않았는데 종료요청이 도달하면 어떻게 될까요? Client는 응답을 받지 못하고 timeout이 발생합니다. Spring Boot 2.3에서 제공하는 graceful shutdown에 대해 알아보고, Spring Boot Application이 종료되는 과정을 분석해 보겠습니다. Shutdown public enum Shutdown { //요청들이 완료될때 까지 기다렸다가 종료 GRACEFUL, //즉시 종료 IMMEDIATE; } shutdown 전략에는 IMMEDIATE와 GRACEFUL이 존재합니다. 기본값은 IMMEDIATE로 설정되어 있고, GRACEFUL으로 설정할 시에는 새로운 요청을 거부하고..
-
Spring @Transactional의 rollback 동작과정 디버깅Spring Framework 2023. 10. 30. 00:01
개요 결론적으로는 이번 디버깅을 통해 rollback의 동작과정을 알아보며 runtimeException & Error에만 롤백이 발생하는 이유와 Database 트랜잭션과 관련 없는 로직들이 Rollback 되지 않는 이유에 대해서 이해하였습니다. 의도적으로 예외 발생시키기 @Transactional fun `의도적으로 예외를 발생시키기`() { testRepository.save(TestEntity(name = "firstSave")) throw RuntimeException("의도적으로 runtime Exception을 던지면 rollback이 떻게 발생할까?") } 디버깅을 걸고 추적을 시작합니다. AopUtils invokeJoinpointUsingReflection는 AOP 메서드 호출의 일부..
-
Spring Filter Logging- Spring Filter Hands On 4Spring Framework/Filter 2023. 10. 15. 00:01
개요 Spring Filter를 활용해서 Response, Request에 대한 로깅을 수행해보고자 합니다. 시작 전 주의사항 HttpServletRequest, HttpServletResponse의 경우에 내부적으로 Stream을 사용하기 때문에 ContentCachingRequestWrapper와 ContentCachingResponseWrapper를 사용해주어야 합니다. Stream은 한번 소비하면 재사용할 수 없습니다. Response Request Logging class ResponseRequestLoggingFilter : OncePerRequestFilter() { override fun doFilterInternal( request: HttpServletRequest, response: ..