프로그래밍/JAVA Spring

[Spring 스프링] @Component, @Repository, @Service, @Controller 는 뭐가 다를까

hectick 2023. 4. 12. 21:45

프로그램을 짜면서 @Component를 달아보기도 하고, @Repository로 바꿔서 달아보기도 했다.

근데 둘 다 프로그램이 잘 돌아간다. 궁금해져서 차이점을 찾아봤다.

 

 

🐣 컴포넌트 스캐닝

@ComponentScan 어노테이션을 달고있는 어플리케이션이 위치하는 패키지 내에서 이루어진다.

컴포넌트 스캐닝을 통해 @Component 어노테이션이 달린 클래스들을 빈으로 만든다.

 

 

🐣 @Component

스프링에서는 @Component을 사용하여 빈을 선택하고 등록한다.

 

 

🐣 @Repository, @Service, @Controller

각각의 어노테이션을 까고 들어가보면 @Component라는 어노테이션을 달고 있음을 확인할 수 있다.

@Component가 일반화된 어노테이션이라고 생각하면 된다.

 

 

대충 코드를 까본 결과와 구글링을 해본 결과를 정리하면 다음과 같다.

@Repository : 데이터베이스에 접근하는 계층에서 사용, DB에 관련된 예외를 변환해서 던지는 기능 살짝 추가
@Service : 비즈니스 로직과 연관된 서비스 계층에서 사용, @Component와 기능상의 차이 없음
@Controller : 스프링 MVC 패턴에서 컨트롤러 역할을 함을 나타낼 때 사용, 무작정 @Component로 대체해버리면 에러가 발생할수도?

 

 

@Controller를 @Component로 완전히 대체될 수 없는 경우를 실험해 본 블로그들의 글을 아래에 첨부한다.

그냥 @Component만 쓰면 @RequestMapping을 수행하지 못한다.

@Component로 대체하려면 @RequestMapping도 같이 써줘야 동작한다는 내용이다. 

 

@Component와 @Controller의 차이

0. Spring MVC. 가볍게 쓰면 희극이요, 깊게 파고들면 비극이리라. 수많은 개발자들이 정말 간편하게 쓰고 있는 기능이다. 클라이언트에서 영속 계층까지 물 흐르듯 이어지는 로직은 언뜻보면 단순

velog.io

 

Spring boot @Controller VS @Component

Spring has different annotations for different purposes. Often the stereotype annotations are contradicted by the umbrella @Components…

medium.com

 

실제로 미션의 테스트 코드도 돌려봤는데 다음 네개의 경우의 중에서 네번째 경우만 빼고 다 테스트 코드가 통과하도록 잘 작동한다.

왜 그런지는 몰?루. 아무튼 컨트롤러를 제대로 쓰려면 @Controller를 쓰자 ㅎ.ㅎ

 

1. @Controller + @RequestMapping (동작ㅇ)
2. @Component + @RequestMapping (동작ㅇ)
3. @Controller만 사용 (동작ㅇ)
4. @Component만 사용 (동작x)

 

 

아무튼, 결론을 어서 지어보자면 괜히 @Service, @Repository, @Controller가 생긴 것은 아닐 것이다.

아마도 각각의 계층을 구분해서 유지보수하기 쉽게하기 위해 생긴 것이 아닐까싶은데, 생긴데는 이유가 있을 것이므로 있는 것을 잘 써보도록 하자!!