[기술 면접] @SpringBootApplication 이해하기

송진영·2023년 8월 14일
0

기술면접

목록 보기
12/24

@SpringBootApplication 이해하기

@SpringBootApplication
public class SpringBootDeveloperApplication {
  public static void main(String[] args) {
    SpringApplication.run(SpringBootDeveloperApplication.class, args);
  }
}

이 클래스는 자바의 main() 메서드와 같은 역할을 한다. 즉, 여기서 스프링 부트가 시작된다. @SpringBootApplication 애너테이션을 추가하면 스프링 부트 사용에 필요한 기본 설정을 해준다. SpringApplication.run() 메서드는 애플리케이션을 실행한다. 첫 번째 인수는 스프링 부트 3 애플리케이션의 메인 클래스로 사용할 클래스, 두 번째 인수는 커맨드 라인의 인수들을 전달한다.

@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 {
  /// 생략

@SpringBootApplication을 Ctrl을 누른 상태에서 마우스로 클릭 하면 위와 같은 구성이 나타난다. 여기서 세 가지 애너테이션인 @SpringBootConfiguration, @ComponentScan, @EnableAutoConfiguration을 자세히 알아보자.

@SpringBootConfiguration

@Configuration을 상속해서 만든 애너테이션으로 스프링 부트 관련 설정을 나타내는 애너테이션이다.

@ComponentScan

사용자가 등록한 빈을 읽고 등록하는 애너테이션이다. 이 애너테이션은 @Component라는 애너테이션을 가진 클래스들을 찾아 빈으로 등록하는 역할을 한다. 그렇다고 모든 빈에 @Component만 사용하는 게 아니고 @Configuration, @Repository, @Controller, @RestController, @Service와 같은 용도에 따라 다른 애너테이션을 사용한다.

@EnableAutoConfiguration

스프링 부트에서 자동 구성을 활성화하는 애너테이션이다. 이 애너테이션은 스프링 부트 서버가 실행될 때 스프링 부트의 메타 파일을 읽고 정의된 설정들을 자동으로 구성하는 역할을 수행한다.

테스트 컨트롤러 살펴보기

@RestController
public class TestController {
  @GetMapping("/test")
  public String test() {
    return "Hello, world!";
  }
}

@RestController는 라우터 역할을 하는 애너테이션이다. 라우터란 HTTP 요청과 메서드를 연결하는 장치를 말하는데 이 애너테이션이 있어야 클라이언트의 요청에 맞는 메서드를 실행할 수 있다. 지금의 경우 TestController를 라우터로 지정해 /test라는 GET 요청이 왔을 때 test() 메서드를 실행하도록 구성한 것이다.

@RestController를 왜 @Component처럼 취급할까?

@RestController를 왜 @Component처럼 취급하는지는 @RestController 구현 코드를 타고 가보면 알 수 있다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 * @since 4.0.1
	 */
	@AliasFor(annotation = Controller.class)
	String value() default "";

}

코드를 보면 @Controller, @ResponseBody 애너테이션이 함께 있다. 이 코드를 보면 @Controller 애너테이션에 @ResponseBody 애너테이션이 합쳐진 결과물이 @RestController 애너테이션이라는 것을 알 수 있다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 */
	@AliasFor(annotation = Component.class)
	String value() default "";

}

@Controller 구현 코드를 보면 @Component 애너테이션을 사용하는 것을 알 수 있다. 이를 통해 @Controller 애너테이션이 @ComponentScan을 통해 빈으로 등록되는 것을 알 수 있다.

정리

  1. @SpringBootApplication은 스프링 부트 관련된 설정을 하는 @SpringBootConfiguration, 사용자가 등록한 빈을 읽고 등록하는 @ComponentScan, 자동 설정으로 등록되는 빈을 읽고 등록하는 @EnableAutoConfiguration으로 이루어져있다.

  2. @Component 애너테이션이 있는 클래스는 빈으로 등록되며, @Controller, @RestController, @Configuration, @Repository, @Service 모두 @Component 애너테이션을 가지고 있으므로, 때에 따라 알맞은 애너테이션을 선택해야 한다.

참고

스프링 부트 3 백엔드 개발자 되기(자바 편)

profile
못하는 건 없다. 단지 그만큼 노력을 안 할 뿐이다.

0개의 댓글