Spring Boot (+ RESTful)

Spring Boot - 기본값과 구성 규칙에 대한 Spring Boot의 고유한 접근 방식

wy-family 2024. 12. 12. 10:23

Spring Boot의 **기본값(Default Values)**과 **구성 규칙(Configuration Rules)**에 대한 고유한 접근 방식은 **"설정보다 관례(Convention over Configuration)"**라는 철학에 기반하고 있어. 이 접근 방식은 개발자가 최소한의 설정으로도 애플리케이션을 빠르게 실행하고 동작시킬 수 있도록 돕는 것이 핵심이야.

아래에서 Spring Boot의 기본값과 구성 규칙을 단계적으로 상세히 설명할게.


1. Spring Boot의 기본값(Default Values)

Spring Boot는 많은 기능에 대해 합리적인 기본값을 제공해.
이 기본값은 대부분의 애플리케이션에서 공통적으로 사용될 만한 값으로 설정되어 있어, 개발자가 초기 설정에 많은 시간을 들이지 않아도 된다.

1.1 자동 설정(Auto Configuration)

Spring Boot는 **자동 설정(Auto Configuration)**을 통해 기본값을 적용한다.

  • Spring Boot 애플리케이션 실행 시, 클래스 경로(classpath)에 포함된 라이브러리와 설정 파일을 분석해 필요한 설정을 자동으로 추가.
  • 예를 들어, H2 데이터베이스가 클래스 경로에 있으면, Spring Boot는 H2를 기본 데이터베이스로 자동 설정.
  • 기본값의 예
    • 내장 서버: Tomcat이 기본값으로 설정됨.
    • 기본 포트: HTTP 서버는 포트 8080에서 실행됨.
    • 데이터베이스 연결: H2 데이터베이스를 자동으로 인식하고 설정.

1.2 Spring Boot Starter Dependencies

Spring Boot는 Starter Dependencies라는 의존성 묶음을 제공해.
이를 통해 필요한 라이브러리를 일일이 추가하지 않아도, 적절한 기본값을 가진 환경을 바로 사용할 수 있어.

  • 예: spring-boot-starter-web
    • Spring MVC를 구성하기 위한 모든 라이브러리 포함.
    • Tomcat이 내장 서버로 자동 설정되고, JSON 처리에 Jackson 라이브러리가 포함됨.

1.3 application.properties의 기본값

Spring Boot는 application.propertiesapplication.yml 파일에서 설정을 읽어들이지만, 개발자가 설정하지 않은 값에 대해선 기본값을 제공해.

  • 예: spring.datasource.url 설정이 없으면, Spring Boot는 H2 데이터베이스를 기본값으로 사용.
  • application.properties 기본값 예시
# 기본값이 없을 때 자동 설정
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=

2. Spring Boot의 구성 규칙(Configuration Rules)

Spring Boot의 구성 규칙은 기본값을 유지하면서, 필요할 때만 커스터마이징할 수 있도록 돕는다.
이는 **"필요할 때만 구성한다"**는 철학에 기반하고 있어.

2.1 계층적 우선순위

Spring Boot는 설정 값이 여러 곳에 정의된 경우, 우선순위에 따라 값을 적용한다.
우선순위가 높은 설정이 우선 적용되며, 나머지는 무시된다.

  • 구성 우선순위
    1. application.properties / application.yml 파일: 가장 흔히 사용하는 설정 방법.
    2. 명령줄 인수(Command Line Arguments): 애플리케이션 실행 시 -- 옵션으로 전달한 값.
    3. 환경 변수(Environment Variables): 운영 체제에서 제공하는 환경 변수.
    4. 기본값(Default Values): Spring Boot가 제공하는 기본값.
  • 예: 명령줄에서 실행 시 기본 포트를 변경할 수 있음.
java -jar myapp.jar --server.port=9090

2.2 프로파일(Profile) 기반 구성

Spring Boot는 환경에 따라 설정을 다르게 적용할 수 있도록 프로파일(Profile) 기능을 제공한다.
예를 들어, 개발 환경과 운영 환경에서 다른 데이터베이스를 사용해야 할 때 유용하다.

  • 사용 방법
    1. application.properties에서 spring.profiles.active를 설정.
    2. 환경별 파일 작성: application-dev.properties, application-prod.properties.
  • 예: 프로파일 별 데이터베이스 설정
# application-dev.properties
spring.datasource.url=jdbc:h2:mem:devdb

# application-prod.properties
spring.datasource.url=jdbc:mysql://prod-db-server/mydb

2.3 설정 오버라이드(Override)

