본문 바로가기

Spring Boot

[SpringBoot] 메인 어플리케이션 클래스

메인 어플리케이션 클래스는 스프링 부트의 어플리케이션을 실행하는 메서드를 호출한다.

 

자바 어플리케이션 엔트리 포인트인 main 메서드 안에서 SpringApplication 클래스의 run 메서드를 호출하면

 

내장된 톰캣이 실행되고 Spring IocC 컨테이너가 초기화 된다.

 

 

메인 어플리케이션 클래스는 디폴트 패키지가 아닌 루트 패키지에 배치할 것을 권장한다.

 

자동 구성에 의해 @EnableAutoConfiguration이 부여된 클래스의 패키지를 기준으로 동작하기 때문이다.

 

 

※ 전형적인 디렉터리 구성

 

 

 

루트 패키지에 메인 어플리케이션 클래스를 배치함으로써 @ComponentScan의 basePackage 속성을 명시적으로 지정할 필요는 없지만.

 

아래 예제처럼 scanBasePackageClasses 속성에는 컴포넌트 스캔의 기준 패키지에 배치한 클래스를 지정할 것을 권장한다.

 

이렇게하면 리팩터링이 쉬워질 뿐만 아니라 기준 패키지가 어떤 패키지인지 쉽게 알 수 있다.

 

 

스프링 부트를 사용하는 어플리케이션에서는 메인 어플리케이션 클래스에 대부분

 

@Configuration
@EnableAutoConfiguration
@ComponentScan

을 지정한다.

 

이를 대신하는 어노테이션은 @SpringBootApplication이다.

 

 

@SpringBootApplication은 @EnableAutoConfiguration과 @ComponentScan의 속성을 커스터마이즈하는 별칭을 가지고 있어서

 

대부분이 어노테이션을 지정하는 것만으로도 대응이 가능하다.

 

// @See 메인 어플리케이션 클래스

package com.sample.web;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// @Configuration, @EnableAutoConfiguration, @ComponentScan을 지정한 것과 동일
@SpringBootApplication( scanBasePackageClasses = { ComponentScanBasePackage.class } )
@RestController	// 원래 컨트롤러에 작성할 어노테이션
public class Application {
	
	@RequestMapping("/")	// 원래 컨트롤러에 작성할 메서드
	public String hello() {		
		return "Hello World!";
	}	
    
	public static void main(String[] args) {
		SpringApplication.run( Application.class, args );
	}
}

 

// @See 컴포넌트 스캔의 기준이 되는 패키지 정하기

package com.sample;

/*
 * 컴포넌트 스캔의 basePackages를 설정한다.
 */
public class ComponenScanBasePackage { }

 

위 예제는 패키지 클래스가 컴포넌트 스캔의 설정인 예를 보여준다.

 

메인 어플리케이션에서만 동작하도록 Controller 클래스 구현을 포함한다.