spring boot 2.1
@WebMvcTest
spring boot 2.2
- 
Spring Framework 5.2 
- 
JUnit 5 
생성자 @Autowired
- 
SpringBoot 2.2.0 부터 JUnit5가 기본으로 변경됨 - 참고 
- 
JUnit5부터 생성자를 통해 주입받을 수 있음 class UserControllerTest { private final UserController userController; @Autowired private UserControllerTest(UserController userController) { this.userController = userController; } }
- 
@TestConstructor어노테이션을 사용하여 생성자에@Autowired를 생략할 수 있다.@TestConstructor(autowireMode = AutowireMode.ALL) class UserControllerTest { private final UserController userController; private UserControllerTest(UserController userController) { this.userController = userController; } }
@AutoConfigureMockMvc
- 
MockMvc를 Builder 없이 주입 받을 수 있다.
Context
- 
bean을 다루기 위한 공간? 
- 
root-context - 
여기에 등록된 빈들은 컨텍스트들에 공유함 
- 
스프링에 의해 생성되는 빈에 대한 spring ioc container 
- 
여러 서블릿에서 공통으로 사용할 빈을 등록하는 컨텍스트 
- 
service, repository 
 
- 
- 
servlet-context - 
빈을 공유하지 않고, 빈이 없으면 root-context에서 찾음 
- 
서블릿 단위로 생성 
- 
controller 
 
- 
@SpringBootConfiguration
@startuml [Configuration] <|-- [SpringBootConfiguration] [SpringBootConfiguration] <|-- [SpringBootApplication] [EnableAutoConfiguration] <|-- [SpringBootApplication] [ComponentScan] <|-- [SpringBootApplication] @enduml
- 
@SpringBootConfiguration은@Configuration의 대안.
- 
@SpringBootConfiguration은 Spring Boot 어플리케이션의@Configuration들을 제공함
- 
@SpringBootConfiguration을 사용하면 설정을 자동으로 찾을 수 있으므로 단위, 통합 테스트에서 유용.
- 
Spring Boot 어플리케이션에서는 하나의 @SpringBootConfiguration만을 포함해야함- 
대부분의 Spring Boot 어플리케이션들은 @SpringBootApplication을 사용함으로써@SpringBootConfiguration을 사용함.
 
- 
- 
@EnableAutoConfiguration은 대게@Conditional한 설정을들 위해 사용한다 함. 하지만 프로젝트에서 모듈을 나누고 의존성 추가만으로 설정 주입 받기를 원하면서@Conditional이 아닌 congiguration을 사용함(spring.factories > org.springframework.boot.autoconfigure.EnableAutoConfiguration) 
AOP
- 
해당 bean이 - 
인터페이스를 구현하고 있다면 JDK Dynamic Proxy 방식으로 프록시 생성 
- 
인터페이스를 구현하고 있지 않다면 CGLIB 방식으로 프록시 생성 
 
- 
- 
JDK Dynamic Proxy - 
Java 리플렉션 패키지에 존재하는 Proxy 클래스를 통해 생성되는 객체 
- 
리플렉션의 Proxy 클래스가 동적으로 Proxy를 생성해줌 
- 
인터페이스 타입으로 DI 
 
- 
- 
CGLIB - 
Code Generator Library 
- 
클래스의 바이트코드를 조작하여 Proxy 객체를 생성해주는 라이브러리 
- 
Enhancer 클래스를 통해 Proxy 생성 
- 
인터페이스 타입으로 DI 
 
- 
- 
Spring Boot는 인터페이스를 구현한 클래스가 CGLib 방식으로 프록시 생성됨