세가지 Annotation 모두 목적은 똑같다.
controller, service, repository의 어노테이션은 모두 컴포넌트 스캔이 가능하게 만드는 수단입니다. 여기서 말하는 컴포넌트 스캔이란 @Component 와 연관이 있는데 해당 어노테이션이 붙으면 스프링이 어노테이션을 분석하고 자동으로 Bean클래스를 생성 해줍니다. Spring 에 대해서 공부해보신 분들은 잘 아시겠지만, MVC패턴과 DI & IOC 개념이 잘 녹아든 프레임워크이죠. 이 세가지 어노테이션 모두 앞서 말한 패턴과 개념이랑 연관이 있습니다. MVC패턴 처리 과정을 살펴보면 이해하기 쉬울겁니다.
- 클라이언트가 서버에 페이지를 요청한다.
- Dispatcher Servlet은 사용자의 요청에 알맞는 @Controller를 찾는다.
- 만약 DB데이터를 이용한 처리 과정이 없다면, 단순히 View를 보여주면 여기서 끝이다.
- 만약 DB가 필요하다면 @Controller는 알맞은 @Service로 가서 비지니스 로직을 수행한다.
- 수행하는 과정중 DB를 접근하기 위하여 @Repository에 요청하여 DB로 부터 필요한 값을 가져온다.
- 순서대로 @Controller까지 결과값을 가지고 return을 하게 되며, Model에 담은 다음에 View를 찾아 보여준다.
여기까지 이해하셨다면 추후에 내용은 매우매우 Eazy합니다 :)
@Component
@Controller, Service, Repository 모두 위 사진과 같은 코드가 포함되 있다.
일단 위에 3가지 어노테이션을 알기전에 기본적으로 모두 포함되있는 @Component를 먼저 알아봐야 합니다.
@Component 어노테이션이 지정 되면 해당 객체는 Bean으로 등록되고 스프링 컨테이너가 해당 Bean을 관리하게 됩니다.
해당 기능을 스프링에서는 컴포넌트 스캔이라고 말합니다.
@Controller
@Controller라고 명시된 해당 클래스의 Mapping을 스캔한다.
@Controller라고 명시가 되면, 해당 클래스는 @Component에 의해 자동으로 Bean이 등록 됩니다. 클라이언트가 특정 요청을 하게 되면 처리하기 위해서 스프링은 제일 먼저 해당하는 Controller를 찾게 되는데 이때 @Controller라고 명시된 클래스들을 탐색합니다. 그리고 난 다음에 Mapping주소가 일치하는 메소드의 내용을 실행하게 됩니다.
추가적으로 @RestController가 존재하는데, 요 아이는 @ResponseBody 사용한것과 동일하게 View를 반환하는게 아닌 객체(보통 JSON) 를 반환하게 된다.
@Service
@Service라고 명시되는 클래스는 비지니스 로직에 대한 정보를 담고 있다.
@Service 라고 명시된 클래스는 비지니스 로직에 대한 정보들이 담겨 있어야 합니다. 즉 사용자의 요청에 따라서 DB에 접근하여 데이터를 추가, 삭제, 수정, 선택과 같은 요청을 처리할 수 있어야 합니다. 프로젝트의 규모가 커질수록 Service에 대한 내용이 매우 방대해지니, 처음에 설계할때 비슷한 서비스끼리 잘 나눠서 정리해야합니다. 유지보수 및 기능확장 측면에서 매우 유용합니다.
위 사진과 같이 컨트롤러에서 요청을 제일 먼저 받은 다음에 해당 요청에 대한 비지니스 로직을 수행하기 위해 MainService를 DI해주고 결과값을 받아 Model에 attribute한 다음 View를 전달하는걸 확인할 수 있다.
@Repository
@Repository라고 명시되있으면 DB에 접근을 하는 객체입니다.
@Repository 어노테이션은 해당 객체는 DB에서 CRUD와 같은 명렁을 하게 되며, 간단하게 DB 접근이 가능한 객체라고 생각하면 됩니다. 위 사진을 보면 메소드명이 DB에서 어떠한 명령을 하는지 나타나져있고, 해당 명령을 실행하기 위한 데이터를 매개변수로 받는걸 확인 할 수 있습니다.
Mybatis를 사용하면 Mapper라는 클래스를 사용하게 됩니다. 보통 JPA를 사용할때 위와 같이 Repository를 명시합니다.
오늘도 모두 슬기로운 코딩 생활.....하십쇼 :)
잘못된 기재내용이나 사실은 피드백 주시면 감사하겠습니다 ! 궁금하신건 언제나 댓글로 남겨주세요.