Spring Boot Applicatoin Event 와 애플리케이션 시작 과정

배경 SpringApplicationEvent 에서 Spring 프레임워크가 애플리케이션에 관련된 이벤트를 발행하는 것을 이해할 수 있었다. Spring Boot에서 어떤 이벤트를 전송하고 있는지 이해한다. 이벤트 목록 애플리케이션 실행 시 아래 순서대로 이벤트가 발생한다. ApplicatoinStartingEvent: 애플리케이션 실행 이전에 발생한다. ApplicationContextInitializer 들과 ApplicationListener 들의 등록을 제외한 모든 처리 이전에 발생한다. ApplicationContextInitializer: ApplicationContext가 초기화되기 전에 실행되어야 하는 로직이 있을 때 정의하는 콜백 인터페이스 ApplicationListener: 애플리케이션에서 발생하는 이벤트를 감지하고 처리하는 역할의 인터페이스 ApplicationEnvironmentPreparedEvent: Environment가 준비 되었지만, ApplicationContext가 생성되기 전에 발생한다....

2025-03-17 · 2 min · 250 words

Spring Framework에서 존재하지 않는 URL로 요청 시 처리 과정

목표 Spring Boot에서 존재하지 않는 URL로 요청 시 404 응답한다. 어떤 내부 동작으로 404 응답을 하게 되는지 이해한다. ResourceHttpRequestHandler Spring Boot 기본 설정 기준으로 모든 요청에 대해서, 처리할 다른 핸들러가 없으면 ResourceHttpRequestHandler로 정적 리소스를 찾아서 반환하려고 시도한다. 해당 핸들러는 spring.web.resources.add-mappings를 false로 설정하는 등의 방법으로 사용하지 않게 설정하여, 정적 리소스를 응답하지 않도록 설정할 수 있다. 해당 핸들러 사용 유무에 따라 404 응답을 처리하는 위치가 달라진다. ResourceHttpRequestHandler를 사용하는 경우 처리 과정 Spring Framework 6....

2024-10-16 · 1 min · 190 words

Spring의 Thread pool

목표 Thread pool의 사용 목적을 이해한다. Spring boot에서 Tomcat의 Thread pool 설정 방법을 이해한다. Thread Pool DB, 웹 서버 등의 프로그램에서 요청이 도착할 떄마다 새 스레드를 생성하는 방법은 문제점이 있다. 요청을 처리할 때마다 스레드를 생성하고 삭제하는 것은 많은 시간과 시스템 리소스를 사용한다. 너무 많은 요청이 오면, 동시에 너무 많은 스레드가 생성되어 시스템 리소스가 부족해질 수 있다. 스레드 수를 제한할 필요가 있다. 이 문제를 해결하기 위해서 이전에 미리 생성된 스레드를 재사용하기 위한 Thread pool을 사용한다....

2024-09-15 · 2 min · 241 words

SpringApplicationEvent

목표 SpringApplicationEvent 가 무엇인지 알아본다. SpringApplicationEvent 의 사용법을 알아본다. SpringApplication.run() @SpringBootApplication public class AccountCoreApplication { public static void main(String[] args) { SpringApplication.run(AccountCoreApplication.class, args); } } Spring Boot를 사용하면 main 메서드에 다음과 같은 함수를 호출하는 것을 볼 수 있다. run 메서드를 호출하면 SpringApplication 생성자를 호출하는 것을 확인할 수 있다. SpringApplication 생성자를 호출하면 ApplicationListener를 로드하여 등록하게 된다. ApplicationListener 관심이 있는 이벤트에 대한 ApplicationListener를 ApplicationContext에 등록하면 ApplicationEvent가 그에 따라 필터링되고, 일치하는 이벤트에 대해서만 Listener가 호출이 된다....

2024-09-15 · 1 min · 149 words

Spring boot는 정적 파일을 어떻게 처리하나

