신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

Environment 객체

Environment 객체를 이용해서 스프링 빈과 설정을 setting 한다.

 

설정을 java 코드에서 가지고 있는것이 아니라,

외부의 파일에 존재해서, 그 외부에 존재하는 파일에서 가져온다.

(여기서의 '설정' : 관리자의 ID 또는 password 등등...)

 

수정할때도 java 코드를 수정할 필요없이,

외부파일을 수정하면 된다.

 

ctx.getEnvironment()

context에서 Environment를 가져올수 있음

 

env.getPropertySources()

Environment 내부의 property 소스들을 가져옴

(Environment안에는 여러개의  properties 파일들이 들어가있음)

 

프로퍼티 추가 및 추출

추가 : propertySources.addLast()

추출 : env.getProperty()

 

 

파일 구조

 

admin.properties

admin.id=hong
admin.pwd=12341234​

 

Main.java

package com.edu.exam01;
 
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.io.support.ResourcePropertySource;
 
public class Main {
 
    public static void main(String[] args) {
        
        ConfigurableApplicationContext ctx = new GenericXmlApplicationContext();
        ConfigurableEnvironment env = ctx.getEnvironment(); // Environment 객체 가져옴
        MutablePropertySources ps = env.getPropertySources(); // 프로퍼티 파일들 가져옴
        
        try {
            ps.addLast(new ResourcePropertySource("classpath:admin.properties")); // 프로퍼티 파일 추가
            
            // 프로퍼티 파일에서 값 추출
            System.out.println(env.getProperty("admin.id"));
            System.out.println(env.getProperty("admin.pwd"));
        } catch (Exception e) {
            // TODO: handle exception
        }
        
        GenericXmlApplicationContext gCtx = (GenericXmlApplicationContext) ctx;
        gCtx.load("classpath:applicationCTX.xml");
        gCtx.refresh();
        
        AdminConnection adminConnection = gCtx.getBean("adminConnection", AdminConnection.class);
        System.out.println(adminConnection.toString());
        
        gCtx.close();
        ctx.close();
        
    }
}
 ​

 

27번째 줄 전까지 보면,

ctx로 부터 env를 가져오고, 

env로 부터 propertySource들을 가져온다.

 

그리고, property안의 값들을 가져올때는

env.getProperty()를 사용한다는 것을 알 수 있다.

 

 

하지만,

27번째 줄부터 보면...

adminId와 adminPwd의 값에 대해 set을 안했는데,

바로 get으로 값을 가지고 오고 있다.

 

applicationCTX.xml과 AdminConnnection.java를 살펴보자

 

 

applicationCTX.xml

<?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.xsd">
    
    <bean id="adminConnection" class="com.edu.exam01.AdminConnection" />

</beans>​

 

AdminConnnection.java

package com.edu.exam01;
 
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 adminId;
    private String adminPwd;
 
    // constructor
    public AdminConnection() {
 
    }
 
    public AdminConnection(String adminId, String adminPwd) {
        this.adminId = adminId;
        this.adminPwd = adminPwd;
    }
 
    // get set method
    public String getAdminId() {
        return adminId;
    }
 
    public void setAdminId(String adminId) {
        this.adminId = adminId;
    }
 
    public String getAdminPwd() {
        return adminPwd;
    }
 
    public void setAdminPwd(String adminPwd) {
        this.adminPwd = adminPwd;
    }
 
    @Override
    public String toString() {
        return "AdminConnection [adminId=" + adminId + ", adminPwd=" + adminPwd + "]";
    }
 
    @Override
    public void afterPropertiesSet() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("afterPropertiesSet() 호출");
 
        // 값 set
        setAdminId(env.getProperty("admin.id"));
        setAdminPwd(env.getProperty("admin.pwd"));
    }
 
    // Environment set
    @Override
    public void setEnvironment(Environment env) {
        // TODO Auto-generated method stub
        System.out.println("setEnvironment() 호출");
 
        // env set
        this.env = env;
    }
}​

 

EnvironmentAware (Environment를 set하는 역할을 하는 method를 가짐)

InitializingBean (빈이 생성될때 호출되는 역할을 하는 method를 가짐)

위 2개의 인터페이스를 implements 한다.

 

그리고, 이 2개의 인터페이스들의

setEnvironment() 메소드와 afterPropertiesSet() 메소드를

재정의(오버라이드)한다.

 

afterPropertiesSet() 함수가(빈이 생성될때 호출되는 함수)

adminId와 adminPwd 안에 값을 set 해주고 있다.

 

그래서, main 메소드안에서 따로 set을 안했지만,

이미 빈이 생성될때 값이 할당 됐기 때문에 사용이 가능하다.

 

 

 

참고

Environment는 꼭 사용할 필요는 없다.

프로젝트 성격에 맞게 사용하면 된다.

 

 

※ 이 글은 Seoul Wiz - '실전 Spring 강좌'를 요약하여 작성하였습니다.

>> 유튜브 - SeoulWiz

 

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기