◎ 패키지 구조
-
패키지 구조 필요성
- 작은 프로젝트더라도 java 파일은 굉장히 많나질 것이다.
ex) Controller, Service, DTO, entity, ...
- 따라서 패키지 (일종의 폴더 구조)를 통해 원하는 파일을 찾기 쉽게 분류해놓는 것이 좋다.
-
기능 기반 패키지 구조(package-by-feature)
- 애플리케이션의 패키지를 애플리케이션에서 구현해야 하는 기능을 기준으로 패키지를 구성
- 한 기능 패키지 내에는 하나의 기능을 완성하기 위한 계틍별 클래스들이 모여있음
-
계층 기반 패키지 구조(package-by-layer)
- 패키지를 하나의 계층으로 보고, 클래스들을 계층별로 묶어서 관리함
-
Spring Boot 팀에서는 테스트와 리팩토링이 용이하고, 향후에 마이크로 서비스 시스템으로의 분리가 상대적으로 용이한 기능 기반 패키지 구조 사용을 권장
◎ 한 기능 내에서의 구조
-
기본적인 구조
- Controller : Controller : 가장 바깥 부분, 요청/응답을 처리함. → API와 통신함
- Service : 중간 부분, 비즈니스 로직을 수행
- Repository : 가장 안쪽 부분, DB와 맞닿아 있음.
- 서로 연결될 때, 클래스 내부에서 객체를 생성하는 것이 아닌 DI(Spring Container) 로 주입함
◎ Controller 설계
- 클라이언트로부터 발생할 요청을 고민 (API 문서 작성)
- REST API 기반의 애플리케이션에서는 리소스(Resource, 자원) 으로 구분
ex) 커피 주문 어플 > 회원, 커피, 주문 ...
- 리소스에 해당하는 리소스별 패키지 생성 및 컨트롤러 설계
- 컨트롤러 별로 CRUD 작업을 진행 (필요한 부분을 필요에 맞게 구현)
◎ EntryPoint (엔트리 포인트)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Section3Week1Application {
public static void main(String[] args) {
SpringApplication.run(Section3Week1Application.class, args);
}
}
-
애플리케이션 시작점
-
‘Spring Initializr’를 통해 생성한 프로젝트에는 엔트리포인트 클래스가 이미 작성되어 있음
-
@SpringBootApplication
- 자동 구성을 활성화
- Spring Bean에 등록하는 역할 (@ComponentScan 역할, @Configuration을 추가로 등록)
-
@SpringApplication.run(ProjectName.class, args);
- Spring 애플리케이션을 부트스트랩하고, 실행하는 역할
- 부트스트랩 : 어플리케이션 실행 전, 설정 작업 수행하여 실핵 가능하게 만드는 단계