Controller에 상세보기 기능을 만든다.
기본적인 회원정보란에는 비밀번호가 숨겨져서 나왔지만, 상세보기를 누르면 find.html
로 이동하여, 비밀번호를 포함한 정보를 볼 수 있는 기능이다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>회원 상세정보</h1>
<div style="margin: 10px">
<h3>등록퀴즈</h3>
<table border="1" width="100%" style="tablelayout: fixed">
<tr>
<th>No.</th>
<th>아이디</th>
<th>이름</th>
<th>이메일</th>
<th>비밀번호</th>
</tr>
<tr align="center">
<td>[[${key}]]</td>
<td>[[${id}]]</td>
<td>[[${name}]]</td>
<td>[[${mail}]]</td>
<td>[[${password}]]</td>
</tr>
</table>
</div>
</body>
</html>
thymeleaf기능을 사용하여 table로 정렬한 곳에 데이터를 집어넣는 구조다.
AccountController.java
에 추가해준다.
AccountContorller.java
@GetMapping("/find/{key}")
public String find (AccountForm accountForm, Account account, @PathVariable Integer key, Model model) {
Optional<Account> accountOptional = service.selectOneByKey(key);
// 뷰 용 모델에 저장
if(accountOptional.isPresent()) {
// AccountForm으로 다시 채우기
Optional<AccountForm> accountFormOptional = accountOptional.map(t -> makeAccountForm(t));
accountForm = accountFormOptional.get();
}
// 업데이트를 위한 모델 만들기
makeFindModel (accountForm, model);
return "find";
}
// 상세보기 모델 값 추가하는 메소드
private void makeFindModel (AccountForm accountForm, Model model) {
model.addAttribute("key", accountForm.getKey());
model.addAttribute("id",accountForm.getId());
model.addAttribute("name", accountForm.getName());
model.addAttribute("mail", accountForm.getMail());
model.addAttribute("password",accountForm.getPassword());
}
crud.html
<td>
<form method="GET" th:action="@{/account/find/{key}(key=${obj.key})}">
<input th:onclick="@{/account/find}" type="submit" value="개별정보">
</form>
</td>
crud.html
에서 상세보기버튼을 눌렀을때 find/{key}
로 신호를 보내고, 그것을 find
메소드가 get방식으로 잡아서 실행하는 구조다.
@PathVariable
어노테이션으로 Restfull하게 파라미터를 받는다.
이후는 update
메소드, showUpdate
메소드와 비슷한 방식으로 흘러간다.
findById
메소드를 사용해 Account값을 뽑아내고, 람다식과 makeAccountForm
을 통해 Form형식으로 변환후
makeFindModel
을 통해 model에 값을 추가해준다.
이후 find.html
로 리턴하면서 값을 보내주고, find.html
은 값을 출력하면서 끝난다.
실행해보자.
정상적으로 실행됨을 알 수 있다.
오류메시지는 AccountForm.java
의 @NotEmpty
어노테이션에 의해 나온다.
이는 동일하게 항상 '공백일 수 없습니다' 이다.
따라서 이를 항목에 맞게 변화시켜보자.
main/src/form/AccountForm.java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AccountForm {
// 식별 Key
private Integer key;
// 회원 Id
@NotBlank
private String id;
// 회원 이름
@NotBlank
private String name;
// 회원 이메일
private String mail;
// 회원 비밀번호
@NotBlank
private String password;
// 등록 변경 판정용
private Boolean newAccount;
}
@NotBlank
가 걸려있는 어노테이션은 id, name, password 이다.
이를 관리하기 위해 속성파일(Properties Files)을 생성해보자.
먼저 한글로 메세지를 만들 것이기 때문에 파일 인코딩 상황을 확인한다.
IntelliJ IDEA 기준으로 Settings/Prefrences
창을 연 다음 [Editor] - [File Encodings]를 선택하여 Properties Files (*.properties)
항목이 UTF-8로 되어 있는지 확인하고, 아니라면 UTF-8로 변경한다.
src/main/resources
폴더에 messages.properties
파일을 추가한다.
이후 속성파일에 이것을 작성한다.
messages.properties
accountForm.id = 아이디
accountForm.name = 이름
accountForm.password = 비밀번호
messages.properties는 기본적으로 “key=value”형태로 속성을 정의한다.
key의 형태는 “필드명” 또는 “객체명.필드명” 중 하나의 형식으로 사용한다.
객체명은 카멜 케이스 (camel case) 문법을 따른다. 즉 중간글자는 대문자로 시작하지만 첫글자는 소문자인 경우다.
따라서 AccountForm
의 id는 accountForm.id
로 작성이 된다.
src/main/resources
폴더에 ValidationMessages.properties
파일을 추가한다
이후 속성파일에 이것을 작성한다.
**
javax.validation.constraints.NotBlank.message = {0} 을/를 입력하십시오.
이 경우, @NotBlank
어노테이션을 실행될때는 ValidationMessages.properties
의 값이 실행이 되는데,
{0}의 값은 AccountForm
클래스의 어디서 났는지 확인을 한 이후
messages.properties
에 있는 accountForm
의 값들 중 맞는 값이 골라져서 나오게 된다.
정상적으로 실행이 되었음을 알 수 있다.