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