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 방식으로 프록시 생성됨