스프링부트를 고민해보자 (2) @SpringBootApplication

허진혁·2023년 3월 5일
0

고민해보자

목록 보기
2/5

스프링 부트를 활용하여 공부를 처음 시작할 때, MVC패턴과 관련되어 간단한 웹을 만드는 것부터 시작했다.

웹을 몇 번 만들어 보고 Rest 프로그래밍으로 통신을 위해 API를 만들어 보았다. 스프링부트 덕분에 활용법만 알고 코딩을 하어 결과물을 확인할 수 있었다. 이제는 확인해볼 필요가 있다는 것을 알았다.

내가 활용한 것들이 어떤 기능을위해 어떻게 작동되고있는지 확인해볼 필요가 있다.

우선 스프링 컨테이너에서 스프링 bean으로 등록되어 생명주기를 관리한다는 내용은 인지하면서 시작해보자. 난 스프링부트에서 어떤 스프링 빈을 관리해달라고 메세지를 보낸 적이 없다. 그치만 내가 만든 애플리케이션은 작동이 잘 되고 있다.

스프링부트에서 스프링의 애노테이션을 잘 활용하고 있는 것이다.
웹이 화면이 작동하려면 다음과 같은 순서를 가진다.(MVC패턴 기반)
간단하게 정리해보면 요청이 들어오면 컨트롤러에서 매핑을 하고 모델에 데이터를 담아 view를 보여준다.

스프링은 빈을 관리하는 것이니까 위의 내용들은 스프링 빈에 있는 객체들을 활용하여 웹에 나오도록 하는 것일텐데 나는 애노테이션밖에 쓴 적이 없다.

이전에 작성한 애노테이션에서 생각을 해보면 한 애노테이션은 다른 애노테이션을 갖을 수 있다. 이것은 메타 애노테이션인데, 이 덕분에 애노테이션을 더욱 효율적으로 활용할 수 있는 것이다.

@Controller을 확인해 보면

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

@Component가 포함되어 있다. 이를 통해 컨트롤러는 스프링이 관리하는 빈에 포함되어 있는 것이다.
@Servcie, @Repository 또한 @Conponent가 들어가 있다.

@RestController를 확인하면

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

@Controller 애노테이션이 포함되어 있다. 메타 애노테이션을 활용한 것이다. 우리가 구글링을 해서 @RestController을 찾으면 @Controller + @ResponseBody 라는 것을 쉽게 찾을 수 있다. 이것이 애노테이션을 기반으로 함축적으로 설명한 것이다.

마지막으로 스프링부트를 만들고 나면 바로 확인할 수 있는 @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 {
    // ... 코드
}

세 개의 애노테이션 @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan을 확인해 봅시다.

보통 우리는 @Configuration을 통해 빈으로 등록하고 설정파일을 관리한다. 그 이유는 @SpringBootConfiguration을 사용하면 자동으로 구성을 찾아주기 때문이다. 그래서 @SpringBootConfiguration은 2개 이상 사용하지 못한다.

@EnableAutoConfiguration은 @ComponentScan으로 빈이 등록된 이후, 추가적인 Bean들을 읽어 등록하는 애노테이션 이다. spring.factories 내부에 여러 Configuration들을 조건에 따라 Bean을 등록한다. 즉, 스프링부트가 자동으로 bean을 등록하는 자바 설정 파일인 것이다.

@ComponentScan은 스프링 빈으로 만들기 위한 컴포넌트를 스캔할 곳을 설정하는 역할을 한다. 스프링에서는 여러 빈들을 관리하면서 DI 하는데 이때 전체 코드에서 컴포넌트를 찾아 빈을 생성하는 것이 아니라 범위를 지정하여 그 범위 안에서 어노테이션 된 클래스들을 찾아 빈을 생성 및 관리한다.

이렇게 간단하지만 생각해보면서 찾아보니 스프링부트의 편리한 점을 찾을 수 있었다. 다만, 편리한 점만 활용하면 내부 원리를 이해하지 못한다. 그래서 애노테이션을 들어가 어떠한 내용이 있는지 찾아보고, 디버깅을 통해 동작 원리를 공부하는 습관이 필요하다고 느끼게 되었다.

profile
Don't ever say it's over if I'm breathing

0개의 댓글