Structuring Your Code
특정한 코드 구조를 강요하지 않는다.
!권장사항!
1. Default package 사용을 권장하지 않는다.
- Default package 에서 클래스 파일 생성 후
@ConfigurationPropertiesScan, @ComponentScan, @EntityScan, @SpringBootApplication 어노테이션을 사용할 경우
Default package 안에 있는 모든 class들에 대해 scan을 수행할 것이다.
따라서 어플리케이션 성능에 영향을 미칠 수 있다.
2. Locating the Main Application Class
- Main 메소드를 갖고 있는 클래스의 위치는 root 패키지 및에 위치 할 것을 추천한다.
- Main 메소드를 갖고 있는 클래스에는 보통 @SpringBootApplication 어노테이션이 붙어 있는데,
이는 Main 메소드가 있는 패키지를 기본 검색 하도록 정의 한다. - 샘플 코드
Configuration Classes(a.k.a Bean 설정)
- Spring Boot는 xml과 java 설정을 모두 지원하지만 java 기반의 설정을 선호 한다.
- 두 가지 이상의 설정을 할 수 있지만 둘 중 하나의 설정이 기본 설정(primary configuration)이 되어야하며,
@Configuration 어노테이션을 사용해서 primary로 설정할 수 있다.
(기본 설정(@Configuration)으로 하기 좋은 곳은 main 메소드가 있는 클래스이다.)
1. Importing Additional Configuration Classes
<!-- 예시 코드 폴더구조 -->
com
+- sally
+- main
+- Main.java
|
+- configuration
| +- ServiceConfig.java
|
+- service
| +- UserService.java
@Import : import할 추가 설정 클래스에 @Import 어노테이션 붙이기
[예시]
Main 클래스에서 @Configuration 으로 설정 파일임을 명시하고, @Import 어노테이션으로 ServiceConfig 클래스도 설정 파일 임을 명시해 준다.
@RestController
@EnableAutoConfiguration
@Configuration
@Import(ServiceConfig.class)
public class Main {
@RequestMapping("/")
String home() {
return "hello world";
}
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
@Configuration
public class ServiceConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
@ComponentScan : componentscan 을 사용해 자동으로 스프링의 모든 컴포넌트들을 수집하는 방법이 있다.
[예시]
@Configuration 클래스는 Main.java 와 ServiceConfig.java가 있다.
Main class에 @ComponentScan 어노테이션을 붙여 해당 패키지 내에 있는 모든 클래스들을 scan 한다.
그럼 ServiceConfig 는 @Configuration 어노테이션 때문에 bean이 되고 그 안에 @Bean 설정 때문에 UserService 빈이 생긴다.
package com.sally.main;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableAutoConfiguration
@Configuration
@ComponentScan
public class Main {
@RequestMapping("/")
String home() {
return "hello world";
}
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
* @EnableAutoConfiguration, @Configuration, @ComponentScan 어노테이션들 대신 @SpringBootApplication 하나만 쓸 수도 있다.
package com.sally.main.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.sally.main.service.UserService;
@Configuration
public class ServiceConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
* @Configuration 클래스를 만들어서 Bean을 생성할 수도 있지만 빈으로 생성하고자 하는 클래스의 위에 @Service, @ComponentScan, @Repository, @Controller 어노테이션을 붙여 빈을 생성할 수도 있다.
2. Importing XML Configuration
메인으로 사용할 설정파일은 JAVA를 기반으로한 것을 사용하길 권장한다.
하지만 XML 기반의 설정이 반드시 필요하다면 @Configuration 어노테이션을 사용해서 primary로 설정한 클래스에 @ImportResource 을 사용해서 XML 설정 파일을 사용할 수 있다.
Auto-configuration
- Spring Boot 는 jar dependency들을 기준으로 자동으로 configuration을 진행한다.
예)HSQLDB 가 classpath(pom.xml)에 있고 데이터 베이스 connection bean을 configuration(구성)하지 않았다면 스프링 부트가 자도으로 메모리 안의 데이터베이스에 자동으로 구성한다. - Auto-configuration을 사용하려면 @EnableAutoConfiguration 또는 @SpringBootApplication 어노테이션을 @Configuratin을 사용한 클래스위에 작성하면 된다.
1.Gradually Replacing Auto-configuration
- Auto-configuration은 반드시 사용해야하는 것은 아니다.
- 만약 HSQLDB bean을 직접등록한다면 기본으로 제공해주는 embedded database는 자동으로 등록되지 않는다.
- (단, auto-configuration 마다 특징이 다르므로 그때그때 확인이 필요하다)
- 어떤 auto-configuration이 적용 되었는지 확인하고 싶다면 디버깅을 해보면 된다.
(왜 적용이되는지도 확인 할 수 있다.)
2. Disabling Specific Auto-configuration Classes
특정 Auto-configuration 이 적용될 필요가 없다면 @SpringBootApplication 어노테이션의 제외 속성을 사용하면된다.
[예시]
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
public class MyApplication {
}
만약, 그 클래스가 classpath에 없다면 어노테이션의 excludeName 속성을 사용하거나,
application.properties 에서 spring.autoconfigure.exclude 키를 사용함으로써 auto-configuration을 사용하지 않도록 설정할 수 있다.
[출처]
Spring-boot doc : https://docs.spring.io/spring-boot/docs/2.3.0.RELEASE/maven-plugin/reference/html/
Spring-boot doc : https://docs.spring.io/spring-boot/docs/2.3.0.RELEASE/reference/pdf/spring-boot-reference.pdf#page=36&zoom=100,0,434
백기선 youtube : https://www.youtube.com/watch?v=w9wqpnLHnkY&list=PLfI752FpVCS8tDT1QEYwcXmkKDz-_6nm3&index=3
'Spring Boot' 카테고리의 다른 글
[Spring Boot]스프링부트 사용하기-Build Systems(Maven) (0) | 2020.05.23 |
---|---|
[Spring Boot] 시작하기 - Spring Boot 란/시스템 요구사항/Spring Boot 설치/jar 파일로 얻기 (0) | 2020.05.23 |