Back-End/Spring

[Spring] 자바 스프링 프로퍼티(properties) 파일 데이터 가져오기

현기 2022. 10. 27. 03:43

프로퍼티(properties)란 응용 프로그램의 구성 가능한

파라미터를 저장하기 위해 자바 관련 기술을

사용하는 파일의 확장자입니다.

 

주로 스프링의 설정 정보를 저장한다고 합니다.

.properties의 각 줄은 일반적으로 하나의 값을 저장하고

key(문자열) = value 쌍 형식을 가집니다.

 

프로퍼티 파일에서 설정 값을 분리하면 얻을 수 있는 장점은

@Value 어노테이션을 효율적으로 사용할 수 있습니다.

 

@Value 어노테이션의 주요 용도는 자바 코드 외부의 리소스

환경정보에 담긴 값을 사용하는 데 있습니다.

 

@Value는 소스코드 안에 포함되는 어노테이션이어서 값을 수정하면 매번 새로 컴파일 해야합니다.
하지만 @Value에서 프로퍼티 파일의 내용을 참조하게 해주면 소스코드의 수정 없이
@Value를 통해 프로퍼티에 주입되는 값을 변경할 수 있습니다.

출처:https://cornswrold.tistory.com/95

 


📝 XML을 이용해 properties 값 가져오기

 

 

⦁ 프로퍼티 파일 생성

XML이 있는 경로에 프로퍼티 파일을 생성합니다.

 

⦁ 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"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
	
	<!-- properties 경로-->
	<context:property-placeholder location="classpath:admin.properties" />
	
	<bean id="adminConnection" class = "com.company.day3.AdminConnection">
		<property name="adminId">
            <value>${admin.id}</value>
        </property>
        <property name="adminPw">
            <value>${admin.pw}</value>
        </property>
	</bean>

</beans>

 

 네임 스페이스에 context, schemaLocation을 추가해야 합니다.

    <value> 태그에 ${프로퍼티 key}를 넣습니다.

 

⦁ 메인 클래스 실행

package com.company.day3;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX.xml");
        
        AdminConnection connection = ctx.getBean("adminConnection", AdminConnection.class);
        System.out.println("adminID : " + connection.getAdminId());
        System.out.println("adminPW : " + connection.getAdminPw());

        ctx.close();
    }
}

 

 

성공적으로 프로퍼티 값을 가져온 모습입니다.

 

 

⦁ 빈즈 소스코드

더보기
public class AdminConnection {
    private String adminId;
    private String adminPw;
    
    public void setAdminId(String adminId) {
        this.adminId = adminId;
    }
    
    public void setAdminPw(String adminPw) {
        this.adminPw = adminPw;
    }
    
    public String getAdminId() {
        return adminId;
    }
    
    public String getAdminPw() {
        return adminPw;
    }

}

 


📝 Bean을 이용해 properties 값 가져오기

 

ApplicationConfig.java 파일 생성

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

@Configuration
public class ApplicationConfig {
 
    @Value("${admin.id}")  // 프로퍼티 값 가져오기
    private String adminId;
    @Value("${admin.pw}")   // 프로퍼티 값 가져오기
    private String adminPw;
    
    @Bean
    public static PropertySourcesPlaceholderConfigurer Properties() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        
        //프로퍼티 경로를 배열로 여러 개 가능
        Resource[] locations = new Resource[1];
        locations[0] = new ClassPathResource("admin.properties");
        configurer.setLocations(locations);
        
        return configurer;
    }

    @Bean  
    public AdminConnection adminConfig() {                            
        AdminConnection adminConnection = new AdminConnection();
        adminConnection.setAdminId(adminId);
        adminConnection.setAdminPw(adminPw);
        return adminConnection;
    }
}

 

DI 어노테이션 방식으로 가져옵니다.  (https://hyunki99.tistory.com/65 참고)

 

❗ PropertySourcesPlaceholderConfigurer 클래스를 사용하지 않을 시 "${admin.id}"

  그대로 출력됩니다.

🤔PropertySourcesPlaceholderConfigurer란?

PropertySourcesPlaceholderConfigurer는 추상 클래스 PlaceholderConfigurerSupport를 구현한 클래스입니다.
PropertySource를 추가하여 @Value 어노테이션의 ${...} 부분에 프로퍼티 값을 주입해 줍니다.
Bean으로 등록해서 사용하며, PropertySource를 여러개 등록할 수 있습니다.
프로퍼티가 겹칠 땐 먼저 등록된 PropertySource의 프로퍼티가 우선순위를 가집니다.

출처 : https://stuffdrawers.tistory.com/6

 

 

⦁ 메인 클래스 실행

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        AdminConnection connection = ctx.getBean("adminConfig", AdminConnection.class);
        
        System.out.println("adminID : " + connection.getAdminId());
        System.out.println("adminPW : " + connection.getAdminPw());

        ctx.close();
    }
}

 

 

 


 

 

 


참고 문헌 : 

 

https://cloud0477.tistory.com/64?category=856438

https://cornswrold.tistory.com/95

https://cloud0477.tistory.com/63?category=856438