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

deoksam님의 프로필 이미지
deoksam

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

HTTP 요청 메시지 - JSON

RestController과 Controller 그리고 API

작성

·

55

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

안녕하세요 강사님 따로 아주 간단한 토이팀프로젝트를 하다가 궁금해진게 있어서 질문드립니다.

프론트엔드와 백엔드로 역할을 나눈뒤에 restapi를 통해

기본적인 회원crud개발을 하려고 하는데 문득 뭔가 이상하다는 느낌이 들어서요 . 제가 알고있기론 restapi라는게 사용자인터페이스 보다는

어떤경로로 어떤 데이터를 주고받는지 방법에 대한 약속? 규율을 정해놓는다고 생각합니다.

여기서 궁금한점은 그러면 api개발용으로 만든 restcontroller은 일반적으로 웹개발을 할때 사용하는 mvc패턴의 controller을 만들고나면 필요가 없어지는건가요 ? 하다보면 뭔가 로직이 비슷한거같아서요. 결국에는 둘다 return service.xxx 같아요 ㅠㅠ 유지보수에 용이하고 확장성에 좋다고 하지만 솔직히 저는 크게 와닿지는 않는점도 있구요 .. 그럼 굳이 api개발을 해야하는가 의문도 드네요
결국에는 view를 사용자에게 보여줘야하고 그러려면 mvc controller이 필요하고 apicontroller은 필요하지않은 느낌이 ..
제 질문이 어떻게 느껴지실지는 모르겠지만 답변 해주시면 감사하겠습니다.

답변 2

0

안녕하세요. deoksam님, 공식 서포터즈 y2gcoder입니다.

AI 인턴이 잘 설명해준 것 같습니다. 저는 여기에 좀 더 덧붙여서 말씀드리고 싶습니다.

쉽게 설명드리자면

View를 반환하는 @Controller 나 데이터(요즘은 주로 JSON)를 반환하는 @RestController 모두 서비스의 로직 결과를 담아낼 수 있습니다.

다만 전자는 서비스 로직의 데이터를 가공해서 뷰를 만들어 반환하고, 후자는 데이터를 그대로 반환하거나 가공하여 JSON 과 같은 또다른 데이터의 형태로 반환하는 것입니다.

이전의 웹 개발에서는 서버에서 화면을 그려서 내려줬기 때문에 @Controller 의 방법을 사용해서 View 와 Model(데이터)를 함께 반환했습니다. 지금도 꽤 많은 프로젝트와 간단한 프로젝트에서는 해당 방식을 이용해 개발하기도 합니다.

다만 뷰와 데이터를 함께 반환하는 방식은 결국 화면을 그린다는 책임도 포함하는 것이기 때문에

  1. 웹 화면 렌더링

  2. 데이터 반환

두 가지 책임이 하나의 로직에 공존한다고 볼 수 있습니다. 또한 두 가지 기능이 강하게 결합되어있기 때문에 화면을 앱으로 변경하는 등의 기능을 수정하기에는 좋지 않습니다.

이렇게 결합도 관점에서 좋지 않기 때문에 데이터를 받아 화면을 그리고 화면에서의 인터렉션을 담당하는 프론트엔드, 서버에서 요청을 받아 데이터를 가공해 반환해주는 API만을 제공하는 백엔드로 나뉘게 된 것 같습니다. 그리고 서버에서는 이제 화면을 그리는 책임을 분리해 결합도를 낮췄기 때문에 앱 화면을 그리는 요구사항이 추가되어도 서버 단에서는 변경이 없을 수 있게 되었습니다.(실제로 일을 해보면 조금은 변경할 일이 있습니다.)

결합도의 관점에서 백엔드 개발 히스토리를 개인적으로 평가해보았습니다 🙂

