프로그램을 짜면서 @Component를 달아보기도 하고, @Repository로 바꿔서 달아보기도 했다.
근데 둘 다 프로그램이 잘 돌아간다. 궁금해져서 차이점을 찾아봤다.
🐣 컴포넌트 스캐닝
@ComponentScan 어노테이션을 달고있는 어플리케이션이 위치하는 패키지 내에서 이루어진다.
컴포넌트 스캐닝을 통해 @Component 어노테이션이 달린 클래스들을 빈으로 만든다.
🐣 @Component
스프링에서는 @Component을 사용하여 빈을 선택하고 등록한다.
🐣 @Repository, @Service, @Controller
각각의 어노테이션을 까고 들어가보면 @Component라는 어노테이션을 달고 있음을 확인할 수 있다.
@Component가 일반화된 어노테이션이라고 생각하면 된다.
대충 코드를 까본 결과와 구글링을 해본 결과를 정리하면 다음과 같다.
@Repository : 데이터베이스에 접근하는 계층에서 사용, DB에 관련된 예외를 변환해서 던지는 기능 살짝 추가
@Service : 비즈니스 로직과 연관된 서비스 계층에서 사용, @Component와 기능상의 차이 없음
@Controller : 스프링 MVC 패턴에서 컨트롤러 역할을 함을 나타낼 때 사용, 무작정 @Component로 대체해버리면 에러가 발생할수도?
@Controller를 @Component로 완전히 대체될 수 없는 경우를 실험해 본 블로그들의 글을 아래에 첨부한다.
그냥 @Component만 쓰면 @RequestMapping을 수행하지 못한다.
@Component로 대체하려면 @RequestMapping도 같이 써줘야 동작한다는 내용이다.
실제로 미션의 테스트 코드도 돌려봤는데 다음 네개의 경우의 중에서 네번째 경우만 빼고 다 테스트 코드가 통과하도록 잘 작동한다.
왜 그런지는 몰?루. 아무튼 컨트롤러를 제대로 쓰려면 @Controller를 쓰자 ㅎ.ㅎ
아무튼, 결론을 어서 지어보자면 괜히 @Service, @Repository, @Controller가 생긴 것은 아닐 것이다.
아마도 각각의 계층을 구분해서 유지보수하기 쉽게하기 위해 생긴 것이 아닐까싶은데, 생긴데는 이유가 있을 것이므로 있는 것을 잘 써보도록 하자!!
'프로그래밍 > JAVA Spring' 카테고리의 다른 글
[Spring 스프링] JdbcTemplate 써보기 (0) | 2023.04.15 |
---|---|
[Spring 스프링] JDBC, JDBC 드라이버, JDBCTemplate (0) | 2023.04.14 |
[Spring 스프링] consumes와 produces의 차이 (1) | 2023.04.11 |
[JAVA 자바] chat gpt와 SOLID 원칙에 대해 공부를 해보았다(2) (0) | 2023.03.25 |
[JAVA 자바] chat gpt와 SOLID 원칙에 대해 공부를 해보았다(1) (1) | 2023.03.24 |