본문 바로가기

SpringBoot

[Spring boot] Hikari CP 적용 & 커넥션 누수 이슈 데이터베이스와 애플리케이션을 연결해주는 커넥션 풀은 다양한 오픈소스 라이브러리가 존재한다. Apache Commons DBCP Tomcat JDBC Bone CP Hikari CP 등등.. Spring boot 2.0부터는 Hikari CP를 default 커넥션 풀로 채택하고 있다. 따라서, 최근 프로젝트를 생성한 경우라면, 기본적으로 Hikari CP를 사용하기 때문에 굳이 다른 커넥션 풀로 전환하는 일은 드물 것이다. # Hikari CP 적용 Spring Boot가 기본적으로 데이터베이스에 대한 설정을 자동으로 생성해주기 때문에, 해당 설정을 특별히 제외하지 않았고, Spring Boot 2.0 이상의 프로젝트를 생성했다면 property 설정만으로 간단하게 Hikari CP를 구성할 수 있다. .. 더보기
Graceful Shutdown (with nginx & spring boot) Graceful Shutdown ? 정확한 개념에 대해서는 말들이 많지만, 간단히 말해서 현재 들어온 요청을 모두 수행하고 우아하게(?) 종료된다는 개념이다. 예를 들어, 내가 어떠한 상품을 구매하기 위해 결제 요청을 했고, 서버가 결제를 처리하고 있는데, 뭔지 모르는 이유로 서버가 종료될 때 이미 처리하고 있는 결제 요청은 모두 처리하고 종료된다는 것을 의미한다. Graceful Shutdown을 이해하기 위해서는 SIGTERM, SIGKILL에 대한 이해도 필요하다. SIGTERM과 SIGKILL의 이해를 돕기 위한 유명한 그림이 있다. SIGTERM은 위 그림처럼 자식에게 가기 전에 인사할 시간을 준다. 쉽게 말해, 서버에게 종료될 시간을 주는 것이다. SIGKILL은 위 그림처럼 인사할 시간도 안.. 더보기
JPA 변경감지(Dirty Checking)과 OSIV JPA를 사용할 때 변경 감지를 주의해야한다. 아무런 생각없이 중간 데이터 전달 경로로 엔티티의 필드를 건드린다면, 실제로 DB에도 변경이 적용되기 때문이다. 또한 주의해야할 점은 OSIV를 활성화 시켰을 경우이다. 다음 예제를 살펴보자. fun test() { val product1 = productItemRepository.findById(1L).orElse(null) product1.amount = product1.amount + 1 // 엔티티 값 변경 // osiv가 활성화되어있다면 여기서 product1은 영속성컨텍스트에 계속 살아있게된다. (영속 상태) // osiv가 반대로 비활성화 되어있다면 여기서 product1은 영속성컨텍스트에 남아있지 않는다. (준영속 detach 상태) dirty.. 더보기
JPA 영속성 컨텍스트의 1차캐시 & 쓰기지연은 정말 동작하는가? JPA는 엔티티를 영속성 컨텍스트에서 관리한다. 영속성 컨텍스트에 대한 장점을 다시 한번 살펴보면 다음과 같다. 1. 1차 캐시 2. 동일성 보장 3. 트랜잭션을 지원하는 쓰기 지연 4. 변경 감지 이러한 영속성 컨텍스트의 장점은 많이들 접해보고 들어봤을 것이다. 이 글에서는 1차캐시와 쓰기지연에 대해서 좀 더 자세히 알아보도록 한다. 1차 캐시 1차 캐시가 되는 것은 오직 식별자로 쿼리할 때만이 가능하다. 식별자가 무엇인가? 바로 @Id 어노테이션을 붙여둔 Key이다. 다음 예제를 살펴보자. Person(id = 1, name = "A") 위와 같은 Entity가 DB에 저장되어 있다고 가정해보자. 여기서 다음과 같이 쿼리를 하면 어떤 일이 발생할까? val p1 = repository.findByNa.. 더보기
Spring 순환참조(Circular Depencies) 해결하기 스프링에서 빈 순환참조가 일어날 때 회피하는 방법을 알아보자. Redesign 사실상 재설계하는 것이 가장 바람직한 방법이다. 하지만 실제 운용할 때에는 재설계할 수 없는 상황이 허다할 것이다. (레거시와 많이 엮여있거나, 이미 테스트가 끝난 경우) Use @Lazy 가장 심플한 방법으로 주입하는 곳에 @Lazy 키워드를 붙이는 것으로 해결할 수 있다. 완전히 빈을 초기화하는 것 대신에 프록시가 대신 주입되는 방법이다. 실제로 해당 빈이 사용될 때 빈이 주입되는 방식이다. Use Setter/Field Injection 가장 많이 사용되는 순환참조 회피 방법으로 Constructor 주입 방법 대신 Setter, Field 주입 방법을 사용하는 것이다. Use @PostConstructor 빈 주입을 @.. 더보기
[Spring] DI - 빈 주입하기 With Kotlin Spring에서는 빈을 주입하는 방법은 세가지가 있다. Field Setter Constructor Field 우선 첫번째 방법으로는@Autowired 어노테이션을 이용하여 주입하는 방법이다. @Service class UserService { @Autowired private lateinit var userRepository: UserRepository ... // Business Logic } Constructor 다른 방법으로는 생성자에 주입할 객체를 파라미터로 작성하는 방법이다. @Service class UserService(private val userRepository: UserRepository) { ... // Business Logic } 위의 UserService 클래스처럼 생성자가 .. 더보기
[Spring] @Retryable 어노테이션 특정 Exception이 발생했을 경우 일정 횟수만큼 재시도할 수 있는 어노테이션이다. 예를 들어, 서비스 내에서 다른 서비스에 있는 API를 호출할 때 간헐적으로 토신 오류가 발생할 수 있다. 하지만 이때마다 사용자가 에러메세지를 받아본다면 당혹스러울 것이다. 사용법은 아주 간단하다. 1. Spring Application에 @EnableRetry 어노테이션 추가 2. 재시도 하고 싶은 메소드에 @Retryable 어노테이션 추가 - include : 여기에 설정된 특정 Exception이 발생했을 경우 retry한다. - exclude : 설정된 Exception 재시도 제외 - maxAttempts : 최대 재시도 횟수 (기본 3회) - backoff : 재시도 pause 시간 @Retryable(.. 더보기
[Spring] 자동설정 (AutoConfiguration) 스프링에서 그 많던 설정은 스프링부트로 넘어오면서 어디로 사라진걸까?? 스프링부트는 스프링에서 주로 사용했던 설정들을 자동으로 설정한다. 이 기능은 자바의 main 진입점에 @SpringBootApplication 을 붙임으로서 사용할 수 있다. @SpringBootApplication class Application @SpringBootApplication 안에 있는 @ComponentScan 과 @EnableAutoConfiguration 어노테이션을 통해 프로젝트의 스프링 빈을 찾아내어 등록한다. @ComponentScan 은 @Repository @Configuration @Service등을 찾아내어 스프링 빈으로 등록하는 기능을 가진 어노테이션이다. @EnableAutoConfiguration은.. 더보기