📌 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에서는 데이터를 다룰 때 DTO 와 VO 개념을 많이 사용해.
✅ 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 | 불변 객체 (값 변경 불가능) |
'프로그래밍 > 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 |