Spring
[Spring] RestClient 에서 Okhttp3 라이브러리를 사용할 때 주의할 점
이 글은 실무에서 겪은 이슈의 원인과 해결, 문제 분석을 회고 형식으로 작성한 글입니다. 결론만 보아도 무방합니다! 1. 개요 (문제 상황)사내에서 스프링 부트 버전을 3.2.3 으로 업그레이드를 하면서 HTTP 클라이언트로 RestClient 를 도입하기로 했습니다. RestClient 는 스프링 부트 3.2.x 버전부터 사용할 수 있으며 RestTemplate 을 더이상 유지보수 하지 않게 되면서 스프링 진영에서 권장하고 있는 HTTP 클라이언트 입니다. WebClient 도 있긴 하지만 따로 spring-cloud 의존성을 추가해야 하기 때문에 후보에서 제외되었습니다. 잠깐 RestClient 의 장점에 대해서 설명하자면 fluent 한 API 를 제공하고 체이닝 메서드를 제공하기 때문에 가독성이..
[Spring] @Async 애노테이션에서 커스텀 스레드풀 이름을 설정해줬을 때 따로 빈으로 등록하지않아도 스프링컨테이너가 구동된다구??
1. 발단별도의 커스텀 스레드풀을 빈으로 등록해주지 않고 @Async("customThreadPoolExecutor") 를 메서드에 붙여주고 스프링 컨테이너를 실행했을 때 당연히 빈을 못찾아서 실행부터 오류가 날거라고 생각했다.@Servicepublic class MyService { @Async("customTaskExecutor") public void performAsyncTask() { // 비즈니스 로직 System.out.println("비동기 작업 실행: " + Thread.currentThread().getName()); }}하지만 스프링 컨테이너는 잘 실행되었고 해당 기능을 호출하기 전까지 아무런 문제없이 구동되고 있었다.그리고 해당 기능이 호출되..
[spring-authorzaiton-server] RegisteredClient를 JPA 로 구현하기
1. Spring Authorization Server 의 Core Model 을 알아보자 1) RegisteredClient인가 서버에 등록된 클라이언트를 의미한다.OAuth2.0 또는 OAuth2.1 을 통해 인증 및 권한 부여를 요청하는 클라이언트를 구성하는데 사용된다.예를 들어, 클라이언트가 authorization_code 또는 client_credentials 와 같은 권한 부여 흐름을 시작하려면 먼저 클라이언트를 권한 부여 서버에 등록해야한다.클라이언트 등록시 클라이언트는 고유한 client_id, client_secret 및 고유한 클라이언트 식별자와 연결된 메타 데이터를 할당한다.클라이언트의 주요 목적은 보호된 리소스에 대한 액세스를 요청하는 것으로 클라이언트는 먼저 권한 부여 서버를 인..
[Spring Boot 3.2 마이그레이션] @TransactionalEventListener 사용시 트랜잭션을 분리하고 싶다면 반드시 전파속성을 명시해라!
문제Spring Boot 2.7 에서 3.2.3 로 마이그레이션을 하던 중 아래와 같은 에러가 발생했다. 원인에러 내용을 읽어보면 @TransactionalEventListener 가 쓰인 곳에서 @Transactional 을 사용하려면 반드시 REQUIRES_NEW 또는 NOT_SUPPORTED 전파속성을 명시해야 한다고 한다.에러가 발생한 코드는 스프링 이벤트 리스너를 사용하면서 커밋된 후 이벤트를 발생시키기 위해서(관심사와 비관심사 로직을 분리하기 위해)@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) 을 사용했고 이 트랜잭션과 분리하여 새 트랜잭션에서 커밋을 발생시키기 위해 @Transactional 을 같이 사용하였다. @T..
[Spring Boot 3.2 마이그레이션] hibernate @Type, @TypeDef deprecated
개요 postgresql 에서 jsonb 타입으로 데이터를 저장하고 있었다. spring boot 2.7.6 버전을 사용중이었고 spring boot 3.2.3 로 버전업을 하게 되면서 @Type, @TypeDef 가 deprecated 되었다. 해결 @JdbcTypeCode(SqlTypes.JSON) 또는 AttributeConverter 를 새로 만들어주면 된다는데 postgresql 에서는 dependency 만 새로 바꿔주면 된다! https://github.com/vladmihalcea/hypersistence-utils GitHub - vladmihalcea/hypersistence-utils: The Hypersistence Utils library (previously known as Hi..
[SpringDataJPA] @Modifying 과 @Query 의 관계와 동작방식 (@Query 없이 @Modifying 만 사용한다면 어떻게 될까?)
1. @Modifying 이란? @Modifying 어노테이션은 @Query 어노테이션으로 작성된 수정, 삭제 쿼리 메소드를 사용할 때 필요하다. 즉, 조회 쿼리를 제외하고 데이터에 변경이 일어나는 INSERT, UPDATE, DELETE 쿼리에서 사용한다. @Modifying 어노테이션은 @Query 와 같이 사용되며 벌크 연산을 하고 싶을 때 사용한다. ex. 나이가 20살인 모든 회원의 주류 구매 가능 여부 업데이트 UPDATE SET isAvailiablePurchase WHERE age >= 20; @Modifying 의 내부 옵션을 보면 flushAutomatically() 와 clearAutomatically() 가 존재하는 것을 알 수 있다. (참고: https://docs.spring.i..