
@NotNull, @NotEmpty, @NotBlank는 스프링에서 유효성 검사를 할 때 사용하는 어노테이션들이다.각각의 어노테이션들은 역할이 유사해보이지만, 허용하는 값의 범위가 다르다. 차례대로 설명해보겠다.1. @NotNull특징null값을 허용하지 않는다.문자열의 경우, 빈 문자열("") 또는 공백 문자열(" ")은 허용된다.사용 예시public class UserDTO { @NotNull(message = "이름은 null일 수 없습니다.") private String name;}사용 시 참고객체나 필드가 반드시 초기화되어야 할 때 사용한다.단, 문자열이 비어 있거나 공백만 있는지에 대한 검증은 하지 않는다.2. @NotEmpty특징null과 빈 문자열("")을 허용하지 않는다.공백 ..

얼마전 서블릿 컨테이너 초기화에 대해 공부했다.그리고 NHN Academy에서 진행했던 서블릿 기반 쇼핑몰을 다시 만들면서 스프링에서 서블릿 컨테이너 초기화를 어떻게 진행하는지 찾아보았다.코드가 그렇게 길지는 않아서 코드 첨부 후에 이어서 경험을 공유해보겠다.@HandlesTypes(WebApplicationInitializer.class)public class SpringServletContainerInitializer implements ServletContainerInitializer { @Override public void onStartup(@Nullable Set> webAppInitializerClasses, ServletContext servletContext) ..

Spring 애플리케이션에서 객체를 관리하는 핵심은 Spring 컨테이너이다.Spring 컨테이너는 Bean을 생성하고 관리할 때 @Configuration 어노테이션을 함께 사용한다.@Configuration 어노테이션은 싱글톤을 보장하면서 Bean들 사이의 의존성 주입을 해준다.이 글에서는 @Configuration이 필요한 이유에 대해서 설명해보겠다.@Configuration이란?@Configuration은 클래스가 Spring 컨테이너에 Bean을 등록하기 위한 클래스임을 나타낸다. 주요 특징Bean 등록 및 관리: @Bean 메서드를 통해 Bean을 정의한다.Singleton 보장: 컨테이너는 동일한 @Bean 메서드 호출 시 항상 같은 객체를 반환한다.의존성 관리: Bean 간의 의존성을 명확..

BeanFactory와 ApplicationContext의 기본 계층 구조BeanFactory스프링 컨테이너의 최상위 인터페이스다.스프링 bean을 관리하고 조회하는 역할을 담당한다.지연 로딩(Lazy Loading)Bean을 실제로 요청할 때(getBean() 호출 시) 생성하고 초기화한다.이는 초기 로딩 속도를 빠르게 하고, 메모리 사용을 최적화할 수 있다.ApplicationContextBeanFactory의 기능을 포함해서 여러 기능을 가지고 있는 BeanFactory의 하위 인터페이스이다.즉시 로딩컨텍스트 초기화 시점에 모든 Bean을 미리 생성하고 초기화한다.이는 애플리케이션 시작 시점에 모든 Bean의 상태를 확인할 수 있어 런타임 오류를 사전에 방지할 수 있다.그러나 필요하지 않은 Bean..

웹 애플리케이션 개발에서 서블릿 컨테이너 초기화는 필수적인 과정이다.서블릿 컨테이너는 애플리케이션 실행 시점에 초기화 작업을 수행하여 서블릿, 필터, 리스너 등을 등록한다.이 글에서는 서블릿 컨테이너 초기화의 전반적인 구조와 이를 기반으로 스프링 레거시와 스프링 부트에서 각각 어떻게 처리하는지 살펴보겠다.1. 서블릿 컨테이너 초기화의 기본 방법1.1 ServletContainerInitializer1.1.1 정의서블릿 3.0 스펙에서 제공하는 ServletContainerInitializer는 서블릿 컨테이너 초기화를 담당하는 표준 인터페이스이다.웹 애플리케이션이 시작될 때 서블릿 컨테이너(Tomcat, Jetty 등)는 이 인터페이스를 구현한 클래스를 자동으로 탐색하고 실행한다.public interf..

스프링부트는 @ConfigurationProperties를 통해 외부 설정을 객체로 바인딩해서 관리하는 기능을 제공한다.이를 활용하면 설정값을 타입 안전하게 사용할 수 있고, 유지보수성이 크게 향상된다.이번 글에서는 @ConfigurationProperties의 개념, 사용법, 검증에 대해 알아보겠다.1. @ConfigurationProperties란?1.1 개념과 장점@ConfigurationProperties는 외부 설정값을 자바 객체에 자동으로 바인딩하는 기능을 제공한다.이를 통해 설정 파일의 값을 일괄적으로 객체에 매핑할 수 있으며, 타입 안전성을 보장한다.장점타입 안전성: 설정값이 객체 필드와 타입에 맞게 바인딩된다.일괄 바인딩: 설정값을 하나의 객체로 묶어서 관리할 수 있다.유지보수성 향상: ..

스프링 레거시와 스프링 부트는 외부 설정 파일(Properties와 Yaml)을 관리하고 활용하는 방식에서 차이점이 있다.이 글에서는 각각의 설정 파일 활용법과 자동 설정 기능, 우선순위 비교를 통해 두 방식의 차이점을 자세히 알아보겠다.1. 스프링 레거시에서 Properties 사용하기스프링 레거시에서는 .properties 파일을 사용해 설정값을 관리할 수 있으며, @PropertySource를 통해 이를 등록해야 한다.1.1 @PropertySource와 @Value를 사용한 값 조회@PropertySource와 @Value사용하면 .properties 파일을 읽고 스프링 Environment에 등록할 수 있다.import org.springframework.context.annotation.Con..

스프링은 다양한 외부 설정 값을 통합적으로 관리하기 위해 Environment와 PropertySource라는 개념을 제공한다.이를 통해 OS 환경 변수, 자바 시스템 속성, 커맨드 라인 옵션 인수, 그리고 설정 파일 등 다양한 외부 설정 값을 하나의 인터페이스로 관리할 수 있다.이번 글에서는 스프링의 외부 설정 통합 관리 구조와 동작 원리를 알아보겠다.1. 스프링의 외부 설정 통합스프링은 외부 설정을 Environment와 PropertySource를 통해 추상화하여 관리한다.이를 통해 개발자는 외부 설정 값을 동일한 방법으로 읽을 수 있다.1.1 Environment 인터페이스 개념Environment는 스프링에서 설정값을 통합적으로 관리하는 추상화 인터페이스이다.역할: 다양한 외부 설정 값을 키-값..

자바 애플리케이션 개발 시 외부 설정을 읽을 수 있는 다양한 방법이 존재한다.이 글에서는 OS 환경 변수, JVM 시스템 속성, 커맨드 라인 인수, 그리고 커맨드 라인 옵션 인수(스프링부트)를 통해 설정값을 전달하는 방법을 자세히 알아보겠다.1. OS 환경변수OS 환경 변수는 운영체제에서 설정된 전역적인 값이다. 이러한 환경 변수는 다양한 프로그램에서 활용될 수 있다.1.1 터미널에서 환경 변수 조회Mac/Linux에서 터미널로 조회printenv 또는 env 명령어를 사용하면 현재 시스템에 설정된 환경 변수를 확인할 수 있다.printenvWindows에서 환경 변수 조회명령 프롬프트에서 다음 명령어를 실행한다.set1.2 자바 코드에서 환경 변수 조회자바에서는 System.getenv()를 통해 O..