Spring Boot의 구성 규칙에서는, 기본값이나 자동 설정 값을 언제든 개발자가 정의한 값으로 덮어쓸 수 있어.
필요한 경우, 명시적으로 설정을 추가하면 Spring Boot는 이를 우선적으로 적용한다.

  • 오버라이드 예시
# 기본 포트 8080을 오버라이드
server.port=9090

3. Spring Boot의 고유 접근 방식

Spring Boot의 접근 방식은 기존의 Spring Framework와 비교했을 때 아래와 같은 차별점을 가진다:

3.1 "설정보다 관례" 철학

  • Spring Boot는 개발자가 필요한 설정만 추가하면 되도록 설계.
  • 일반적인 애플리케이션에서 자주 사용하는 구성은 기본값으로 제공.
  • 개발자는 복잡한 XML 설정 파일 대신, 최소한의 Java 코드와 application.properties로 설정 가능.

3.2 자동 설정의 유연성

  • Spring Boot는 **자동 설정(Auto Configuration)**을 제공하지만, 언제든 개발자가 이를 비활성화하거나 수정 가능.
  • 필요하지 않은 자동 설정은 제외 가능:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

3.3 빠른 프로토타이핑

  • 기본값과 구성 규칙 덕분에 Spring Boot는 초기 설정 시간을 크게 줄여준다.
  • 애플리케이션을 빠르게 개발하고 실행할 수 있어, 프로토타입 개발에 특히 유리하다.

4. 실제 사례

4.1 기본값 활용

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

위 코드만으로도:

  • 내장 Tomcat 서버가 8080 포트에서 실행.
  • /로 접속 시 기본 오류 페이지 표시.

4.2 커스터마이징

기본값을 유지하면서 일부 설정을 변경하려면 application.properties를 수정:

# 기본값 덮어쓰기
server.port=9090
spring.application.name=MyApp

5. 요약

Spring Boot의 기본값과 구성 규칙은 다음과 같은 장점이 있다:

  1. 설정보다 관례: 자주 사용하는 값을 기본값으로 제공.
  2. 자동 설정: 필요한 설정을 자동으로 감지하고 적용.
  3. 유연한 커스터마이징: 필요할 때만 설정을 오버라이드.
  4. 빠른 시작: 최소한의 설정으로 애플리케이션 실행 가능.

이 철학 덕분에 Spring Boot는 초보자에게 친화적이면서도 실무에서 강력한 도구로 자리 잡았어.


spring-boot-starter-web이 뭔지 설명해줄래?
spring-boot-starter-data-jpa이 뭔지 설명해줄래?
H2 데이터베이스이 뭔지 설명해줄래?
Properties 이나 YAML 파일이 뭔지 설명해줄래?
8080 포트가 뭔지 설명해줄래?
Tomcat 이 뭔지 설명해줄래?
Bean 이 뭔지 설명해줄래?

 

1. spring-boot-starter-web

1.1 개념

  • Spring Boot Starter는 특정 기능을 빠르게 설정하고 사용할 수 있도록 관련된 라이브러리를 묶어둔 의존성 묶음(Dependency Bundle)이다.
  • spring-boot-starter-web은 웹 애플리케이션 개발에 필요한 라이브러리를 한 번에 추가할 수 있는 스타터다.

1.2 주요 포함 라이브러리

  • Spring MVC: 웹 애플리케이션을 개발하기 위한 MVC(Model-View-Controller) 프레임워크.
  • Jackson: JSON 데이터 처리를 위한 라이브러리.
  • Tomcat: 내장 웹 서버.
  • 기타 웹 개발 관련 필수 라이브러리들.

1.3 역할

  • REST API웹 애플리케이션을 개발할 때 사용하는 기본 의존성.
  • 개발자는 별도의 서버 설정 없이 바로 웹 애플리케이션을 실행 가능.

1.4 예제

xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

위와 같이 의존성을 추가하면, 기본 설정만으로도 간단한 웹 서버를 실행할 수 있다.


2. spring-boot-starter-data-jpa

2.1 개념

  • spring-boot-starter-data-jpa는 Spring Data JPA를 기반으로 데이터베이스와의 상호작용을 단순화하기 위한 스타터다.
  • 데이터베이스의 CRUD(Create, Read, Update, Delete) 작업을 코드 몇 줄로 구현할 수 있다.

2.2 주요 포함 라이브러리

  • Spring Data JPA: JPA(Java Persistence API) 기능을 간편하게 사용할 수 있도록 지원.
  • Hibernate: JPA의 구현체로, 객체를 데이터베이스 테이블과 매핑.
  • 데이터베이스 연결 관련 라이브러리.

2.3 역할

  • 데이터베이스와 상호작용하는 코드를 최소화.
  • SQL 쿼리를 직접 작성하지 않고도 데이터베이스 작업 가능.