추가로 AI 인턴에 달아주신 부분에 대해 첨언을 해보자면

  1. @Controller

    1. 요청 가공

    2. 서비스 로직 호출

    3. 서비스 로직 응답 데이터 가공(Model)

    4. 반환(View + Model)

  2. @RestController

    1. 요청 가공

    2. 서비스 로직 호출

    3. 서비스 로직 응답 데이터 가공(POJO -> JSON)

    4. 반환(JSON)

같은 요청에 대해 어떤 응답을 반환하냐에 따라 다른 역할을 한다고 봐주시면 좋을 것 같습니다!

 

감사합니다.

deoksam님의 프로필 이미지
deoksam
질문자

데이터를 어떤 방식으로 가공하는지, 반환을 어떤식으로 하는지에 따라 controller과 api호출 restcontroller인지는 이해를 했습니다. 그럼,
사용자 요청 -> controller -> api호출(restcontroller) -> service,repository -> controller 호출 view 반환 이런 느낌인걸까요 ?

deoksam님의 프로필 이미지
deoksam
질문자

밑에 ai답변에 답글을 달았는데 따로 피드백이 없어서 다시 한번 같은 질문 드렸습니다 ~

위의 첨언이 답변인데 이해가 안되는 부분이 있으시면 답변 드리겠습니다!

0

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

RestController와 Controller의 사용 목적과 차이에 대해 궁금해 하시는 것 같습니다. 이는 백엔드 개발에서 자주 혼란스러운 부분이기도 합니다.

RestController와 Controller의 차이

  • @Controller: 이는 일반적으로 웹 애플리케이션에서 View를 렌더링할 때 사용됩니다. 주로 JSP, Thymeleaf와 같은 템플릿 엔진을 통해 HTML을 생성하여 사용자에게 반환할 때 활용됩니다.

  • @RestController: 이는 RESTful 웹 서비스를 제공할 때 사용되며, 주로 클라이언트(ex: 프론트엔드 애플리케이션)와 데이터를 주고받기 위해 사용됩니다. JSON이나 XML과 같은 데이터 형태로 응답하게 됩니다. 이로 인해 REST API를 구현할 때 많이 사용합니다.

두 Controller의 공존

  • 프론트엔드와 백엔드를 분리하여 개발하는 경우, API를 통한 데이터 교환이 필수적입니다. 이때 RestController를 사용하여 백엔드 로직을 API 형태로 제공하고, 프론트엔드는 해당 API를 통해 데이터를 받아 사용자 인터페이스를 구성합니다.

  • 반면, 서버 사이드 렌더링(SSR)을 사용하여 사용자에게 직접 HTML을 반환해야 하는 경우에는 Controller를 사용하게 됩니다.

왜 분리해서 사용하는가?

  • 유지보수성과 확장성: 프론트엔드와 백엔드를 분리하여 API로 통신하게 되면, 두 개발 영역을 독립적으로 변경하고 확장할 수 있습니다. 예를 들어 모바일 앱, 웹앱 등 다양한 클라이언트에서 API를 사용할 수 있습니다.

  • 역할의 명확화: API는 데이터의 제공 및 저장에 집중하고, 프론트엔드는 사용자에게 이를 시각적으로 제공하는데 집중합니다.

추가 참고 자료

김영한 님의 답변을 통해 학습자들이 비슷한 질문을 해결한 예시입니다. 아래 링크에서 더욱 구체적인 내용을 참고할 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

deoksam님의 프로필 이미지
deoksam
질문자

api가 유지보수성과 확장성이 좋다 -> 다른곳(xxController)의 코드를 변경하지않아도되면서 웹환경이 아닌 다른 환경(앱 ?)에서도 사용이 가능하다. 그렇기 때문에 apicontroller로 개발하는게 좋다(?)
그렇다면 controller단에서 api를 호출하는식으로 사용하면 되는건가요 ?

사용자 요청 -> controller -> api호출(restcontroller) -> service,repository -> controller 호출 view 반환 이런 느낌인건가 .. 그럼 controller은 진짜로 view를 위한건가보네요

deoksam님의 프로필 이미지
deoksam

작성한 질문수

질문하기