Programming/Spring Boot 100

스프링 부트 내장 톰캣 제거 방법 (exclude embedded tomcat)

Spring Boot 내장 톰캣 제거 방법 (exclude embedded tomcat) 'spring-boot-starter-web' 의존성에는 기본적으로 톰캣 라이브러리가 내장되어 있으며, 애플리케이션 실행 시 내장 서블릿 컨테이너인 톰캣(tomcat)이 자동으로 설정되어 동작합니다. 하지만 스프링 부트 프로젝트를 외부 WAS에서 동작해야 하는 경우나, 내장 서블릿 컨테이너를 톰캣이 아니나 다른 것으로 사용하고 싶은 경우, 배치 프로세스나 백그라운드 작업처럼 웹 서버가 필요하지 않은 경우 Spring Boot 내장 톰캣을 제거해야 할 수 있는데요. 아래 내용은 'Spring Boot 프로젝트에서 내장 톰캣을 제거하는 방법 및 내장 서블릿 컨테이너를 톰캣이 아닌 다른 것으로 바꾸는 방법'을 정리하였습니..

스프링부트 내장 톰캣(서블릿 컨테이너) 실행되는 과정

Spring Boot 내장 서블릿 컨테이너가 실행되는 과정 최근 스프링부트 프로젝트의 내장 톰캣을 제거하는 과정에서 '내장 서블릿 컨테이너가 자동으로 실행되는 과정'이 궁금하여 관련 내용을 디버깅하며 정리해 보았습니다. SpringApplication.run() public ConfigurableApplicationContext run(String... args) { // ... ConfigurableApplicationContext context = null; try { // ... // 1. ApplicationContext 생성 context = createApplicationContext(); context.setApplicationStartup(this.applicationStartup); //..

Atomikos를 통한 Multi Datasource Transaction 처리 (전역 트랜잭션)

스프링 부트 다중 데이터베이스 트랜잭션 처리 (jta-atomikos) 해당 포스팅은 스프링부트 환경에서 다중 데이터베이스를 연결할 때 'multi datasource에 대한 트랜잭션 처리'에 대해 정리한 내용입니다. 내용은 크게 스프링에서 지원하는 'ChainedTransactionManager'와 Java에서 지원하는 'JTA(Java Transaction API)'에 대한 내용으로 나뉘며, ChainedTransactionManager의 경우에는 현재 deprecated 된 상태이기 때문에 세부적인 구현보다는 동작되는 방식과 deprecated 된 이유에 대해서만 살펴보고 JTA에 대해서는 Atomikos를 사용한 실제 구현 방식과 트랜잭션 테스트 결과까지 확인해 볼 예정입니다. PlatformTr..

Spring Boot 다중 데이터베이스 구성하는 방법

Spring Boot 다중 데이터베이스(Multi Datasource) 구성하는 방법 해당 포스팅은 '스프링 부트 환경에서 다중 데이버테이스 연결을 구성하는 방법'에 대한 내용입니다. 단순히 다중 데이터베이스 연결을 구성하는 방법은 어렵지 않지만 구성 후 다중 데이버테이스에 대한 트랜잭션 처리 등 함께 공부할만한 내용이 있어 정리하게 되었으며, TransactionManager가 여러 개일 때 트랜잭션 처리에 대해서는 해당 포스팅이 아닌 이어지는 포스팅에서 다룰 예정이니 참고 부탁드리겠습니다. Multi Datasource (application.yml) 다중 데이터베이스를 연결하여 사용하는 방법의 가장 핵심은 '각각의 데이터베이스에 대한 Datasource를 구성하는 것'인데요. 먼저 applicati..

(Spring Data JPA) 데이터베이스 View, Entity 매핑하기

(Spring Data JPA) 데이터베이스 View, Entity 매핑하기 해당 포스팅은 '데이터베이스 가상 테이블인 View를 Entity에 매핑하는 방법'을 정리한 내용입니다. 먼저 데이터베이스에서 View란 무엇인지를 간단하게 살펴보고, 이어서 '1. 생성된 View에 Entity를 매핑하는 방법'과 '2. View가 생성되지 않은 상태에서 Entity에 매핑하는 방법'에 대해서 살펴보겠습니다. View란? 뷰(View)란 데이터베이스에 존재하는 가상의 테이블입니다. 가상의 테이블이라는 이름처럼 실제로는 데이터를 가지고 있지 않은데요. View는 데이터가 아닌 SQL을 저장하여 보여주는 것만을 목적으로 하는 테이블입니다. 이처럼 View는 SQL을 저장하기 때문에 '1. 여러 테이블을 조인하는 복..

BeanUtils.copyProperties를 사용한 객체 필드값 복사

BeanUtils.copyProperties를 사용한 객체 필드값 복사 프로젝트를 진행하다 보면 Dto -> Entity 또는 Entity -> Dto 변환하는 과정이 필요한데요. (그 외에도 객체 간의 필드 값을 복사해야 하는 경우) 개인적으로는 지금까지 Entity 또는 Dto에서 builder를 통해 변환된 객체를 반환하는 method를 만들어 사용했으며, 동료 분의 코드에서 'BeanUtils.copyProperties' 기능을 사용하시는 것을 보고 해당 기능에 대해 알아보게 되었습니다. (데이터 복사에는 BeanUtils 외에도 ModelMapper, MapStruct 등의 라이브러리를 사용할 수 있으며, 관련된 부분도 아래 내용을 통해 언급됩니다.) *** 아래 내용에서는 'Entity와 Dt..

@AuthenticationPrincipal 동작 원리와 사용 예시

Spring Security @AuthenticationPrincipal 동작 원리와 사용 예시 해당 포스팅은 스프링 시큐리티 환경에서 인증 후 로그인 객체를 가져오는 방법 중 '@AuthenticationPrincipal 어노테이션을 사용하는 방법과 동작 원리, 사용 예시'를 중점으로 정리한 내용입니다. (코드가 너무 긴 부분은 내용상 필요한 부분만 올려놓았으며, 전체가 궁금하신 경우 포스팅 맨 하단 github 소스코드를 참고하시면 좋을 것 같습니다.) 인증 후 로그인 객체를 가져오는 방법 1. SecurityContextHolder에서 직접 가져오는 방법 Object principal = SecurityContextHolder.getContext().getAuthentication().getPrin..

repository, repositoryCustom, repositoryImpl 구조를 사용하자

jpa 공식 같은 repository, repositoryCustom, repositoryImpl 구조 해당 포스팅에서는 하나의 Repository를 통해 JpaRepository의 기능과 Querydsl의 기능을 사용하는 CustomRepository를 모두 사용할 수 있는, 일종의 공식처럼 쓰이는 'repository, repositoryCustom, repositoryImpl 구조'에 대해서 살펴보겠습니다. repository 상속 구조 해당 구조를 코드로 보면 아래와 같은데요. 크게 JpaRepository를 extends 하는 Repository 인터페이스에 CustomRepository 인터페이스를 추가로 extends 하는데, CustomRepository 인터페이스는 Querydsl의 기능..

@SpringBootTest 스프링 부트 통합 테스트 개념과 예시 코드

@SpringBootTest를 사용한 스프링 부트 통합 테스트 개념과 예시 코드 Spring Boot 프로젝트의 테스트 코드 작성 방법에 대해 찾아보면서, 테스트 방식이 크게 '@SpringBootTest를 사용하는 통합 테스트'와 '@WebMvcTest, @DataJpaTest 등의 어노테이션을 사용하는 슬라이스 테스트'로 나뉜다는 것을 알게 되었습니다. (슬라이스 테스트에 사용되는 어노테이션 @WebMvcTest, @WebFluxTest, @DataJpaTest, @JsonTest, @RestClientTest 등) 해당 포스팅에서는 '@SpringBootTest를 사용하는 통합 테스트의 개념과 장단점, 예시 코드'에 대해서 살펴보겠습니다. * 전체 코드는 포스팅 맨 하단에 링크해 두었으니 필요하신 ..

@RequestMapping 정규식, PathPattern 활용하기

@RequestMapping 정규식, PathPattern 활용하기 '@RequestMapping'에는 정규식과 PathPattern을 적용할 수 있는데요. 이런 기능이 있는 줄 모르고 있었는데, 간단하고 또 활용성 있는 기능인 것 같아서 정리하게 되었습니다. @RequestMapping 정규식 사용 방법 @RequestMapping(value = "{변수명:정규식}") public void request(@PathVariable String 변수명) { ... } @RequestMapping에서는 다음과 같이 '{변수명:정규식}' 형식을 통해 정규식을 적용할 수 있는데요. //영문 대소문자 //http://localhost:8080/request/TestValue @RequestMapping("/req..