[Spring] @Controller와 @RestController의 차이 및 구분

이번 포스팅에서는 웹 애플리케이션을 API 방식으로 개발하는데, 

 @Controller는 어디까지 구현하는데 사용하고 @RestController는 어디까지 구현하는데 사용해야 할지에 대해

확실히 정리하고자 한다.


@Controller

@Controller 어노테이션은 주로 웹 애플리케이션에서 View를 처리하는데 사용된다.

Spring MVC에서 요청을 처리하고 뷰 템플릿과 연계하여 결과를 반환한다.

해당 뷰로 데이터를 전달하고 싶은 경우 Model 객체를 사용하여 데이터를 첨부해 반환할 수 있다.

@Controller
@RequiredArgsConstructor
public class MemberController {

    private final MemberService memberService;

    @GetMapping("/members/new")
    public String createForm(Model model) {
        model.addAttribute("memberForm", new MemberForm());
        return "/members/createMemberForm";
    }
    ... 생략   
}

@RestController

@RestController 어노테이션은 주로 웹 애플리케이션에서 RESTful API를 개발하는데 사용된다.

객체를 반환하면 결과를 JSON, XML 등과 같은 형식으로 직접 반환한다.

ResponseBody 어노테이션이 기본적으로 포함되어 있어, 메서드의 반환 값이 HTTP 응답 본문에 직접 쓰여지게 된다.

주로 클라이언트 (웹, 모바일)와 데이터를 주고받을 때 사용되며, 데이터만 반환하므로 뷰 템플릿과 연계되지 않는다.

@RestController
@RequiredArgsConstructor
public class MemberApiController {
    private final MemberService memberService;

    @PostMapping("/api/v2/members")
    public CreateMemberResponseDto saveMemberV2(@RequestBody @Validated CreateMEmberRequestDto requestDto) {
        Member member = Member.builder()
                .name(requestDto.getName())
                .build();
        Long id = memberService.join(member);
        return new CreateMemberResponseDto(id);
    }
	... 생략
}

 

위 코드를 보면 엔티티 객체를 직접 반환하지 않고 DTO 객체로 반환한 것을 볼 수 있다.

API 개발 시에 엔티티를 직접 반환하게 되면 여러 문제점이 발생하게 되는데 해당 내용은 아래 포스팅에서 설명한다.

 

[Spirng/JPA] Dto와 Entity를 분리해서 사용하는 이유

프로젝트를 진행하거나 강의, 책을 보면 항상 엔티티를 직접 반환하지말고 DTO로 변환하여 반환하라는 말을 접하거나 보았을 것이다. 하지만 단순히 "아 ~ 그렇게 하라니까 그렇게 해야지" 보다

hstory0208.tistory.com


정리

  • @Controller : 뷰와 연계되는 웹 페이지를 위한 요청 처리
  • @RestController : RESTful API를 통해 데이터를 주고받기 위한 요청 처리
  • 엔티티 객체를 직접 반환하지 말고 DTO 객체로 변환하여 반환!

구조적으로는 두 어노테이션을 사용하는 컨트롤러 클래스를 따로 구성하는 것이 좋다.

(예를 들어, 홈페이지와 관련된 컨트롤러는 HomeController로, API 처리는 HomeApiController와 같이 별도의 컨트롤러로 구성)

이렇게 함으로써, 각 컨트롤러의 역할을 명확하게 구분하여 유지 관리를 용이하게 할 수 있다.