스프링 패키지를 나눌 때 전체적인 그림은 일반적으로 위와 같다. 이렇게 계층을 나누어 관리하면 유지보수하기에 용이하며 디버깅 하기도 쉽다.
(Entity와 DTO에 관해서는 따로 여기에 따로 정리해두었다.)
실제 DB에 접근하는 객체
를 말한다.데이터를 꺼내오거나 넣는 역할
을 DAO가 담당한다.JPA의 경우 Repository가 DAO의 역할을 한다고 볼 수 있지만, 그렇다고 DAO와 Repository가 같은 것은 아니다.
1:1 테이블로 매핑되는 DAO와 여러 DAO를 통해 데이터를 가져와 도메인 객체를 만들어 제공하는 것이 Repository의 역할이다.
Http 요청과 응답을 위한 클래스로서 제일 앞단이라고 볼 수 있다.
@Controller
어노테이션을 통하여 Bean에 등록되고 스프링에서 관리된다.
Contoller는 Client의 요청을 DTO의 형태로 받아 Service의 기능을 호출하고, 적절한 응답을 DTO의 형태로 반환하는 역할을 한다.
즉, 요청(Request)과 응답(Response)를 관리하는 계층이라고 생각하면 된다.
Service계층은 DTO를 통해 받은 데이터를 이용해 비즈니스 로직(CRUD의 프로세스 관리, 예외처리 등)을 처리하고, DAO(혹은 Repository)를 통해 DB에 접근하여 데이터를 관리하는 역할을 한다.
@Service
어노테이션을 붙이면 스프링에서 관리된다.
Repository는 DB에 접근하는 소스코드를 모아둔 Interface
다.
JPA를 사용하면 Repository를 통해 DB에 실제로 접근할 수 있다.
JpaRepository interface
를 상속받아서 관리하고자 하는 클래스, ID 필드 타입을 JpaRepository<Entity Class, PK type> 와 같이 넣어주면 자동으로 DB와 CRUD 연결을 할 수 있는 메소드를 생성해준다.
public interface MemberRepository extends JpaRepository<Member, String> {
}
Service와 DB를 연결해주는 역할을 하며, Service 계층에서 Repository를 이용하여 데이터를 관리할 수 있다.
📚참고
[Spring] 스프링 패키지 구조, DAO, DTO, Entity, Repository 에 대하여, DTO를 사용하는 이유