Develope Story

2019-08-21 [Spring-study] QnA 3단계 - 로그인 기반 개발

|

QnA 3단계 - 로그인 기반 개발

요구사항

  • 로그인 전 후 상태 충족

  • 로그인 후 질문 가능 하도록 + 수정, 삭제

  • question - user -> ManyToOne 관계 만들기

공부한 거

Exception 처리

ControllerAdvicce

  • 예외처리를 전역적으로 처리

  • ExceptionHandler

    @ExceptionHandler(value = LoginException.class)
      public String loginException(LoginException e) {
        return "redirect:/users/login/form";
      }
    

    예외 클래스 지정 후 메소드 작성

다음 단계에서

  • ErrorCode를 Enum 객체로 지정 후 Error Response 객체를 통한 유연한 처리
  • json으로 에러에 대한 message 작성 예정
  • https://cheese10yun.github.io/spring-guide-exception/

ManyToOne 매핑

User 와 Question 관계 = 1 : 다

  • 사용법

    @Entity
    public class Question {
        @ManyToOne
        @JoinColumn(foreignKey = @ForeignKey(name = "fk_question_writer"))
        private User writer;
        [...]
    }
    
    • writer의 User 객체로 매핑

Session (HttpSession session)

  • 저장하기 : session.setAttribute()
  • 불러오기 : session.getAttribute() (null 값 체크하기)

테스트 데이터 추가 방법

  • .sql 파일 만들고 쿼리문 작성
INSERT INTO USER (id, user_id, password, name, email) VALUES (1, 'hello', '1234', '자바지기', 'javajigi@slipp.net');
INSERT INTO USER (id, user_id, password, name, email) VALUES (2, 'test', '1234', '산지기', 'sanjigi@slipp.net');
  • User 객체 userId -> user_id

궁금증

예외 혹은 특정 조건에 충족될 때 특정 페이지로 이동하려면 어떻할까?

image

위 조건 식이 많이 중복 되어서 리팩토링 하고 싶은 데 return 때문에 하지 못하였다.

​ => throw 예외발생 후 exceptionHandler 를 통한 예외처리

리뷰 받은 내용

혁진이형

  • password 검사를 하는데 User 객체로 넘겨주는게 어색하지 않나요?

    • User을 일치여부를 확인하는 것으로 변경

      public boolean isSameUser(User other) {
          if (other == null) {
            return false;
          }
          
          if(userId != other.userId){
            return false;
          }
          
          return password.equals(other.getPassword());
        }
      
  • User와 Question 이 왜 DTO 인지 설명해보세요

  • Entity와 VO와 DTO의 차이점을 설명해주세요. 그리고 domain 이란 무엇인지 설명해주세요

    VO

    • 데이터 그 자체로 의미 있는 것을 담고 있는 객체(read only)
      • 사용 되는 값이 객체로 표현 되며, 값 변경이 없는 경우를 말함

    DTO

    • 전송되는 데이터의 컨테이너
      • 데이터의 전송을 위한 객체이며, 비지니스 로직까지 담아서 사용함
    • Request와 Response용 DTO는 View를 위한 클래스 자주 변경이 필요한 클래스

    Entity class

    • db의 테이블과 매칭될 클래스
      • Entity 클래스와 DTO 클래스를 분리하는 이유
        • 테이블과 매핑되는 Entity 클래스가 변경되면 여러 클래스에 영향을 끼치게 되는 반면 View와 통신하는 DTO 클래스(Request / Response 클래스)는 자주 변경되므로 분리해야 함.

    User와 Question은 기존에 비즈니스 로직에서 사용되고 변경이 필요하기 때문에 DTO로 정했습니다. domain에 대해 공부해보니 User, Question은 DB에 담길 Entity 클래스이기 때문에 여기서는 domain을 사용하는 게 맞는 것 같습니다. 참고

  • SessionUtils 는 유틸클래스이므로 프로젝트의 전 영역에서 사용될 수 있는 공용 클래스입니다. 따라서 여기에서는 세션에 저장된 유저를 가져오고, 세션에 유저를 저장하는 행위만 있으면 좋을 것 같은데, Question의 작성자까지 검증하는 행위까지 추가하는 것을 보니 앞으로 세션과 관련된 모든 로직이 여기에 생길까하는 우려가 됩니다. Util 클래스는 사용 되는 범위가 너무 넓으므로 변경이 거의 일어나지 않는 로직만 위치시켜야합니다. 중복을 줄이고자 좋은 고민을 하신 것 같은데 조금만 더 리팩토링 해보면 좋을 것 같아요

    • Util은 전역으로 처리 하기 때문에 util의 기능 범위를 판단 필요

Comments