##반복주기 5학습 목표
* 객체 간의 관계 설정 (@OneToMany, @ManyToOne 등)
## 강의 순서
* 5-1. 회원과 질문 간의 관계 매핑 및 리팩토링
* 5-1. 질문 상세보기 기능 구현
* 5-3. 질문 수정/삭제 기능 구현
* 5-4. 수정/삭제 기능에 대한 보안 처리 및 LocalDateTime 설정
* 5-5. 답변 추가 및 답변 목록 기능 구현
* 5-6. QuestionController 중복 제거 리팩토링
* 5-7. 원격 서버에 소스 코드 배포
class QuestionController
package net.slipp.web;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.query.QueryLookupStrategy;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import net.slipp.domain.Question;
import net.slipp.domain.QuestionRepository;
import net.slipp.domain.Result;
import net.slipp.domain.User;
@Controller
@RequestMapping("/questions")
public class QuestionController {
private static final Logger log = LoggerFactory.getLogger(QuestionController.class);
@Autowired
private QuestionRepository questionRepository;
@GetMapping("/form")
public String form(HttpSession session){
if(!HttpSessionUtils.isLoginUser(session)){
return "/users/loginForm";
}
return "/qna/form";
}
@PostMapping("")
public String create(HttpSession session, String title, String contents){
if(!HttpSessionUtils.isLoginUser(session)){
return "/users/loginForm";
}
log.info("create(String title, String contents) {} , {} ", title, contents);
User sessionUser =HttpSessionUtils.getUserFromSession(session);
Question newQuestion =new Question(sessionUser, title, contents);
questionRepository.save(newQuestion);
return "redirect:/";
}
@GetMapping("/{id}")
public String show(@PathVariable Long id, Model model){
Question question=questionRepository.findOne(id);
model.addAttribute("question", question);
model.addAttribute("answers", question.getAnswers());
return "/qna/show";
}
@GetMapping("/{id}/form")
public String updateForm(@PathVariable Long id, Model model, HttpSession session){
Question question =questionRepository.findOne(id);
Result result=valid(session, question);
if(!result.isValid()){
model.addAttribute("errorMessage", result.getErrorMessage());
return "/user/login";
}
model.addAttribute("question", questionRepository.findOne(id));
return "/qna/updateForm";
}
private Result valid(HttpSession session, Question question){
if(!HttpSessionUtils.isLoginUser(session)){
return Result.fail("로그인이 필요합니다.");
}
User loginUser =HttpSessionUtils.getUserFromSession(session);
if(!question.isSameWriter(loginUser)){
return Result.fail("자신이 쓴 글만 수정, 삭제가 가능합니다.");
}
return Result.ok();
}
@PutMapping("/{id}")
public String update(@PathVariable Long id, String title, String contents, Model model, HttpSession session){
Question question =questionRepository.findOne(id);
Result result=valid(session, question);
if(!result.isValid()){
model.addAttribute("errorMessage", result.getErrorMessage());
return "/user/login";
}
question.update(title, contents);
questionRepository.save(question);
return String.format("redirect:/questions/%d", id);
}
@DeleteMapping("/{id}")
public String delete(@PathVariable Long id, Model model, HttpSession session){
Question question =questionRepository.findOne(id);
Result result=valid(session, question);
if(!result.isValid()){
model.addAttribute("errorMessage" , result.getErrorMessage());
return "/user/login";
}
questionRepository.delete(id);
return "redirect:/";
}
}
login.html
{{> include/header}}
{{> include/navigation}}
<div class="container" id="main">
<div class="col-md-6 col-md-offset-3">
<div class="panel panel-default content-main">
{{#errorMessage}}
<div class="alert alert-danger" role="alert">{{this}}</div>
{{/errorMessage}}
<form name="question" method="post" action="/users/login">
<div class="form-group">
<label for="userId">사용자 아이디</label>
<input class="form-control" id="userId" name="userId" placeholder="User ID">
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" name="password" placeholder="Password">
</div>
<button type="submit" class="btn btn-success clearfix pull-right">로그인</button>
<div class="clearfix" />
</form>
</div>
</div>
</div>
{{> include/footer}}
class Result
package net.slipp.domain;
public class Result {
private boolean valid;
private String errorMessage;
private Result(boolean valid){
this.valid=valid;
}
private Result(boolean valid, String erroMessage){
this.valid=valid;
this.errorMessage=erroMessage;
}
public boolean isValid(){
return valid;
}
public String getErrorMessage(){
return errorMessage;
}
public static Result ok(){
return new Result(true);
}
public static Result fail(String errorMessage){
return new Result(false, errorMessage);
}
}
댓글 ( 4)
댓글 남기기