
Controller vs RestController, Controller로 다 해결 되잖아~
그렇긴 한데....
- Controller의 역할
보편적으로 Controller는 HTTP 요청이 들어오면 먼저 받는 구간이라고 생각하면된다. Controller가 받고 Service에서 기능을 실행한 결과를 다시 Controller가 클라이언트 측으로 전달한다. (실질적인 제일 앞단은 아니긴함, security도 있고,, 뭐,,)
- @Controller ?
일단 Controller는 주로 기능 실행의 결과를 Model 또는 Response 객체에 담아 uri를 return한다. 간단히 요청 진행을 보면 아래와 같다. (실제로는 몇가지 동작이 더 있음, 개략적인 흐름만 보기!)

요청 URI에 따른 Controller로 전달되어 Service 진행 후 결과를 View Resolver를 통해 return한 URI의 페이지를 보여준다.
만약 페이지가 아닌 Data만을 반환할 경우 @ResponseBody를 붙여주면 ViewResolver를 거치지 않고 JSON 형태로 Client에게 전달된다. 이 경우 페이지가 전환되지 않고 해당 페이지를 요청한 곳에 response가 전달이 되는 형태이다.
- @RestController ?
RestController는 앞서 Controller에서 @ResponseBody를 붙여 Data만을 전달한 경우와 똑같은 작용을 한다. 보편적으로 REST-API를 제작할 때 주로 사용되며 @RestController를 사용하면 기본적으로 @ResponseBody 어노테이션이 들어가 있다고 보면된다.
만약 프론트, 백 서버가 나뉘지 않고 둘다 사용해야한다면, Controller와 RestController는 클래스를 따로 두고 사용하는 것을 권장한다. 한 Controller 내에서 굳이 @ResponseBody를 붙이며 진행하면 추후 CI/CD 시에 실수가 있을 수 있기 때문이다.
- Controller 기본 설정
Controller와 RestController의 설정 자체는 크게 차이가 없기 때문에 해당 포스팅에서는 RestController를 적용한 사례를 예시로 들겠다.
@RestController
@RequestMapping("/chat")
@RequiredArgsConstructor
public class ChatController {
private final ChatRoomService chatRoomService;
private final ChatUserService chatUserService;
@GetMapping("/users/{roomId}")
public StatusResponseDTO getChatRoomUser(@PathVariable Long roomId, @AuthenticationPrincipal SecurityUserDto user) {
ViewChatUserResponse chatRoomUser = chatUserService.findByRoomId(roomId, user);
return StatusResponseDTO.ok(chatRoomUser);
}
@PostMapping("/room/{joinUserId}")
public StatusResponseDTO createChatRoom(@PathVariable Long joinUserId, @AuthenticationPrincipal SecurityUserDto user) {
ViewChatRoomResponse chatRoom = chatRoomService.createChatRoom(joinUserId, user);
return StatusResponseDTO.ok(chatRoom);
}
@PutMapping("/user/{roomId}")
public StatusResponseDTO readMsg(@PathVariable Long roomId, @AuthenticationPrincipal SecurityUserDto user) {
chatUserService.updateChatUserReadMsg(roomId, user);
return StatusResponseDTO.ok("메시지 읽음 처리");
}
| @RequestMapping("/chat") | 해당 컨트롤러로 연결되는 가장 앞쪽의 URI |
| @GetMaaping("/users/{roomId}") | 해당 메서드로 연결되는 URI (/chat/users/{roomId}) |
기본적으로 맵핑 어노테이션을 통해 클라이언트 요청을 연결시켜준다. @RequestMapping의 경우 필요 없다면 사용하지 않아도 무방하다. 하지만 기능별 구분을 위해 주로 기입하는 편이다.
다른 내용들은 모두 커스텀 클래스들이라 눈여겨 보지 않아도 좋다. 대략적인 형태만 보여주기 위함이기 때문..
또한, Mapping 종류와 HTTP 통신의 Method를 통해 어떤식으로 구분하여 받는지 다음 포스팅에서 이어 설명 해보도록 하겠다.
'Back-End > Spring Boot' 카테고리의 다른 글
| [Spring Boot] HTTP 통신 방식과 Controller 연결 (0) | 2025.05.13 |
|---|---|
| [Spring Boot] 순환 참조 해결하기 (2) | 2025.05.13 |
| [Spring Boot] 의존성 주입, @Autowired vs @RequiredArgsConstructor (0) | 2025.05.13 |
| [Spring Boot] IntelliJ Spring Boot Project 생성 파일 분석 (0) | 2025.05.13 |
| [Spring Boot] FFmpeg + 스프링부트 연동 및 사용하기 (0) | 2025.05.12 |