프로필
개발을 진행하는 동안에는 실제 서비스 목적으로 운영중인 DB를 이용할 수는 없다. 개발하는 동안에는 개발용 DB를 따로 사용하거나 개발 PC에 직접 DB를 설치해서 시용한다.
처음부터 개발 목적 설정과 실 서비스 목적의 설정을 구분해서 작성하기 위한 스프링 기능이 프로필(profile) 이다.
@Configuration 설정에서 프로필 사용하기
@Configuration
@Profile("dev")
public class DsDevConfig {
@Bean(destroyMethod = "close")
public DataSource dataSource() {
DataSource ds = new DataSource();
ds .setDriverClassName("com.mysql.jdbc.Driver") ;
ds .setUrl("jdbc:mysql ://localhost/spring5fs?characterEncoding=utf8");
ds .setUsername("spring5");
ds.setPassword("spring5");
ds.setlnitia1Size(2) ;
ds.setMaxActive(10);
ds.setTestWhileldle(true);
ds .setMinEvictableldleTimeMillis(60000 * 3) ;
ds.setTimeBetweenEvictionRunsMillis(10 * 1000);
return ds ;
}
}
@Configuration
@Profile("real")
public class DsRealConng {
@Bean(destroyMethod = "close")
public DataSource dataSourceO {
DataSource ds = new DataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUri("jdbc:mysqi://realdb/spring5fs?characterEncoding=utf8");
ds.setUsername("spring5") ;
ds.setPassword("spring5") ;
… 생략
return ds;
특정 프로필을 선택하려면 컨테이너를 초기화하기 전에 setActiveProfiles() 메서드를 사용해서 프로필을 선택해야 한다.
AnnotationConflgApplicationContext context = new AnnotationConflgApplication
Context();
context.getEnvironment().setActiveProfiles("dev");
context.register(MemberConfig.class, DsDevConflg.class, DsRealConflg.class) ;
context.refresh();
getEnvironment() 메서드는 스프링 실행 환경을 설정하는데 사용되는 Environment리턴한다. 이 Environment의 setActiveProfiles() 메서드를 사용해서 프로필을 선택할 수 있다.
- setActiveProfies()메서드로 프로필 지정
- register()메서드로 설정 파일 목록 지정
- refresh() 메서드를 실행해서 컨테이너 초기화
// 프로필 두 개 이상 설정도 가능하다.
context.getEnvironment().setActiveProflles("dev" , "mysql ") ;
자바의 시스템 프로퍼티를 사용해서도 설정이 가능하다. 또 OS의 ‘spring.profies.active’ 환경 변수에 값을 설정해도 된다. 우선순위는 다음과 같다.
- setActiveProfies()
- 자바 시스템 프로퍼티
- OS 환경변수
@Configuration 을 이용한 프로필 설정
중첩 클래스를 이용해서 프로필을 한 곳으로 모을 수 있다.
@Configuration
public class MemberConfigWithProfile {
@Autowired
private DataSource dataSource:
@Bean
public MemberDao memberDao() {
return new MemberDao(dataSource) ;
}
@Configuration
@Proflle(1dev1)
public static class DsDevConfig {
@Bean(destroyMethod = "close")
public DataSource dataSource() {
DataSource ds = new DataSource() ;
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl{"jdbc:mysql://localhost/spring5fs?characterEncoding=utf8");
return ds;
}
}
@Configuration
@Profile( "『eal")
public static class DsRealConfig {
@Bean(destroyMethod = "close")
public DataSource dataSource() {
DataSource ds = new DataSource();
ds .setDriverClassName("com.mysql.jdbc.Driver"),
ds.setUrl("jdbc:mysql://realdb/ spring5fs?characterEncoding=utf8");
return ds;
}
}
}
중첩된 @Configuration 설정을 사용할 때 주의할 점은 중첩 클래스는 static 이어야 한다는 점이다.
다수 프로필 설정
스프링 설정은 두 개 이상의 프로필 이름을 가질 수 있다. 아래 코드는 real과 test 프로필을 갖는 설정 이다.
@Configuration
@Proflle("real","test")
public class DataSourceJndiConftg {
//다음과 같이 부정의 의미인 느낌표를 사용해도 된다.
// real이 사용되지 않을 때
@Profile("!rea1")
어플리케이션에서 프로필 설정하기
spring.profiles.active 시스템 프로퍼티나 환경 변수를 사용해서 사용할 프로필을 선택할 수 있다.
그리고 web.xml에서 초기화 파라미터를 이용해서 프로필을 선택할 수 있다.
<init-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</init-param>
프로퍼티 파일을 이용한 프로퍼티 설정
스프링은 외부의 프로퍼티 파일을 이용해서 스프링 빈을 설정하는 방법을 제공하고 있다. 예를 들어 다음과 같은 db.properties 파일이 있다고 하자.
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/spring5fs?characterEncoding=utf8
db.user=spring5
db.password=spring5
이 파일의 프로퍼티 값을 자바 설정에서 사용할 수 있으며 이를 통해 설정 일부를 외부 프로퍼티 파일을 사용해서 변경할 수 있다.
@Configuration 애노테이션 이용 자바 설정에서의 프로퍼티 사용
자바 설정에서 프로퍼티 파일을 사용하려면 다음 두 가지를 설정한다.
- PropertySourcesPlaceholderConfigurer 빈 설정
- @Value 애노테이션으로 프로티 값 사용
@Configuration
public class PropertyConhg {
@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConhgurer configurer =
new PropertySourcesPlaceholderConhgurer();
conhgurer.setlocations(
new ClassPathResource("db.properties" ),
new ClassPathResource("info.properties"));
return configurer;
}
}
PropertySourcesPlaceholderConfigurer#setLocations() 메서드는 프로퍼티 파일 목록을 인자로 전달 한다. 이때 스프링의 Resource 타입을 이용해서 파일 경로를 전달한다.
db.properties 파일이 클래스 패스에 위치하고 있다면(예, src/main/resources 폴더) 위와 같이 프로퍼티 파일 정보를 전달한다.
또 주의해서 봐야할 점은 메서드가 static이라는 점이다. 이는 PropertySourcesPlaceholderConfigurer 클래스가 특수한 목적의 빈이기 때문이며 정적 메서드로 지정하지 않으면 원하는 방식으로 동작하지 않는다.
PropertySourcesPlaceholderConfigurer 타입 빈은 serLocations() 메서드로 전달받은 프로퍼티 파일 목록 정보를 읽어와 필요할 때 사용한다. 이를 위한 것이 @Value 애노테이션이다.
@Configuration
public class DsConflgWithProp {
@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.setlnitia1Size(2) ;
ds.setMaxActive(10) ,
ds.setTestWhileldle(true);
ds.setMinEvictableldleTimeMillis(60000 * 3).
ds .setTimeBetweenEvictionRunsMillis(10 * 1000),
return ds :
}
}
빈 클래스에서 사용하기
빈으로 사용할 클래스에도 @value 애노테이션을 붙일 수 있다.
public class Info {
@Value("${info.version}")
private String version ;
public void printlnfo() {
System.out.println("version = " + version);
}
//@Value("${info.version}") // set메서드에서도 적용 가능
public void setVersion(String version) {
this.versirsion=version;
}
}
@Value 애노테이션을 필드에 붙이면 플레이스 홀더 에 해당하는 프로퍼티를 필드에 할당한다.
Reference
초보 웹개발자를 위한 스프링5 프로그래밍 입문
'Spring > 스프링5 프로그래밍 입문' 카테고리의 다른 글
초보 웹 개발자를 위한 스프링5 프로그래밍 입문 REVIEW (1) | 2023.04.17 |
---|---|
Chapter 16. JSON 응답과 요청 처리 (0) | 2023.04.13 |
Chapter 15. 간단한 웹 어플리케이션 구조 (0) | 2023.04.12 |
Chapter 14. MVC 4: 날짜 값 변환, @PathVariable, 익셉션 처리 (0) | 2023.04.11 |
Chapter 13. 세션, 인터셉터, 쿠키 (0) | 2023.04.10 |