2022. 2. 25. 23:40ㆍSpring 기초
기존의 테스트 코드는, 해당 테스트 클래스 내에서 단독으로 진행되었다.
이번에는 Spring 서버를 띄운 상태로 테스트를 진행하였다.
1. @SpringBootTest
이 어노테이션은 Spring Main Application(@SpringBootApplication 어노테이션)을 찾은 뒤 동일 패키지의 하위 모든 Bean을 찾아온다.
package first.firstspring;
@SpringBootApplication
public class FirstSpringApplication {
public static void main(String[] args) {
SpringApplication.run(FirstSpringApplication.class, args);
}
}
*Bean을 스프링이 자동으로 탐색한 뒤 컨테이너에 등록한다. 탐색 범위는 첫 줄 패키지부터 시작하여 하위 경로로 내려간다.
따라서, 설정 정보가 담긴 클래스는 상위 패키지에 두는 것이 좋다. 하위 Bean 중 제외하고 싶은 Bean은 filter를 사용해 등록에서 제외할 수 있다.
@ComponentScan(
basePackages = "hello.demo",
}
@ComponentScan{
basePackages = {"hello.demo", "hello.service"} // 중복 정의가 가능하다.
}
basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.
만약 지정하지 않으면 @ComponentScan 이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
@Configuration
@ComponentScan(
includeFilters = @Filter(type = FilterType.ANNOTATION, classes =
MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
MyExcludeComponent.class)
)
하위 경로 중, @MyIncludeComponent 어노테이션이 붙어있는 Bean은 컨테이너에 등록하고, @MyExcludeComponent가 붙어있는 Bean은 제외하는 코드다.
type은 기본값이 FilterType.ANNOTATION으로 (생략가능) 어노테이션 형식으로 붙어있는 케이스를 상정한다.
*includeFilters 속성은 @Component 으로 대체가 가능하다..
2. @Transactional
테스트 코드에서는 데이터베이스 정보가 테스트 이후 자동으로 rollback되어, 테스트에서 상태 의존성이 제거된다. 각각의 메서드에 모두 동작한다. 테스트 코드가 성공하고, DB에서 업데이트를 확인하고 싶다면 @Commit 어노테이션으로 DB에 커밋하는 과정이 추가로 필요하다.
테스트 코드가 아닌, Main 코드에서 @Transactional은 조금 다른 역할을 수행한다. 프록시 관련 게시글에 간단히 정리하였다.
'Spring 기초' 카테고리의 다른 글
AOP(Aspect Oriented Programming) (0) | 2022.03.02 |
---|---|
Spring JDBC Template (0) | 2022.02.25 |
스프링 웹 개발 방식 - 정적컨텐츠, MVC 패턴, API (0) | 2022.02.16 |
Cookie & Session (0) | 2022.02.09 |
DataBinder(아주 간략) (0) | 2022.02.06 |