본문 바로가기
Spring

@Component, @Service, @Repository, @Controller??

by 작심평생 2019. 5. 26.

혼자 스프링을 공부하다 보니, 이렇게 디테일한 부분은 항상 새롭다(...)

먼저 @Controller 는 클라이언트로 부터 요청이 왔을 때 dispatcherservlet이 handleradapter를 통해

컨트롤러를 찾기 위해 '컨트롤러' 역할을 한다 명시하는 것으로 알고 있었다.


하지만 @Component, @Service, @Repository는 모두 스프링 컨테이너에 등록하는 것으로

아무거나 사용하면 되는 줄 알았다. 하지만 소스 플젝을 보니 구분되어 사용된 것을

보고....아 뭔가 잘못 알고 있구나 싶어 갓---구글을 통해 찾은 내용을 정리한다!




 @Controller :  Presentation Layer에서 Contoller를 명시하기 위해서 사용


 @Service :  Business Layer에서 Service를 명시하기 위해서 사용


 @Repository :  Persistence Layer에서 DAO를 명시하기 위해서 사용


 @Component :  그 외에 자동으로 스캔해서 등록하고 싶은 것들을 위해 사용

 (+ 추가 @Component의 구체화된 형태로 @Repository, @Service,  @Controller 등이 있다는 것.)



(롸..?)



또...다시 시작된 구글링..을 통해서 해당 어노테이션에 설명된 Layer는 

계층화 아키텍처(Layered architecture)를 알아야 한다는 걸 깨닫게 되었다..ㅎㅎ




프리젠테이션 레이어(Presentation layer) 는 클라이언트와 최초로 만나는 곳으로 데이터 입출력이 발생하는 곳이다.

비즈니스 레이어(Business Layer)는 컨트롤러와 뷰를 연결해주며 

퍼시스턴스 레이어(Persistence Layer)데이터 베이스에 접급하는 계층이라 보면 된다.





해당 어노테이션 관계를 그림으로 나타낸 것이다.

결국 @Component, @Service, @Repository는 Bean객체를 만드는 역할을 하지만, @Component가 가장 큰 단위

@Service, @Repository 등 구체적으로 사용하면 어떤 부분에 쓰이는지 시각적으로 판단하기 편하다.


이는 나중에 AOP에서 어노테이션에 따라 PointCut을 할 수 있기 때문에 구분해서 사용하는 게 더 좋을 듯하다!

(물론 AOP는 아직도 어렵다..다시 강의들어야지...)





참고

https://docs.spring.io/spring-roo/reference/html/base-layers.html

https://namocom.tistory.com/421

http://blog.daum.net/question0921/797

https://springbootdev.com/2017/07/31/spring-framework-component-service-repository-and-controller/


댓글