Study/spring

[Java] Spring @Component, @Service, @Controller 차이

 

스프링에서 객체를 빈으로 등록해주는 어노테이션은 여러가지가 존재합니다.

@Controller, @Service, @Component, @Repository 등의 어노테이션을 사용하는 객체는 스프링에 의해 자동으로 빈으로 등록됩니다.

 

@Component

@Component 어노테이션은 스프링이 자동으로 빈을 찾을 수 있게 해줍니다.

개발자가 새로 만든 객체를 빈으로 등록하고 싶을 때 해당 클래스에 @Component 어노테이션을 선언하면 스프링이 실행될 때 찾아서 빈으로 등록할 수 있습니다.

 

@Service나 @Controller, @Repository, @Configuration과 같은 어노테이션에는 모두 @Component 어노테이션이 포함되어 있기 때문에 빈 등록이 됩니다.

다만, 클래스가 사용되는 계층이 정해져있거나 혹은 설정 파일과 같이 특정한 용도가 있을 때 전부 @Component 어노테이션으로 사용해버리면 구분이 어렵습니다.

그리고 각 어노테이션에는 용도에 맞는 기능이 구현되어 있기 때문에 컨트롤러 클래스는 @Controller, 서비스 클래스는 @Service, 설정 관련 클래스에는 @Conguration과 같이 용도에 맞게 사용하는 것이 좋습니다.

 

 

 

 

@Service

@Service 어노테이션은 DDD(Domain-Driven Design: 도메인 주도 설계)에서 서비스 계층을 표현하는 클래스에 사용됩니다.

@Service 어노테이션 자체에는 @Component와 구분되는 특수한 기능은 없지만, 클래스가 속한 계층과 용도를 명확하게 표현할 수 있습니다.

그리고 AOP와 같은 기능을 사용해서 해당 어노테이션이 있는 클래스 단위로 특정 로직을 실행하게 할 수도 있습니다.

 

@Controller, @RestController

@Controller 어노테이션은 MVC 패턴에서 컨트롤러 계층을 표현할 때 사용합니다.

그리고 해당 어노테이션이 선언된 클래스는 @RequestMapping 메소드와 함께 사용되어 웹 요청 매핑, 입력 값 처리 등의 작업을 처리할 수 있게 됩니다.

 

스프링이 실행될 때 @Controller 어노테이션이 사용된 클래스를 빈으로 등록하고 내부에 선언된 매핑 어노테이션을 가져와서 경로와 메소드를 연결하여 저장합니다.

그래서 웹 요청이 들어오면 일치하는 경로를 찾아서 메소드를 실행할 수 있습니다.

 

@RestController는 @Controller와 @ResponseBody가 합쳐진 어노테이션입니다.

그래서 요청의 응답값을 뷰가 아닌 응답의 본문으로 반환할 수 있습니다.