[LG CNS AM Inspire Camp 1기] BE - SpringBoot의 MVC

이슬아·2025년 1월 23일

LG CNS AM Inspire Camp 1기

목록 보기
14/20

🌟 Spring MVC

Spring MVC는 Model-View-Controller 아키텍처를 기반으로 사용자 요청(Request)을 처리하고 적절한 응답(Response)을 반환하는 구조이다.

📍 모델(model)

애플리케이션의 데이터를 나타내며, 데이터의 구조(필드)와 비즈니스 로직(메서드)을 정의한다.
도메인 객체, 폼 객체, 데이터 전송 객체, 리포지토리 등으로 구성되어 있고,
컨트롤러와 뷰 사이에서 데이터를 주고받는 핵심적인 역할을 담당한다.

✔️ 도메인 객체(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);
}

📍 뷰(view)

사용자에게 데이터를 표시하고 사용자 인터페이스를 제공하는 역할
모델 데이터를 표시하고, 사용자가 입력한 데이터를 컨트롤러로 전달하는 중간 매개체로 작동
JSP, Thymeleaf, FreeMarker, Velocity와 같은 템플릿 엔진을 사용

✏️ 템플릿 엔진

HTML을 자동으로 만들어 주는 도구로 데이터를 넣으면 자동으로 HTML이 만들어진다.

템플릿 엔진 없이 직접 HTML 작성

<h1>안녕하세요, 홍길동님!</h1>
<h1>안녕하세요, 김철수님!</h1>
<h1>안녕하세요, 이영희님!</h1>

템플릿 엔진을 사용하면?
(Django의 DTL 템플릿 엔진 예시)

<h1>안녕하세요, {{ name }}님!</h1>

→ {{ name }} 부분에 Python 코드에서 넘겨준 이름이 자동으로 들어감.

템플릿 엔진 종류

  • Django → DTL (Django Template Language)
  • Flask → Jinja2
  • Spring Boot → Thymeleaf
  • Node.js → EJS, Pug, Handlebars

하지만 요즘은 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을 만들어서 보여줌!

📍 컨트롤러(controller)

사용자 요청을 처리하고 적절한 응답을 생성하는 역할
사용자가 요청한 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️⃣ 뷰 렌더링: 최종적으로 데이터를 렌더링하고 응답을 클라이언트에게 반환한다.

0개의 댓글