Spring boot의 경우 ResourceHttpRequestHandler 라는 정적 리소스를 처리하는 핸들러가 따로있다. 기본적으로 /static, /public, /resources, /META-INF/resources 디렉토리에 있는 정적 컨텐츠를 처리하고 있다. https://www.baeldung.com/spring-mvc-static-resources https://github.com/spring-projects/spring-framework/blob/main/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java

2024-09-15 · 1 min · 23 words

Spring Boot 개발 환경에서 TestContainers 사용하기

목표 TestContainers를 통해 개발 환경에서 Spring 애플리케이션 실행 시 mariaDB 컨테이너를 실행하도록 한다. TestContainers를 통해 이미 mariaDB 컨테이너가 실행 중이라면 재사용하도록 한다. 의존성 추가 일반적으로 TestContainers는 테스트 환경에 사용하지만, Spring 애플리케이션이 dev 프로파일로 실행될 때 사용하는 것이 목표여서 아래와 같이 의존성을 추가한다. mariaDB를 사용하기 위한 JDBC Driver도 함께 의존성 추가한다. dependencies { //... implementation("org.mariadb.jdbc:mariadb-java-client") implementation("org.springframework.boot:spring-boot-testcontainers") implementation("org.testcontainers:mariadb") //... } 컨테이너 자동 실행 Spring Boot 3.1부터 Container 클래스를 Bean 등록하면, 자동으로 컨테이너를 실행해준다....

2024-09-15 · 1 min · 131 words

Spring Boot Web Starter에서 validation 애노테이션 없어짐

배경 Spring Boot에서 @NotBlank를 사용했는데 존재하지 않는 애노테이션으로 인식했다. Spring Boot의 웹 스타터에 validation api를 구현한 하이버네이트 컴포넌트가 존재한다고 알고 있었는데, 의문이었다. 원인 및 해결 Spring Boot 2.3 부터 웹 스타터에서 validation 스타터가 분리되었다. 아래와 같이 직접 의존을 추가해줘야 된다. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> dependencies { ... implementation 'org.springframework.boot:spring-boot-starter-validation' } 참고 자료 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#validation-starter-no-longer-included-in-web-starters https://stackoverflow.com/questions/48614773/spring-boot-validation-annotations-valid-and-notblank-not-working

2024-09-15 · 1 min · 54 words

ResourceBundleMessageSource 파헤치기

목표 ResourceBundleMessageSource가 다국어 값을 가져오는 과정을 이해한다. ResourceBundleMessageSource에 기본 Locale을 설정하는 방법을 이해한다. ResourceBundleMessageSource Spring Boot에서 다국어를 처리할 때 기본적으로 사용하는 MessageSource 인터페이스의 구현체 액세스한 ResourceBundle 인스턴스와 각 메시지에 대해 생성한 MessageFormat을 캐싱한다. MessageSource Spring에서 만든 메시지를 매개 변수화 및 i18n화 할 때 사용하는 전략 인터페이스 아래 3가지의 메소드가 존재한다. ResourceBundle Java에서 만든 Locale 별로 리소스(예: 문자열)가 필요한 경우 이를 번들로 묶어서 관리해주는 클래스 이를 상속해서 property file로부터 각 Locale 별로 문자열을 관리하는 PropertyResourBundle도 존재한다....

2024-09-15 · 1 min · 161 words

proejct property 설정하여 Spring boot profile 설정하기

위의 방법으로 gradle을 실행시킬 때 project property를 설정할 수 있다. SPRING_PROFILES_ACTIVE=local ./gradlew build sonarqube --info 위의 방법으로 gradle 빌드할 때 spring의 프로필을 설정할 수 있다. 참고 자료 https://docs.gradle.org/current/userguide/build_environment.html#sec:project_properties https://stackoverflow.com/questions/23367507/how-to-pass-system-property-to-gradle-task

2024-09-15 · 1 min · 29 words