Spring-Boot,JPA로 질문/답변 게시판 구현(31)

Spring-Boot, JPA로 질문/잡변 게시판 구현 및 배포

자바지기님 유튜브 강의 정리

5-6 QuestionController 중복 코드 제거 리팩토링

  • QuestionController에 보이는 여러 중복코드를 리팩토링 하는것을 먼저하고 원격 서버에 배포하자.
  • 현재 로그인 되었는지 체크하는부분, question 글을 쓴 사용자와 로그인한 사용자가 일치하는지 체크하는부분이 중복이 가장많다.

  • Exception을 사용하여 중복을 제거해보자

    public class QuestionController {
      ...
      @GetMapping("/{id}/form")
      public String updateForm(@PathVariable Long id, Model model, HttpSession session) {    
        try {
          Question question = questionRepository.findOne(id);
          hasPermission(session, question);
          model.addAttribute("question", question);
          return "/qna/updateForm";
        } catch (IllegalStateException e) {
          model.addAttribute("erroMessage", e.getMessage());
          return "/users/login";
        }
      }
      private boolean hasPermission(HttpSession session, Question question) {
          if ( )
        if (!HttpSessionUtils.isLoginUser(session)) {
          throw new IllegalStationException("로그인 하세요");
        }
          
        User loginUser = HttpSessionUtils.getUserFromSession(session);
        if (!question.isSameWriter(loginUser)) {
          throw new IllegalStationException("본인 글만 수정, 삭제할 수 있습니다.");
        }
           
        return true;
      }
      ...
    }
    
    • 데이터에 대해서 수정할 권한을 가지고 있는지 확인한다.
    • 다른 인증관련 로직이 있는 부분도 위처럼 수정한다.
  • login.html에 로그인 관련 catch문의 model에 담은 errorMessage를 출력한다.

    <!-- login.html -->
    ...
    <div class="panel panel-default content-main">
          
        <div class="alert alert-danger" role="alert">
              
        </div>
          
    </div>
    
  • 테스트

  • hasPermission()이라는 메서드를 만들긴했는데 맘에들지않는다. 그래서 다른 방법을 해보려고한다.

  • Validation 체크 후 Result라는 클래스를 생성에 클래스를 통해 리턴하는것이다.

    public class Result {
      private boolean valid;
      private String errorMessage;
          
      private Result(boolean valid, String errorMessage) {
        this.valid=valid;
        this.errorMessage = errorMessage;
      }
          
      public boolean isValid() {
        return valid;
      }
        
      public static Result ok() {
        return new Result(true, null);
      }
         
      public static Result fail(String errorMessage) {
        return new Result(false, errorMessage);
      }
        
    }
    
  • QuestionController에서 적용한다.

    public class QuestionController {
      ...
      @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.isValud()) {
          model.addAttribute("errorMessage", result.getErrorMessage());
          return "/user/login";
        }
        model.addAttribute("question", question);
        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();
      }
    }
    
  • 중복코드는 어디서나 생길 수 있다. 중복코드가 생길때마다 어떻게하면 제거 할 수 있을까 고민하는것이 개발자의 숙명이다. 그래야 코드를 더 깔끔하게 유지할 수 있다. 또 새 기능이 추가되거나 변경되었을때 빠르게 대처할 수 있다.

댓글남기기