본문 바로가기
개발/Spring

[JPA] 도메인 및 웹 계층 개발

by 윤호 2021. 9. 6.

회원 도메인 개발

엔티티매니저

  • createQuery 엔티티 객체를 대상으로 jpql 쿼리.

트랜잭션

  • 기본적으로 데이터 변경은 트랜잭션 안에서 일어나야한다. - 서비스에서 메소드 트랜잭셔널을 붙이자
  • @Transactional
    • javax와 spring중 spring을 import 하자, 기능이 더 많음
  • @Transactional(readOnly - true)
    • 조회 기능에서 리드온니를 넣어주면 성능 증가.
    • 기본적으로 서비스 클래스를 리드온리로 하고, 수정이 필요한 것에 @Transactional을 따로 붙임
      • 기본적인 @Transactional은 readOnly = false
  • 의존성 주입
    • @Autowired보단 생성자를 이용하는 방식
      • 생성자만 있어도 스프링이 긱본적으로 @Autowired를 붙여줌
    • @RequiredArgsConstructor
      • private final 클래스 인스턴스명

테스트

  • 커멘드 shift T : 테스트 클래스 만들기
  • 테스트 회원가입에서 insert 쿼리가 안보이는 이유?
    • transactional 에서 롤백하기 때문
    • Rollback(false) 하면 쿼리 볼 수 있긴함
    • 또는 when에서 em.flush(); 를 넣으주면 롤백해도 볼 수 있음
  • 예외 처리 테스트
    • try catch 문으로 죽지않게 냅두고, catch 밖을 나가면 fail
    • @Test(expected = IllegalStateException.class) 로 위를 대체가능
  • 테스트할 땐 외부 디비를 사용 X -> 메모리 디비를 사용하자
    • test 의 resource와 applicatiohn.yml을 생성
      • 없을 경우엔 main의 resource를 사용하지만 따로 생성하면 그걸 사용함
    • test의 yml에서 h2 url을 jdbc:h2:mem:test 로 변경
    • 또는 h2는 별다른 설정이 없을 경우 인메모리 디비로 돌아기 때문에 설정을 지워두 가능

주문 도메인 개발

  • casecade
    • order를 persist하면 orderItem, delivery 자동으로 persist 됨
    • 언제 사용하면 좋을까?
      • order가 orderItem을 관리하고, delivery 관리.
      • 그리고 그 두개를 order만 참조함.
      • 이런 상황에서 사용할만 하다.
  • 클래스 생성 방법 제한
    • static 메소드로 createOrder를 만들고
    • protected로 기본생성자를 만듬
      • 롬복으로 간단하게
      • @NoArgsConstructor(access = AccessLevel.PROTECTED)
    • 결과) createOrder로만 생성하도록 제한
  • 도메인 모델 패턴
    • 엔티티에 핵심 비즈니스 로직을 몰아넣는 방법
  • 트랜잭션 스크립트 패턴
    • 엔티티가아닌 서비스에서 비즈니스 로직을 몰아넣는 방법
  • JPA에서 동적쿼리를 어떻게 처리하나? (ex 검색 기능)
    • 파라미터가 있으면 조건을 추가하고 없으면 그냥 쿼리 실행
    • QueryDSL을 사용

웹 계층 개발

  • 서버 재시작 안하고 화면 바뀐거 알수 있게 해주는 의존성
    • spring boot dev tools
  • 타임리프의 th:field="*{name}"
    • 같은 의미 : id="name" name="name"
  • @Validation
    • 클래스에 옵션을 주고
    • 해당 클래스에 validation이 있다면
      • @Valid MemberForm 으로 사용
    • BindingResult result
      • Validate 다음에 있으면 오류가 result에 담긴채로 실행됨
      • result.hasError()로 예외 처리 가능.
        • 이전 페이지로 가면 왜 에러인지 화면에서 알려줌
        • 화면에 th:if="${#filds.hasErrors('name')}" 에러 표시해줌.
        • ex) 회원 이름은 필수 입니다.
  • 화면 개발에서 클래스를 되도록 수정하지 않을 것
    • 엔티티는 핵심 비즈니스 로직만 갖고있어야한다.
    • 화면에 대한 로직은 X
    • dto를 사용하자
      • Member를 바로 받지 않고 dto인 memberForm을 이용해서 데이터를 가져오는 것.
  • 상품 수정 - JPA에선 어떻게 수정할까?
    • 병합이아닌 변경감지를 이용하도록 하자.

댓글