[Java] Spring Boot @Controller / @Service / @Repository 개념
@Controller / @Service / @Repository 개념
- 본인은
NodeJS
를 통해 서버 공부를 하다 Java의 Spring Boot
도 공부를 시작했으며 자바라는 언어 자체도 이때 처음 접했다.
- 자바의 웹개발 프레임워크를 공부하다 보면
NodeJS
의 express
프레임워크와 다르게 스프링이나 스프링 부트는 개념들이 굉장히 세분화 되어있었다.
- 그 중에서 가장 대표적으로 큰 개념들이 내가봤을땐
@Service
@Controller
@Repository
가 있다. 물론 더있음.
- 한줄 요약 하자면 세개의 역할은 다음과 같다.
@Controller
: 웹의 요청과 응답을 담당함, 서비스를 호출하며 작업이 끝나면 리턴값 가져와 클라이언트에 응답.
@Service
: 서비스 레이어라고도 부르며 대부분의 로직이 이 계층에서 이루어짐,Repository
를 통해 데이터를 가져오며 가공 후 컨트롤러에게 전달.
@Repository
: 서비스에 의해 호출되며 DB관련 CRUD.
@Controller
- 위의 그림을 보면 프론트의
view
에서 요청을 했을때 controller
에게 먼저 요청이 가게 된다.
- 개발자는 서버에
URL
마다 각 API
를 만들어 두고 클라이언트는 필요한 정보를 적절한 API
에 요청만 하면 된다.
- 컨트롤러란 결국 이런 요청별로 하나씩 맡은
API
들을 모아놓은 클래스를 칭한다.
- 추가로 요청을 받기도 하지만 해당 요청에 대한 작업이 끝났을때 응답도 해당 컨트롤러에서 실시한다.
@Service
- 비즈니스 로직을 처리함.
Repository
에서 가져온 정보를 이용해 요청을 처리 후 controller
에게 리턴함.
controller
에서 service
없이 바로 repository
에 접근하지 않고 굳이 service
계층을 하나 더 만들어 정보를 가공하는 이유는 만약 service
없이 정보를 직접 CRUD
한다면 테이블에 저장된 원본의 정보가 손상될 위험이 있기 때문임.
- 따라서 원본의 데이터를 사용하는 것이 아닌 DB에서 추출한 정보의 복사본
DTO(Data Transfer Object)
를 사용해 service
에서 가공함.
@Repository
- DB에 접근하는 클래스, 그 후 해당 객체를 이용해 데이터를 조작하는 기능을 하는 클래스
DB
와연결을 할 때 Repository라는 저장소를 두게 됨, 흔히 Model이라고도 하는데 스프링에선 Repository라고 부름.
- Repository를 구성하는 클래스는
DAO(Data Access Object)
DTO(Data Transfer Object)
VO(Value Object)
가 있으며 이들을 통해 DB와 연결함.
- DAO에서 CRUD를 전담하며, DB를 사용하는것은 온전하게 데이터를 보관하고 관리하는 측면에서 유리하기 때문에 프로그램에 필요한 데이터들은 DB에 보관해두고
DTO
를 통해 데이터내용을 CRUD 해야함. 따라서 controller
의 부담도 줄어든다.
Repository
계층에서 DAO
를 만들어 DB연동을 수행하며 controller
와 DAO
사이에 데이터의 가공이 필요하다면 서비스 계층에서 작업함. controller
와 DAO
간의 중간계층이 하나 더 생성되는데 이것을 service
계층이라 함.