강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

6udguin님의 프로필 이미지
6udguin

작성한 질문수

실무에서 RestController 와 Controller 혼합하여 사용하나요?

작성

·

14

·

수정됨

0

안녕하세요!

이번 개인프로젝트에서 REST API 형식으로 개발하려 합니다. vue 나 리액트를 사용하지 않은 타임리프를 사용할 생각입니다!

 

RestController 의 return 타입은 ResponseEntity 로 할 생각입니다 !

 

내용은.

RestController 는 JSON 으로 응답을 돌려주는 역할을 하며 redirect 와 같은 것을 사용하지 않는 이상 view페이지로 리턴해주는 건 따로 없고, 권장하지 않는다고 배웠습니다.

 

view 페이지 이동 및 view 에서 표출할 단순한 데이터는 @Controller , "기능"에 관련된 것은 @RestController 을 사용해야할 거 같습니다.

 

예를 들어,
1. 회원목록 페이지 이동은 Controller 및 회원목록조회(DB조회) -> member_list.html 리턴
2. 회원상세보기 페이지 이동은 Controller 및 회원상세조회(DB조회) -> member_detail.html 리턴

3.회원 상세보기페이지에서의 수정 기능은 RestController 및 JSON 응답 리턴

 

이렇게 구현이 되어야할 거 같더라구요 !

RestAPI 및 @RestController 형식을 사용한다하더라도 전체를 RestController 를 사용하는 건 구현에 무리도 있고 권장되지 않는 거 같기도 하더라구요.

패키지 구조로 치면
1.

domain(package)

-member(package)

-controller(package) > MemberApiController.java, MemberController
2.

domain(package)
-member(package)
-web(package)
-controller(package) > MemberController
-api(package) > MemberApiController

이렇게요!

 

 

RestController 하나만 사용하게 된다면

  1. 메인페이지에서 [회원목록] 을 클릭한다.

  2. 클릭과 동시에 axios/fetch 등의 비동기 통신이 이루어진다.

  3. 비동기통신의 url 은 회원목록데이터를 return 하는 @RestController 메서드에 도착한다.

  4. 응답이 성공하면 axios/fetch 비동기 메서드에 200코드와 회원목록데이터를 전달한다.

  5. 응답이 성공하면 그 데이터를 회원목록페이지를 보여주는 @RestController 에 다시 전달한다.

  6. 해당 RestController 메서드가 전달받은 데이터를 view페이지에 표출한다.

순서가 이렇게 될 거 같은데

5번의 회원목록 페이지를 보여주는 RestController 또한 view 페이지를 열수없으니, redirect 와 같은 걸 사용해야할 거 같더라구요.

 

상당히 복잡하고 비효율적인거 같아 RestController(기능) 와 Controller(view 페이지 이동) 을 분리해서 사용하기로 결정했는데

 

실제 현업/실무에서도 @RestController(ResponseEntity) 와 @Controller(ModelAndView) 를 위처럼 기능 / view 페이지 이동 이렇게 구분해서 사용하나요?

아니면 RestController(ResponseEntity) 하나만 사용하나요?

만약 구분해서 사용해야한다면
MemberApiController 는 ResponseEntity 메서드
MemberController 는 ModelAndView 메서드
를 작성하는 것을 염두에 두고 있습니다 !

또한 패키지 구조 추천도 부탁드립니다! 1번과 2번 외에 더 추천해주실 만한 패키지구조가 있다면 조언부탁드리겠습니다!

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

6udguin님, 현업에서는 @RestController@Controller를 혼합하여 사용합니다. @RestController는 주로 JSON 데이터를 반환하는 API 구현에 사용되며, 일반적으로 비동기 요청과 관련된 기능을 다룹니다. 반면, @Controller는 뷰 템플릿으로의 페이지 이동이나 렌더링에 사용됩니다.

따라서 프로젝트 구조에서 기능과 뷰 이동을 명확히 분리하는 것이 좋습니다. 예를 들어, @RestController는 API 관련 기능, 예를 들어 데이터 수정, 생성 등을 처리하고, @Controller는 페이지 간 이동 및 사용자에게 출력할 데이터를 준비하는 데 사용됩니다.

패키지 구조로는 다음과 같은 구분을 추천드립니다:
- domain 패키지: 도메인 객체와 비즈니스 로직
- member 패키지: 회원 관련 클래스들
- web 패키지 (optional): 웹과 관련된 로직 처리
- controller 패키지: @Controller 클래스들
- api 패키지: @RestController 클래스들

이렇게 하면 각 계층이 담당해야 할 역할이 명확해져 프로젝트 유지보수가 쉬워질 것입니다. 실무에서도 이와 유사한 방식으로 구현하곤 합니다.

이미지의 예시 URL로는 제공할 수 없으나, 보다 자세한 사항은 Spring Boot 공식 문서를 참조하면 좋습니다.

6udguin님의 프로필 이미지
6udguin

작성한 질문수

질문하기