본문 바로가기

STUDY/스프링 철저 입문

1-6) 스프링 프로퍼티(Property): @PropertySource, @Value, Environment

 - 스프링 프로퍼티(Property)

 

소스 코드를 작성하다 보면, 정적으로 하드코딩된 내용을 쓸때가 있다. 대표적으로 DB의 설정정보가 그렇다. 그래서 DB 설정 정보 클래스를 보면 다음과 같이 코딩되어있다.

 

 

@Configuration
@Import(value = {DBConfig.class})
public class AppConfig {
  ...
}

 

@Configuration
public class DBConfig {
  private String driver = "DB 접속 드라이버";
  private String url = "DB 접속 URL";
  private String username = "DB 접속 유저명";
  private String password = "DB 접속 패스워드";
  ...
  @Override
  public String toString() {
    return "DBConfig [driver=" + driver + ", url=" + url + ", username=" + username + ", password="
  	+ password + "]";
  }
  ...
}

 

하지만 이와 같은 코딩은 몇가지 단점이 있다. 먼저, 소스코드에 설정 정보가 있기 때문에, 변경사항이 있으면 빌드부터 다시 해야 한다는 점이다. 또, 소스코드를 공유해야하는 상황일 때, 민감한 설정 정보까지 포함되어 있어서 공유에 어려움이 따른다. 이를 해결하기위해 설정 정보 파일을 따로 분리하고, 불러오는 방식을 사용할 수 있다. 그리고 스프링 프로퍼티가 바로 그것이다.

 

 

 - 실습: @PropertySource

 

스프링 프로퍼티를 사용하는 법은 매우 간단하다. resources 폴더에 dbProperty.properties 파일을 만들고, 스프링 설정 클래스(@Configuration이 적용된 클래스)에 @PropertySource를 적용해주면 된다.

 

[dbProperty.properties 파일]
dbconfig.driver=myDriver
dbconfig.url=myUrl
dbconfig.username=myUsername
dbconfig.password=myPassword
@Configuration
@PropertySource(value = {"dbProperty.properties"})
public class DBConfig {
  ...
}

 

이렇게 하면 스프링이 시작될 때, dbProperty.properties를 불러와서, 스프링 프로퍼티에 해당 데이터를 저장한다.

 

 

 - 실습: @Value

 

이제 DBConfig 클래스의 속성을 dbProperty.properties에 있는 데이터를 사용해서 채워보겠다. 각 속성의 선언문 앞에 @Value("${프로퍼티명}")을 적어주면 된다.

 

@Configuration
@PropertySource(value = {"dbProperty.properties"})
public class DBConfig {
  @Value("${dbconfig.driver}")
  private String driver;
  @Value("${dbconfig.url}")
  private String url;
  @Value("${dbconfig.username}")
  private String username;
  @Value("${dbconfig.password}")
  private String password;
  ...
}
public static void main(String[] args) {
  AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(AppConfig.class);
  DBConfig dbConfig = appContext.getBean(DBConfig.class);
  System.out.println(dbConfig);
}

 

DBConfig의 각 속성에 @Value 어노테이션을 적용하여, 프로퍼티의 값들이 들어가도록 하였다. 그리고 실제로 dbConfig를 출력해보면 다음과 같이 나온다.

 

DBConfig [driver=myDriver, url=myUrl, username=myUsername, password=myPassword]

 

 

 - 실습: Environment

 

 

저장된 스프링 프로퍼티는 다음과 같이 Environment 객체를 통하여 접근할 수도 있다.

 

@Configuration
@PropertySource(value = {"myProperty.properties"})
public class DBConfig {
  @Autowired
  private Environment env;
  
  private String driver = env.getProperty("dbconfig.driver");
  private String url = env.getProperty("dbconfig.url");
  private String username = env.getProperty("dbconfig.username");
  private String password = env.getProperty("dbconfig.password");
  ...
}

 

DBConfig의 각 속성에 Environment 객체를 이용하여, 프로퍼티의 값들이 들어가도록 하였다. 그리고 실제로 dbConfig를 출력해보면 다음과 같이 나온다.

 

DBConfig [driver=myDriver, url=myUrl, username=myUsername, password=myPassword]

 

 

 - 마무리

 

고정된 설정 정보는 소스코드가 아니라 설정파일로 분리하여 두는것이 유지보수, 보안성 측면에서 좋다. 개발을 하다가 설정정보를 하드코딩하고 있는 자신의 모습을 발견한다면, 즉시 스프링 프로퍼티를 사용하는 것이 좋지 않을지 고민해 보아야 할 것이다.

 

728x90