작성
·
178
0
@Transactional
public class MemberService {
MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public Optional<Member> findOne(long id){
return memberRepository.findById(id);
}
public long save(Member member){
valiateDuplicateMember(member); // 중복회원 검증
memberRepository.save(member);
return member.getId();
}
private void valiateDuplicateMember(Member member) {
memberRepository.findByName(member.getName()).ifPresent( // findByName이 Optional을 리턴하니까 null이 아니면 중복 검사를 실행
m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
}
);
}
public List<Member> findAll(){
return memberRepository.findAll();
}
public void deleteOne(Member member){
memberRepository.deleteAllInBatch(member);
}
}
여기서 MemberService는 여러가지 연산을 하기 위해서 memberRepository가 필요한데 의존성 주입을 하지 않는 이유가 있는지 궁금합니다!
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
님께서 제공해주신 코드를 살펴보면, MemberService
클래스 내부에서 MemberRepository
를 주입하고 있습니다. 생성자 주입 방식을 이용하여 MemberRepository
인스턴스를 주입받고 있기 때문에, 의존성 주입을 하지 않은 것은 아닙니다. 생성자 주입 방식은 Spring Framework에서 권장되는 안전하고 깔끔한 의존성 주입 방법 중 하나입니다.
생성자를 통해 주입된 memberRepository
는 MemberService
의 메서드들에서 사용되어 다양한 작업을 수행합니다. 이 과정에서 memberRepository
는 필요한 JpaRepository 인터페이스를 통해 데이터베이스와의 상호작용을 담당합니다.
만약 생성자 주입 대신 다른 의존성 주입 방식을 사용했다면, @Autowired 어노테이션을 필드에 붙이거나 setter 주입 방식을 사용할 수 있으나, 생성자 주입 방식이 가지는 불변성 및 필수 의존성 명시 측면에서의 장점으로 인해, 특히 필수적인 의존성이 있는 경우 권장되는 방식입니다.
따라서 코드상에서 memberRepository
가 의존성 주입되지 않았다고 판단할 이유는 없어 보입니다. 코드에 제시된 방식을 그대로 사용하시면 됩니다.