본문 바로가기
JPA

JPA 회원, 상품 도메인 개발

by ppirae 2022. 4. 19.

애플리케이션 아키텍처

계층형 구조 사용

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

개발 순서: 서비스, 리포지토리 계층을 개발하고, 테스트 케이스를 작성해서 검증, 마지막에 웹 계층 적용


회원 도메인 개발

1. 회원 리포지토리 개발

@PersistenceContext -> JPA가 제공하는 표준 어노테이션

스프링이 EntityManager em을 만들어서 주입해준다.

(@PersistenceUnit을 사용하면 Factory를 직접 주입받을수 있다 -> 사용할일은 거의 없다..)

 

public List<Member> findAll() {
    return em.createQuery("select m from Member m", Member.class)   //JPQL
            .getResultList();
}

JPQL을 사용하는데, SQL과 조금 다르다.

SQL은 테이블을 대상으로 쿼리를 하고, JPQL은 엔티티 객체를 대상으로 쿼리를 하는 차이가 있다.

 

2. 회원 서비스 개발

JPA의 어떤 모든 데이터 변경이나 로직들은 가급적이면 Transaction안에서 전부 실행되어야 한다.

@Transactional이 필요함

@Transactional -> javax, spring이 있는데 spring을 쓰자. 쓸 수 있는 옵션이 많다.

읽기(조회하는 곳)에서 @Transactional(readOnly = true) 조건을 주면 JPA가 조회 성능을 더 최적화한다.

클래스 단위에  @Transactional(readOnly = true)를 쓰고

쓰기 타입 메서드에 @Transactional를 붙이는 식으로 사용한다. ( 반대의 경우도 가능 )

 

생성자 주입을 주로 사용한다.

최신 스프링 버전에서는 생성자가 하나면 @Autowired 생략이 가능하다.

필드에 final을 추가하는 것을 권장한다.

요즘은 lombok을 이용하여

@AllArgsConstructor -> 생성자를 대신 생성해줌

@RequiredArgsConstructor -> final이 있는 필드만 생성자를 대신 생성해줌

 

3. 회원 기능 테스트

@Transactional은 테스트 코드 안에 있을때 default가 Rollback이다.

테스트 과정(insert문)을 직접 눈으로 확인하고 싶다면 @Rollback(false) 추가한다.

또는 EntityManager em 필드를 추가하고 em.flush() 를 사용한다.

 

test 디렉토리에 resources 디렉토리를 만들고 application.yml을 복사하면

main의 yml이 아닌 test의 yml을 사용한다.

yml 설정을 아무것도 쓰지않으면 스프링부트가 자동으로 메모리에서 테스트를 실행한다.


상품 도메인 개발

1. 상품 엔티티 개발(비즈니스 로직 추가)

엔티티가 해결할 수 있는 것은 엔티티 안에 비즈니스 로직을 넣는 것이 좋다. (도메인 주도 설계 ?)

데이터를 가지고 있는데서 비즈니스 로직을 나가는게 가장 응집도가 높다.

 

2. 상품 리포지토리 개발

public void save(Item item) {
    if (item.getId() == null) {
        em.persist(item);
    } else {
        em.merge(item);
    }
}

id 값이 없는 것 -> 새로 생성한 객체 -> persist로 신규로 등록

id 값이 있는 것 -> DB에 있는 새로 가져온 것 -> merge는 update와 비슷

 

3. 상품 서비스 개발

repository를 이용해 서비스 개발


인프런 김영한님의 스프링부트와 JPA 활용1을 듣고 작성한 글입니다.

https://inf.run/uqB6

 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의

실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., - 강

www.inflearn.com

 

'JPA' 카테고리의 다른 글

JPA 웹 계층 개발 - 홈 화면과 레이아웃  (0) 2022.04.22
JPA 주문 도메인 개발  (0) 2022.04.20
JPA 도메인 분석 설계  (0) 2022.04.19
JPA 프로젝트 환경설정  (0) 2022.04.17
JPA 활용 1편을 들어가며.  (0) 2022.04.16

댓글