학습 목표
-데이터베이스에 사용자 데이터 추가
-개인정보 수정 기능 구현
-질문하기, 질문목록 기능 구현
학습 목차
2-1. QnA HTML 템플릿, H2 데이터베이스 설치, 설정, 관리 툴 확인
2-2. 자바 객체와 테이블 매핑, 회원가입 기능 구현
2-3. HTML 정리, URL 정리
2-4. 개인정보 수정 기능 구현 1
(수정 화면으로 이동할 수 있는 기능 구현)
2-5. 개인정보 수정 기능 구현 2
(수정 화면에서 사용자가 수정한 내용을 다시 submit하면, 서버가 받아서 database에 수정을 해주는 기능 구현)
2-6. 원격 서버에 소스 코드 배포
//HomeController.java
@Controller
public class HomeController { //1.
@GetMapping("")
public String home() {
return "index";
}
}
1. 브라우저 상에서 파일에 접근하면 static의 파일을 찾게 됩니다. 따라서 template 파일들은 브라우저 상에서 직접 접근할 수 없으므로, template의 각각의 html 파일과 mapping되는 controller를 구현해서 브라우저가 controller를 통해서 template의 html 파일들(view)에 접근할 수 있도록 합니다.
//변경5: "/form" 경로 추가
//UserController.java
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/form") //1.
public String form() {
return "/user/form";
}
@PostMapping("")
public String create(User user) {
System.out.println("user : " + user);
userRepository.save(user);
return "redirect:/users";
}
@GetMapping("")
public String list(Model model) {
model.addAttribute("users", userRepository.findAll());
return "/user/list";
}
}
1. user 디렉토리 하위의 form.html 파일에 접근할 수 있도록 기능을 추가했습니다.
2. navigation.html의 회원가입 경로를 '/users/form'으로 변경합니다.
<!--list.html-->
<!DOCTYPE html>
<html lang="kr">
<head>
<meta charset="utf-8">
{{> /include/header}}
</head>
<body>
{{> /include/navigation}}
<div class="container" id="main">
<div class="col-md-10 col-md-offset-1">
<div class="panel panel-default">
<table class="table table-hover">
<thead>
<tr>
<th>#</th> <th>사용자 아이디</th> <th>이름</th> <th>이메일</th><th></th>
</tr>
</thead>
<tbody>
{{#users}}
<tr>
<th scope="row">{{id}}</th>
<td>{{userId}}</td>
<td>{{name}}</td>
<td>{{email}}</td>
<td><a href="/users/{{id}}/form" class="btn btn-success" role="button">수정</a></td> <!--1.-->
</tr>
{{/users}}
</tbody>
</table>
</div>
</div>
</div>
{{> /include/footer}}
</body>
</html>
1. '/users/{{id}}/form': 수정할 회원의 id를 받아와서 그 회원의 form으로 이동합니다.
//변경5: "/form" 경로 추가
//UserController.java
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/form")
public String form() {
return "/user/form";
}
@PostMapping("")
public String create(User user) {
System.out.println("user : " + user);
userRepository.save(user);
return "redirect:/users";
}
@GetMapping("")
public String list(Model model) {
model.addAttribute("users", userRepository.findAll());
return "/user/list";
}
@GetMapping("/{id}/form") //1.
public String updateForm(@PathVariable Long id, Model model) { //2.
model.addAttribute("user", userRepository.findById(id).get()) //3.
return "/user/updateForm";
}
}
1. id를 받아와서 정보 수정 페이지로 이동하도록 해줍니다.
2. @PathVariable: id 값을 얻어오기 위해 사용하는 어노테이션
1.의 id와 2.의 id는 이름을 같게 해줍니다.
3. html에 id 값을 전달해주기 위해 model에 user 정보를 저장합니다.
<!--updateForm.html-->
{{#user}} <!--2.-->
<form name="question" method="post" action="/users">
<div class="form-group">
<label for="userId">사용자 아이디</label>
<input type="text" class="form-control" name="userId" placeholder="사용자 아이디" value="{{userId}}">
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" name="password" placeholder="비밀번호">
</div>
<div class="form-group">
<label for="name">이름</label>
<input type="text" class="form-control" name="name" placeholder="이름" value="{{name}}">
</div>
<div class="form-group">
<label for="email">이메일</label>
<input type="email" class="form-control" name="email" placeholder="이메일" value="{{email}}">
</div>
<button type="submit" class="btn btn-default">개인정보수정</button>
</form>
{{/user}}
1. form.html과 다른 점은 updateForm.html에는 value값이 채워져있다는 것입니다.
password는 보여지면 안되기 때문에, userId, name, email 값만 채웁니다.
2. user에서 값을 꺼내와야 하기 때문에 해당 mustache를 추가해줘야 합니다.
<!--updateForm.html-->
{{#user}} <!--2.-->
<form name="question" method="post" action="/users/{{id}}"> <!--1.-->
<div class="form-group">
<label for="userId">사용자 아이디</label>
<input type="text" class="form-control" name="userId" placeholder="사용자 아이디" value="{{userId}}">
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" name="password" placeholder="비밀번호">
</div>
<div class="form-group">
<label for="name">이름</label>
<input type="text" class="form-control" name="name" placeholder="이름" value="{{name}}">
</div>
<div class="form-group">
<label for="email">이메일</label>
<input type="email" class="form-control" name="email" placeholder="이메일" value="{{email}}">
</div>
<button type="submit" class="btn btn-default">개인정보수정</button>
</form>
{{/user}}
1. 개인정보 수정을 요청하면 id에 해당하는 정보를 데이터베이스에서 조회하여 정보를 수정하려고 합니다.
//User.java
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@Column(nullable=false, length=20)
private String userId;
private String password;
private String name;
private String email;
public void setUserId(String userId) {
this.userId=userId;
}
public void setPassword(String password) {
this.password=password;
}
public void setName(String name) {
this.name=name;
}
public void setEmail(String email) {
this.email=email;
}
public void update(User newUser) { //1.
this.password=newUser.password;
this.name=newUser.name;
this.email=newUser.email;
}
@Override
public String toString() {
return "User [userId=" + userId + ", password=" + password + ", name=" + name, "email=" + email +"]";
}
}
1. update 메소드를 추가합니다.
//변경5: "/form" 경로 추가
//UserController.java
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/form")
public String form() {
return "/user/form";
}
@PostMapping("")
public String create(User user) {
System.out.println("user : " + user);
userRepository.save(user);
return "redirect:/users";
}
@GetMapping("")
public String list(Model model) {
model.addAttribute("users", userRepository.findAll());
return "/user/list";
}
@GetMapping("/{id}/form")
public String updateForm(@PathVariable Long id, Model model) {
model.addAttribute("user", userRepository.findById(id).get())
return "/user/updateForm";
}
@PostMapping("/{id}") //1.
public String update(@PathVariable Long id, User newUser) { //2.
User user=userRepository.findById(id).get(); //2.
user.update(newUser); //3.
userRepository.save(user); //4.
return "redirect:/users"; //5.
}
}
1. post 방식으로 요청을 받고, 해당하는 id에 대해 post를 보내면 '수정'으로 보겠다는 것입니다.
2. newUser: 사용자가 새롭게 수정한 User 정보
user: 데이터베이스에서 가져온 User 정보
3. 수정한 정보를 user에 갱신합니다.
4. userRepository에 갱신된 user 정보를 저장합니다.
5. 사용자 목록으로 이동합니다.
----------------------------------------------------------------------------------------------------------------------------
여기서 수정 기능을 완료해도 되지만, 몇 가지 기능을 추가해보도록 하겠습니다.
<!--updateForm.html-->
{{#user}}
<form name="question" method="post" action="/users/{{id}}">
<input type="hidden" name="_method" value="put"/> <!--1.-->
<div class="form-group">
<label for="userId">사용자 아이디</label>
<input type="text" class="form-control" name="userId" placeholder="사용자 아이디" value="{{userId}}">
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" name="password" placeholder="비밀번호">
</div>
<div class="form-group">
<label for="name">이름</label>
<input type="text" class="form-control" name="name" placeholder="이름" value="{{name}}">
</div>
<div class="form-group">
<label for="email">이메일</label>
<input type="email" class="form-control" name="email" placeholder="이메일" value="{{email}}">
</div>
<button type="submit" class="btn btn-default">개인정보수정</button>
</form>
{{/user}}
1. _method: '_method'라는 인자가 전달되면, value값을 통해서 어떤 method로 호출할 것인지를 결정합니다.
여기서는 'put'으로 호출합니다.
html에서 실질적으로 사용하는 것은 post이고, 추가적인 값을 '_method'로 전달함으로써 put을 사용할 수 있습니다.
//UserController.java
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/form")
public String form() {
return "/user/form";
}
@PostMapping("")
public String create(User user) {
System.out.println("user : " + user);
userRepository.save(user);
return "redirect:/users";
}
@GetMapping("")
public String list(Model model) {
model.addAttribute("users", userRepository.findAll());
return "/user/list";
}
@GetMapping("/{id}/form")
public String updateForm(@PathVariable Long id, Model model) {
model.addAttribute("user", userRepository.findById(id).get())
return "/user/updateForm";
}
@PutMapping("/{id}") //1.
public String update(@PathVariable Long id, User newUser) {
User user=userRepository.findById(id).get();
user.update(newUser);
userRepository.save(user);
return "redirect:/users";
}
}
1. updateForm.html에서 '_method'를 이용하여 추가적인 값을 put으로 받고 있습니다. 따라서 post, get 뿐만 아니라 put을 이용할 수 도 있음을 알 수 있습니다.
'Spring > 게시판 만들기 프로젝트' 카테고리의 다른 글
[Spring Boot] #3_2 게시판 만들기 (0) | 2020.12.21 |
---|---|
[Spring Boot] #3_1 게시판 만들기 (0) | 2020.12.21 |
[Spring Boot] #2_1 게시판 만들기 (0) | 2020.12.09 |
[Spring Boot] #1 게시판 만들기 (0) | 2020.12.07 |
[Spring Boot]JPA (0) | 2020.12.07 |