작심십육일러의 스프링 시작하기(16)-끝!

서은경·2022년 10월 13일
0

Spring

목록 보기
28/43

프로퍼티 파일을 이용한 프로퍼티 설정

스프링은 외부의 프로퍼티 파일을 이용해서 스프링 빈을 설정하는 방법을 제공하고 있다.

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/spring5fs?characterEncoding=utf8
db.user=spring5
db.password=spring5

이 파일의 프로퍼티 값을 자바 설정에서 사용할 수 있으며 이를 통해 설정 일부를 외부 프로퍼티 파일을 사용해 변경할 수 있다.

@Configuration 어노테이션 이용 자바 설정에서의 프로퍼티 사용

자바 설정에서 프로퍼티 파일을 사용하려면 다음 두 가지를 설정한다.
1. PropertySourcesPlaceholderConfigurer 빈 설정

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;

@Configuration
public class PropertyConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer peoperties() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        configurer.setLocations(
                new ClassPathResource("db.properties"),
                new ClassPathResource("info.properties"));
        return configurer;
    }
}

PropertySourcesPlaceholderConfigurer의 setLocations() 메서드는 프로퍼티 파일 목록을 인자로 전달받는다. 이때 스프링의 Resource 타입을 이용해서 파일 경로를 전달한다. db.properties 파일이 클래스 패스에 위치하고 있다면 ClassPathResource 클래스를 이용해서 프로퍼티 파일 정보를 전달한다.

💡 o.s.core.io.Resource 인터페이스는 스프링에서 자원을 표현할 때 사용한다. 대표적인 구현 클래스로는 다음 두가지가 있다.

  • o.s.c.io.ClassPathResource
    : 클래스 패스에 위치한 자원으로부터 데이터를 읽음
  • o.s.c.io.FileSystemResource
    : 파일 시스템에 위치한 자원으로부터 데이터를 읽음

여기서 주의점은 PropertySourcesPlaceholderConfigurer 타입 빈을 설정하는 메서드가 정적(static) 메서드라는 것이다. 이는 이 클래스가 특수한 목적의 빈이기 때문이며 정적 메서드로 지정하지 않으면 원하는 방식으로 동작하지 않는다.

  1. @Value 어노테이션으로 프로퍼티 값 사용
package config;

import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DsConfigWithProp {
    @Value("${db.driver}")
    private String driver;
    @Value("${db.url}")
    private String jdbcUrl;
    @Value("${db.user}")
    private String user;
    @Value("${db.password}")
    private String password;

    @Bean(destroyMethod = "close")
    public DataSource dataSource() {
        DataSource ds = new DataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(jdbcUrl);
        ds.setUsername(user);
        ds.setPassword(password);
        ds.setInitialSize(2);
        ds.setMaxActive(10);
        ds.setTestWhileIdle(true);
        ds.setMinEvictableIdleTimeMillis(60000 * 3);
        ds.setTimeBetweenEvictionRunsMillis(10 * 1000);
        return ds;
    }
}

PropertySourcesPlaceholderConfigurer의 타입 빈은 setLocations() 메서드로 전달받은 프로퍼티 파일 목록 정보를 읽어와 필요할 때 사용하는데 이를 위한 것이 @Value 어노테이션이다.

@Value 어노테이션이 ${구분자} 형식의 플레이스홀더를 값으로 갖고 있는데 이 경우 PropertySourcesPlaceholderConfigurer는 플레이스홀더의 값을 일치하는 프로퍼티 값으로 치환한다. 위 예의 경우 ${db.driver} 플레이스홀더를 db.properties에 정의되어 있는 db.driver 프로퍼티 값으로 치환한다.

빈 클래스에서 사용하기

빈으로 사용할 클래스에도 @Value 어노테이션을 붙일 수 있다.

package spring;

import org.springframework.beans.factory.annotation.Value;

public class Info {

    @Value("${info.version}")
    private String version;

    public void printInfo() {
        System.out.println("version=" + version);
    }

    public void setVersion(String version) {
        this.version = version;
    }
}

@Value 어노테이션을 필드에 붙이면 플레이스홀더에 해당하는 프로퍼티를 필드에 할당한다. 위의 경우 info.version 프로퍼티에 해당하는 값을 version 필드에 할당한다.

@Value("${info.version}")
public void setVersion(String version) {
	this.version = version;
}

set 메서드에도 적용 가능 ~!

🗣 드뎌 책 한권의 실습이 끝이 났다 !!!!!! 한동안 직장 다니고 운동다니고 하느라 공부하고 포스팅하는 걸 조금 소홀히 했는데.. 어찌저찌해서 끝이 났다 !!! 자축경축 .. 복습하고 또 하고 더더더 공부해야지 !

0개의 댓글