Programming/Spring Boot 101

Spring Boot OAuth2-Client 내부적인 동작 과정

스프링 부트 OAuth2-Client 내부적인 동작 과정 스프링 부트 2.x 버전으로 올라오며 oauth를 연동하는 방법이 크게 변경되었는데요. 아래 내용은 spring-boot-starter-oauth2-client 라이브러리를 적용하여 소셜 로그인(google, naver, kakao)을 구현하는 과정에서 내부적인 동작 과정에 대한 궁금증으로 찾아본 내용입니다. /* 기존(1.5 버전)에서는 'org.springframework.security.oauth:spring-security-oauth2' 라이브러리를 사용하였다면, 2.x 버전부터는 'org.springframework.boot:spring-boot-starter-oauth2-client' 라이브러리를 사용합니다. */ OAuth 2.0의 경..

Spring Event, @TransactionalEventListener 사용하기

@TransactionalEventListener 사용하기 및 propagation.REQUIRES_NEW spring framework 4.2부터 스프링 이벤트의 사용이 간편해졌는데요. 지난 포스팅에서 spring event를 사용하는 이유와 @EventListener를 통한 기본적인 이벤트 처리 방법에 대해서 살펴본 것에 이어, 이번 포스팅에서는 더 향상된 기능인 @TransactionalEventListener에 대해서 살펴볼 예정입니다. 2022.12.23 - [Programming/Spring Boot] - spring 이벤트 사용하기(event publisher, event listener) (이전 포스팅 내용으로 spring event에 대한 기본적인 처리 방법이 궁금하시다면 참고하시면 좋을..

(Spring Security + JWT) Refresh Token을 통한 토큰 재발급에 대해서

Spring Security + JWT / Refresh Token을 통한 토큰 재발급 방식 spring security + jwt를 사용한 인증 방식을 구현할 때, 토큰 재발급은 어떤 방식으로 이루어지는 게 좋을지에 대해 생각해 보며 정리한 내용입니다. * 토큰 재발급의 경우 다양한 방식으로 구현될 수 있으며, 해당 포스팅에서 구현된 방식은 여러 방식 중 하나라는 점 참고 부탁드립니다. Refresh Token을 사용하는 이유 access token은 발급된 이후, 서버에 저장되지 않고 토큰 자체로 검정을 하며 사용자 권한을 인증한다는 stateless(무상태)라는 특징이 있는데요. 때문에 access token이 탈취되면 토큰이 만료되기 전까지 토큰을 가진 사람은 누구나 권한 인증이 가능해진다는 문제..

Spring Boot 초기 데이터 설정 방법 정리(data.sql, schema.sql)

스프링부트 초기 데이터 설정 방법에 대한 정리 스프링부트에서는 데이터베이스 초기 설정을 위해 기본적으로 script(schema.sql, data.sql) 파일을 사용할 수 있는데요. 관념적으로 데이터 정의어(DDL)는 schema.sql 파일에 작성하고 데이터 조작어(DML)은 data.sql 파일에 작성됩니다. 스크립트 파일의 동작은 spring boot 2.4.x 버전과 2.5.x 버전을 기점으로 차이가 있기 때문에 동작 방식에 대해서 알고 적용할 필요가 있는데요. (스트립트 파일을 적용하는 것의 상위 방식으로는 Flyway 또는 Liquibase라고 하는 마이그레이션 도구가 있습니다.) 아래 내용은 Spring Boot 2.4.x 이하 버전과 2.5.x 이상 버전을 기준으로 스프링 부트에서 scr..

@Scheduled 동작 시 timezone 설정 관련하여 발생한 이슈 정리

spring boot 프로젝트에서 스케줄러 작업을 하던 중 발생한 이슈를 정리한 내용입니다. 이슈는 어플리케이션 기동 시 설정한 'TimeZone이 Scheduler 동작 시 적용되지 않는 것'에서 시작되었으며, 이슈에 대한 원인으로는 Scheduler 동작을 위한 클래스들이 Bean 등록되는 시점과 TimeZone을 설정하는 코드가 실행되는 시점의 차이 때문이었는데요. 아래 코드와 내용을 통해 자세하게 살펴보겠습니다. (CommandLineRunner interface를 통한 timezone 설정과 @PostConstruct annotation을 통한 timezone 설정의 실행 시점 차이) 문제가 된 코드 @EnableScheduling @SpringBootApplication public class..

@Transactional 상태에서 Exception이 발생했을 때 Rollback 동작 과정

@Transactional 어노테이션을 통해 트랜잭션을 선언하고 메서드 내부 로직을 짜던 중 '트랜잭션 안에서 발생하는 예외와 그 예외를 처리하는 방법에 따라 어떻게 롤백이 되는지'에 대한 개념이 명확하지 않아 정리해본 내용입니다. 결론을 먼저 말하자면 Unchecked Exception 발생 시에는 트랜잭션이 롤백되지만, Checked Exception 발생 시에는 트랜잭션이 롤백되지 않는데요. 이어지는 내용을 통해 Unchecked Exception, Checked Exception에 대한 간단한 정리와 더불어, 각 상황에 따른 코드 예시와 동작 과정, 그리고 결과를 살펴보겠습니다. Checked Exception, Unchecked Exception - Checked Exception Compile..

spring 이벤트 사용하기(event publisher, event listener)

최근 프로젝트에서 'Spring Event'를 사용하게 되면서 정리한 내용입니다. 아래 내용에서 자세하게 볼 수 있겠지만 Spring Framework 4.2부터 스프링 이벤트의 사용이 간편해졌는데요. 기본적인 적용은 쉽고 간단하지만 실제 프로젝트에서는 @TransactionalEventListener 등의 조금 더 향상된 기능이 많이 사용되는데 해당 포스팅은 spring event 적용에 대한 기본적인 내용을 담았으며, 함께 사용되는 @TransactionalEventListener 어노테이션에 대한 내용은 추후 따로 포스팅하여 해당 글 하단에 링크하도록 하겠습니다. 1. 스프링 이벤트를 사용하는 이유와 장점 spring event를 사용하는 가장 주된 이유는 '서비스 간의 강한 의존성을 줄이기 위함'..

JPA에서 Native SQL Function 사용하는 방법 (MetadataBuilder)

How To Use Native SQL Functions in JPA Queries? JPA 동작 방식과 Dialect SQL은 모든 DBMS에서 공통적으로 사용하는 표준 SQL인 ANSI SQL 외에 DBMS Vender인 MS-SQL, MySQL, Oracle, PostgreSQL 등에서 제공하는 SQL이 있는데요. 각각의 DBMS Vender에서 사용되는 SQL은 문법과 함수가 조금씩 다른 경우가 있는데, 이처럼 SQL 표준에서 벗어난 특정 Vender별 기능을 Dialect(방언)이라고 합니다. /* Oracle에서는 문자열을 자르는 함수로 SUBSTR()가 사용되는 반면, MySQL에서는 SUBSTRING()도 사용할 수 있다거나, Oracle에서는 ID 값을 증가시키기 위해 Sequence를 ..

(Spring Boot) flyway 데이터 마이그레이션 설정 방법

Flyway란? 일반적으로 프로그램의 소스코드를 효과적으로 관리할 수 있게 해주는 형상 관리 도구(Configuration Management Tool)로 Git을 많이 사용하고 있는데요. Flyway는 데이터베이스의 형상 관리를 목적으로 하는 오픈소스 데이터베이스 마이그레이션 툴입니다. * 형상관리(Software Configuration Management) - 소프트웨어의 변경사항을 체계적으로 추적하고 통제하는 것 데이터베이스의 형상 관리를 통해 얻을 수 있는 이점으로는 크게 '데이터베이스 schema의 변경 이력이 남는다'는 것과 '데이터베이스 변경 작업을 안전하게 할 수 있다'는 것이 있는데요. 데이터베이스에서 어떤 문제가 발견되었을 때, 이전에 해당 DB를 수정한 이력이 남아있다면 그 내용을 ..

스프링부트 spring-security-web을 사용한 IP 접근제어

해당 포스팅은 spring-security-web의 IpAddressMatcher와 spring의 interceptor를 활용하여 지정된 ip만 해당 서비스에 접근 가능하도록 설정하는 ip 접근제어를 구현한 내용입니다. (spring-security-web은 org.springframework.boot:spring-boot-starter-security:2.7.3에 포함되어 있습니다.) Interceptor @Component @RequiredArgsConstructor public class IpAddressAccessControlInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest..