Coding/Spring(Boot)

[Spring]DI(의존성 주입)와 Bean

민톨이 2024. 6. 10. 23:23
728x90

 

DI란? = Dependency Injection (의존성 주입)

- 객체 의존관계를 외부에서 넣어주는 것 = 의존성 주입

- Controller에서 객체 사용 시, new 키워드를 통해 컨트롤러에서 직접 생성 x => 스프링 컨테이너에 생성된 객체를 받아 사용

- 코드의 재사용성 증가, 코드의 유지보수성 향상, 객체 간의 결합도 감소, 단위 테스트 용이성 증가라는 장점을 가짐

 

컴포넌트 스캔 방식

- @Component 애노테이션이 있으면 스프링 빈으로 자동 등록

- @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔때문

- @Component를 포함하는 애노테이션도 스프링 빈으로 자동 등록

   (@Controller, @Service, @Repository)

 

 

회원 컨트롤러에 의존관계 추가

 package hello.hellospring.controller;
 import hello.hellospring.service.MemberService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 @Controller
 public class MemberController {
     private final MemberService memberService;
     @Autowired
     public MemberController(MemberService memberService) {
         this.memberService = memberService;
     }
}

 

회원 서비스 스프링 빈 등록

@Service
 public class MemberService {
    private final MemberRepository memberRepository;
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}


- 생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.

- 스프링에선 @Autowired에 의해 의존성이 주입될 수 있다.

(참고 : @Autowired를 통한 의존성 주입은 스프링이 관리하는 객체에서만 동작한다./ 스프링 빈으로 등록하지 않고 직접 생성한 객체에서는 동작하지 않는다.)

@Repository
 public class MemoryMemberRepository implements MemberRepository {
 
 }

 

=====> memberService와 memberRepository가 스프링 컨테이너에 스프링 빈으로 저장되어있음