Spring/Spring Boot

[Spring Boot] 1-1. Spring Boot 사용하기

noahkim_ 2023. 10. 7. 00:51

1. Build System

  • Spring Boot는 의존성 관리를 위한 build system을 선택하여 사용할 수 있습니다. 
  • build system은 repository에 있는 공개된 artifact들을 가져오는 기능을 지원합니다.
  • Spring Boot에서는 Maven, Gradle이 자주 사용됩니다.
    • Ant, lvy 등도 지원되지만 기능이 제한되어 있습니다.

 

Dependency Management

  • 각 Spring Boot 버전별 사용하는 의존성의 버전을 큐레이션 해 두었습니다.
    • Spring Boot 버전이 올라가면 해당 버전의 적절한 의존성 버전이 제공됩니다.
    • 사용자는 Spring Boot 버전별 의존성에 대한 버전을 따로 지정하지 않아도 됩니다.
    • 큐레이션된 의존성 버전을 사용하지 않고 원하는 버전을 사용할 수 있습니다.
  • 각 Spring Boot 버전별 사용하는 의존성의 버전 정보를 담고있는 데이터를 BOM 이라 합니다.
    • BOM은 Bills of Materials 의 약자입니다.
    • 종속성의 버전을 중앙화하고 관리하는데 사용되는 메타데이터 입니다.
  • 각 Spring Boot 버전은 특정 Spring 버전을 바탕으로 두고 있습니다.

 

Starters

  • 의존성 기술서 집합으로 Spring 에 연관된 의존성이 묶어있습니다.
  • Starters는 프로젝트 초기 설정을 간소화하고, 여러 의존성 간의 호환성을 확인하고 맞춰주는 관리된 의존성 집합을 제공합니다.
    • 특정 Spring 버전의 기술과 관련된 의존성들을 한번에 가져옵니다.
  • spring-boot-starter-* 형태의 명명 규칙을 가진 Starter를 제공하는데, 여기서 '*' 부분에 특정 기술이 들어갑니다.

 

2. Structuring Your Code

  • Spring Boot는 코드의 structure를 강요하지 않습니다.
  • 그러나, best practice가 존재합니다.

 

Using the “default” Package

  • Java 클래스에서 package 키워드가 표기되지 않으면, 최상위 패키지가 default package로 설정됩니다.
  • default package가 사용될 경우
    • 성능 저하 : @ComponentScan 관련 어노테이션은 스캔 범위를 정확히 인식하지 못해 모든 jar의 클래스를 읽게 됩니다.
    • 빈 충돌 : package의 이름이 같은 bean이 충돌할 수 있으며 이러한 경우 어떤것이 bean으로 등록될지 알 수 없습니다.
    • 가독성 저하 : 다른 package의 클래스와 구별이 되지 않아 어려움을 겪을 수 있습니다.

 

Locating the Main Application Class

  • Spring Boot는 root package에 @SpringBootApplication를 붙인 main class를 둘것을 권고합니다.
  • @SpringBootApplication가 붙은 클래스는 하위 패키지부터 클래스들을 탐색합니다.

 

3. Configuration Classes

  • Spring Boot는 java 기반의 설정이 선호되는 프로젝트입니다.
  • 비록 XML을 사용하여 설정할 수 있으나 @Configuration 설정 클래스가 권장됩니다.
  • main class가 @Configuration 설정 클래스로 쓰이기 좋습니다.

 

Importing Additional Configuration Classes

  • 하나의 설정 클래스에 모든 설정을 하지 마세요.
    • 설정 클래스를 참조해주는 @Import 어노테이션을 같이 사용해서 쓰는것이 권장됩니다.
  • 여러 설정 클래스를 생성해서 설정할 경우, @ComponentScan을 통해 설정클래스를 스캔할 수 있습니다.

 

4. Auto-configuration

  • Spring Boot의 auto-configuration은 추가한 jar dependencies를 기반으로 자동설정을 시도합니다.
  • auto-configuration 기능을 활성화하기 위해 @EnableAutoConfiguration을 설정클래스에 붙입니다.
    • @SpringBootApplication은 @EnableAutoConfiguration을 가지고 있는 메타 어노테이션입니다.

 

Gradually Replacing Auto-configuration

  • auto-configuration은 비침투적인 기술입니다.
    • 어떤 auto-configuration이더라도, 대체하고 싶은 설정을 오버라이딩 할 수 있습니다.
    • @Configuration이 붙은 설정클래스를 선언하여 오버라이딩 합니다.
  • 프로젝트 내 어떤 auto-configuration이 적용되었는지 --debug 옵션을 사용하여 콘솔에서 확인할 수 있습니다.

 

Disabling Specific Auto-configuration Classes

  • Spring Boot는 특정 auto-configuration 을 제외하기 위한 방법을 제공합니다.
    • @EnableAutoConfiguration 어노테이션의 exclude attribute에 명시적으로 클래스 이름을 표기합니다.
    • @EnableAutoConfiguration 어노테이션의 excludeName attribute에 명시적으로 FQCN 이름을 표기합니다.
    • environment의 spring.autoconfigure.exclude property에 클래스 이름을 표기합니다.
  • auto-configuration 클래스의 접근제어자는 public 클래스입니다.
    • 자동 설정 클래스의 내부 메서드나 중첩 클래스는 오직 설정을 위한 것이므로 직접적으로 쓰이는 것이 권장되지 않습니다.

 

5. Spring Beans and Dependency Injection

  • Spring Framework에서 제공하는 기술을 통해 빈 등록, 의존성 주입 기능을 지원받을 수 있습니다.
  • Spring Framework에서 제공하는 어노테이션을 통해 편리하게 빈 등록을 할 수 있습니다.
    • @Component, @Service, @Repository, @Controller 등이 있습니다.
    • 빈의 쓰임에 따라 의미론적으로 구별하기 위해 여러 어노테이션이 제공되지만, 기능적으로는 동일하게 동작합니다.
  • 생성자를 통한 의존성 주입이 권장됩니다.
    • 빈의 의존성이 불변하게 됩니다.
      • 이로 인해 빈의 상태를 일관적으로 유지할 수 있습니다.
      • 상태가 변하지 않도록 의존성은 final 키워드가 적용되어야 합니다.
    • 빈의 모든 의존성이 제공된 상태로 생성됩니다.
      • 초기화 중 의존성이 누락되는 상황을 방지할 수 있습니다.
    • 순환 의존성을 방지할 수 있습니다.
      • 빈의 초기화 시에, 컴파일 타임에서 순환 의존성을 검사할 수 있어 조기에 에러를 체크할 수 있습니다.
    • 생성자가 한개 이상이라면, Spring Framework로부터 의존성 주입을 지원받을 생성자를 마킹해 주어야 합니다.
      • 의존성 주입을 지원받을 생성자에 @Autowired 어노테이션을 마킹해줍니다.
      • 다른 생성자들은 사용자로부터 직접 의존성을 주입받아 생성됩니다.

 

 

 

참고