구현 순서
1. 서비스, 리포지토리 계층 개발
2. 테스트 케이스 작성 및 검증
3. 웹 계층 적용
선언할 때 @PersistenceContext를 이용한다. 영속성 컨텍스트라 한다.
나머지 영속성 컨텍스트에 대한 내용들은 영속성 컨텍스트란에 상세히 나와있어서
많은 도움이 되었다.
서비스, 리포지토리를 구현하는 것은 스프링 강의에서 몇 번 해봤던 것처럼 하면 어렵지 않다.
스프링 강의 외 이번 강의에서 새로 알게된 것들만 몇가지 정리하겠다.
@Repository
public class MemberRepository {
@PersistenceContext
private EntityManager em;
를
@Repository
@RequiredArgsConstructor
public class MemberRepository {
private final EntityManager em;
와 같이도 쓸 수 있다. 스프링 데이터 JPA를 사용하면 가능하다.
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class MemberServiceTest {
위 어노테이션들을 붙여주어야 정상적으로 JPA를 사용할 수 있다.
테스트를 격리된 환경에서 실행하고 검증 후 데이터 초기화를 하기 위해 메모리 DB를 사용하는 것이 이상적이다.
spring:
# datasource:
# url: jdbc:h2:mem:testdb
# username: sa
# password:
# driver-class-name: org.h2.Driver
# jpa:
# hibernate:
# ddl-auto: create
# properties:
# hibernate:
# show_sql: true
# format_sql: true
# open-in-view: false
logging.level:
org.hibernate.SQL: debug
# org.hibernate.type: trace
스프링 부트는 datasource 설정 파일이 없으면 자동으로 메모리 DB를 사용하기 때문에
없어도 되는 부분을 주석처리 하였다.
@Service
@Transactional(readOnly = true)
public class MemberService {
@Autowired
MemberRepository memberRepository;
/**
* 회원가입
*/
@Transactional //변경
public Long join(Member member) {
validateDuplicateMember(member); //중복 회원 검증
memberRepository.save(member);
return member.getId();
}
...
readonly=true 옵션을 주면 최적화에 좋다.
클래스에 일괄적으로 적용한 후, DB 쓰기를 하는 메서드만 따로 @Transactional을 주면 편하다.
참고로 @Transactional은 readonly=false을 기본 값으로 가지고 있다.