Spring Boot의 등장 이후 Java 코드 기반 설정이 주류로 자리 잡았음에도 불구하고, YAML, properties 파일 같은 정적 파일 기반 설정도 여전히 중요한 역할을 하고 있습니다. 이러한 이유는 여러 가지가 있지만, 대표적인 이유들을 살펴보면 다음과 같습니다.
정적 파일(YAML, properties 파일)은 환경에 따라 쉽게 설정을 분리하고 관리할 수 있는 장점을 제공합니다. 예를 들어, application-dev.yml, application-prod.yml 같은 파일을 사용하여 개발, 테스트, 운영 환경에 맞는 설정을 나눌 수 있습니다.
Spring Boot는 프로파일 기반 설정을 지원하므로 환경에 맞는 설정 파일을 선택하여 사용할 수 있습니다. 이는 배포 시점에서 파일만 교체하거나 프로파일을 지정하여 손쉽게 환경별 설정을 변경할 수 있게 합니다.
# application-dev.yml
server:
port: 8081
# application-prod.yml
server:
port: 8080
YAML이나 properties 파일은 비개발자나 DevOps 엔지니어들이 쉽게 이해하고 수정할 수 있는 형식입니다. Java 코드 기반 설정은 유연하지만 코드에 익숙하지 않은 사람들에게는 가독성이 떨어질 수 있습니다.
반면, 정적 파일은 설정값들을 간결하게 나열할 수 있어, 운영 측면에서 설정을 검토하거나 수정하기에 더 용이합니다.
Spring Boot의 핵심 철학 중 하나는 애플리케이션의 설정을 외부에서 관리하는 것입니다. Java 코드로 설정을 작성하면 애플리케이션 내부에 포함되지만, YAML 또는 properties 파일을 사용하면 외부 설정을 쉽게 관리할 수 있습니다.
이는 특히 컨테이너 환경이나 클라우드 환경에서 중요한데, 설정을 배포하지 않고 파일 볼륨이나 환경 변수를 통해 외부에서 설정을 주입할 수 있기 때문입니다.
코드 기반 설정은 애플리케이션 로직과 설정이 결합될 수 있는 위험이 있습니다. 반면, 정적 파일은 설정과 비즈니스 로직을 명확히 분리할 수 있습니다. 설정 파일만 독립적으로 관리하고 변경할 수 있기 때문에, 유지보수 시 코드 수정 없이 설정 파일만 업데이트할 수 있다는 장점이 있습니다.
Spring Boot는 기본적으로 properties 또는 YAML 파일을 통한 설정 관리를 지원하며, 이를 통해 매우 간단하게 기본적인 설정을 처리할 수 있습니다. application.yml 파일을 통해 Spring Boot의 다양한 설정을 정의하고, 이를 코드로 직접 작성할 필요가 없습니다.
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: user
password: pass
Java 코드 기반 설정을 변경하려면 코드를 수정하고 다시 빌드 및 배포해야 합니다. 하지만 정적 파일 설정은 애플리케이션을 빌드하거나 다시 배포하지 않고도 파일만 변경하여 설정을 업데이트할 수 있습니다.
예를 들어, 로그 레벨을 변경하거나 데이터베이스 설정을 수정할 때 코드를 수정하지 않고 설정 파일만 교체하여 바로 적용할 수 있습니다.
많은 클라우드 플랫폼(예: Kubernetes, AWS, Azure)에서는 애플리케이션 설정을 외부에서 관리하고 배포 시 동적으로 설정 파일을 주입하는 방식을 선호합니다.
정적 파일을 사용하면 이러한 동적 설정 변경이 더 쉽게 가능합니다. 예를 들어, Kubernetes에서는 ConfigMap이나 Secrets를 사용하여 애플리케이션 설정을 관리하고 이를 컨테이너에 주입할 수 있습니다.
즉, 정적 파일을 이용한 동적 설정이 자바 코드를 이용한 동적 설정보다 장점이 많다.
컨테이너 오케스트레이션 도구, 클라우드 서비스, Spring Cloud Config 등, MSA 환경에서 중앙집중형 설정관리가 크게 용이해졌기 때문이라고 판단됨.
Spring Boot는 기본적으로 많은 설정 값을 제공하고, 필요에 따라 특정 값만 오버라이드할 수 있습니다. 정적 파일을 사용하면 이러한 설정을 쉽게 오버라이드할 수 있어 설정 관리를 더 유연하게 할 수 있습니다.
Java 코드 기반 설정은 유연하고 강력하며, 복잡한 로직이나 동적인 설정을 처리할 때 매우 유용합니다. 특히 코드와 설정을 함께 관리하면서 타입 안전성과 IDE 지원을 받을 수 있습니다.
반면, YAML이나 properties 파일과 같은 정적 파일 설정은 간단하고 읽기 쉽기 때문에 환경별 설정, 외부 설정 관리, 비즈니스 로직과 설정의 분리 측면에서 여전히 중요합니다.
따라서 Spring Boot 애플리케이션에서는 Java 코드 기반 설정과 정적 파일 기반 설정을 함께 사용하는 것이 일반적입니다. Java 코드로 복잡한 설정을 처리하고, 정적 파일로 간단한 설정을 외부에서 관리함으로써 더 유연하고 유지보수하기 쉬운 애플리케이션을 구축할 수 있습니다.