JPA 생성자 DI 리팩토링
1. 생성자 DI 소스 코드를 간결하게 하는 방법
@Service
pubice class MemberService {
@Autowired
private MemberRepository memberRepository;
}
1번째 수정 ↓
@Service
public class MemberService {
private MemberRepository memberRepository;
@Autowired <- 생략 가능 (생성자가 하나면, @Autowired를 생략할 수 있다.)
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
2번째 수정 ↓
@Service
@RequiredArgsConstructor <- final 있는 곳에만 생성자 생성
public class MemberService {
private final MemberRepository memberRepository;
생성자 생략
}
2. EntityManager 부분 간결하게 하는 방법
@Repository
public class MemberRepository {
@PersistenceContext
EntityManager em;
}
수정 ↓
@Repository
@RequiredArgsConstructor <- final 있는 곳에만 생성자 생성
public class MemberRepository {
private final EntityManager em;
생성자 생략
}
1) final 키워드를 추가하면 컴파일 시점에 memberRepository 를 설정하지 않는 오류를 체크
2) @RequiredArgsConstructor : @AllArgsConstructor 같은 의미 생성자 자동생성 , final 있는 곳에만 생성자 생성
3) @Transactional : 트랜잭션, 영속성 컨텍스트 (데이터 변경하는 모든 곳에 필요 예) 저장 , 읽기)
readOnly=true : 데이터의 변경이 없는 읽기 전용 메서드에 사용, 영속성 컨텍스트를 플러시 하지 않으므로 약간의 성능 향상(읽기 전용에는 다 적용, 읽기 전용 모드 같은 느낌)
데이터베이스 드라이버가 지원하면 DB에서 성능 향상
4) @Autowired
생성자 Injection 많이 사용, 생성자가 하나면 생략 가능