[4] 스프링 부트와 JPA 활용 (5) - 웹계층 개발 1 (Form객체 / Thymeleaf 연결 )

김정욱·2021년 3월 22일
0
post-thumbnail
post-custom-banner

Form 객체 ?

[ 설명 ]

  • htmlform으로 넘어오는 값들을 받는 역할을 하는 객체

[ Form 객체 / Entity ]

  • Entity 직접 사용
    • Form으로 넘어오는 값이 Entity와 일치하지 않거나 값 검증을 해야하면 Entity 내부처리 로직이 늘어난다
      --> Entity화면에 종속적으로 변함
      --> 유지보수 힘듬
  • Form 객체 사용
    • 화면 계층서비스 계층을 명확하게 분리 가능
    • @NotEmpty 처럼 검증하는 로직Entity에 영향을 주지 X

  • 정리
    • Form을 받기 위한 객체를 생성해야하는 귀찮음을 감수해서라도 안전하게 Entity를 관리하기 위해 Form 객체를 사용하자

Thymeleaf 사용

목차

  • 회원
    • 회원 등록
    • 회원 목록 조회
  • 상품
    • 상품 등록
    • 상품 목록 조회
    • 상품 목록 수정
  • 주문
    • 주문 등록
    • 주문 목록 조회 (+검색)

[ 회원 ]

[ MemberForm ]

  • 회원 등록 Form에서 정보를 받는 Form 객체
  • javax.validation에 있는 @NotEmpty를 사용해서 넘어오는 데이터의 필수속성을 지정
    (지정한 필드가 넘어오지 않으면 오류를 발생시킴!)

[ MemberController ]

( 회원 등록 )

  • 설명
    • GET /members/new
      : 회원 등록 폼으로 보내는 것
      (/resources/templates/members/createMemberForm.html에 매칭)
    • POST /members/new : 입력받은 회원 정보를 저장하는 것
      • BindingResult예외가 발생했을 때 검증하고 대처할 수 있음
      • EntitySetter를 개방하는 것은 위험 --> 생성자로 대체
        (수정이 일어나는 부분을 추적하기 어려워짐)

( 회원 목록 조회 )

  • 설명
    • GET /members
      : 모든 회원 목록을 조회해서 View로 보내준다
  • 주의
    • 실무에서는 Entity를 반환하지 않고 DTO생성한 후에 반환한다
      --> Entity에 있는 모든 데이터가 필요한 것이 아니며, 보안상 위험

[ 상품 ]

[ BookForm ]

  • Item들중 예시를 간단하게 하기 위해서 Book만 사용하는 Form을 제작
  • 상품 수정을 위해서 Formid값이 있어야 함

[ ItemController ]

( 상품 등록 & 조회 )

  • 설명
    • GET /items/new
      : 상품 등록 Form이 있는 View로 보냄
    • POST /items/new
      : 입력받은 상품의 정보form을 통해 받아서 저장
    • GET /items
      : 모든 상품조회해서 리스트를 View에 반환
      (역시 실무에서는 Entity 반환이 아닌 DTO를 사용해야 함)

( 상품 수정 )

  • 설명
    • GET /items/{itemId}/edit
      : itemId에 해당하는 수정 View로 보내줌
      (수정 View니까 기존 값조회)
      (Spring에서는 Params@PathVariable("이름")으로 가져옴)
    • POST /items/{itemId}/edit
      : itemId에 대한 값을 입력받은 값으로 수정
  • 주의
    • Entity 어설프게 사용 X
      : form에서 받은 정보를 저장할 때 Entity를 만들어서 저장하는 것 보다는
      DTO를 따로 만들어서 전달하거나, 필요한 데이터만 받는 메서드생성해서 넘기자
      (EntitySetter 닫힌채로 설계하는 것이 좋기 때문)
    • 수정을 위해 생성한 객체는 현재 영속성 컨텍스트관리하지 않는 준영속 객체
      --> 즉, 변경감지(Dirty Checking)이 수행되지 X
      --> 변경할 식별자 값을 통해 조회(findOne)한 후에 값을 수정하면 변경감지 일어남

[ 주문 ]

[ OrderController ]

(주문 등록)

  • 설명
    • GET /order
      : 주문 등록 View에서 필요한 membersitems조회 후 View로 이동
    • POST /order
      : 입력받은 주문 내용으로 주문을 생성하는 것

(주문 목록 조회+검색 / 상태 변경)

  • 설명
    • GET /orders
      : 사용자의 검색에 따라 order들을 처리하는 로직
    • POST /orders/{orderId}/cancel
      : orderId에 해당하는 주문을 삭제처리하는 로직
  • OrderSearch 객체 필드 쿼리스트링 매칭
    : OrderSearch를 통해 검색에 필요한 name, orderstatus를 매핑해서 쿼리스트링으로 값을 넘겨준다
profile
Developer & PhotoGrapher
post-custom-banner

0개의 댓글