일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 연관관계
- eager
- 스토어드 프로시저
- BOJ
- 연결리스트
- 즉시로딩
- 스프링 폼
- FetchType
- JPQL
- 데코레이터
- CHECK OPTION
- SQL프로그래밍
- fetch
- exclusive lock
- 지연로딩
- shared lock
- 비관적락
- 다대일
- querydsl
- 낙관적락
- 힙
- 일대다
- dfs
- 이진탐색
- 다대다
- 유니크제약조건
- execute
- 동적sql
- 백트래킹
- PS
- Today
- Total
흰 스타렉스에서 내가 내리지
[스프링부트와JPA활용]섹션4. 회원 도메인 개발 본문
애플리케이션 아키텍처
계층형 구조 사용
- controller, web: 웹 계층
- service: 비즈니스 로직, 트랜잭션 처리
- repository: JPA를 직접 사용하는 계층, 엔티티 매니저 사용
- domain: 엔티티가 모여 있는 계층, 모든 계층에서 사용
강의 1. 회원 레포지토리 개발
기술 설명
@Repository : 스프링 빈으로 등록, JPA 예외를 스프링 기반 예외로 예외 변환
@PersistenceContext : 엔티티 메니저( EntityManager ) 주입
@PersistenceUnit : 엔티티 메니터 팩토리( EntityManagerFactory ) 주입
기능 설명
save()
findOne()
findAll()
findByName()
강의 2. 회원 서비스 개발
기술 설명
- @Service
- @Transactional : 트랜잭션, 영속성 컨텍스트
- readOnly=true : 데이터의 변경이 없는 읽기 전용 메서드에 사용, 영속성 컨텍스트를 플러시 하지 않으므로 약간의 성능 향상(읽기 전용 에는 다 적용)
- 데이터베이스 드라이버가 지원하면 DB에서 성능 향상
- @Autowired
- 생성자 Injection 많이 사용, 생성자가 하나면 생략 가능
기능 설명
- join()
- findMembers()
- findOne()
필드 주입
public class MemberService {
@Autowired
MemberRepository memberRepository;
...
}
생성자 주입
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
- 생성자 주입 방식을 권장
- 변경 불가능한 안전한 객체 생성 가능
- 생성자가 하나면, @Autowired 를 생략할 수 있다.
- final 키워드를 추가하면 컴파일 시점에 memberRepository 를 설정하지 않는 오류를 체크할 수 있다. (보통 기본 생성자를 추가할 때 발견)
lombok
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
...
}
@Repository
@RequiredArgsConstructor
public class MemberRepository {
private final EntityManager em;
...
}
강의 3. 회원 기능 테스트
package jpabook.jpashop.service;
import jpabook.jpashop.Repository.MemberRepository;
import jpabook.jpashop.domain.Member;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class MemberServiceTest {
@Autowired MemberService memberService;
@Autowired
MemberRepository memberRepository;
@Test
public void 회원가입() throws Exception{
//given
Member member = new Member();
member.setName("kim");
//when
Long saveId = memberService.join(member);
//then
assertEquals(member, memberRepository.findOne(saveId));
}
@Test(expected = IllegalStateException.class)
public void 중복_회원_예외() throws Exception{
//given
Member member1 = new Member();
member1.setName("kim");
Member member2 = new Member();
member2.setName("kim");
//when
memberService.join(member1);
memberService.join(member2); //예외가 발생해야 한다.
//then
fail("예외가 발생해야 한다.");
}
}
기술 설명
- @RunWith(SpringRunner.class) : 스프링과 테스트 통합
- @SpringBootTest : 스프링 부트 띄우고 테스트(이게 없으면 @Autowired 다 실패)
- @Transactional : 반복 가능한 테스트 지원, 각각의 테스트를 실행할 때마다 트랜잭션을 시작하고 테스트가 끝나면 트랜잭션을 강제로 롤백 (이 어노테이션이 테스트 케이스에서 사용될 때만 롤백)
기능 설명
- 회원가입 테스트
- 중복 회원 예외처리 테스트
테스트 케이스를 위한 설정
테스트는 케이스 격리된 환경에서 실행하고, 끝나면 데이터를 초기화하는 것이 좋다. 그런 면에서 메모리 DB를 사용하는 것이 가장 이상적이다.
추가로 테스트 케이스를 위한 스프링 환경과, 일반적으로 애플리케이션을 실행하는 환경은 보통 다르므로 설정 파일을 다르게 사용하자. 다음과 같이 간단하게 테스트용 설정 파일을 추가하면 된다.
test/resources/application.yml
url을 저렇게 바꿔주면, 실제 h2데이터베이스를 쓰는게 아니라 인메모리를 쓰게되어 데이터베이스에 실제로 영향이 안간다.
혹은,
이렇게 해줘도 알아서 인메모리로 돌아간다.
스프링 부트는 datasource 설정이 없으면, 기본적을 메모리 DB를 사용하고, driver-class도 현재 등록된 라이브러를 보고 찾아준다. 추가로 ddl-auto 도 create-drop 모드로 동작한다. 따라서 데이터소스나, JPA 관련된 별도의 추가 설정을 하지 않아도 된다.
'Spring' 카테고리의 다른 글
[스프링부트와JPA활용1]섹션5. 상품 도메인 개발 (0) | 2022.08.06 |
---|---|
[스프링핵심원리-기본편] SOLID 원칙 (0) | 2022.08.05 |
[스프링부트와JPA활용]섹션2. 도메인 분석 설계 (0) | 2022.08.02 |
[스프링부트와JPA활용]섹션1. 프로젝트 환경설정 (0) | 2022.08.02 |
[인프런 스프링 입문] 섹션7. AOP (0) | 2022.07.24 |