JPA #2 - 계층형 구조

업데이트:

JPA 학습

강의 정보

  • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
  • 김영한

애플리케이션 아키텍처

계층형 구조 사용

  • controller, web : 웹 계층
  • serviece : 비즈니스 로직, 트랜잭션 처리
  • repository : JPA를 직접 사용하는 계층, 엔터티 매니저 사용
  • domain : 엔터티가 모여 있는 계층, 모든 계층에서 사용

회원 도메인 개발

회원 리포지토리 개발

  • JPQL과 SQL의 차이?
    • SQL : 테이블 대상으로 하는 쿼리
    • JPQL : 엔터티 객체를 대상으로 하는 쿼리(from의 대상이 엔터티 객체)

회원 서비스 개발

  • @Transactional(readOnly = true) (읽기전용)을 사용하면 JPA가 조회하는 부분에 있어서 성능을 최적화 한다. (영속성 컨텍스트 flush 안해서 dirty checking 안하거나 하는..)

  • 클래스 단에서 @Transactional(readOnly = true) 선언해주고, 쓰기가 필요한 메서드에서 @Transactional 추가해주는 것을 권장한다.

  • 필드 인젝션 사용 지양 -> 세터 인젝션 사용 -> 생성자 인젝션 사용 권장한다. 서비스가 실행되면 repository가 중간에 변경되지 않는 장점이 있고, 테스트 코드 작성 시에도 이점이 있다.

    // 필드 인젝션
    @Autowired
    private MemberRepository memberRepository;
      
    // 세터 인젝션
    private MemberRepository memberRepository;
      
    @Autowired
    public void setmemberRepository(MemberRepository memberRepository) {
      this.memberRepository = memberRepository;
    }
      
    // 생성자 인젝션
    private final MemberRepository memberRepository;
      
    @Autowired // 생략가능
    public MemberService(MemberRepository memberRepository) {
      this.memberRepository = memberRepository;
    }
      
    // lombock 활용 생성자 인젝션, final 붙은 객체만 생성자 만든다.
    @RequiredArgsConstructor
    //...//
    private final MemberRepository memberRepository
    

회원 기능 테스트

  • @Test(expected = Exception.class)try - catch 생략 가능하다.
  • fail()로 발생하면 안되는 부분 체크 가능하다.
  • 테스트 코드 작성 시 인메모리 DB로 사용 할 수 있다.
  • 테스트 코드에서는 yml 파일을 따로 가져가는 것이 괜찮다. (보고싶은 레벨이 다르기 때문)

상품 도메인 개발

상품 엔터티 개발

  • 데이터를 갖고 있는 곳에서 비즈니스 로직을 처리하는 것이 응집력이 있고 객체 지향적인 설계이다.
    • Entity가 갖고 있는 stock add하거나 remove 할 때 등

상품 리포지토리 개발

  • EntityManager
  • em.persist : save & em.merge : update 정도로 우선 생각하자.

상품 서비스 개발

  • 이번 경우에서는 상품 서비스는 단순히 상품 리포지토리를 위임하는 역할만 했다. 이 경우에는 컨트롤러에서 리포지토리 자체를 가져와도 무방하다.

댓글남기기