프로퍼티 파일을 이용한 프로퍼티 설정
스프링은 외부의 프로퍼티 파일을 이용해서 스프링 빈을 설정하는 방법을 제공하고 있다.
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/spring5fs?characterEncoding=utf8
db.user=spring5
db.password=spring5
이 파일의 프로퍼티 값을 자바 설정에서 사용할 수 있으며 이를 통해 설정 일부를 외부 프로퍼티 파일을 사용해 변경할 수 있다.
@Configuration 어노테이션 이용 자바 설정에서의 프로퍼티 사용
자바 설정에서 프로퍼티 파일을 사용하려면 다음 두 가지를 설정한다.
1. PropertySourcesPlaceholderConfigurer 빈 설정
package config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
@Configuration
public class PropertyConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer peoperties() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocations(
new ClassPathResource("db.properties"),
new ClassPathResource("info.properties"));
return configurer;
}
}
PropertySourcesPlaceholderConfigurer의 setLocations() 메서드는 프로퍼티 파일 목록을 인자로 전달받는다. 이때 스프링의 Resource 타입을 이용해서 파일 경로를 전달한다. db.properties 파일이 클래스 패스에 위치하고 있다면 ClassPathResource 클래스를 이용해서 프로퍼티 파일 정보를 전달한다.
💡 o.s.core.io.Resource 인터페이스는 스프링에서 자원을 표현할 때 사용한다. 대표적인 구현 클래스로는 다음 두가지가 있다.
여기서 주의점은 PropertySourcesPlaceholderConfigurer 타입 빈을 설정하는 메서드가 정적(static) 메서드라는 것이다. 이는 이 클래스가 특수한 목적의 빈이기 때문이며 정적 메서드로 지정하지 않으면 원하는 방식으로 동작하지 않는다.
package config;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DsConfigWithProp {
@Value("${db.driver}")
private String driver;
@Value("${db.url}")
private String jdbcUrl;
@Value("${db.user}")
private String user;
@Value("${db.password}")
private String password;
@Bean(destroyMethod = "close")
public DataSource dataSource() {
DataSource ds = new DataSource();
ds.setDriverClassName(driver);
ds.setUrl(jdbcUrl);
ds.setUsername(user);
ds.setPassword(password);
ds.setInitialSize(2);
ds.setMaxActive(10);
ds.setTestWhileIdle(true);
ds.setMinEvictableIdleTimeMillis(60000 * 3);
ds.setTimeBetweenEvictionRunsMillis(10 * 1000);
return ds;
}
}
PropertySourcesPlaceholderConfigurer의 타입 빈은 setLocations() 메서드로 전달받은 프로퍼티 파일 목록 정보를 읽어와 필요할 때 사용하는데 이를 위한 것이 @Value 어노테이션이다.
@Value 어노테이션이 ${구분자} 형식의 플레이스홀더를 값으로 갖고 있는데 이 경우 PropertySourcesPlaceholderConfigurer는 플레이스홀더의 값을 일치하는 프로퍼티 값으로 치환한다. 위 예의 경우 ${db.driver} 플레이스홀더를 db.properties에 정의되어 있는 db.driver 프로퍼티 값으로 치환한다.
빈 클래스에서 사용하기
빈으로 사용할 클래스에도 @Value 어노테이션을 붙일 수 있다.
package spring;
import org.springframework.beans.factory.annotation.Value;
public class Info {
@Value("${info.version}")
private String version;
public void printInfo() {
System.out.println("version=" + version);
}
public void setVersion(String version) {
this.version = version;
}
}
@Value 어노테이션을 필드에 붙이면 플레이스홀더에 해당하는 프로퍼티를 필드에 할당한다. 위의 경우 info.version 프로퍼티에 해당하는 값을 version 필드에 할당한다.
@Value("${info.version}")
public void setVersion(String version) {
this.version = version;
}
set 메서드에도 적용 가능 ~!
🗣 드뎌 책 한권의 실습이 끝이 났다 !!!!!! 한동안 직장 다니고 운동다니고 하느라 공부하고 포스팅하는 걸 조금 소홀히 했는데.. 어찌저찌해서 끝이 났다 !!! 자축경축 .. 복습하고 또 하고 더더더 공부해야지 !