kimyu0218
  • [spring] 스프링 부트 시작하기 (스프링/스프링 부트/@SpringBootApplication/ApplicationContext)
    2024년 12월 19일 20시 00분 54초에 업로드 된 글입니다.
    작성자: @kimyu0218

    프레임워크는 목적에 맞는 일반적인 기능을 제공한다. 예를 들어 웹 어플리케이션 프레임워크는 HTTP 기반의 요청과 응답을 처리할 수 있도록 객체나 클래스를 제공한다. 이처럼 프레임워크에서 일반적인 기능과 비기능적인 로직을 제공함으로써 개발자는 비즈니스 로직에 집중할 수 있다.
     

    EJB vs. 스프링

    스프링 프레임워크 이전에는 EJB(Enterprise JavaBeans)를 사용했다. EJB를 사용하기 위해서는 인터페이스를 구현하고 클래스를 상속 받아 부모 클래스를 오버라이드 해야 했다. 즉, EJB 프레임워크의 메서드가 비즈니스 로직에 침투되고, (invasive) 프레임워크와 개발자의 코드가 강하게 결합된다.
     
    스프링은 개발하기 복잡하고 어려운 EJB를 대체하기 위해 등장했다. 스프링을 사용하면 더 이상 특정 메서드를 구현하거나 오버라이딩 하지 않아도 된다. 스프링은 프레임워크와 개발자의 코드가 복잡하게 얽히지 않는, 비침투적(non-invasive)인 프레임워크다.
     

    스프링 부트

    하지만 스프링에도 단점이 존재한다. 기존 스프링은 상호 호환되는 적절한 버전의 라이브러리를 찾고, 프로젝트에 필요한 설정값을 설정해야 하기 때문에 프로젝트 세팅에 많은 시간이 걸린다. 스프링 부트는 이러한 스프링의 단점을 보완하여 어플리케이션을 빠르게 개발하기 위해 등장했다.
     
    스프링 부트는 다음 특징을 갖는다.

    • jar 파일을 통해 빠르고 간단하게 배포한다.
    • 스타터를 통해 필요한 라이브러리를 한 번에 추가한다. (라이브러리들은 상호 호환 검증된 상태!)
    • 자동 설정 기능을 통해 스프링 기능을 자동으로 설정한다.
    • 액추에이터를 통해 어플리케이션을 모니터링하고 헬스 체크할 수 있다.
    💡 스타터는 일종의 의존성 그룹으로, 일반적으로 `spring-boot-starter-[특정 기능/목적]`이라는 이름을 갖는다.
    🚨 스타터가 없다면 웹에 필요한 의존성들을 개별적으로 추가해야 한다. 즉, 개발자는 특정 기능을 구현하는 데 필요한 모든 의존성과 호환되는 버전을 알아야 한다.

     

    @SpringBootApplication

    스프링 부트 프로젝트를 생성하면 메인 클래스에 `@SpringBootApplication`이 붙어있다. `@SpringBootApplication`은 다음 어노테이션들을 포함한다.

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(
        excludeFilters = { ... }
    )

    여기서 눈 여겨 봐야 하는 어노테이션은 세 가지다.

    • `@SpringBootConfiguration` : 스프링에서 제공하는 `@Configuration`을 포함한 어노테이션으로, 스프링 부트 어플리케이션을 설정하는 데 사용된다.
    • `@EnableAutoConfiguration` : 스프링 부트의 자동 설정 기능을 활성화한다.
    • `@ComponentScan` : classpath에 포함된 `@Configuration`이 붙은 구성 클래스와 스테레오 타입 어노테이션으로 정의된 클래스를 스캔한다.

    즉, `@SpringBootApplication`은 classpath 내 구성 클래스와 빈 클래스를 스캔하여 스프링 컨텍스트에 등록하고 자동 설정 기능을 활성화 한다.
     

    ApplicationContext

    스프링에서 가장 중요한 `ApplicationContext`에 대해 알아보자. 모든 스프링 프로젝트는 `spring-context` 모듈을 포함하는 데, `ApplicationContext`가 해당 모듈에 포함되어 있다. 즉, 모든 스프링 프로젝트에는 `ApplicationContext`가 있다.
     
    `ApplicationContext`는 `BeanFactory` 인터페이스를 상속한다. 따라서 `ApplicationContext`는 스프링 빈을 관리하는 스프링 컨테이너라고도 불린다.

    public interface ApplicationContext 
        extends EnvironmentCapable, 
            ListableBeanFactory, 
            HierarchicalBeanFactory,
            MessageSource, 
            ApplicationEventPublisher, 
            ResourcePatternResolver {
        ...
    }

    위 코드에서도 알 수 있듯이 `BeanFactory` 외에도 여러 인터페이스를 상속하므로 다양한 기능을 가지고 있다.

    • `EnvironmentCapable` : 환경 변수를 추상화한 `Environment` 객체 제공 (환경 변수 관리)
    • `MessageSource` : 국제화* 메시지를 처리할 수 있는 메서드 제공
    • `ApplicationPublisher` : 스프링 이벤트를 생성할 수 있는 메서드 제공 (이벤트 기반 프로그래밍)
    • `ResourcePatternResolver` : 패턴을 이용하여 `Resource`를 다룰 수 있는 메서드 제공 (리소스 관리)
    *국제화 : 지역 정보에 맞는 적절한 언어 제공

    참고자료

    댓글