욱'S 노트

Spring Boot - 프로젝트 구성하기 본문

Programming/Spring Boot

Spring Boot - 프로젝트 구성하기

devsun 2015. 3. 23. 16:41

프로젝트 구성하기


Spring Boot는 동작을 위한 특별한 코드 레이아웃을 요구하지 않는다. 하지만 도움이 될만한 best practice는 존재한다.


클래스가 패키지 정의를 포함하고 있지 않을때, 디폴트 패키지로 정의된다. 일반적으로 디폴트 패키지의 사용은 권장하지 않고 반드시 피해야 한다. @ComponentScan 또는 @EnitityScan 이나 @SpringBootApplication 사용할 때 모든 jar의 모든 클래스를 읽어야 하므로 특정한 문제가 발생할 수 있다.


자바의 추천 패키지 네이밍 규칙은 domain명을  역순으로 사용하는 것이다. (com.example.project)


일반적으로 메인 어플리케이션 클래스를 다른 클래스들의 상위 root 패키지에 위치시키는 것을 권고한다. @EnableAutoConfiguration 어노테이션은 종종 메인 클래스에 위치하면 이것은 묵시적으로 패키지 탐색의 베이스를 지정하는 것이 된다. 예를 들어 JPA 어플리케이션을 작성했다면 @EnableAutoConfiguration 어노테이션이 작성된 클래스의 패키지가 @Entity 아이템을 찾기 위한 디폴트 패키지가 된다. 


루트 패키지를 이용하는 것은 @ComponentScan 어노테이션을 사용했을때 특정한 베이스패키지 설정없이 사용될 수 있다. 또한 @SpringBootApplication에서도 마찬가지이다.


일반적인 레이아웃은 다음과 같다.


com

 +- example

     +- myproject

         +- Application.java

         |

         +- domain

         |   +- Customer.java

         |   +- CustomerRepository.java

         |

         +- service

         |   +- CustomerService.java

         |

         +- web

             +- CustomerController.java


Application 클래스는 다음과 같은 형태로 작성된다.

package com.example.myproject;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}


클래스 설정하기


Spring Boot는 Java-based configuration을 선호한다. 비록 XML 소스와 함께 수행하는 것이 가능하지만 우리는 일반적으로 @Configuration 클래스를 주요한 소스로 추천한다. 항상 primary @Configuration 클래스에 main 메소드를 정의하는 것은 좋은 접근법이다.


인터넷에 배포된 많은 Spring 설정의 예는 XML 방식이다. 항상 가능하다면 Java-base 설정을 사용하도록 노력하자. enable* 어노테이션을 찾는것은 좋은 시작 포인트이다.


모든 @Configuration 설정을 하나의 클래스로 넣을 필요는 없다. @Import 어노테이션은 추가적인 @Configuration 클래스를 임포트 시킬때 사용한다. 대안으로 @ComponentScan을 이용하여 모든 Spring 컴포넌트 중에 @Configuration 클래스를 자동으로 뽑아낼 수 있다.


만약 무조건 XML 기반 설정을 사용해야 한다면 우리는 또한 @Configuration 클래스에서 시작하기를 추천한다. 만약 추가적인 설정을 위해 XML 설정 파일을 로드해야 한다면 @ImportResource를 사용해서 추가할 수 있다.


Auto-Configuration


Spring Boot auto-configuration은 추가된 jar 디펜던시를 기반으로 Spring application을 자동적으로 설정하는 것을 시도한다. 예를 들어 HSQLDB가 클래스패스에 있다면 어떤 데이터베이스 연결 빈을 정의하지 않아도 자동적으로 in-memory 데이터베이스에 접근할 것이다. @EnableAutoConfiguration이나 @SpringBootApplication중 하나를 @Configuration 클래스에 추가함으로써 자동 설정을 수행할 수 있다.


@EnableAutoConfiguration 어노테이션 한번만 추가해야 한다.  메인 @Configuration 클래스에 추가하는 것을 권장한다.


자동설정은 비침입적이다. 자동설정의 특정한 부분은 교체될 수 있다. 예를 들어 Datasource 빈을 추가한다면 디폴트 임베디드 설정은 사라질 것이다. 만약 현재 적용되어진 자동설정을 알아야 할 필요가 있다면 어플리케이션 시작할떄 --debug 스위치를 주면 된다. 이렇게 하면 콘솔에 자동설정 결과가 로그로 출력될 것이다.


만약 특정한 자동설정클래스를 제거하려면 @EnableAutoConfiguration의 exclude 속성을 활용할 수 있다.


package com.example.myproject;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

Spring Beans And Dependency Injections


빈을 정의하기 하고 디펜던시를 인젝션하기 위해 어떤 스프링 프레임워크를 사용하는지는 자유이다. 단순하게 빈들을 찾아내기 위해 @ComponentScan을 이용한다.  또한 constructor 인젝션을 위해서는 @Autowired를 사용한다.


만약 코드 구조가 위에서 제안한대로 루트 패키지에 어플리케이션 클래스가 위치한다면 다른 인자없이 @ComponentScan 추가하면 된다. 당신 어플리케이션 컴포넌트의 모든 Spring Beans가 자동적으로 등록될 것이다.


다음은 @Service로 빈을 정의하고 RiskAssessor 빈을 인젝션한 예이다.

package com.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;

@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}


@SpringBootApplication


많은 Spring Boot 개발자들은 항상 그들의 메인 클래스에 @Configuration, @EnableAutoConfiguration 그리고 @ComponetScan을 어노테이트한다. 이 어노테이션들은 자주 함께 사용된다. Spring Boot는 편의를 위해 @SpringBootApplication을 제공한다. @SpringBootApplication 어노테이션은 @Configuration, @EnableAutoConfiguration 그리고 @ComponentScan을 디폴트 속성으로 함께 사용하는 것과 같다.





'Programming > Spring Boot' 카테고리의 다른 글

Spring Boot - SpringApplication  (0) 2015.06.03
Spring Boot - 데이터베이스 연동  (0) 2015.04.09
Spring Boot - 빌드시스템  (0) 2015.03.23
Spring Boot - 시작하기  (1) 2015.03.23
Comments