이번 글에서는 Spring Boot 멀티 모듈 프로젝트에서 JPA를 어떤 구조로 배치해야 하는지와
초기 셋팅에서 알아두면 좋은 핵심 개념을 정리합니다.
특히 본 시리즈는 “기본 서버 셋팅 템플릿”을 만드는 목적이므로,
JPA 자체를 깊게 파고들거나 공유하는 프로젝트 파일에 도메인 코드 작성은 다루지 않습니다.
대신, 왜 JPA가 실무에서 널리 사용되는지, 멀티 모듈 환경에서 Entity / Repository / Service / Controller가 어떻게 배치되는지,
그리고 초기 셋팅에서 필요한 최소한의 구조만 깔끔하게 소개합니다.
📚 Spring Boot(Kotlin) 기본 셋팅 — 전체 시리즈
- 왜 멀티 모듈 구조인가? (아키텍처 철학 & 전체 설계 편)
- API Response 포맷 설계
- 글로벌 예외 처리(GlobalExceptionHandler)
- Swagger(OpenAPI) 설정
- Security(JWT) 기본 골격
- JWT TokenProvider
- Redis 설정
- Validation 설정
- Logging + MDC(traceId) 설정
- application.yml 프로필 분리 (local/dev/prod)
- 멀티모듈 + JPA 기본 구조 정리 ← 지금 글
- 완성된 프로젝트 템플릿 git 공유
✔ JPA는 왜 많이 사용될까?
Spring 진영에서 JPA는 많이 사용되는 ORM 기술입니다.
그 이유는 다음과 같습니다.
- SQL을 직접 작성하지 않아도 CRUD가 자동 처리됨 — 생산성이 매우 높음
- 엔티티 중심 개발(Domain 중심 개발)이 가능해짐
- Repository 패턴으로 DB 접근 코드가 자연스럽게 분리됨
- 다양한 DB (MySQL, PostgreSQL 등)에 쉽게 대응
- 스프링과 강력하게 통합됨 (트랜잭션, Lazy, Auditing 등)
✔ 멀티 모듈에서 JPA는 어디에 배치해야 할까?
아래는 이번 프로젝트에서 사용하는 레이어 구조입니다.
api → Controller & Request/Response DTO
application → Service(비즈니스 로직)
domain → Entity & Repository (JPA)
📌 JPA 구성요소 배치
- Entity → domain 모듈
- Repository(JpaRepository) → domain 모듈
- Service → application 모듈 (Entity 조합/검증/흐름 관리)
- Controller → api 모듈 (요청/응답 처리)
이렇게 구성하면 레이어 책임이 확실히 구분되고,
api → application → domain 구조가 자연스럽게 흘러갑니다.
✔ 초기 셋팅에서 필요한 최소한의 JPA 코드 예시
아래 예시는 zip파일로 공유 될 프로젝트에 직접 포함되지 않으며,
이 글에서 멀티 모듈 + JPA 구조를 설명하기 위한 독립적인 샘플 코드입니다.
(실제 프로젝트에서는 도메인마다 구조가 달라지므로 개발자가 직접 구현하게 될 부분입니다.)
📌 Entity (domain 모듈)
@Entity
@Table(name = "user")
class User(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0,
val name: String,
val email: String
)
📌 Repository (domain 모듈)
interface UserRepository : JpaRepository<User, Long>
📌 Service (application 모듈)
@Service
class UserService(
private val userRepository: UserRepository
) {
fun findUser(id: Long): User =
userRepository.findById(id).orElseThrow()
}
📌 Controller (api 모듈)
@RestController
@RequestMapping("/users")
class UserController(
private val userService: UserService
) {
@GetMapping("/{id}")
fun getUser(@PathVariable id: Long): ApiResponse<UserResponse> {
val user = userService.findUser(id)
return ApiResponse.ok(UserResponse.from(user))
}
}
✔ 자동 설정(Spring Boot Auto Configuration)은 그대로 이용
Spring Boot 3.x 환경에서는 별도의 JPA 스캔 설정이 필요 없습니다.
@EnableJpaRepositories→ 필요 없음@EntityScan→ 필요 없음- domain 모듈이 boot에 포함되면 Spring이 자동 인식
즉, 이번 템플릿에서는 application.yml의 datasource + jpa 설정만 준비하면 JPA는 자동으로 정상 동작합니다.
✔ 마무리
이번 글에서는 JPA 자체 설명이 아니라,
멀티 모듈 구조에서 JPA가 어떤 역할을 맡고 어디에 배치되어야 하는지에 초점을 맞추어 정리했습니다.
이 구조를 기반으로 프로젝트를 확장하면, 유지보수성과 확장성이 크게 향상됩니다.
다음 글에서는 완성된 서버 템플릿 git 공유합니다.
https://jaemoi8.tistory.com/50
Spring Boot(Kotlin) — 12편. 완성된 프로젝트 템플릿 공유
📚 Spring Boot(Kotlin) 기본 셋팅 — 전체 시리즈왜 멀티 모듈 구조인가? (아키텍처 철학 & 전체 설계 편)API Response 포맷 설계글로벌 예외 처리(GlobalExceptionHandler)Swagger(OpenAPI) 설정Security(JWT) 기본 골격J
jaemoi8.tistory.com
'개발' 카테고리의 다른 글
| HTTP 통신의 실제 모습 – 라이브러리가 감추고 있던 바이트 스트림 처리 (0) | 2025.12.09 |
|---|---|
| Spring Boot(Kotlin) — 12편. 완성된 프로젝트 템플릿 공유 (0) | 2025.11.27 |
| Spring Boot(Kotlin) — 10편. application.yml 프로필 분리 (local/dev/prod) (0) | 2025.11.27 |
| Spring Boot(Kotlin) — 9편. Logging + MDC(traceId) 설정 (0) | 2025.11.27 |
| Spring Boot(Kotlin) — 8편. 멀티 모듈 환경에서 Spring Validation을 어떻게 적용할 것인가 (0) | 2025.11.27 |