Environment 객체란?

외부 설정 파일들을 가져와서 프로퍼티를 추가하거나 추출하는 역할을 한다.

Environment 객체를 사용하는 이유?

Environment를 이용하는 경우를 생각해보자. DB 이전을 할 경우 해당 정보는 자바 코드 상에 없을 때, 외부 파일에 정보를 담아 관리를 해야 할 경우이다.

Environment 사용 방법

ConfigurableApplicationContext 객체는 AbstractApplicationContext 클래스의 상위 클래스이다.

ConfigurableApplicationContext 객체에 GenericXmlApplicationContext() 를 생성 후 getEnvironment()로 Environment 객체를 얻어올 수 있다.

아래 예시는 resources 폴더에 user.properties 라는 파일을 읽어와 user.id와 user.pw 라는 속성 값을 출력한 결과다.

// MainClass.java
 
public class MainClass {
    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = new GenericXmlApplicationContext();
        ConfigurableEnvironment env = ctx.getEnvironment();
 
        MutablePropertySources propertySources = env.getPropertySources();
 
        try {
            propertySources.addLast(new ResourcePropertySource("classpath:user.properties"));
 
            System.out.println(env.getProperty("user.id"));
            System.out.println(env.getProperty("user.pw"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

'=' 를 기준으로 key, value를 구분한다. '=' 이외에도 ':'으로도 테스트를 해보니 가능함을 알 수 있다.

// user.properties
 
user.id=konan
user.pw=12345

bean 객체 생성후 Environment 값을 전달하기

ctx는 ConfigurableApplicationContext 형이고, 이는 GenericXmlApplicationContext의 상위 클래스이므로 형변환이 가능하다.

생명주기에 따라 gCtx 객체는 해당 bean 파일을 로드하고 refresh()를 해줘야 설정값이 적용된다.

// MainClass.java
 
...
 
GenericXmlApplicationContext gCtx = (GenericXmlApplicationContext) ctx;
 
gCtx.load("applicationCTX.xml");
gCtx.refresh();
 
AdminConnection adminConnection = gCtx.getBean("adminConnection", AdminConnection.class);

AdminConnection 이라는 객체를 BeanFactory로부터 가져오기 위해 다음과 같이 설정을 하여 객체를 DI Container에서 생성한다.

// applicationCTX.xml
 
<bean name="adminConnection" class="com.bbo.example.AdminConnection">
 
</bean>

이제 Environment 값을 adminConnection 객체에 전달해야 한다. AdminConnection 클래스에 EnvironmentAware 인터페이스를 추가후 setEnvironment(Environment env) 함수를 재정의한다.

흐름을 다시 생각해보면, ctx에는 기존의 Environment 객체 값을 가지고 있고 이 ctx를 GenericXmlApplicationContext 타입으로 gCtx라는 객체로 형변환하였다. gCtx로부터 BeanFactory에 대한 정보를 가지고 있는 applicationCTX.xml 를 load하여 refresh()를 호출하여 적용시켰다. 적용 후에 applicationCTX.xml 내에 adminConnection이라는 객체를 생성된다.

즉, 객체 생성시 이미 Environment에 대한 정보를 가지고 있으니 전달이 가능하다는 이론이다.

// AdminConnection.java
 
public class AdminConnection implements EnvironmentAware {
    private Environment env;
    private String adminId;
    private String adminPw;
 
    @Override
    public void setEnvironment(Environment env) {
        // TODO Auto-generated method stub
        setEnv(env);
    }
 
  public void setEnv(Environment env) {
        this.env = env;
    }
}

env로부터 값을 가져올 때는 getProperty(key)를 통해 value를 가져올 수 있다. 다음 예시는 InitializingBean을 통해 bean 객체 생성시 각 멤버변수에 대해 초기화한다.

// AdminConnection.java
 
public class AdminConnection implements EnvironmentAware, InitializingBean, DisposableBean {
    private Environment env;
    private String adminId;
    private String adminPw;
 
    @Override
    public void setEnvironment(Environment env) {
        // TODO Auto-generated method stub
        setEnv(env);
    }
 
  ...
 
  @Override
    public void afterPropertiesSet() throws Exception {
        // TODO Auto-generated method stub
        setAdminId(env.getProperty("user.id"));
        setAdminPw(env.getProperty("user.pw"));
    }
 
    @Override
    public void destroy() throws Exception {
        // TODO Auto-generated method stub
 
    }
}

정리

이번 포스팅에서는 Environment 객체가 무엇인지, 언제 사용되는지, 어떻게 사용하는지에 대해 간략하게 알아보았다.

이렇게 외부 파일을 이용한 bean 객체 설정 방법은 Environment 외에도 프로퍼티 파일을 이용한 방법과 java 코드에 어노테이션을 이용한 방법, 그리고 프로파일 속성을 이용한 설정도 있다.

관련 강의는 검색을 통해 알아보거나 추후 포스팅하도록 하겠다.

+ Recent posts