Spring Boot 프로젝트를 생성하고 어떻게 시작해야 하는지 막막할 수 있다.
효율적이고 관리하기 쉬운 구조를 설계하기 위해 적절한 패키지 구성이 프로젝트의 확장성과 유지보수를 하는데 큰 도움이 된다.
본인도 위 구조를 가지고 프로젝트를 진행하는만큼, 각 패키지들이 어떤 역할을 수행하는지 알아보자.
java 디렉토리 하위 패키지
Config
config 패키지는 프로젝트의 전역 설정과 관련된 클래스들을 모아둔 패키지이다.
주로 데이터베이스 설정, CORS, WebSecurity, Swagger 설정 등이 존재한다.
Controller
컨트롤러 패키지는 클라이언트의 HTTP 요청을 처리하고 응답을 반환하는 역할을 한다.
각 기능별로 RESTful API를 제공하게 된다. 예를 들자면 유저에 대한 요청은 UserController 내부에 기능별 메소드를 작성한다.
각 메소드는 클라이언트 요청을 받아 적절한 서비스 레이어로 전달한다.
DTO
DTO(Data Transfer Object)는 클라이언트와 서버 간 데이터를 주고받을 때 사용하는 객체들을 정의한다.
API로 복잡한 형태의 request나 response의 body를 주고받을 때 데이터 형태를 정의하는데 필수적이다.
본인은 request, response에 대한 dto를 따로 구분 및 정의하여 사용한다.
Entity
엔티티 패키지는 데이터베이스의 테이블과 매핑되는 객체들을 정의한다.
User, Product 등 서비스를 운영하는데 필요한 데이터 스키마를 정의하고 데이터베이스의 table과 twin 형태로 유지한다.
Spring Data JPA를 사용하면 엄격하게 테이블 간 relation이나 constraint까지 코드상으로 정의할 수 있다.
enums
프로젝트 내에서 사용하는 상수값이나 상태를 enum class로 정의하여 관리한다.
Repository
데이터베이스와의 상호작용을 처리하는 레이어이다.
각 Entity 별 JPA 인터페이스 (UserRepository, ProductRepository)를 정의하여 기본 CRUD 기능을 제공한다.
실제로 SQL 쿼리를 작성해 조회할 수 있고, JpaRepository를 상속하여 기본적으로 생성되는 메소드를 사용할 수도 있다.
Service
비즈니스 로직을 처리하고 데이터를 가공하는 역할을 한다.
repository 레이어에서 entity object 가져오고 적절한 비즈니스 로직을 수행하여 dto 형태로 controller에 반환한다.
트랜잭션 관리 및 repository와 controller 사이의 중간 레이어 역할을 수행한다고 생각하면 된다.
resources 디렉토리 하위 패키지
static
정적자원(이미지, CSS, JS) 등 파일을 저장하는 폴더.
브라우저에서 바로 접근 가능한 파일들이 위치한다.
templates
HTML 템플릿 파일을 저장하는 디렉토리.
View 렌더링을 위한 템플릿 파일이다.
application.yaml
프로젝트의 전역 설정 파일
데이터베이스 설정, 서버 포트, 로깅 레벨, 프로필 등을 정의할 수 있다.
사실 static과 templates 파일은 spring에서 가볍게 페이지 렌더링을 수행할 때 사용한다.
하지만 백엔드 서버의 기능으로써만 API를 제공하는 형태로 사용할때면 사실 사용할 일이 없다.
application.yaml 파일 설정만 잘 하면 된다.
패키지 구성 설명은 여기까지 하고, 다음 포스팅에서는 가장 핵심 패키지인
entity, repository, service, controller의 코드를 작성하고 API 기능 구현 위주로 작성하겠다.