프로파일별로 다른 파일이 실행되도록 세팅하기
웹/Java2024. 8. 2. 18:11
백엔드를 만들 때, 프로파일을 나눠 빌드시 설정한 프로파일에 따라 기능을 제한해야 하는 경우가 있다.
예를 들어, 어떤 편의 기능은 좀 더 상위 프로파일에서만 지원되게 한다던가,
같은 메서드를 사용해도 프로파일에 따라 로직이 달라지는 경우가 있을 수 있다.
이런 부분을 구현하기에 앞서 먼저 기본적인 테스트를 해 봤다.
어떤 Service에 대한 인터페이스를 두고 각 프로파일별로 구현한 다음,
설정된 프로파일에 따라 각 구현된 Service 내의 메서드가 실행되도록 하려 한다.
우선 폴더 구조는 아래와 같이 설정했다.
core에 구현할 서비스의 Test 인터페이스를 생성하고, 프로파일의 이름으로 된 디렉토리 내에서 구현할 예정이다.
package com.example.demo.core;
public interface Test {
void test();
}
테스트 인터페이스는 위와 같이 간단하게 생성했다.
Initializer
package com.example.demo.core;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class Initializer {
private final ApplicationContext applicationContext;
@PostConstruct
public void init() {
Test test = applicationContext.getBean(Test.class);
test.test();
}
}
Initializer라는 클래스에서는 ApplicationContext를 불러와 Test 인터페이스의 구현체를 가져오고,
test()라는 메서드를 실행한다. 이 때 프로파일이 활성화되어 있으면 해당 구현체를 불러와 빈으로 사용한다.
구현체
인터페이스 Test를 각각 DevTest와 PrdTest로 구현한다.
각 구현체는 @Profile 어노테이션을 통해 지정된 프로파일에서만 빈으로 등록된다.
package com.example.demo.v1;
import com.example.demo.core.Test;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
@Component
@Profile("dev")
public class DevTest implements Test {
@Override
public void test() {
System.out.println("DevTest");
}
}
package com.example.demo.v2;
import com.example.demo.core.Test;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
@Component
@Profile("prd")
public class PrdTest implements Test {
@Override
public void test() {
System.out.println("PrdTest");
}
}
실행
@Component로 등록된 빈들이 스프링 컨텍스트에 로드되며,
활성화된 프로파일과 관련된 Test 인터페이스 구현체를 불러와 실행시킨다.
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
'웹 > Java' 카테고리의 다른 글
*.properties 내 값 enum 클래스로 받아 관리하기 (0) | 2024.07.26 |
---|
댓글()