외부 설정

외부 설정

외부설정 파일을 애플리케이션에서 설정해야하는 애플리케이션 밖 또는 안에 정의할 수 있는 기능

appication.properties가 대표적이라고 할수 있다.

제일 간단한 방법은 classpath밑에 존재하는 application.properties를 이용하는 방법이다.

스프링 부트는 기본적으로 application.properties를 제공한다.

여기에 key = value 형식으로 입력하면 된다.

note.book=klom

대충 이런식으로 입력하면 된다.

그러면 이걸 사용하는 방법이 여러가지가 있는데 그 중에서 가장 간단한 방법은

@Value("${note.book}") private String name; @Override public void run(ApplicationArguments args) throws Exception { System.out.println("===================="); System.out.println(name); System.out.println("===================="); }

이런식으로 @value("${key값}")으로 추가해주면 된다.

그런데 무조건 스프링 부트에서 제공되는 application.properties에 작성이 된것이 반영되는 것은 아니다. 여기에는 우선순위가 존재한다.

1. 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties 2. 테스트에 있는 @TestPropertySource 3. @SpringBootTest 애노테이션의 properties 애트리뷰트 4. 커맨드 라인 아규먼트 5. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로티) 에 들어있는 프로퍼티 6. ServletConfig 파라미터 7. ServletContext 파라미터 8. java:comp/env JNDI 애트리뷰트 9. System.getProperties() 자바 시스템 프로퍼티 10. OS 환경 변수 11. RandomValuePropertySource 12. JAR 밖에 있는 특정 프로파일용 application properties 13. JAR 안에 있는 특정 프로파일용 application properties 14. JAR 밖에 있는 application properties 15. JAR 안에 있는 application properties 16. @PropertySource 17. 기본 프로퍼티 (SpringApplication.setDefaultProperties)

이 순서에 따르면 applicaiton.properties는 우선순위가 15번째인걸 알 수 있다.

만약에, 테스트 코드로 작성하고 싶다고 한다면...

2순위에서 3순위로 측정이 된다.

그렇기 때문에 찾는 값이 기존 application.properties에는 존재하지만, 테스트쪽에는 없는 값이 존재한다면 에러가 발생하게 된다. 왜냐하면 테스트는

이 부분을 읽어오는데 main은

이 부분을 읽어오기 때문이라고 한다. 즉, 읽어오는 부분이 달라서 생기는 문제점과 테스트의 우선순위가 높기 때문이라 생각한다. 물론, 테스트쪽에 applicaiton.properties를 만들지 않으면 이러한 에러는 발생하지 않는다. (현재, 무슨 이유인지는 모르겠지만 정상적으로 되고 있지 않아 일단은 최대한 글로 작성하는게 좋을 것 같다.)

또한, application.properties는 여러 곳으로 놓을 수 있는데 위 사진을 보면 같은 위치 상에 있는 걸 확인 할 수 있다.

1. file:./config/ 2. file:./ 3. classpath:/config/ 4. classpath:/

확실한건 아니지만 file은 프로젝트 파일을 말하는 것 같다.

이렇게 보면 위 사진에서는 application.properties는 4순위인 듯 하다.

추가적으로 application.properties에는 랜덤값도 지정 할 수 있다. ${random.*}

또, 원래 있는 값을 가져와 쓸 수 있는데 이 기능을 플레이스 홀더라고 부른다. name = keesun

fullName = ${name} baik

무조건 이름을 application.properties라고 안 지어도 된다. 스프링 부트는 디폴트값으로 생각?하고 있는 것 같으니

@TestPropertySource( location = "")으로 설정해주면 될 듯 싶다. 이렇게 하면 기존에 만든 application.properties와 충돌날 일이 없을 것 같다. 왜냐하면 그 값을 가져온다고 명시해줬기 때문이다.

다시 application.properties로 돌아와서 이번에는 키 : value를 여러개 추가했다.

note.book=klom note.blog=tistory note.name=yong

지금은 3개라 @Value를 통해 가져오는 방법도 괜찮겠지만, 갯수가 늘어난다면 이것을 일일이 입력하는건 곤욕일 것이다. 하나로 묶어서 관리 할 수 있는데 @ConfigurationProperties 이 어노테이션이 담당을 한다. 정확히 말하면 이 어노테이션이 붙은 클래스가 담당하게 된다. 이 어노테이션 같은 경우

org.springframework.boot spring-boot-configuration-processor true

이 의존성을 추가하게 되는데, applicaiton.propeties는 메타정보를 읽어서 그 값을 사용하는데, 이 의존성을 추가하게 되면 메타정보를 만들어준다고 한다.

@ConfigurationProperties("note") public class NoteProperties { private String book; private String blog; private String name; public String getBook() { return book; } public void setBook(String book) { this.book = book; } public String getBlog() { return blog; } public void setBlog(String blog) { this.blog = blog; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

이런식으로 만들어주면 된다. 여기에는 자바 빈패턴으로 되어있는데 그 이유는 자바 빈 스팩을 따르기 때문이라고 한다.그래서 get/set을 추가해줘야한다. 이제 이걸 사용하기 위해 빈을 등록을 해주면 된다.

이 빈 같은 경우는 @EnableConfigurationProperties에서 담당을 하게 되는데 스프링 부트에서 이 어노테이션은 지원해준다. 그래서 추가하지 않고 그냥 위 클래스에 @Componet만 붙여주면 된다. 이제

@Autowired private NoteProperties noteProperties; @Override public void run(ApplicationArguments args) throws Exception { System.out.println("===================="); System.out.println(noteProperties.getName()); System.out.println(noteProperties.getBlog()); System.out.println(noteProperties.getBook()); System.out.println("===================="); }

이런식으로 추가해주면 된다.

융통성이 있는 바인딩을 하려면 context-path(케밥), contetx_path(언드스코어), contextPath(캐멀), CONTEXTPATH중 한 가지만 사용해서 하는게 좋을 것 같다.

또한, 스프링 부트에서는 다양한 프로퍼티 타입 컨버전 기능을 제공하는데 그 중 하나가

@DurationUnit(ChronoUnit.SECONDS)

이다. 이것을 사용하게 되면 값을 받아 자동으로 PT s를 반환해 준다.

저 어노테이션을 사용하지 않고.숫자뒤에 s를 붙여도 같은 결과를 얻을 수 있다.

마지막으로 프로터피 값을 검증 할 수 있는데

이 것은 JSR-303에 있다고 한다.???

이런식으로 입력하면 된다. 그러면 book에 있는 값을 지우고 확인해 보자.

이런식으로 되있는 다는 것을 확인 할 수 있다. 참고로

위에꺼는 잘 되지 않아 @NoEmpty로 수정 했다. 그 결과 값이다.

지금까지 외부설정을 하는 방법에 대해 알아봤는데 생각보다 이용할 수 있는 방법이 많은 것 같다,.

from http://b-programmer.tistory.com/16 by ccl(A) rewrite - 2020-03-22 01:20:28

댓글

이 블로그의 인기 게시물

데이터 바인딩 추상화 - propertyEditor

[샤니마스 SPRING PARTY2020] THE IDOLM @ STER SHINY COLORS SPRING...

Spring Web Form