본문 바로가기

spring9

[Spring Data JPA] entity update 후 JpaRepository.save 호출에 관하여 통상적으로 Spring Data Jpa를 사용하면 Hibernate를 사용하게 되고, 그로인해 dirty checking도 사용하게 된다. 그렇기 때문에 아래와 같이 코드에 따로 update를 명시하지 않아도, entity의 변경을 감지하여 update 문이 실행된다. import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional public class UpdatePostService { private final Po.. 2023. 1. 9.
[Spring with Kotlin] sealed class로 다양하게 요청 받기 예제 코드는 여기에서 확인할 수 있다. 서버 API를 만들다보면 동일한 리소스에 대해 다른 요청 파라미터를 받아야할 때가 있다. 기본적인 파라미터는 동일하지만 리소스의 타입에 따라 다른 파라미터를 추가적으로 받아야할 때 sealed class를 활용하여 하나의 리소스에 대한 다양한 요청 DTO를 관리할 수 있다. 예를 들어 유저를 등록하는 API가 있다고 하자. 기본적으로 서비스에서 가입 시 유저로부터 이름, (로그인 ID로써)이메일, 비밀번호를 받아야한다면 요청 파라미터는 다음과 같은 data class로 나타낼 수 있을 것이다. data class UserSignUpRequest( @field:NotBlank val name: String, @field:Email val email: String, @.. 2022. 1. 28.
@Profile 대신 @Conditional로 유연하게 Bean 등록하기 @Profile을 사용하면 spring.profiles.active에 따라 Bean을 등록하거나 하지않거나 할 수 있다. 하지만 @Profile은 String 값을 입력받기 때문에 하드 코딩으로 인해 일괄 변경이 힘들 때가 있고, 여러 profile 조건이 붙는 경우 스프링에서 처리할 수 있는 문법을 알아야하는 등 불편한 점이 있다. 그래서 개인적으로 @Profile을 사용하기 보다는 @Conditional을 사용해서 profile 별 Bean 등록 처리하는 것을 선호한다. 이번 포스팅에서는 @Conditional과 이를 사용하여 @Profile을 대체하는 방법에 대해 알아보자. 예제 코드는 여기에서 확인할 수 있다. @Conditional 먼저 @Conditional 에 대해 알아보자 @Conditio.. 2022. 1. 1.
Spring Data JPA - Write, Read Only 분리 적용하기 - 2. 무력화 되는 경우 이전 포스팅을 통해 Spring Data JPA를 사용하면서 AbstractRoutingDataSource, LazyConnectionDataSourceProxy를 사용하여 Write, Read Only DB를 분리하여 사용하는 방법의 원리를 알아보았다. 그럼 이 설정을 무력화하려면 어떻게 하면될까? 앞서 봤던 설정의 핵심은 LazyConnectionDataSourceProxy를 사용하여 DataSource로 부터 Connection을 가져오는 타이밍을 늦추는 것이었다. 그럼 이를 무력화 할 수 있는 방법은 Transaction이 시작되자마자 DataSource로부터 Connection을 가져와 이를 직접 사용하게 만드는 것이다. 이러한 방법 중에 당장 테스트해볼 수 있는 방법은 기존 설정에 p6spy를.. 2021. 12. 18.
Spring Data JPA - Write, Read Only 분리 적용하기 - 1. 설정 및 원리 프레임워크를 사용하여 비지니스 로직이 아닌 특정한 기술을 구현하려면 프레임워크 내부에 대한 충분한 이해가 필요하다. 구글링을 통해 해당 기능의 코드를 알아내더라도 정확하게 내부적인 동작 원리를 아는 것이 좋다는 뜻이다. 그렇지 않다면 해당 코드 관련해서 이슈가 생겼을 때 원인을 파악하고 적절한 조치를 취하기가 어렵거나 불가능할 수도 있다. 이번 포스팅에서는 Spring Data JPA를 사용할 때 DB의 부하를 분산시키기 위해 주로 사용하는 기법인 @Transactional에 readonly=true 옵션을 줬을 때 Read Only(Secondary) DB를 사용하고, 그렇지 않은 경우(쓰기를 할 때) Write(Primary) DB를 사용하는 방법에 대해 설정과 내부적인 원리를 알아보고, 다음에는 이.. 2021. 12. 17.
Testcontainers MongoDB init script 실행하기 통합 테스트를 하다보면 가끔씩 인프라에 대해 init script(초기화 스크립트)를 작성하고 실행해야할 때가 있다. 이번 포스팅에서는 Spring Application에서 통합 테스트 시 테스트 인프라를 설정하기 위해 자주 사용되는 Testcontainers와 DB Module 중 하나인 MongoDB Module을 사용했을 때 초기 데이터를 위해 init script를 어떻게 실행할지에 대해 알아보도록 하겠다. (예제는 여기에서 확인할 수 있다.) 프로젝트 생성 Spring Boot 프로젝트를 아래와 같이 Spring Data MongoDB, Testcontainers 의존성을 추가하고 생성한다. 예제 도메인 클래스 추가 프로젝트 생성 후 MongoDB에 저장할 도메인 클래스를 추가하자 import .. 2021. 10. 29.