본문으로 바로가기

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