2.4 예제

xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

사용 예시

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

위 코드만으로도 User 데이터를 저장, 조회, 삭제 가능.


3. H2 데이터베이스

3.1 개념

  • H2는 경량화된 메모리 기반의 관계형 데이터베이스다.
  • 개발과 테스트 환경에서 주로 사용되며, 파일 기반 모드로도 동작 가능.

3.2 특징

  • 빠른 속도: 메모리 기반이라 데이터 처리가 빠르다.
  • 내장 웹 콘솔: 데이터베이스의 테이블과 데이터를 쉽게 조회할 수 있는 웹 인터페이스 제공.
  • SQL 호환성: 표준 SQL 문법 지원.

3.3 사용 이유

  • 초기 개발 단계에서 MySQL, PostgreSQL 같은 무거운 데이터베이스를 설치하지 않고도 간단히 데이터베이스를 테스트할 수 있음.
  • Spring Boot에서 기본 데이터베이스로 자동 설정.

3.4 예제

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.h2.console.enabled=true

4. Properties와 YAML 파일

4.1 개념

  • Properties 파일: 애플리케이션의 설정을 키-값 형태로 저장.
  • YAML 파일: 설정을 계층적으로 저장할 수 있는 파일 형식.

4.2 차이점

  • Properties 파일은 간단하지만, 구조가 계층적이지 않아 복잡한 설정엔 불편.
  • YAML 파일은 들여쓰기로 계층 구조를 표현하므로 복잡한 설정에 적합.

4.3 예제

  1. Properties 파일
server.port=8080
spring.datasource.url=jdbc:h2:mem:testdb
  1. YAML 파일
server:
  port: 8080

spring:
  datasource:
    url: jdbc:h2:mem:testdb

5. 8080 포트

5.1 개념

  • **포트(Port)**는 네트워크에서 특정 애플리케이션에 데이터를 전달하기 위한 번호다.
  • 8080은 HTTP 웹 서버에서 기본적으로 사용하는 포트.

5.2 역할

  • 클라이언트가 브라우저에서 http://localhost:8080으로 접속하면, 서버는 8080 포트를 통해 요청을 받음.

5.3 커스터마이징

server.port=9090

6. Tomcat

6.1 개념

  • Apache TomcatJava 기반의 웹 애플리케이션을 실행하는 웹 서버다.
  • Spring Boot는 Tomcat을 내장 서버로 포함하고 있어, 추가 설치 없이 웹 애플리케이션을 실행할 수 있다.

6.2 역할

  • 클라이언트가 보낸 HTTP 요청을 처리하고, 필요한 데이터를 반환.

6.3 특징

  • 경량화된 웹 서버.
  • JSP(Java Server Pages)와 서블릿(Servlet)을 지원.

6.4 변경

Tomcat 대신 다른 웹 서버를 사용할 수도 있다:


7. Bean

7.1 개념

  • Bean은 Spring이 관리하는 객체를 뜻한다.
  • Spring IoC 컨테이너에 의해 생성되고 관리되며, 애플리케이션 전반에서 공유된다.

7.2 생성 방법

@Component 사용

@Component
public class MyComponent {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}

@Bean 사용

@Configuration
public class MyConfig {
    @Bean
    public MyComponent myComponent() {
        return new MyComponent();
    }
}

7.3 특징

  • 의존성 주입(Dependency Injection)을 통해 다른 Bean을 주입받아 사용할 수 있음.

마무리

Spring Boot는 위 요소들을 유기적으로 연결하여, 웹 애플리케이션 개발을 단순화하고 생산성을 높여준다.


'유연하고 외부화된 구성관리를 허용한다'는 말이 무슨 뜻인지 설명해줄래?
'프로필별 구성을 통해 다양한 환경 간 전환을 단순화합니다'는 말이 무슨 뜻인지 설명해줄래?
'특정 조건에 따라 Bean을 포함하거나 제외하려면 조건부 구성을 활성화합니다'는 말이 무슨 뜻인지?
1. "유연하고 외부화된 구성 관리를 허용한다"는 말의 뜻

1.1 개념

Spring Boot는 애플리케이션의 설정을 코드에 하드코딩하지 않고, 외부 파일이나 환경 변수로 관리할 수 있도록 한다. 이를 통해 애플리케이션을 실행하는 환경에 따라 동적으로 설정을 변경할 수 있다.

