[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 계층이라 함.