친구 데이터 객체 변환
<진행 과정>
1) 많은 양의 데이터 클라이언트로부터 전송되면 @ModelAttribute 이용해 수신
2) DTO 생성
- 기본 생성자가 있어야 한다.
- setter를 이용해서 데이터가 저장될 수 있도록 준비
- 클라이언트의 form 태그의 name 값과 DTO의 변수명이 같아야 값을 setting 할 수 있다.
3) Model 객체에 데이터(객체)를 담는다.@model.addattribute()사용
4) Thymeleaf로 데이터를 꺼내야 하는 클라이언트에서는 getter를 이용해서 데이터를 꺼냄
package com.kdigital.spring4.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MainController {
@GetMapping({"/", ""})
public String index() {
return "index";
}
}
<!DOCTYPE html>
<html xmlns:th="http://thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>객체로 데이터 송신하기</title>
</head>
<body>
<h2>객체로 데이터 송신하기</h2>
<form action="regist" method="POST">
<label for="username">이름: </label>
<input type="text" id="username" name="username" placeholder="이름을 입력"><br>
<label for="age">나이: </label>
<input type="text" id="age" name="age" placeholder="나이를 입력"><br>
<label for="phone">전화번호: </label>
<input type="text" id="phone" name="phone" placeholder="전화번호를 입력"><br>
<label for="birthday">생년월일: </label>
<input type="date" id="birthday" name="birthday" placeholder="생년월일을 선택"><br>
<label> 성향:
<input type="radio" name="active" value="0"> 내성적
<input type="radio" name="active" value="1" checked> 외향적
</label>
<br><br>
<input type="submit" value="전송">
<input type="reset" value="취소">
</form>
</body>
</html>
@ModelAttribute 사용해 데이터 수신package com.kdigital.spring4.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import com.kdigital.spring4.dto.Friend;
@Controller
public class FriendController {
@PostMapping("/regist")
public String regist(
@ModelAttribute Friend friend,
Model model
) {
System.out.println(friend);
model.addAttribute("friend", friend);
return "regist"; // forwarding
}
}
package com.kdigital.spring4.dto;
import java.time.LocalDate;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@NoArgsConstructor
@Setter
@Getter
@ToString
public class Friend {
private String username;
private Integer age;
private String phone;
private LocalDate birthday;
private Boolean active;
}
Lombok 어노테이션 사용 (반복 작성 코드 줄여 주는 도구)
@NoArgsConstructor: 파라미터가 없는 기본 생성자 자동 생성@Setter: 필드에 대한 setter 메서드 자동 생성, 각 필드의 값 설정@Getter: 필드에 대한 getter 메서드 자동 생성, 각 필드의 값을 읽기 위해 생성할 필요 有@ToString: 객체의 상태(필드 값)을 문자열로 표현
model.addattribute("friend", friend);<!DOCTYPE html>
<html xmlns:th="http://thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>객체 데이터 꺼내기</title>
</head>
<body>
<h2>객체 데이터 꺼내기</h2>
<p> 전체 출력: [[ ${friend} ]]</p> <!-- toString()으로 출력 -->
<p>
이름: [[${friend.username}]] <br>
나이: [[${friend.age}]] <br>
전화번호: [[${friend.phone}]] <br>
생년월일: [[${friend.birthday}]] <br>
성향: [[${friend.active}]] <br>
</p>
</body>
</html>
DTO
= 데이터를 구조화하고 전송하기 위한 객체
=> 서버-클라이언트 간 주고받는 데이터가 많은 경우, DTO가 하나의 객체에 데이터를 담아 전달함으로써, 여러 필드를 한 번에 전송/처리 가능하게 함
- 클라이언트 - 서버 간 명확하고 일관된 데이터 전송
- 코드의 재사용성, 유지보수성 향상 + 보안 및 검증 작업 용이
- Thymeleaf와의 연동을 통해 DTO는 데이터를 템플릿에 바인딩하거나 폼 데이터를 서버로 전송할 때 매우 유용
ex) 예시 코드
@NoArgsConstructor
@Setter
@Getter
@ToString
public class Friend {
private String username;
private Integer age;
private String phone;
private LocalDate birthday;
private Boolean active;
}
username, age, phone, birthday, actibe 등 각 필드는 클라이언트 폼에서 전송된 데이터와 1:1 매핑<input name="username"> 에서 입력한 값은 DTO의 username 필드에 저장