➡️ 빈(Bean) 등록 관련 애너테이션
클래스 용도에 따라 다른 애너테이션을 사용하기는 하지만
사실 내부 코드를 보면 @Component 애네터이션이 모두 달려 있다.
✅ @Component
클래스를 빈으로 등록하기만 해주면 될 때 사용하는 애너테이션
✅ @Configuration
클래스를 설정 파일을 등록하면서 빈으로 등록해줄 때 사용하는 애너테이션
✅ @Repository
클래스를 ORM 매핑을 하면서 빈으로 등록해줄 때 사용하는 애너테이션
✅ @Service
클래스가 비즈니스 로직을 담당하게 하면서 빈으로 등록시킬 때 사용하는 애너테이션
✅ @Controller와 @RestController
: @Controller와 @RestController는 라우터 역할을 하는 어노테이션이다. 여기서 라우터란 HTTP 요청과 메서드를 연결하는 장치를 가리키는데, 이 어노테이션이 있어야 클라이언트 요청에 맞는 메서드를 실행시킬 수 있다. 또한 클래스가 Controller 역할을 수행하도록 만들어준다. 그렇다면 Controller는 무엇일까? 둘은 어떻게 다를까?를 알아보자.
일단 Controller는 스프링, 스프링부트에서 자주 사용되는 디자인 패턴인 MVC 패턴에서 C에 해당하며, 전체적인 컨트롤 타워 역할을 하며 클래스를 라우터로 만들어주면서 빈으로 등록해줄 때 사용하는 애너테이션이다. 또한 Model에게 View를 반환하는 중간다리로서 활약한다. 여기서 View 반환이란, 눈으로 웹 페이지를 볼 수 있게 만들어주는 것을 의미한다. 즉, View 반환의 목적은 클라이언트가 요청한 화면을 렌더링시키기 위함인 것이다.
이번에는 View 반환 과정을 살펴보자.
1) 클라이언트가 웹 서비스에 URI 형식의 요청을 보낸다.
2) DispatcherServlet이 요청을 처리할 대상을 찾는다.
3) HandlerAdapter를 통해 요청을 Controller에 위임한다.
4-1) @Controller 사용하는 경우
: 요청 처리 역할을 위임받은 Controller는, 요청을 처리하고 요청한 ViewName을 HandlerAdapter로 반환한다.
4-2) @RestController 사용하는 경우
: 요청받은 것이 ViewName보다 복잡한 구조의 Data 형식일 경우 Controller에서 Data를 HandlerAdapter로 반환하기 위해 Response Entity에 담기도 한다. Response Entity에 담아 전달한다는 것은 참고로 객체를 반환한다는 것과 같은 의미이다. 다시 돌아가서.. Response Entity 형식을 가지기 위해서 편하게 어노테이션을 이용할 수 있는데, 그 에너테이션이 @ResponseBody이다. 즉, 복잡한 요청을 받은 경우 @ResponseBody가 포함된 @RestController를 전체 클래스에 적용하는 것이 유리한 셈이다.
CF. @ResponseBody : JSON 형태의 데이터를 반환해주는 어노테이션이다. 풀어 설명하자면, 반환된 객체(Response Entity)는 JSON으로 Serialize(직렬화)되어서 클래이언트에게 반환해줄 수 있도록 한다.
★ ★ ★ 둘의 차이점 비교하기
CF. 라우터 : HTTP 요청과 메서드를 연결하는 장치 역할을 하는 것
@RestController = @Controller + @ResponseBody
= @Component + @Target(ElementType.TYPE) + · · · + @ResponseBody
: 라우터 역할을 하는 어노테이션이다. 클라이언트의 요청에 맞는 메서드를 실행할 수 있게 하는 즉, 매핑할 수 있게하는 애너테이션이다.
@RestController @RequestMapping("/api/users") @RequiredArgsConstructor public class UserController { private final UserService userService; @Operation(summary = "회원 가입") @PostMapping("/signup") public ResponseEntity<ApiResponseDto> signup(@Validated @RequestBody SignupRequestDto requestDto) { userService.signup(requestDto); return ResponseEntity.status(HttpStatus.CREATED).body(new ApiResponseDto(HttpStatus.CREATED.value(), "회원 가입 성공")); } . . . }
@Controller = @Component + @Target(ElementType.TYPE) + · · ·
: @Component 즉, 해당 클래스를 빈으로 등록해주는 어노테이션이 걸려있기 때문에 @Controller 어노테이션만 붙여주면 되는 것이다.
➡️ 의존성 주입 관련 애너테이션
✅ @Autowired : 타입에 맞는 Bean을 주입해주는 애너테이션