Web/팁

[Spring] main과 test에서 따로 동작하는 클래스 만들기

 

개발을 하다보면 main에서만 실행되고 test에서는 실행되길 기대하지 않는 메서드(나 클래스)가 있을 수 있습니다.

 

main 과 test에서 따로 동작하는 클래스를 제작하는 방법에 대해 다뤄봅니다.

 

 

 

방법

 

1. application.yml 을 main과 test에 따로 만들고 spring.profiles.active 이름을 다르게 지정합니다.

 

main의 application.yml

spring:
  profiles:
    active: local
  ...

 

 

test의 application.yml

spring:
  profiles:
    active: test
  ...

 

 

 

 

 

 

2. main에서만 실행되길 기대하는 클래스에 @Profile("local")을 붙여줍니다.

 

보통은 개발단계에서 InitDB를 main에서만 실행시킬때 사용합니다.

...

@Profile("local")
@Component
@RequiredArgsConstructor
public class InitDB {

    private final InitService initService;

    @PostConstruct
    public void init() {
        initService.dbInit1();
    }


    @Component
    @Transactional
    @RequiredArgsConstructor
    static class InitService {
        private final EntityManager em;

        public void dbInit1() {
            ...
        }
    }
}

 

 

 

 

 

 

 

왜 됨?

Spring boot는 main을 실행하면 main의 application.yml을 읽어서 실행하고, test를 실행하면 main의 application.yml을 읽어서 실행합니다.

 

@Profile 어노테이션은 현재 읽은 application.yml의 active 이름을 읽어서 일치할 경우에 실행하도록 합니다.

그래서 현재 local(main) application.yml이 실행되고 있으므로 InitDB가 동작하고, Test의 applicaiton.yml이 실행될때는 InitDB가 동작하지 않게 되는 것입니다.