thumbnail
비상교육 현장실습 - Controller와 Service의 역할
VISANG / Spring
2023.08.10.

Controller와 Service 둘 다 비즈니스 로직을 담당한다. 그렇다면 둘의 역할은 무엇이 다른 점인지 궁금하여 정리해보았다. 특히 엔티티를 service 계층에서만 써야 되는 이유는 엔티티의 지연 로딩이 가능한 범위 이기 떄문이라고 하셨는데 그럼 jpa 를 안쓰는 경우에는 엔티티가 전 계층에서 사용해도 발생되는 문제는 없나요? -> 해당 의문이 제일 고민이 되어 정리를 해보았다.

답변

  • 엔티티를 전 계층에서 사용해도 문제될 것은 없습니다. 다만 아키텍처를 도메인 계층(엔티티)을 컨트롤러를 포함한 모든 계층에서 접근 가능한 아키텍처로 가져갈 것인지, 아니면 좀 딱딱해도 서비스 계층에서만 도메인 계층에 접근하게 할 것인지 규칙을 정하는 것 뿐입니다. 좀 딱딱한 방식으로 가면 아무래도 DTO를 더 많이 만들고 엔티티를 DTO로 변환하는 과정을 많이 거쳐야겠지요? 다만 프로젝트 규모가 크다면, 충분히 고려해볼만한 방식입니다.

또 다른 답변은 다음과 같다.

  • 먼저 엔티티를 서비스 계층 안에서만 사용해야 한다는 주장은 엔티티의 지연 로딩이 가능한 범위 때문입니다. 엔티티를 지연 로딩하려면 영속성 컨텍스트가 필요한데, 이 영속성 컨텍스트는 일반적으로 트랜잭션 범위에 맞추어 사용합니다. 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고, 트랜잭션이 끝날 때 영속성 컨텍스트도 종료되는 것이지요. 이렇게 사용하는게 일반적인 방법이다. 문제는 이렇게 했을 때 서비스 계층을 넘어선 컨트롤러 계층에서는 트랜잭션이 끝나버리므로 영속성 컨텍스트 종료되고, 더이상 지연로딩을 할 수 없는 문제가 있습니다. 그래서 엔티티를 서비스 계층 안에서만 사용하는게 안전합니다.

참고자료