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