Spring Boot에서 Controller, Service, Repository를 분리하는 이유는 소프트웨어 설계 원칙 중 하나인 '단일 책임 원칙'을 따르기 위함이며, 이 원칙에 따르면, 각 컴포넌트는 하나의 책임만을 가져야 하며, 이는 시스템의 각 부분이 잘 정의된 역할을 가지고 있어야 함을 의미한다.

  • Controller: 컨트롤러는 HTTP 요청을 처리하는 역할을 담당한다. 이는 요청을 받아들이고, 요청에 대한 적절한 서비스 메소드를 호출하며, 그 결과를 클라이언트에게 반환하는 역할을 한다. (프레젠테이션 계층)
  • Service: 서비스 계층은 비즈니스 로직을 담당한다. 이는 여러 레포지토리를 조합하여 작업을 수행하거나, 트랜잭션을 관리하거나, 특정 작업을 수행하기 위한 로직을 구현하는 역할을 한다. 데이터의 흐름과 비즈니스 로직을 캡슐화하여 Controller DAO 사이에서 역할을 수행한다. (비즈니스 로직을 수행하는 계층)
  • Repository: 레포지토리는 도메인 모델에 집중하고 특정 데이터베이스 기술의 의존성을 최소화 하는 것을 목적으로 가진다. 기능으로는 데이터베이스와의 상호작용을 담당한다. CRUD(Create, Read, Update, Delete) 작업을 데이터베이스에 대해 수행한다. (데이터 접근 계층)

<Repository>

EntityManager와 JpaRepository는 두 가지 다른 방법으로 데이터베이스 작업을 수행할 수 있게 한다. 어떤 방법을 선택할 것인지는 프로젝트의 요구사항과 개발 팀의 선호에 따라 달라지게된다.

  1. EntityManager를 사용: EntityManager는 JPA의 핵심 컴포넌트로, 엔티티를 관리하며 데이터베이스와의 모든 상호작용을 처리한다. EntityManager를 사용하면 직접적으로 데이터베이스 작업을 제어할 수 있어, 복잡하고 세밀한 작업이 필요한 상황에서는 EntityManager를 사용하는 것이 유리하다. 하지만 EntityManager를 사용하면 코드가 복잡해질 수 있고, JPA를 깊이 이해하는 것이 필요하다.
  2. JpaRepository를 상속: JpaRepository를 상속받는 Repository를 사용하면 CRUD 연산을 매우 쉽게 처리할 수 있다. JpaRepository는 기본적인 CRUD 메서드를 제공하며, 이를 상속받는 클래스는 이 메서드를 직접 사용할 수 있다. 또한, 메서드 이름으로 쿼리를 생성하는 기능을 제공하여 데이터베이스 작업을 매우 쉽게 만들어준다. JpaRepository를 사용하면 보일러플레이트 코드를 크게 줄일 수 있지만, 복잡한 쿼리나 특정 데이터베이스 작업을 처리하기 어려울 수 있다.

+ Recent posts