본 게시글은 Seoul wiz의 신입SW인력을 위한 실전 자바(Java) 스프링(Spring)을 참고하여 작성한 글입니다.
외부에 따로 저장해놓은 세팅 (ID, PW, DB설정 등등)을 스프링 내에서 사용할 일이 종종 생긴다고 한다.
외부 파일의 내용을 Spring으로 가져와 사용하는 방법을 살펴보자. (주로 초기에 설정해야 할 때)
외부 파일로 환경설정 하는 법 (Environment 사용)
우선 대략적인 방법은 다음과 같다.
Context로부터 -> Environment (환경설정)객체를 생성한다.
이제 이 Environment 객체 내에는 PropertySource라는 객체 형식으로 사용 할 정보들이 존재한다.
이 PropertySource 객체들을 빼서 사용하면 된다.
일단 properties라고 아무 파일을 만들어서 사용할 내용을 적어보자.
그리고 이것을 읽어서 사용해보자. Environment 객체를 통해 전체 PropertySources들을 읽어오고,
해당 파일을 추가해주면 읽어올 수 있다.
public static void main(String[] args) {
//ConfigurableApplicationContext = 가장 상위 인터페이스 (Abstract, GenericXml)
//Context 생성
ConfigurableApplicationContext context = new GenericXmlApplicationContext();
//Environment 생성
ConfigurableEnvironment environment = context.getEnvironment();
//PropertySource 다 가져오기
MutablePropertySources propertySources = environment.getPropertySources();
System.out.println(environment.getProperty("myid"));
System.out.println(environment.getProperty("mypw"));
//내가 만든 property 정보를 추가하기
try{
propertySources.addLast(new ResourcePropertySource("classpath:properties"));
//읽어오기
System.out.println(environment.getProperty("myid"));
System.out.println(environment.getProperty("mypw"));
}catch(Exception e){
e.printStackTrace();
}
}
그렇다면 이 프로퍼티 값을 객체에 사용해보자. 위의 main 코드 하단에 아래의 코드를 추가해주자.
GenericXmlApplicationContext gcontext = (GenericXmlApplicationContext) context;
gcontext.load("appCTX.xml");
gcontext.refresh();
AdminConnection adConnection = gcontext.getBean("adminConnection", AdminConnection.class);
System.out.println("ID : " + adConnection.getId());
System.out.println("PW : " + adConnection.getPw());
gcontext.close();
context.close();
xml파일도 설정해주자. 이때 adminConnection 클래스에 대한 정보는 아래 한줄로 충분하다.
<bean id ="adminConnection" class="com.birdmissile.demo.AdminConnection"/>
사용할 AdminConnection 클래스 파일 역시 생성해주자. 여기서 주목해야 할 것은 EnvironmentAware 인터페이스이다.
EnvironmentAware 인터페이스를 구현하게 되면, setEnvironment 메소드를 구현하게 된다.
이 setEnvironment는 Bean이 생성되기도 전에 호출되어 (Initializing을 통한 메소드보다도 먼저) 자동으로 시스템에서 Environment 객체를 받아와 설정한다.
이후 afterPropertiesSet에서 필드를 세팅하는 형식으로 외부 파일에 있는 설정값을 사용할 수 있다.
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
public class AdminConnection implements EnvironmentAware, InitializingBean{
private Environment env;
private String id;
private String pw;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("필드 세팅");
//Environment에 있는 id, pw를 set하기
setId(env.getProperty("myid"));
setPw(env.getProperty("mypw"));
}
//환경 설정
@Override
public void setEnvironment(Environment environment) {
System.out.println("환경 설정");
setEnv(environment);
}
public void setEnv(Environment ev){
this.env = ev;
}
/*id, pw의 setter getter들
...
*/
}
프로퍼티 파일로 직접 설정해보기
1) XML
xml 파일의 "context:property-placeholder"이 location의 파일(외부 환경)에서 가져온다고 명시하는 부분이다.
(context와 schemaLocation 역시 정의해주어야 한다)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:property-placeholder location="classpath:properties"/>
<bean id ="adminConnection" class="com.birdmissile.demo.AdminConnection">
<property name="id">
<value>${id}</value>
</property>
<property name="pw">
<value>${pw}</value>
</property>
</bean>
2) JAVA로 해보기
JAVA 파일로 하는 법은 다음과 같다. 지난 게시글과 같이 AppConfig 클래스를 만들어준다.
xml에서 property-placeholder에 해당하는 PropertySourcesPlaceholderConfiguer를 반환하는 Properties() 메소드를 정의한다. 이 메소드는 시스템에서 자동으로 호출해준다.
메소드 내에서 원하는 외부파일의 위치를 지정하게 하면 시스템이 외부 파일에서 읽어온다.
이 값을 위 value annotation 부분(@Value)을 통해 할당시켜주고 사용하면 되는 것이다.
@Configuration // 스프링 설정에 사용한다고 명시
public class AppConfig {
//value annotation
@Value("${id}")
private String id;
@Value("${pw}")
private String pw;
@Bean //PropertySourcePlaceholder를 정의해주기
public static PropertySourcesPlaceholderConfigurer Properties(){
PropertySourcesPlaceholderConfigurer config = new PropertySourcesPlaceholderConfigurer();
Resource location = new ClassPathResource("properties");
config.setLocation(location); //위치 지정
return config;
}
@Bean
public AdminConnection adminConnection(){
AdminConnection adc = new AdminConnection();
adc.setId(id);
adc.setPw(pw);
return adc;
}
}
프로파일 속성을 이용하기
Spring bean을 여러개 만들어 놓고 profile 속성을 사용하여 상황에 맞게 원하는 빈을 사용하게 할 수도 있다.
보통 개발환경 / 실행환경에 대해 다르게 테스팅하는 경우 위와 같이 한다고 한다.
1) XML을 사용하는 경우
devCTX.xml, runCTX.xml의 파일 두개를 만들고, beans를 정의하는 부분에서 profile 을 추가해준다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
profile = "dev">
<bean id ="adminConnection" class="com.birdmissile.demo.AdminConnection">
<property name="id" value = "devSituation"/>
<property name="pw" value = "devPass"/>
</bean>
</beans>
이때 Spring 3.1버전 이상이어야지 profile 기능을 사용할 수 있다. (schemaLocation부분에서 버전 확인하자)
아니면 그냥 이런식으로 한 파일 내에 정의할 수도 있다.
<beans profile = "dev">
<bean id ="adminConnection" class="com.birdmissile.demo.AdminConnection">
<property name="id" value = "devSituation"/>
<property name="pw" value = "devPass"/>
</bean>
</beans>
<beans profile = "run">
<bean id ="adminConnection" class="com.birdmissile.demo.AdminConnection">
<property name="id" value = "runSituation"/>
<property name="pw" value = "runPass"/>
</bean>
</beans>
실행함에 있어 profile은 Context의 getEnvironment().setActiveProfiles("상황")으로 설정하면서 xml 파일을 호출할 수 있고,
profile에 맞는 beans가 선택되어 사용된다.
GenericXmlApplicationContext context = new GenericXmlApplicationContext();
String situation = "dev";
context.getEnvironment().setActiveProfiles(situation); //profile 설정
context.load("classpath:devCTX.xml","classpath:runCTX.xml");
context.refresh();
AdminConnection adConnection = context.getBean("adminConnection", AdminConnection.class);
2) JAVA를 사용하는 경우
역시 두개의 상황에 따른 class파일을 생성한다.
Profile annotation을 사용해 profile을 명시하기만 하면 된다.
@Configuration // 스프링 설정에 사용한다고 명시
@Profile("run")
public class AppConfigRun {
@Bean
public AdminConnection adminConnection(){
AdminConnection adc = new AdminConnection();
System.out.println("run상황");
adc.setId("runSituation");
adc.setPw("runPass");
return adc;
}
}
java를 사용하는 경우 register로 class들을 등록하는데, 역시 setActiveProfiles를 통해 상황을 설정해놓고 맞는 Profile에 따른 class를 호출한다.
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
String situation = "run";
context.getEnvironment().setActiveProfiles(situation);
context.register(AppConfigDev.class, AppConfigRun.class);
context.refresh();
전문가가 아니라 정확하지 않은 지식이 담겨있을 수 있습니다.
언제든지 댓글로 의견을 남겨주세요!
본 게시글은 Seoul wiz의 신입SW인력을 위한 실전 자바(Java) 스프링(Spring)을 참고하여 작성한 글입니다.
외부에 따로 저장해놓은 세팅 (ID, PW, DB설정 등등)을 스프링 내에서 사용할 일이 종종 생긴다고 한다.
외부 파일의 내용을 Spring으로 가져와 사용하는 방법을 살펴보자. (주로 초기에 설정해야 할 때)
외부 파일로 환경설정 하는 법 (Environment 사용)
우선 대략적인 방법은 다음과 같다.
Context로부터 -> Environment (환경설정)객체를 생성한다.
이제 이 Environment 객체 내에는 PropertySource라는 객체 형식으로 사용 할 정보들이 존재한다.
이 PropertySource 객체들을 빼서 사용하면 된다.
일단 properties라고 아무 파일을 만들어서 사용할 내용을 적어보자.
그리고 이것을 읽어서 사용해보자. Environment 객체를 통해 전체 PropertySources들을 읽어오고,
해당 파일을 추가해주면 읽어올 수 있다.
public static void main(String[] args) {
//ConfigurableApplicationContext = 가장 상위 인터페이스 (Abstract, GenericXml)
//Context 생성
ConfigurableApplicationContext context = new GenericXmlApplicationContext();
//Environment 생성
ConfigurableEnvironment environment = context.getEnvironment();
//PropertySource 다 가져오기
MutablePropertySources propertySources = environment.getPropertySources();
System.out.println(environment.getProperty("myid"));
System.out.println(environment.getProperty("mypw"));
//내가 만든 property 정보를 추가하기
try{
propertySources.addLast(new ResourcePropertySource("classpath:properties"));
//읽어오기
System.out.println(environment.getProperty("myid"));
System.out.println(environment.getProperty("mypw"));
}catch(Exception e){
e.printStackTrace();
}
}
그렇다면 이 프로퍼티 값을 객체에 사용해보자. 위의 main 코드 하단에 아래의 코드를 추가해주자.
GenericXmlApplicationContext gcontext = (GenericXmlApplicationContext) context;
gcontext.load("appCTX.xml");
gcontext.refresh();
AdminConnection adConnection = gcontext.getBean("adminConnection", AdminConnection.class);
System.out.println("ID : " + adConnection.getId());
System.out.println("PW : " + adConnection.getPw());
gcontext.close();
context.close();
xml파일도 설정해주자. 이때 adminConnection 클래스에 대한 정보는 아래 한줄로 충분하다.
<bean id ="adminConnection" class="com.birdmissile.demo.AdminConnection"/>
사용할 AdminConnection 클래스 파일 역시 생성해주자. 여기서 주목해야 할 것은 EnvironmentAware 인터페이스이다.
EnvironmentAware 인터페이스를 구현하게 되면, setEnvironment 메소드를 구현하게 된다.
이 setEnvironment는 Bean이 생성되기도 전에 호출되어 (Initializing을 통한 메소드보다도 먼저) 자동으로 시스템에서 Environment 객체를 받아와 설정한다.
이후 afterPropertiesSet에서 필드를 세팅하는 형식으로 외부 파일에 있는 설정값을 사용할 수 있다.
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
public class AdminConnection implements EnvironmentAware, InitializingBean{
private Environment env;
private String id;
private String pw;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("필드 세팅");
//Environment에 있는 id, pw를 set하기
setId(env.getProperty("myid"));
setPw(env.getProperty("mypw"));
}
//환경 설정
@Override
public void setEnvironment(Environment environment) {
System.out.println("환경 설정");
setEnv(environment);
}
public void setEnv(Environment ev){
this.env = ev;
}
/*id, pw의 setter getter들
...
*/
}
프로퍼티 파일로 직접 설정해보기
1) XML
xml 파일의 "context:property-placeholder"이 location의 파일(외부 환경)에서 가져온다고 명시하는 부분이다.
(context와 schemaLocation 역시 정의해주어야 한다)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:property-placeholder location="classpath:properties"/>
<bean id ="adminConnection" class="com.birdmissile.demo.AdminConnection">
<property name="id">
<value>${id}</value>
</property>
<property name="pw">
<value>${pw}</value>
</property>
</bean>
2) JAVA로 해보기
JAVA 파일로 하는 법은 다음과 같다. 지난 게시글과 같이 AppConfig 클래스를 만들어준다.
xml에서 property-placeholder에 해당하는 PropertySourcesPlaceholderConfiguer를 반환하는 Properties() 메소드를 정의한다. 이 메소드는 시스템에서 자동으로 호출해준다.
메소드 내에서 원하는 외부파일의 위치를 지정하게 하면 시스템이 외부 파일에서 읽어온다.
이 값을 위 value annotation 부분(@Value)을 통해 할당시켜주고 사용하면 되는 것이다.
@Configuration // 스프링 설정에 사용한다고 명시
public class AppConfig {
//value annotation
@Value("${id}")
private String id;
@Value("${pw}")
private String pw;
@Bean //PropertySourcePlaceholder를 정의해주기
public static PropertySourcesPlaceholderConfigurer Properties(){
PropertySourcesPlaceholderConfigurer config = new PropertySourcesPlaceholderConfigurer();
Resource location = new ClassPathResource("properties");
config.setLocation(location); //위치 지정
return config;
}
@Bean
public AdminConnection adminConnection(){
AdminConnection adc = new AdminConnection();
adc.setId(id);
adc.setPw(pw);
return adc;
}
}
프로파일 속성을 이용하기
Spring bean을 여러개 만들어 놓고 profile 속성을 사용하여 상황에 맞게 원하는 빈을 사용하게 할 수도 있다.
보통 개발환경 / 실행환경에 대해 다르게 테스팅하는 경우 위와 같이 한다고 한다.
1) XML을 사용하는 경우
devCTX.xml, runCTX.xml의 파일 두개를 만들고, beans를 정의하는 부분에서 profile 을 추가해준다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
profile = "dev">
<bean id ="adminConnection" class="com.birdmissile.demo.AdminConnection">
<property name="id" value = "devSituation"/>
<property name="pw" value = "devPass"/>
</bean>
</beans>
이때 Spring 3.1버전 이상이어야지 profile 기능을 사용할 수 있다. (schemaLocation부분에서 버전 확인하자)
아니면 그냥 이런식으로 한 파일 내에 정의할 수도 있다.
<beans profile = "dev">
<bean id ="adminConnection" class="com.birdmissile.demo.AdminConnection">
<property name="id" value = "devSituation"/>
<property name="pw" value = "devPass"/>
</bean>
</beans>
<beans profile = "run">
<bean id ="adminConnection" class="com.birdmissile.demo.AdminConnection">
<property name="id" value = "runSituation"/>
<property name="pw" value = "runPass"/>
</bean>
</beans>
실행함에 있어 profile은 Context의 getEnvironment().setActiveProfiles("상황")으로 설정하면서 xml 파일을 호출할 수 있고,
profile에 맞는 beans가 선택되어 사용된다.
GenericXmlApplicationContext context = new GenericXmlApplicationContext();
String situation = "dev";
context.getEnvironment().setActiveProfiles(situation); //profile 설정
context.load("classpath:devCTX.xml","classpath:runCTX.xml");
context.refresh();
AdminConnection adConnection = context.getBean("adminConnection", AdminConnection.class);
2) JAVA를 사용하는 경우
역시 두개의 상황에 따른 class파일을 생성한다.
Profile annotation을 사용해 profile을 명시하기만 하면 된다.
@Configuration // 스프링 설정에 사용한다고 명시
@Profile("run")
public class AppConfigRun {
@Bean
public AdminConnection adminConnection(){
AdminConnection adc = new AdminConnection();
System.out.println("run상황");
adc.setId("runSituation");
adc.setPw("runPass");
return adc;
}
}
java를 사용하는 경우 register로 class들을 등록하는데, 역시 setActiveProfiles를 통해 상황을 설정해놓고 맞는 Profile에 따른 class를 호출한다.
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
String situation = "run";
context.getEnvironment().setActiveProfiles(situation);
context.register(AppConfigDev.class, AppConfigRun.class);
context.refresh();
전문가가 아니라 정확하지 않은 지식이 담겨있을 수 있습니다.
언제든지 댓글로 의견을 남겨주세요!
'코딩 > 스프링 [JAVA]' 카테고리의 다른 글
Spring MVC [Controller, servlet-context, eclipse] (1) | 2021.01.12 |
---|---|
AOP (Aspect Oriented Programming) [Spring] (0) | 2021.01.11 |
컨테이너 생명 주기 [Spring] (0) | 2021.01.08 |
DI (Dependency Injection) Spring에서 적용하기 (0) | 2021.01.07 |
VS Code로 Spring 시작하기 (0) | 2021.01.02 |
Comment