1.2 주요 내용

  • 유연함:
    • 설정 값을 다양한 방법으로 정의할 수 있다.
    • 예: application.properties, application.yml, 환경 변수, 명령줄 인수 등.
  • 외부화:
    • 설정을 애플리케이션 코드와 분리하여, 환경마다 다른 설정을 쉽게 적용 가능.
    • 예: 로컬 개발 환경에서는 H2 데이터베이스, 운영 환경에서는 MySQL을 사용할 수 있도록 설정 파일로 관리.

1.3 예제

  • 하드코딩 방식(비권장):
String dbUrl = "jdbc:mysql://localhost:3306/mydb"; // 변경 시 코드 수정 필요
  • 외부화된 구성(권장):
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
 
@Value("${spring.datasource.url}") // 외부 설정 파일의 값을 가져옴
private String dbUrl;

1.4 장점

  • 설정 변경 시 코드 수정 없이 설정 파일만 업데이트하면 됨.
  • 애플리케이션 배포 환경별로 서로 다른 설정을 손쉽게 적용 가능.

2. "프로필별 구성을 통해 다양한 환경 간 전환을 단순화합니다"는 말의 뜻

2.1 개념

Spring Boot는 프로필(Profile) 기능을 통해 환경별 설정 파일을 나눌 수 있다.
개발 환경(dev), 테스트 환경(test), 운영 환경(prod) 등에서 동일한 애플리케이션 코드를 사용하면서, 설정 파일만 바꿔 다른 환경에 적합한 동작을 하게 한다.

2.2 주요 내용

  • 프로필 정의:
    • 특정 환경에서만 사용되는 설정을 그룹화하여 관리.
    • 프로필 이름으로 application-{profile}.properties 또는 application-{profile}.yml 파일 작성.
  • 활성화:
    • 실행 시 spring.profiles.active를 지정해 특정 프로필을 활성화.

2.3 예제

  • 프로필별 설정 파일:

application-dev.properties (개발 환경)

spring.datasource.url=jdbc:h2:mem:devdb
application-prod.properties (운영 환경)
spring.datasource.url=jdbc:mysql://prod-server/mydb
 
  • 프로필 활성화:
    • 개발 환경 실행: java -jar myapp.jar --spring.profiles.active=dev
    • 운영 환경 실행: java -jar myapp.jar --spring.profiles.active=prod

2.4 장점

  • 환경 간 설정 전환이 간편해진다.
  • 같은 코드 기반으로 여러 환경에서 유연하게 동작 가능.

3. "특정 조건에 따라 Bean을 포함하거나 제외하려면 조건부 구성을 활성화합니다"는 말의 뜻

3.1 개념

Spring Boot는 Bean을 특정 조건이 만족될 때만 등록하거나 제외할 수 있는 기능을 제공한다.
이는 애플리케이션이 실행되는 환경, 프로필, 혹은 클래스 경로에 포함된 라이브러리 여부에 따라 Bean 구성을 동적으로 조정할 수 있게 한다.

3.2 주요 내용

  • 조건부 Bean 등록:
    • 특정 조건(예: 프로필 활성화, 클래스 경로 존재 여부)이 충족될 때만 Bean을 생성.
  • 활성화 방식:
    • @Conditional 애노테이션과 다양한 조건 클래스를 사용.

3.3 예제

@ConditionalOnProperty:

  • 특정 속성 값이 존재하거나 특정 값일 때 Bean을 생성.
@Configuration
public class MyConfig {

    @Bean
    @ConditionalOnProperty(name = "feature.enabled", havingValue = "true") // feature.enabled=true일 때만 생성
    public MyService myService() {
        return new MyService();
    }
}
# application.properties
feature.enabled=true

@ConditionalOnClass:

  • 클래스 경로에 특정 클래스가 있을 때만 Bean 생성.
@Configuration
public class CacheConfig {

    @Bean
    @ConditionalOnClass(name = "com.example.cache.CacheLibrary") // 라이브러리가 존재할 때만 Bean 생성
    public CacheService cacheService() {
        return new CacheService();
    }
}

3.4 장점

  • 불필요한 Bean 생성을 방지하여 애플리케이션 성능 최적화.
  • 다양한 환경과 조건에 맞춘 유연한 애플리케이션 구성 가능.

요약

  1. 유연하고 외부화된 구성 관리:
    • 설정 값을 코드에서 분리하여 환경별로 쉽게 변경 가능.
  2. 프로필별 구성:
    • 환경(dev/test/prod)마다 설정을 나눠서 동일 코드로 다양한 환경을 지원.
  3. 조건부 구성:
    • Bean의 생성을 특정 조건에 따라 제어하여 효율적이고 유연한 구성 관리 가능.

이 접근 방식은 Spring Boot가 다양한 환경에서 유연하게 동작할 수 있도록 설계된 핵심 원리 중 하나야.