structuring Your Code
이 문서는 Spring Boot 애플리케이션의 코드 구조와 권장 관례를 정리한 내용입니다. 원문은 Spring Boot 공식문서의 “Structuring Your Code”를 참고.
1. 기본 권장 원칙 (요약)
- 가능한 한 루트(최상위) 패키지에
@SpringBootApplication이 붙은 메인 클래스를 두어, 컴포넌트 스캔(component scan)과 엔티티 스캔(entity scan)이 프로젝트 내부로 제한되도록 합니다. - 자바의 권장 패키지 네이밍 규칙(도메인 역순:
com.example.project)을 따릅니다. - 기본 패키지(default package)를 사용하지 마십시오. (package 선언이 없는 클래스는 default package에 속하며, 컴포넌트 스캔 등에서 의도치 않은 문제가 발생할 수 있습니다.)
2. “default” 패키지 사용 금지
package 선언을 생략하면 클래스는 기본 패키지(default package)에 포함됩니다. 기본 패키지는 다음과 같은 문제를 일으킬 수 있습니다:
- Spring의
@ComponentScan,@ConfigurationPropertiesScan,@EntityScan등이 모든 JAR의 클래스들을 읽게 되어 성능 저하 또는 충돌 가능성이 높아집니다. - 패키지 기반 접근 제한자 및 리팩토링 도구의 동작이 예측 불가능해질 수 있습니다.
따라서 항상 명시적인 패키지 선언을 사용하세요. 예: com.example.myapp
3. 메인 애플리케이션 클래스 위치
메인 애플리케이션 클래스(보통 @SpringBootApplication이 붙음)는 애플리케이션의 “루트 패키지”에 위치시키는 것을 권장합니다. 이 위치는 다음을 의미합니다:
- 해당 패키지와 그 하위 패키지들만 컴포넌트 스캔 대상이 되어, 외부 라이브러리의 컴포넌트가 의도치 않게 스캔되는 것을 방지합니다.
예시 디렉토리 구조 (권장)
com
+- example
+- myapplication
+- MyApplication.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
MyApplication.java (표준 메인 클래스 예시)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
원문 참조: Spring Boot — Structuring Your Code (https://docs.spring.io/spring-boot/3.5/reference/using/structuring-your-code.html)