[Spring Boot]Controller, Service, Repository에 대하여

백승호·2022년 3월 18일
6
post-custom-banner

스프링 또는 스프링 부트로 웹개발을 공부하다보면 다른 프레임워크와 다르게 굉장히 개념들이 세분화 되었다는 것을 느낄 수 있을 것 입니다. 이번에 알아볼 부분이 바로 그러한 것과 연관이 있는 것인데, Controller, Service, Repository가 무엇을 의미하는지 쉽게쉽게 알아보겠습니다. 너무 깊게 들어가면 아직 저의 머리로는 버겁기 때문에...


한 블로그에서 명확하게 정리해준 것 같아 참고용으로 먼저 제시합니다.

컨트롤러 : @Controller (프레젠테이션 레이어, 웹 요청과 응답을 처리함)
로직 처리 : @Service (서비스 레이어, 내부에서 자바 로직을 처리함)
외부I/O 처리 : @Repository (퍼시스턴스 레이어, DB나 파일같은 외부 I/O 작업을 처리함)

https://codevang.tistory.com/258


Controller

그림을 먼저 참고해봅시다.

위 사진은 웹 서버가 클라이언트와 소통할 때 어떤 로직을 거쳐서 정보가 전달이 되는지에 대한 그림입니다.

가장 위쪽에 보면 front-end에서 들어오는 클라이언트 측의 요청이 가장 먼저 서버 측과 맞닿는 부분이 바로 Controller입니다.
서버에서 기능별 URL이라는 API를 개설해 놓았고, 클라이언트는 필요한 정보를 얻기 위해 적절한 API에 요청하는 것이죠.
즉 Controller는 이런 창구 역할을 하는 API들을 모아놓은 클래스입니다.
당연히 정보를 프론트 쪽으로 내려줄 때도 이 컨트롤러의 API를 통해서 보내줍니다.

Repository

Repository는 직역해도 '저장소'로 데이터베이스와 깊은 연관이 있음을 알 수 있습니다.
맞습니다. 데이터단에 직접 매칭되는 Entity라는 것이 있는데, 이 Entity를 통해 데이터 테이블이 생성이 되면, 받아온 정보를 데이터베이스(ex. MySQL, mariaDB)에 저장하고 조회하는 기능을 수행합니다.

위 사진은 일반적인 데이터베이스(MySQL)과 이를 조작하는 SQL문과 매칭되는 개념으로, 스프링부트에서 Domain(Entity)가 table에 , Repository가 SQL에 매칭됩니다. 즉 Repository에서 주어진 jpa 인터페이스 메소드를 활용하여 기본적인 CRUD를 할 수 있습니다.
그러나 클라이언트가 원하는 정보를 주기 위해 단순 데이터조회로는 처리하지 못하는 개념들이 있을 것 입니다. 이때 더욱 고도화된 정보 가공을 처리하는 곳이 밑에서 설명할 Service입니다.

Service

Service는 매우 애매하면서도 확실한 녀석인 것 같습니다.
Service는 위에서 언급했듯이 Repository에서 얻어온 정보를 바탕으로 자바 문법을 이용하여 가공 후 다시 Controller에게 정보를 보내는 곳입니다.
어떻게 보면 Controller는 클라이언트에, Repository는 데이터에 맞닿아서 정보를 주고받는 부분으로 여길 수 있으나 실질적으로 중요한 작동이 많이 일어나는 부분이라고 할 수 있습니다.
제가 주목했던 것은 '그럼 repository에서 정보를 가져오면 바로 가공해서 컨트롤러한테 주면 되는데 굳이 service가 필요한가'에 대한 것입니다.
그러나 같은 궁금증을 가진 사람이 많아보였고, 정보를 조금만 찾아봐도 여러 정보가 나왔습니다.
(지금부터 얘기하는 부분은 service와 직접적인 연관은 없다고 느낄 수도 있습니다)


결론부터 말하자면 클라이언트 즉 controller 쪽에서 바로 데이터베이스에 접근하여 정보를 얻고 가공해서 가져가는 것은 위험합니다. 정보를 직접 CRUD하고 가공하는 과정에서 테이블에 저장된 원본의 정보가 손상될 우려가 크기 때문입니다. 따라서 정보 변동의 위험이 큰 로직은 Service에서 진행하는 것입니다. 추가로 이때도 원본의 데이터를 사용하는 것이 아니라 데이터베이스에서 추출한 정보의 복사본인 DTO를 만들어서 로직을 조작하는 것입니다.


스프링부트에서 중요하게 여겨지는 controller, service, repository에 대해 알아보았습니다.
웹 개발 로직의 기본이 되는 MVC 기술에서 파생된 구조인 만큼 추후에 MVC구조에 대해서도 명확히 공부할 필요가 있을 것 같습니다.

참고자료

https://devlog-wjdrbs96.tistory.com/209

https://medium.com/webeveloper/spring-mvc-architecture-236235d48fa1

https://azderica.github.io/00-java-repositorys/

https://www.notion.so/Spring-2-58046d5633454406b67905630ab7bc72#7f23944349f94dae87e8b2c9c95a5c09

profile
처음처럼
post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 9월 1일

이해가 쉽게 쉬운 용어로 잘 설명해주셔서 감사합니다.

답글 달기