외부 설정 파일이란 처음 spring boot를 실행하면 src/main/resources에 있는 application.properties와 같이
여러가지 설정 값들을 애플리케이션의 밖이나 안에 정의 할 수 있는 기능을 말한다.
propertie를 사용하는 이유 :
배포하고나서 설정을 변경할 때 용이하기 때문이라고 생각한다.
키-값 구조로 정의된 값들을 소스코드에서 불러다 치환하면 되기 때문에 소스코드를 수정하지 않아도 되고
배포되고나서 고쳐야할 경우 서버에 접속해서 properties 파일만 수정하면 되기 때문에 편리하다.
스프링은 src/main/resources에 들어가 있는 설정파일(yml, properties)을 자동으로 감지한다. 따라서 이 파일들을 사용하기 위해
PropertySource를 명시적으로 등록하거나, 속성 파일에 대한 경로를 제공할 필요가 없다.
그런데 항상 src/main/resources에 있는 application.properties에 모든 설정(데이터 소스, 계정 정보 등)을 넣을 수 없다. 그래서 이러한 기타 설정 파일을 따로 분리하는 경우가 많다. 그렇게 되면 이 외부 설정 파일들은 자동으로 읽지 않기 때문에 따로
직접적인 경로를 지정해서 사용해야 한다.
@PropertySource 어노테이션을 사용하면 사용이 가능하다.
// user-info.properties
// 현재 application.properties와 같은 디렉토리에 있음
user.name = easydong
user.age = 23
user.url = https://dongcoding.tistory
// UserInfoController
@RestController
@PropertySource("classpath:user-info.properties")
public class UserInfoController {
@Value("${user.name}")
private String name;
@Value("${user.age}")
private String age;
@Value("${user.url}")
private String url;
@GetMapping("/userinfo")
public String userinfo(){
String userinfo = "이름 : " + name + "나이 : " + age + "주소 : " + url;
return userinfo;
}
}
주의할 점은 @Value로 propertie 값들을 불러올려면 @Component 로 등록해서 스프링에서 빈으로 관리되게 해줘야 한다는 것이다.
(@RestController는 내부적으로 @Component가 등록되어 있기 때문에 위 예제에는 @Component를 쓰지 않았다)
스프링 컨테이너 내부에서 모든 빈들을 등록할 때 @Value(${내가 가져온 값}) 안의 내용에 맞는 값을
외부 설정 파일(.properties, .yaml)에서 찾아서 넣어준다. 만약 빈으로 등록하지 않았다면
@Value(${내가 가져온 값})에 맞는 값을 넣는 과정이 실행되지 않으므로 @Value 가 동작하지 않는다.
참고한 자료
https://velog.io/@lsb156/Spring-Boot-Properties-Usage#propertysource
Spring Boot - Properties 사용법 정리
Spring에서 Properties는 설정 중 가장 기본적이면서 또한 가장 자주 들어오는 질문 중 하나입니다. 그래서 자주 사용하는 properties 적용 패턴을 kotlin 언어로 정리해보았습니다.
velog.io
https://baeldung.com/properties-with-spring
Properties with Spring and Spring Boot | Baeldung
Tutorial for how to work with properties files and property values in Spring.
www.baeldung.com
'자바' 카테고리의 다른 글
테스트 코드 작성 요령 (0) | 2022.08.29 |
---|---|
제네릭(generic) (0) | 2022.08.26 |
스프링 부트 프로파일(profile)설정 (0) | 2022.08.19 |
다형성(polymorphism) (0) | 2022.06.24 |
접근제어자(Access Modifier)정리 (0) | 2022.06.23 |