728x90

📌 1️⃣ View(뷰)란?

Spring에서 View(뷰)사용자에게 보여지는 화면(UI) 을 의미해.
Spring MVC에서는 Controller가 데이터를 처리한 후, View에 데이터를 전달해서 화면을 구성해.

 

 


📌 2️⃣ Spring에서 View의 흐름

Spring MVC에서 View는 다음과 같은 흐름으로 동작해.

🛠 요청-응답 흐름

1. 사용자가 브라우저에서 요청 (예: /hello)
2. DispatcherServlet이 요청을 처리할 Controller를 찾음
3. Controller에서 비즈니스 로직을 처리하고, Model에 데이터를 담아 View로 전달
4. View Resolver가 해당 View 파일을 찾아 렌더링
5. 최종적으로 HTML 페이지를 응답으로 반환

📌 이 과정을 코드로 살펴보자!

 

 


📌 3️⃣ View를 반환하는 방식

Spring에서는 View를 반환하는 방법이 여러 가지 있어.
주로 사용하는 방식은 Thymeleaf 같은 템플릿 엔진을 사용하는 거야.

 


예제 1: Controller에서 View 반환

@Controller
public class MyController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello, Spring View!");
        return "hello"; // hello.html을 찾아서 보여줌
    }
}

http://localhost:8080/hello 요청하면 hello.html이 렌더링됨.

 

 


📌 4️⃣ Spring View 종류

View종류 설명
Thymeleaf Spring 공식 추천 템플릿 엔진 (HTML 기반)
JSP 예전부터 사용하던 Java 기반 템플릿 (최근에는 거의 사용 안 함)
JSON 응답 (@RestController) API에서 View 대신 JSON 데이터를 반환
FreeMarker, Mustache 다른 템플릿 엔진 (잘 사용하지 않음)

📌 요즘 Spring에서는 Thymeleaf가 표준이야!

 

 


📌 5️⃣ Thymeleaf 기본 문법

Thymeleaf는 HTML에서 데이터를 동적으로 표현할 수 있어.

예제 2: hello.html (Thymeleaf 문법)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Thymeleaf 예제</title>
</head>
<body>
    <h1 th:text="${message}">기본 메시지</h1>
</body>
</html>

📌 th:text="${message}"컨트롤러에서 전달한 데이터를 표시

 


예제 3: 리스트 출력

<ul>
    <li th:each="user : ${users}" th:text="${user.name}"></li>
</ul>

📌 th:each="user : ${users}"리스트 반복문

 

 


📌 6️⃣ View Resolver란?

📌 View Resolver 는 Controller가 반환한 View 이름을 실제 View 파일로 변환하는 역할을 해.

💡 예시: application.yml 설정

spring:
  thymeleaf:
    prefix: classpath:/templates/  # 템플릿 파일 경로
    suffix: .html                 # 뷰 파일 확장자

➡ Controller에서 return "hello" 하면
classpath:/templates/hello.html 파일을 찾아서 렌더링!

 

 


📌 7️⃣ DTO vs VO 개념 완벽 정리

Spring에서는 데이터를 다룰 때 DTOVO 개념을 많이 사용해.

✅ DTO (Data Transfer Object)

  • 데이터를 전달하는 객체
  • 주로 Controller ↔ Service ↔ Repository 간 데이터 전달
  • Getter/Setter를 가짐 (값 변경 가능)
  • 주로 JSON이나 Form 데이터를 담아서 전송할 때 사용

📌 DTO 예제

@Getter @Setter
public class UserDTO {
    private String name;
    private String email;
}

📌 사용 예시

 
@PostMapping("/user")
public String createUser(@ModelAttribute UserDTO userDTO) {
    log.info("User: " + userDTO.getName() + ", Email: " + userDTO.getEmail());
    return "success";
}

✅ VO (Value Object)

  • 값을 나타내는 객체 (Immutable, 불변 객체)
  • 한 번 생성되면 값을 변경할 수 없음 (final 사용)
  • 비즈니스 로직에서 특정 데이터를 표현하는 용도
  • Equals/HashCode를 오버라이딩해서 값 비교 가능

📌 VO 예제

public class UserVO {
    private final String name;
    private final String email;

    public UserVO(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public String getName() { return name; }
    public String getEmail() { return email; }
}

📌 사용 예시

UserVO user = new UserVO("woshi", "woshi@example.com");

📌 이제 user.setName("New Name") 같은 변경이 불가능함!

 

 


📌 8️⃣ DTO vs VO 비교

특징 DTO VO
데이터 변경 가능 여부 변경 가능 (Setter) 변경 불가능 (final)
사용 목적 데이터 전달용 (Controller ↔ Service ↔ Repository) 특정 개념을 표현하는 값 객체
Equals 비교 참조(주소) 비교 값 자체를 비교
사용 예시 요청 데이터, 응답 데이터 상품 가격, 좌표 값, 이름 등

 

 


📌 9️⃣ DTO를 활용한 View 데이터 전달

DTO를 사용해서 View에 데이터를 전달할 수도 있어.

예제 4: DTO를 이용한 사용자 목록

1️⃣ DTO 클래스

@Getter @Setter
public class UserDTO {
    private String name;
    private String email;

    public UserDTO(String name, String email) {
        this.name = name;
        this.email = email;
    }
}

2️⃣ Controller에서 DTO 리스트 전달

@Controller
public class UserController {

    @GetMapping("/users")
    public String getUsers(Model model) {
        List<UserDTO> users = Arrays.asList(
            new UserDTO("Jieun", "jieun@example.com"),
            new UserDTO("John", "john@example.com")
        );
        model.addAttribute("users", users);
        return "userList";
    }
}

3️⃣ userList.html에서 데이터 출력

<ul>
    <li th:each="user : ${users}" th:text="${user.name + ' - ' + user.email}"></li>
</ul>

http://localhost:8080/users 요청하면 사용자 목록이 HTML로 출력됨! 🎉

 


🔥 오늘 배운 핵심 정리

개념 설명
View 사용자가 보는 화면 (HTML)
View Resolver View 이름을 실제 파일로 변환
Thymeleaf Spring에서 가장 많이 쓰는 템플릿 엔진
DTO 데이터를 전달하는 객체 (값 변경 가능)
VO 불변 객체 (값 변경 불가능)
728x90

'프로그래밍 > Spring' 카테고리의 다른 글

@Controller와 @RestController의 차이  (0) 2025.04.02
Thymeleaf란?  (0) 2025.04.01
Spring Controller란?  (0) 2025.03.28
JDK 동적 프록시 (JDK Dynamic Proxy)  (0) 2025.03.27
Proxy Pattern(프록시 패턴)  (0) 2025.03.27