Spring MVC는 Model-View-Controller 아키텍처를 기반으로 사용자 요청(Request)을 처리하고 적절한 응답(Response)을 반환하는 구조이다.
애플리케이션의 데이터를 나타내며, 데이터의 구조(필드)와 비즈니스 로직(메서드)을 정의한다.
도메인 객체, 폼 객체, 데이터 전송 객체, 리포지토리 등으로 구성되어 있고,
컨트롤러와 뷰 사이에서 데이터를 주고받는 핵심적인 역할을 담당한다.
✔️ 도메인 객체(Domain Object)
애플리케이션의 주요 비즈니스 개념을 나타내는 객체 (예: 사용자를 나타내는 User 클래스)
일반적으로 엔터티(Entity)라고도 하며, 데이터베이스의 테이블과 매핑됨
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// getter, setter, toString 등
}
✔️ 폼 객체(Form Object)
사용자 입력을 받아서 저장하는 객체로 주로 웹 애플리케이션에서 폼 데이터를 캡처하고 검증하는데 사용한다.
도메인 객체와 비슷하지만, 주로 사용자 인터페이스와 상호작용하는데 사용한다.public class UserForm {
@NotEmpty(message = "이름은 필수 입력값입니다.")
private String name;
@Email(message = "이메일 형식이 올바르지 않습니다.")
private String email;
// getter, setter 등
}
✔️ 데이터 전송 객체(DTO, Data Transfer Object)
계층 간 데이터를 전달하는데 사용되는 객체
주로 서비스 계층과 프레젠테이션 계층 간 데이터 전송에 사용
도메인 객체와 구분하여 사용되며, 필요한 데이터만 포함하도록 설계
public class UserDTO {
private String name;
private String email;
// getter, setter
}
✔️ 리포지토리(Repository)
데이터베이스와 상호작용하는 DAO(Data Access Object) 계층으로 CRUD 작업을 처리한다.
Spring Data JPA와 같은 라이브러리를 사용하여 리포지토리를 쉽게 구현이 가능
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
사용자에게 데이터를 표시하고 사용자 인터페이스를 제공하는 역할
모델 데이터를 표시하고, 사용자가 입력한 데이터를 컨트롤러로 전달하는 중간 매개체로 작동
JSP, Thymeleaf, FreeMarker, Velocity와 같은 템플릿 엔진을 사용
HTML을 자동으로 만들어 주는 도구로 데이터를 넣으면 자동으로 HTML이 만들어진다.
템플릿 엔진 없이 직접 HTML 작성
<h1>안녕하세요, 홍길동님!</h1>
<h1>안녕하세요, 김철수님!</h1>
<h1>안녕하세요, 이영희님!</h1>
템플릿 엔진을 사용하면?
(Django의 DTL 템플릿 엔진 예시)
<h1>안녕하세요, {{ name }}님!</h1>
→ {{ name }} 부분에 Python 코드에서 넘겨준 이름이 자동으로 들어감.
템플릿 엔진 종류
하지만 요즘은 React, Vue 같은 프론트엔드 프레임워크가 많아서,
템플릿 엔진을 안 쓰고 API를 통해 데이터를 주고받는 방식이 더 자주 쓰인다
프론트엔드 vs 템플릿 엔진 차이점
1. 템플릿 엔진 → 서버에서 HTML을 만들어서 보내줌
(예: Django의 DTL, Spring Boot의 Thymeleaf, Flask의 Jinja2)
✅ HTML을 서버에서 미리 완성해서 보냄
✅ 새로고침할 때마다 서버에서 다시 HTML을 생성
✅ 검색 엔진(SEO)에 유리함
❌ 페이지 전환이 느림 (서버에서 다시 로딩해야 함)
🔹 예제 (Django 템플릿 엔진)
<h1>안녕하세요, {{ name }}님!</h1>
서버에서 name="홍길동" 값을 보내주면 완성된 HTML이 만들어짐
<h1>안녕하세요, 홍길동님!</h1>
2. 프론트엔드 → 브라우저에서 HTML을 만들고 보여줌
(예: React, Vue.js, Svelte, Angular)
✅ 한 번 로딩하면 빠름 (새로고침 없이 화면이 바뀜)
✅ 동적 인터랙션(애니메이션, 즉각 반응 등)이 가능함
✅ 앱처럼 부드러운 UX 가능
❌ 초기 로딩 속도가 느릴 수도 있음 (JS 다운로드 필요)
❌ 검색 엔진(SEO)에 불리할 수 있음 (서버에서 미리 렌더링하는 방식이 필요함)
🔹 예제 (React)
function Greeting({ name }) {
return <h1>안녕하세요, {name}님!</h1>;
}
name="홍길동" 값이 들어가면:
<h1>안녕하세요, 홍길동님!</h1>
이렇게 브라우저에서 직접 HTML을 만들어서 보여줌!
사용자 요청을 처리하고 적절한 응답을 생성하는 역할
사용자가 요청한 URL을 매핑하여 해당 요청을 처리하는 메서드를 호출하고, 모델 데이터를 생성하거나 수정한 후에 적절한 뷰를 선택하여 응답을 반환
✔️ 요청 매핑 (Request Mapping)
URL 경로와 HTTP 메서드(GET, POST, PUT, DELETE 등)를 매핑하여 해당 요청을 처리하는 메서드를 지정
@RequestMapping: 모든 HTTP 메서드 매핑 가능.@GetMapping: GET 요청 처리.@PostMapping: POST 요청 처리.@PutMapping: PUT 요청 처리.@DeleteMapping: DELETE 요청 처리.✔️ 모델 처리 (Model Handling)
모델 객체를 사용하여 데이터를 뷰에 전달
Model: 데이터를 뷰로 전달.ModelMap: 데이터와 키-값 형태로 동작.ModelAndView: 뷰와 데이터를 한 번에 전달.✔️ 뷰 선택 (View Selection)
적절한 뷰 이름을 반환하여, 뷰 리졸버(View Resolver)가 이를 실제 뷰로 매핑하고 렌더링한다.
🤔 뷰 리졸버(View Resolver) ❓
: 컨트롤러가 반환한 뷰 이름을 실제 뷰로 매핑하는 역할
예) 컨트롤러가 "home"이라는 뷰 이름을 반환하면, 뷰 리졸버가 이를 home.html로 변환한다
✔️ 폼 데이터 처리 (Form Handling)
사용자 입력 폼 데이터를 바인딩하고 검증한다.
@ModelAttribute: 폼 데이터를 객체에 자동 바인딩.@Valid: 폼 데이터 검증.🤔 바인딩(Binding) ❓
데이터를 연결하거나 매핑하는 과정
Spring MVC에서는 클라이언트로부터 전달된 요청 데이터를 객체나 변수로 변환하여 연결하는 작업을 의미한다.
🌟 Spring MVC 흐름
1️⃣ 클라이언트 요청: 클라이언트가 HTTP 요청을 보낸다.
2️⃣ DispatcherServlet 처리: 요청을 받고, 적절한 핸들러를 찾기 위해 HandlerMapping을 호출한다.
3️⃣ Handler 호출: 요청을 처리할 컨트롤러(핸들러)를 실행하기 위해 HandlerAdapter를 호출한다.
4️⃣ 컨트롤러 실행: 컨트롤러에서 비즈니스 로직을 처리하고, 모델 데이터와 뷰 이름을 반환한다.
5️⃣ ViewResolver 호출: 반환된 뷰 이름을 실제 뷰 파일로 매핑한다.
6️⃣ 뷰 렌더링: 최종적으로 데이터를 렌더링하고 응답을 클라이언트에게 반환한다.