회원에 대해서는 아래와 같은 기능을 구현합니다.
• save()
• findOne()
• findAll()
• findByName()
member와 관련된 service, repository를 만들어보겠습니다.
파일 구조는 아래와 같습니다.
먼저 데이터 베이스에 직접 접근하는 MemberRepository를 먼저 보겠습니다.
MemberRepository
@PersistenceContext:
엔티티 메니저( EntityManager ) 주입. 원래는 JPA영속성 컨텍스트에 접근하기 위해서는 Persistence 객체를 통해 EntityManagerFactory를 만들고, 팩토리에서 EntityManager를 만들어 사용해야합니다. (영속성 컨텍스트: https://kingchan223.tistory.com/137?category=870827)
하지만
@PersistenceContext private final EntityManager em; 를 통해 엔티티매니저를 쉽게 주입받을 수 있습니다.
(추가로 @PersistenceUnit를 사용하면 엔티티 매니저 팩토리를 주입받을 수도 있습니다.)
이제 memberRepositpry를 의존성 주입받아 사용하는 memberService를 구현합니다.
MemberService
@Transactional : 트랜잭션, 영속성 컨텍스트
DB 접근시 트랜잭션은 매우 중요합니다. 하나의 트랜잭션이 수행되면 이를 commit하거나, 에러가 난다면 rollback해줘야 합니다.
@Transactional 어노테이션은 이렇게 하나의 비즈니스 단위를 트랜잭션 단위로 쉽게 묶고, commit과 rollback 기능을 편리하게 제공해줍니다.
• readOnly=true : 데이터의 변경이 없는 읽기 전용 메서드에 사용, 영속성 컨텍스트를 플러시 하지 않 으므로 약간의 성능 향상(읽기 전용에는 다 적용)
• 데이터베이스 드라이버가 지원하면 DB에서 성능 향상
클래스 단위로 @Transactional을 선언하면 각 메소드에 트랜잭션이 적용됩니다.
참고 :
(validationDuplicateMember 메소드) 실무에서는 검증 로직이 있어도 멀티 쓰레드 상황을 고려해서 회원 테이블의 회원명 컬럼에 유니크 제 약 조건을 추가하는 것이 안전합니다.
Test
이제 테스트코드를 작성하고 테스트를 해보겠습니다.
그전에 테스트 케이스를 위한 설정을 합니다.
테스트는 케이스 격리된 환경에서 실행하고, 끝나면 데이터를 초기화하는 것이 좋습니다. 그런 면에서 메모리 DB를 사용하는 것이 가장 좋습니다.
추가로 테스트 케이스를 위한 스프링 환경과, 일반적으로 애플리케이션을 실행하는 환경은 보통 다르므로 설정 파일을 다르게 사용합니다.
다음과 같이 간단하게 테스트용 설정 파일을 추가하면 된다.
아래와 같이 java패키지에 있는 application.yml을 복사하여 test패키지 아래에 resources 디렉코리를 만든 후 붙여넣기 합니다.
이렇게 하면 test패키지 이하의 test코드들은 해당 application.yml의 설정 정보를 우선으로 적용합니다.
test패키지 이하의 application.yml
3라인에 인메모리 방식의 DB를 사용하는 것을 보실 수 있습니다.
근데 사실 아래와 같이 주석처리하여도 똑같이 작동합니다. 별도의 설정이 없으면 인메모리 DB방식을 사용합니다.
이제 테스트 코드를 보겠습니다.
MemberServiceTest
@Test(expected=IllegalStateException.class)는 해당 테스트를 하면 IllegalStateException에러가 발생해야합니다.
'JPA > JPA + SpringBoot' 카테고리의 다른 글
(X To ONE ) LAZY로딩에 의한 N+1문제 해결 (0) | 2021.09.08 |
---|---|
JPA 엔티티 수정 (merge와 dirty checking) (0) | 2021.07.31 |
어플리케이션 구조, 기능 (0) | 2021.07.28 |
엔티티설계하기 (+엔티티 설계시 주의점) (0) | 2021.07.27 |
프로젝트 만들고 설정하기 (0) | 2021.07.25 |