[첫번째 프로젝트] 각종 어노테이션들 - @SpringBootApplication, auto-configuration

노력을 즐겼던 사람·2020년 4월 2일
0

참고 문서

https://docs.spring.io/spring-boot/docs/2.1.9.RELEASE/reference/html/

@SpringBootApplication

@SpringBootAplication는 auto-configuration을 담당한다. application class에서 extra configuration을 정의하거나 component scan을 해준다.
@SpringBootApplication 하나만으로 @EnableAutoConfiguration, @ComponentScan, @Configuration 세 가지 Annotation을 사용한 것과 같은 동작을 할 수 있다.

Auto-configuration

Spring Boot auto-configuration은 jar dependencie에 추가된 내용을 바탕으로 우리의 Spring application을 자동으로 configure하려고 시도한다. 예를들어 HSQLDB가 우리의 classpath에 있거나 아무런 database bean을 연결하지 않았을 경우 Spring Boot는 자동으로 in-memory database를 연결해준다.

Disabling Specific Auto-configuration Classes

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

@SpringBootApplication 대신 직접 @EnableAutoConfiguration을 사용하여 Specific class를 exclude했다.

Locating the Main Application Class

@SpringBootApplication이 붙은 Class는 root 디렉토리에 위치하는 것을 권장하고 있다.

Configuration Class

SpringBoot는 XML 기반 Configuration과 Java-based Configuration을 지원한다. 그리고 Java-based Configuration을 선호한다.
Enable*로 시작하는 annotation을 찾아보는 것이 가장 바람직하다.

  • XML Configuration
    • @ImportResource annotation을 사용해서 XML을 Load하는 것이 바람직하다.
  • Java-based Configuration
    • ComponentScan을 사용해 @Configuration class들을 자동으로 scan할 수 있다.
    • @Import를 사용해 직접 추가할 수도 있다.

Spring Beans and Dependency Injection

SpringBoot의 auto-configuration은 standard Spring Framework의 기술들을 자유롭게 사용하도록 도와준다. 그러나 auto-configuration이 동작하려면 @Component, @Service, @Repository, @Controller들을 사용하기 위해서 Bean을 등록을 해줘야한다.
Bean을 등록하기 위해서 @Autowired를 사용할 수 있다. (필자의 경우 lombok@RequiredConstructor를 통해 Bean을 주입했다.)

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 // parameter가 1개 일 때는 Autowired가 없어도 된다. 즉, 지금 같은 경우에는 Autowired가 없어도 됨
    public DatabaseAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }

    // ...

}

@Service를 사용하기 위해 constructor에 @Autowired를 이용해 bean을 registered했다. 여기서 주의할 점은 RiskAssessor에 final이 붙은 것이다.
위의 코드는 아래와 같이도 사용할 수 있다.

package com.example.service;

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

@RequiredConstructor
@Service
public class DatabaseAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

    // ...

}
profile
노력하는 자는 즐기는 자를 이길 수 없다 를 알면서도 게으름에 지는 중

0개의 댓글