개요
spring boot 프로젝트를 생성하면 유일하게 만들어지는 자바 클래스가 하나 있다.
이것이 어떤 건지 궁금해서 정리를 해보자고 한다.
Application.java
프로젝트 생성 시[projectName] Application.java 클래스와 메인 메서드가 만들어진다.
스프링 부트는 이 실행클래스를 통해 실행을 한다.
메서드 위에를 보면 하나의 어노테이션이 설정되어 있을 텐데 어노테이션은 부트를 실행할 때 필요한 것들을
자동으로 구성하고 Bean 등을 생성하는 등 기본적인 설정을 해주는 어노테이션이다.
@SpringBootApplication
어노테이션이 자세히 무엇을 해주는지 알아보자
@SpringBootApplication
먼저 이 어노테이션은 안에는 메타 어노테이션이라고 다른 어노테이션에 적용되는 어노테이션이라는 뜻인 어노테이션이 들어있다.
먼저 그 어노테이션부터 설명하겟다.
Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
1. Target
Target 어노테이션 어노테이션이 붙을 수 있는 타입을 지정한다.
Target() 괄호 안에 들어가는 값에 따라 어노테이션이 어디에 적용될지 결정한다.
그 속성에 따라 어노테이션이 어떻게 선언할 때 사용 되는지 알려준다.
ElementType.PACKAGE : 패키지 선언
ElementType.TYPE : 타입 선언
ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
ElementType.CONSTRUCTOR : 생성자 선언
ElementType.FIELD : 멤버 변수 선언
ElementType.LOCAL_VARIABLE : 지역 변수 선언
ElementType.METHOD : 메서드 선언
ElementType.PARAMETER : 전달인자 선언
ElementType.TYPE_PARAMETER : 전달인자 타입 선언
ElementType.TYPE_USE : 타입 선언
2. Retention
@Retention은 해당 어노테이션이 적용되고 유지되는 범위를 나타낸다.
아래와 같은 타입이 존재하고 해당 타입을 통해 범위를 가져간다.
RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM읠 통해 계속 참조가 가능. 대표적으로는 리플렉션이나 로깅에 사용
RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지만 유효
RetentionPolicy.SOURCE : 컴파일 전까지만 유효. 컴파일 이후에는 사라지게 된다.
3. Documented
어노테이션을 선언 시 사용한 클래스가 문서화될 경우 해당 어노테이션이 적용되었음을 명시하도록 한다.
4. Inherited
@Inherited 자식 클래스가 부모에 선언된 어노테이션을 같이 사용하고 싶을 때 선언합니다.
여기까지가 메타 어노테이션이었고
중요한 어노테이션은 밑에 3가지다.
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
5. @SpringBootConfiguration
@SpringBootConfiguration는 @Configuration의 하위 어노테이션으로 @Configuration과 동일한 역할을 수행한다.
스프링 컨테이너(spring container)라는 것을 통해 객체를 관리하는데, 이때 관리되는 객체를 빈(Bean)이라고 표현한다.
Configuration 어노테이션은 @Bean 정의 메서드를 빈으로 등록하고 사용하는데에 도움을 주는 어노테이션이다.
@SpringBootConfiguration 어노테이션이 붙어있는 클래스를 스프링부트에 대한 설정정보가 담긴 클래스로 인식하고, 해당클래스 내부에 @Bean 어노테이션이 담긴 메소드를 찾아 빈을 등록하고 생성해 준다.
마지막으로 SpringBootConfiguration은 프로젝트당 하나만 존재해야 한다.
6. @ComponentScan
@ComponentScan 어노테이션은 @Component 어노테이션이 달린 class들은 자동으로 스캔하여 application context에 빈으로 등록해 주는 역할을 한다.
여기서 한 가지 의문점이 있다. 우리가 MVC로 , 애플리케이션을 만들 때controller이나 service 나 Repository는 @Component 를 선언하지않았는데 자동으로 bean에등록이될까?
찾아본 결과 해당 어노테이션들 내부에 @Component 어노테이션이 존재하기 때문이다.
7. @EnableAutoConfiguration
@EnableAutoConfiguration 어노테이션은 스프링 부트의 auto-configuration을 가능하도록 하는 어노테이션이다.
그렇다면 auto-configuration이란 뭘까?
spring 레거시에서는 애플리케이션에는 수많은 configuration이 필요하다.
그래서 Spring에서는 이를 직접 XML파일을 작성하여 configuration을 해주었어야 했다.
하지만 Spring Boot에서는 maven이나 gradle의 의존성 관계에 있는 jar 파일을 기반으로 Configuration을 자동 설정하는 것이다.
더욱 자세히 들어가자면
어노테이션이 각 패키지들을 순회해서 META-INF 속에 spring.facotries라는 파일 속에 org.springframework.boot.autoconfigure.EnableAutoConfiguratio n 키 값에 있는 설정을 실행시켜준다.
정리
1. 스프링부트의 시작점인 메인 클래스에는 @SpringBootApplication라는 메타 애노테이션이 마킹되어 있다.
2. 어노테이션을 통해 개발자가 작성한 클래스들이 자동으로 읽어져 빈으로 등록되고, (@ComponentScan의 기능)
3. 의존성에 추가한 라이브러리의 자동 설정 및 빈등록도 진행된다.(@EnableAutoConfiguration의 기능)
'개발 > spring_boot' 카테고리의 다른 글
Gradle와 Maven의 차이 (1) | 2024.03.15 |
---|---|
Spring Boot 에서 DataBase(MySQL) 사용 (0) | 2024.02.29 |