[Spring] Profile
application.yml에 아래 로직을 다 구현했다고 가정해봅시다.
// application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:
username:
password:
jpa:
hibernate:
ddl-auto: create-drop
properties:
hibernate:
format_sql: true
logging.level:
org.hibernate.SQL: debug
default Profile만 쓰면 어떤 문제점이 있을까요??
아무런 테스트 없이 바로 개발서버, 실서버에 서비스를 배포하게 된다면 예기치 못한 장애와 버그들이 생길 수 있습니다.
예상치 못한 실수 등의 예를 하나 들자면, create-drop등의 옵션 등을 실수로 삭제하지 않아서 다시 생성되면 안되는 시점에 다시 생성되서 기존 데이터가 전부 날라가는 일등의 일이 일어날 수 있겠죠.
위의 문제점 말고도 여러분이 설정한 것들에 따라 여러 실수들이 발생할 수도 있습니다.
위와 같은 문제를 해결하기 위해
// application.yml
# default profiles
spring:
profiles:
active: local
// 개발 단계라면 active: dev
// application-local.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:
username:
password:
jpa:
hibernate:
ddl-auto: create-drop
properties:
hibernate:
format_sql: true
logging.level:
org.hibernate.SQL: debug
위와 같이 Profile 분리해 줍니다.
실제 서비스를 만들때는 보통 로컬 - 개발 - 운용의 단계를 갖습니다.
그래서 profile을
- 로컬에서 개발하는 profile
- 실제 서비스가 운용되는 실서비스 전 개발 서버에 배포를 하기위한 profile
- 실제 서비스가 돌아가는 운용 profile
로 분리하여 로컬 단계가 아닌 개발 단계에서는 개발 profile로 바꾸어 사용히여 위에서 말한 예기치 못한 장애와 버그가 생기는 문제점들을 예방할 수 있습니다.
추가로 각 환경에 따라 default profile을 번거롭게 수정하는 일 없이 각 환경의 profile 부품화하여 갈아낄 수 있는 다형성이 적용되기 때문에 유지보수하는 비용이 절감되는 장점도 있습니다.
현재 위의 분리해놓은 Profile에서는 local이라는 명시적인 네이밍을 사용하고 local 환경만의 DB나 환경설정들을 사용하고 있습니다.
현재는 local로 설정해두고 추 후 다른 개발, 운용 단계가 되었을때, 로컬 환경에서와 다른 DB나 환경설정이 필요하다면 미리 profile로 정의해두고 각 환경에 맞게 갈아낄 예정입니다.