Spring/boot
spring boot Service 코드 repository injection관련
코딩균
2021. 12. 27. 15:28
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도 생성자를 통해 인젝션 가능