본문 바로가기

더 나은 엔지니어가 되기 위해/지금은 안쓰는 자바

[스프링 프레임워크 핵심 기술] IoC 컨테이너 2

인프런에서 백기선님의 스프링 프레임워크 핵심 기술 을 공부하며 개인적으로 정리한 글입니다.

Profile

Profile 은 빈들의 그룹이다.
예를 들어, 테스트 환경에서는 A 라는 빈을 사용하고 싶고, 배포 환경에서는 B 라는 빈을 사용하고 싶을 때, Profile 을 통해 이러한 설정을 잡아줄 수 있다.

정의

@Profile("이름") 을 통해 정해줄 수 있다.

@Repository
@Profile("test")
public class TestBookRepository implements BookRepository {

}

@Repository
@Profile("prod")
public class ProdBookRepository implements BookRepository {

}

사용 설정

예를 들어, "test" 환경을 사용하고 싶으면, 환경 변수 spring.profiles.active = test 를 설정해준다.
이는 application.properties 나, 실행 arguments 형식 어떤 것으로 값을 줘도 무방함.

표현식

Profile 의 값으로 다음과 같은 표현식이 가능하다.

  • ! (not)
  • & (and)
  • | (or)

예를 들면 Profile("!test") 와 같이 사용할 수 있다.

Property

Property 를 통해 환경 변수에 대해 정의하고 접근할 수 있음.

1) JVM 시스템 Property

JVM 옵션으로 -Dkey=value 형태로 환경 변수를 정의할 수 있다.
예를 들어, -Dapp.name=spring5 으로 준 뒤, 이 값을 Environment 객체를 통해 다음과 같이 받아올 수 있다.

@Component
public class AppRunner implements ApplicationRunner {

  @Autowired
  ApplicationContext ctx;

  @Override
  public void run(ApplicationArguments args) throws Exception {
    Environment environment = ctx.getEnvironment();
    System.out.println(environment.getProperty("app.name"));
  }
}

실행하면 다음과 같이 출력된다.

spring5

2) @PropertySource

app.properties 파일에 별도로 환경 변수를 설정해놓을 수 있다.
예를 들어,

# app.properties

app.about = "heumsi"

로 작성하고, Application 구동 부에서 이 파일을 다음과 같이 읽어오도록 한다.

@SpringBootApplication
@PropertySource("classpath:/app.properties")
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

이후 Runner 에서 이를 확인해보면, 잘 읽어오는 것을 알 수 있다.

@Override
public void run(ApplicationArguments args) throws Exception {
  Environment environment = ctx.getEnvironment();
  System.out.println(environment.getProperty("app.about"));
}
heumsi

우선 순위

같은 프로퍼티의 Key 값이 존재하는 경우에는 어떤 값이 사용될까?
즉 어떤 파일 혹은 로드 되는 값이 우선 순위가 높을까?

이에 대한 정리는 이전 포스팅 참고