spring에서는 Entity, Service, Repository등을 컴포넌트로 중앙에서 생성/관리하고 있다.
service 단으로 repository를 주입하는 방법은 아래와 같다
필드 인젝션
@Repository
@Transactional(readOnly = true)
public class MemeberService{
@Autowired
private final MemberRepository memberRepository;
...
}
- spring에서 생성한 memberRepositry를 해당 필드에 자동으로 주입해준다
- 중간에 repository를 다른 것으로 변경하기 어렵다
Setter 인젝션
@Service
@Transactional(readOnly = true)
class MemberService{
private final MemberRepository memberRepository;
@Autowired
public void setMemberRepository(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
...
}
- setter를 통해 어플리케이션 동작 중간에 repository를 변경해줄 수 있다
- test code 작성 시에 mock을 주입하여 service를 다른 혹은 테스트 repository기반으로 테스트해볼 수 있다
Constructor 인젝션
@Serivce
@Transactional(readOnly = true)
public class MemberService{
private final MemeberRepository memberRepository;
@Autowired
public MemberService(MemeberRepository memeberRepository){ this.memberRepositry = memberRepository; }
...
}
- 어플리케이션 동작 중에 repository를 바꾸는 경우는 적기 때문에 스프링이 시작될 때, 생성자를 통해 인젝션
- 생성자를 통해 인젝션시에, test mock도 생성자를 통해 인젝션 가능
'Spring > boot' 카테고리의 다른 글
[Spring Boot] 개발 단계에서 테스트를 위한 DB data 만들기 (0) | 2022.02.18 |
---|---|
[JPA] DB의 data가 update 되는 플로우 정리 (0) | 2022.02.18 |
[Spring Boot] Rest Controller DTO 의 필요성 (0) | 2022.02.15 |
Spring Boot - Test 코드 작성 (0) | 2022.01.04 |
spring JPA 엔티티 Entity 어노테이션 정리 (0) | 2021.12.24 |