@SpringBootApplication
public class SpringBootDeveloperApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDeveloperApplication.class, args);
}
}
이 클래스는 자바의 main() 메서드와 같은 역할을 한다. 즉, 여기서 스프링 부트가 시작된다. @SpringBootApplication 애너테이션을 추가하면 스프링 부트 사용에 필요한 기본 설정을 해준다. SpringApplication.run() 메서드는 애플리케이션을 실행한다. 첫 번째 인수는 스프링 부트 3 애플리케이션의 메인 클래스로 사용할 클래스, 두 번째 인수는 커맨드 라인의 인수들을 전달한다.
@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을 자세히 알아보자.
@Configuration을 상속해서 만든 애너테이션으로 스프링 부트 관련 설정을 나타내는 애너테이션이다.
사용자가 등록한 빈을 읽고 등록하는 애너테이션이다. 이 애너테이션은 @Component라는 애너테이션을 가진 클래스들을 찾아 빈으로 등록하는 역할을 한다. 그렇다고 모든 빈에 @Component만 사용하는 게 아니고 @Configuration, @Repository, @Controller, @RestController, @Service와 같은 용도에 따라 다른 애너테이션을 사용한다.
스프링 부트에서 자동 구성을 활성화하는 애너테이션이다. 이 애너테이션은 스프링 부트 서버가 실행될 때 스프링 부트의 메타 파일을 읽고 정의된 설정들을 자동으로 구성하는 역할을 수행한다.
@RestController
public class TestController {
@GetMapping("/test")
public String test() {
return "Hello, world!";
}
}
@RestController는 라우터 역할을 하는 애너테이션이다. 라우터란 HTTP 요청과 메서드를 연결하는 장치를 말하는데 이 애너테이션이 있어야 클라이언트의 요청에 맞는 메서드를 실행할 수 있다. 지금의 경우 TestController를 라우터로 지정해 /test라는 GET 요청이 왔을 때 test() 메서드를 실행하도록 구성한 것이다.
@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을 통해 빈으로 등록되는 것을 알 수 있다.
@SpringBootApplication은 스프링 부트 관련된 설정을 하는 @SpringBootConfiguration, 사용자가 등록한 빈을 읽고 등록하는 @ComponentScan, 자동 설정으로 등록되는 빈을 읽고 등록하는 @EnableAutoConfiguration으로 이루어져있다.
@Component 애너테이션이 있는 클래스는 빈으로 등록되며, @Controller, @RestController, @Configuration, @Repository, @Service 모두 @Component 애너테이션을 가지고 있으므로, 때에 따라 알맞은 애너테이션을 선택해야 한다.
스프링 부트 3 백엔드 개발자 되기(자바 편)