Spring Framework
-
SpringApplicationRunner란? (+ 동작과정)Spring Framework 2023. 9. 8. 00:01
개요 Spring Boot를 실행했을 때 매번 특정 코드를 호출하는 방법에 대해 알아보다가 알게 된 Spring ApplicationRunner에 대해서 알아보고자 합니다. ApplicationRunner @FunctionalInterface public interface ApplicationRunner { /** * Callback used to run the bean. * @param args incoming application arguments * @throws Exception on error */ void run(ApplicationArguments args) throws Exception; } Bean이 SpringApplication 내에 포함될 때 실행되어야 함을 나타내는 데 사용되는 인..
-
놓치기 쉽지만 중요한 @Transactional RollbackSpring Framework 2023. 9. 7. 00:01
개요 트랜잭션에 대해서 놓치기 쉬운 개념들을 정리해보고자 합니다. 최대한 많은 내용을 담기 위해 핵심개념위주로 글을 작성해보고자 합니다. Spring의 @Transactional 이란? 트랜잭션이란 데이터베이스에서 주로 사용하는 개념으로 이 연산이 한 번에 묶여서 일어나야 하는지 전부 일어나지 말아야 하는지를 단위를 묶어줄 때 사용합니다. 예를 들어 어떤 시스템에서 회원이 가입하면 이름과 나이를 저장하고 조회해서 사용해야 합니다. 1. 회원가입을 수행할 때 첫 번째로 회원의 이름을 DB에 저장했습니다. 2. 두 번째로 회원의 나이를 DB에 저장했습니다. 이때 2번째 작업을 수행하다가 예상치 못한 오류가 발생했다면 회원의 이름만 남아있고 나이는 존재하지 않는데 이런 의도치 않는 상황에서 데이터 정합성을 지..
-
ServletRequest 여러번 읽기 - ContentCachingRequestWrapperSpring Framework 2023. 9. 6. 00:01
개요 Spring에서 request/response를 다루게 되면 HttpServletRequest/HttpServletResponse를 사용합니다. 이때 최상위 인터페이스는 ServletRequest이며 getInputStream의 경우에는 한 번만 읽을 수 있습니다. 만약 이미 한번 request값을 읽고, 컨트롤러에서 @RequestBody로 2번 읽으려 한다면 HttpMessageNotReadableException가 발생하게 됩니다. 또는 이미 Reader를 사용했다면 다음과 같은 예외 메시지가 나타납니다. java.lang.IllegalStateException: getInputStream() has already been called for this request 이때 Sprinrg의 Con..
-
Json 파싱시 없는 필드 무시(@JsonIgnoreProperties)Spring Framework 2023. 8. 31. 00:01
개요 개발을 진행하다 보면 메시지를 받거나, 외부 API응답을 받아올 때 객체가 String형태로 변환되어 해당 형태를 다시 객체로 만들 필요가 있습니다. 이때 받아오는 필드들이 100개가 있고 나는 여기서 2개만 관심 있는 경우도 종종 있을 수 있습니다. 또는 API가 V1 -> V2로 변경되면서 나도 모르게 메시지의 형식이나 외부 API 응답이 달라지게 되면 어떻게 될까요? 응답 파싱시 장애가 발생할 수 있습니다. 이럴 때 유용하게 사용할 수 있는 @JsonIgnoreProperties에 대해 알아보고자 합니다. @JsonIgnoreProperties JavaDocs 설명 Annotation that can be used to either suppress serialization of properti..
-
Spring 트랜잭션 외부 API 호출 rollbackSpring Framework 2023. 8. 28. 00:01
개요 Spring Framework를 활용하다 보면 데이터 무결성을 지키기 위해 @Transaction 어노테이션을 활용하곤 합니다. 하지만 외부 API 호출이 포함될 경우에는 어떤 문제가 발생할 수 있을까요? Github Code https://github.com/Junuu/spring-study/tree/main/transactional-outer-call Rollback 만약 중간에 Exception이 발생하여 rollback이 되었다고 외부 호출은 rollback 될까요? @RestController class TransactionalAndConnectionTestController( private val testService: OuterService, private val testReposito..
-
feign client ErrorDecoder 분석Spring Framework 2023. 8. 25. 00:01
개요 feignClient를 활용하다 보면 에러 핸들링을 해줘야 합니다. 만약 이러한 부분을 신경쓰지 않는다면 Controller에서 500 에러를 반환하게 되고 장애로 인지할 수 있습니다. feignClient는 어떻게 에러를 헨들링할까요? @ExceptionHandler로 처리 feign.FeignException$BadRequest: [400 Bad Request] 에러상황을 처리하다 보면 다음과 같은 메시지를 볼 수 있습니다. FeignException이 발생했고, 여기에서 400 Bad request가 발생했습니다. 그러면Controller 쪽에서 해당 예외를 잡아서 처리하면 되지 않을까요? 모든 예외를 FeignException으로 처리한다면 400과 500 에러의 판단을 Controller에..
-
@Transactional 과 Database ConnectionSpring Framework 2023. 8. 24. 00:01
개요 Spring에서 @Transational 어노테이션을 활용하여 데이터베이스와 통신할 때 보통 Connection Pool을 활용하곤 합니다. 이때 하나의 트랜잭션은 하나의 Database Connection을 활용하는가? 문득 궁금해져 확인해보려 합니다. @Transactional과 Database Connection은 어떤 관계가 있을까요? 준비 - 매우 간단한 Save @Service class TestService( private val testRepository: TestRepository, ) { @Transactional fun test(){ testRepository.save(TestEntity(name = "test")) } } 테스트 환경 Spring Boot 3.x Jpa H2 H..
-
Spring Environment란?Spring Framework 2023. 8. 9. 00:01
개요 Spring을 활용하다 보면 local, dev, prod 등 다양한 환경들을 사용하게 됩니다. 이때 환경별로 다르게 처리하고 싶은 경우에 Profile("local"), Profile("dev"), Profile("prod")등을 활용할 수 있지만 이렇게 되면 3가지의 클래스가 생겨나게 됩니다. Spring Environment를 활용하여 이를 제어할 수 있습니다. Spring Environment란? package org.springframework.core.env; public interface Environment extends PropertyResolver { String[] getActiveProfiles(); String[] getDefaultProfiles(); @Deprecated ..