미션을 하면서 주어진 기본 뼈대 코드에는 간단한 데이터베이스 설정 같은 것들이 되어있었다. 그래서 별 생각 없이 사용하다가 나중에 내가 바꿔야 하는 상황이 되니 어떻게 설정이 되어있는지, 어떻게 바꿔야하는지 몰라서 학습의 필요성을 느꼈다.
스프링 부트에서는 다양한 외부 파일들을 이용해서 설정을 해줄 수 있다. 자바 코드, YAML 코드, 심지어 커맨드 라인 인자로도 가능하다.
미션을 이용하면서 사용했던 것은 application.properties
또는 application.yml
파일을 이용해서 설정을 지정했다.
application.yml 예시
공식 문서에 따르면 환경 설정을 하는데도 여러 우선 순위가 있지만 application.yml 과 같은 config data를 이용하는 방식은 3순위다.
그리고 스프링부트는 classpath로부터, 또는 현재 디렉토리로부터 application.properties
또는 application.yml
파일을 찾아서 설정을 적용시킨다.
그러면 classpath와 current directory가 뭘까?
Classpath is a parameter in the Java Virtual Machine or the Java compiler that specifies the location of user-defined classes and packages.
클래스패스는 JVM 또는 자바 컴파일러가 클래스들을 찾기 위한 경로다.
IntelliJ에서 Edit Confugrations에 가보면 classpath에 관한 설정이 있다.
하지만 프로젝트에서 설정 파일을
/config
가 아닌resources
밑에 나뒀는데 알아서 설정을 잘 인식했다. 왜 그럴까?
resources 디렉토리를 root라고 생각하고 자바 application에서 resources 하위 항목들을 모두 참조할 수 있다라고 한다.
maven이나 gradle을 사용하면 resources를 classpath로 등록을 하는듯하다 (추정 - 확인 필요)
https://docs.spring.io/spring-boot/docs/2.1.x/reference/html/howto-database-initialization.html
application.properties
체스 미션할 때의 application.properties
설정이다. 당시에는 도커와 mysql을 이용했다. datasource.dirver-class-name
에 mysql 드라이버를 적어놨다. 또한 datasource.url
에 연결된 데이터베이스의 주소가 적혀있다.
application.yml
지하철 미션을 할 때는 yml 파일을 사용하는 것으로 바뀌었다. 둘 다 설정 파일이라는 곳에서 차이가 없지만 yml 파일이 조금 더 계층을 나타내기 좋다고 한다.
다른 차이는 이번에는 H2 Database를 사용한 것이다. H2 Database 역시 Jdbc를 구현했기 때문에 스프링에서 사용할 수 있다.
Embedded and server modes; disk-based or in-memory databases
또 다른 특징으로는 인메모리 설정을 할 수 있는 것인데 그러면 메모리에 저장하기 때문에 서버가 꺼질때마다 데이터가 휘발된다. 간단히 테스트하는 용도로 사용해보기 좋다.
간단하게 스프링에서 환경설정을 하는 방법을 알아봤다. 추가 학습이 필요한 것은 application.properties
파일도 여러 개를 생성할 수 있고 그것을 인식하는 우선순위가 있다는 것이다. 다음에 테스트 환경 격리를 할 때 이 부분도 보면 좋을 것 같다.