com.example.demo
org.springframework.boot
net.shop.app

스프링에서 프로젝트를 만들면 기본 패키지 경로가 aaa.bbb.ccc 형태로 생성되는데, 이 이유는 자바의 패키지 네이밍 규칙과 프로젝트의 식별,관리 목적이 합쳐진 결과이다. 자바는 패키지를 "폴더"처럼 사용하지만, 목적은 전 세계적으로 고유한 네임 스페이스를 가지기 위함이다. 따라서 자바는 관례적으로 도메인 이름을 역순으로 사용해 프로젝트의 시작 패키지를 만든다.

 

1. 첫 번째 : com, org, net

인터넷 도메인의 최상위 도메인(TDL, Top-Level Domain)을 역순으로 적는다. com은 commercial(기업), org은 organization(조직, 재단), net은 network 기반 조직이다. 즉 간단히 설명하는 이 코드를 만든 단체의 성격이 드러내기 위해 가장 바깥에서 나타나는 계층이다.

 

2. 두 번째 : example

소유 조직의 실제 도메인 이름을 역순으로 표현한다. 즉 도메인은 example.com, naver.com 이지만 패키지는 com.example, com.naver가 된다. 의미는 "naver가 만든 코드"이다.

 

3. 세 번째 : demo, boot, app

대부분 우리가 실제 사용하게 될 프로젝트 명 혹은 모듈 명이다. 스프링 부트에서 컴포넌트 스캔 기준 패키지(root package) 역할이며, 어떤 시스템인지 구분하기 때문에 조직에서 다양한 서비스, 시스템을 만들 때 충돌하지 않아야 한다. 즉 패키지 명이 겹치지 않게 네미잉을 관리해야 한다. 왜냐하면 개발자가 실제 사용할 해당 프로젝트 명이, 서비스 이름, 깃헙 레파지토리 이름과 같게 만들 확률이 높기 때문이다.  

 

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

따라서 com.example.demo에 위와 같은 @SpringBootApplication이 붙은 Application 클래스가 있으면 스프링 부트가 해당 클래스가 있는 패키지 기준으로 하위 패키지 전체를 스캔해서 Bean으로 등록한다.

 

@SpringBootApplication은 3개가 합쳐진 메타 애노테이션이다. @Configuration, @EnableAutoConfiguration, @ComponentSacn이고 @ComponentScan은 스프링이 Bean을 찾는 기준이 된다. 여기서 핵심은 ComponentScan의 “기준 패키지”가 이 Application 클래스가 위치한 패키지라는 점 이다.

 

com.example.demo  ← Application.java 위치
 ├─ controller     ← 스캔됨
 ├─ service        ← 스캔됨
 ├─ domain         ← 스캔됨
 └─ repository     ← 스캔됨

스프링은 Application 클래스가 있는 패키지의 하위 패키지들을 자동으로 인식해서 Bean을 만든다.

 

+ Recent posts