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 어노테이션을 마킹해줍니다.
- 다른 생성자들은 사용자로부터 직접 의존성을 주입받아 생성됩니다.
- 빈의 의존성이 불변하게 됩니다.
참고
'Spring > Spring Boot' 카테고리의 다른 글
[Spring Boot] 2-1. Core Features: SpringApplication 클래스 (0) | 2023.10.08 |
---|---|
[Spring Boot] 1-2. Spring Boot 사용하기 (1) | 2023.10.07 |
[Spring Boot][KoLiving] 3-2 Sign-up (0) | 2023.09.19 |
[Spring Boot][KoLiving] 3-1 Sign-up (0) | 2023.09.19 |
[Spring Boot][KoLiving] 2. i18n (0) | 2023.09.18 |