스프링으로 웹 개발을 시작하면 용어가 한꺼번에 등장한다. MVC, JSP, REST, 컨트롤러, 서비스, 레포지토리…
문제는 이 단어들을 각각 외우면 이해가 안 된다는 점이다.
웹 애플리케이션은 결국 “요청이 들어오고, 서버가 처리하고, 응답을 내보내는 파이프라인” 하나로 동작한다. 이 글은 그 파이프라인을 먼저 정리한다.
1. 웹앱은 결국 이것만 한다: 요청 → 처리 → 응답
클라이언트(브라우저/앱)가 서버에 HTTP 요청을 보낸다.
- 요청: GET /lectures?page=1
- 응답: HTML(화면) 또는 JSON(데이터)
이때 서버가 하는 일은 크게 두 가지 중 하나다.
- 서버가 HTML을 만들어 준다(SSR)
- 서버는 JSON만 주고, 화면은 프론트가 만든다(CSR/SPA)
이 선택이 JSP/Thymeleaf/REST 같은 용어를 갈라놓는다.
2. MVC는 “요청 처리 방식(패턴)”이다
MVC는 Model-View-Controller의 약자고, 핵심은 역할 분리다.
- Controller: 요청을 받는 입구, 어떤 로직을 호출할지 결정
- Model: 데이터/비즈니스 로직 영역(실전에서는 Service/Repository/Domain으로 더 쪼갬)
- View: 화면(HTML)을 만드는 부분
MVC는 “웹 요청 처리 흐름”이고, View는 JSP/Thymeleaf 등으로 구현한다.
3. JSP는 MVC의 “V(View)”를 구현하는 기술 중 하나
JSP는 서버에서 HTML을 만들어서 브라우저에 보내는 방식(SSR)에서 View를 만들 때 쓰는 도구다.
- Spring MVC + JSP: 전통적인 조합(레거시/사내 시스템에서 흔함)
- Spring MVC + Thymeleaf: 부트 기반에서 많이 쓰는 SSR 조합
즉, SSR로 화면을 만들면 MVC 흐름 위에서 JSP(또는 Thymeleaf)를 View로 쓴다.
4. REST는 “View를 서버에서 만들지 않는 방식”에 가깝다
REST API는 HTML을 만들어 주는 게 목적이 아니라, 데이터(JSON) 를 주는 게 목적이다.
- GET /api/lectures → JSON 반환
- 화면은 React/Vue 같은 프론트가 렌더링하거나, 모바일 앱이 사용한다.
그래서 REST API에서 @RestController가 등장한다.
- @Controller는 보통 “뷰 이름 반환(HTML 렌더링)” 쪽
- @RestController는 “반환값을 응답 바디(JSON)로” 쪽
정리하면 이렇게 된다.
- MVC(SSR): Controller → Model → View(JSP/Thymeleaf) → HTML 응답
- REST(API): Controller → Model → JSON 응답(뷰 렌더링 없음)
5. 그럼 “Spring MVC”는 REST랑 다른 건가?
엄밀히 말하면 REST도 스프링 MVC 위에서 동작한다. 차이는 “응답을 HTML로 만들지, JSON으로 보낼지”다.
- 같은 컨트롤러라도
- @Controller + 뷰 템플릿 → HTML
- @RestController → JSON
즉, Spring MVC는 요청을 처리하는 기반 프레임워크고, 그 위에서 HTML도 만들고(JSON도 만들고) 둘 다 한다.
6. 폴더 구조(controller/service/repository/domain/dto)는 MVC 확장판이다
학교에서 MVC를 배우면 Model이 하나처럼 보이는데, 실제로는 Model이 너무 커져서 보통 쪼갠다.
- controller: HTTP 입출력(라우팅/바인딩/응답)
- service: 비즈니스 로직(유스케이스)
- repository: DB 접근(JPA/쿼리)
- domain(entity): 핵심 데이터 구조 + 규칙
- dto: 계층 간 데이터 전달용(요청/응답)
MVC로 매핑하면:
- Controller → controller
- View → JSP/Thymeleaf (REST면 프론트가 View)
- Model → service + repository + domain + dto
'백엔드' 카테고리의 다른 글
| [스프링 로드맵] B-3. DI/Bean 실전 - @Autowired, @Qualifier, Profile (0) | 2026.01.19 |
|---|---|
| [스프링 로드맵] B-2. DI/Bean 내부 - 빈 등록 방식과 라이프사이클 (1) | 2026.01.19 |
| [스프링 로드맵] B-1. DI/Bean 기본 - new 지옥에서 벗어나기 (1) | 2026.01.19 |
| [스프링 로드맵] A-2. REST 확장 - POST/PUT/DELETE와 ResponseEntity (0) | 2026.01.19 |
| [스프링 로드맵] A-1. REST 입문 - JSON이 응답되는 이유 (0) | 2026.01.19 |