강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

966kmj님의 프로필 이미지
966kmj

작성한 질문수

MemberService에는 왜 MemberRepository를 주입하지 않는 건가요??

작성

·

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에서 권장되는 안전하고 깔끔한 의존성 주입 방법 중 하나입니다.

생성자를 통해 주입된 memberRepositoryMemberService의 메서드들에서 사용되어 다양한 작업을 수행합니다. 이 과정에서 memberRepository는 필요한 JpaRepository 인터페이스를 통해 데이터베이스와의 상호작용을 담당합니다.

만약 생성자 주입 대신 다른 의존성 주입 방식을 사용했다면, @Autowired 어노테이션을 필드에 붙이거나 setter 주입 방식을 사용할 수 있으나, 생성자 주입 방식이 가지는 불변성 및 필수 의존성 명시 측면에서의 장점으로 인해, 특히 필수적인 의존성이 있는 경우 권장되는 방식입니다.

따라서 코드상에서 memberRepository가 의존성 주입되지 않았다고 판단할 이유는 없어 보입니다. 코드에 제시된 방식을 그대로 사용하시면 됩니다.

966kmj님의 프로필 이미지
966kmj

작성한 질문수

질문하기