Spring/게시판 만들기 프로젝트

[Spring Boot] #2_2 게시판 만들기

sujin7837 2020. 12. 9. 16:44
반응형

학습 목표

-데이터베이스에 사용자 데이터 추가

-개인정보 수정 기능 구현

-질문하기, 질문목록 기능 구현

 

학습 목차

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을 이용할 수 도 있음을 알 수 있습니다.

반응형