[Spring] Spring Bean과 의존관계 - DI (Dependency Injection)

Date:

카테고리:

간단히!


회원 Controller가 회원 Service와 회원 Repository를 사용하도록 의존관계를 관리해보자

[ Spring Bean을 등록하는 2가지 방법 ]

1. Component Scan과 자동 의존관계 설정

1
2
3
4
5
6
7
8
9
@Controller
public class MemberController {
    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}
  1. @Controller : 스프링 컨테이너 안의 Controller 객체가 생성되어 관리된다. 즉, 스프링 컨테이너에서 MemberController(이걸 빈 이라고 함) 빈이 관리된다!
    • new를 쓰게되면 여러 다른 Controller 들이 member service를 가져다 쓸 텐데 여러 인스턴스를 만들 필요 없이 하나만 가져다 쓰면 됨.
    • 즉, 스프링 컨테이너에 하나만 등록해서 그거만 쓰면 된다!


  1. @Autowired : 이 어노테이션이 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다. 이렇게 객체 의존 관계를 외부에서 넣어 주는 것을 DI (Dependency Injection) 라고 한다.
    • 참고 : 생성자에 이 어노테이션을 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 bean을 찾아서 주입한다.
    • 생성자가 1개만 있으면 @Autowired는 생략 가능

:question: Component Scan 원리

  • @Component 어노테이션이 있으면 스프링 빈으로 자동으로 등록된다.
  • @Controller, @Service, @Repository 도 안에 들어가보면 @Component를 포함하고 있어서 스프링 빈으로 자동 등록!
  • 예시에서 HelloSpringApplication (가장 main 클래스) 이 있는 패키지와 그 패키지 하위만 뒤져서 스프링 빈으로 컴포넌트 스캔을 해준다.


참고

스프링은 스프링 컨테이너에 스프링 bean을 등록할 때, 기본으로 싱글톤으로 등록(유일하게 하나만 등록해서 공유)한다. 따라서 같은 스프링 bean 이면 모두 같은 인스턴스!




2. 자바 코드로 직접 spring bean 등록

정형화된 Controller, Service, Repository 같은 코드는 Component Scan 사용
정형화되지 않거나 상황에 따라 구현 클래스를 변경해야하는 경우 설정을 통해 Spring Bean으로 등록한다

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}


:exclamation: 주의

@Autowired 를 통한 DI는 helloController, memberService 등과 같이 스프링이 관리하는 객체에서만 동작한다.
스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작 X




DI ( Dependency Injection )

DI란? 객체를 직접 생성하여 사용하는 게 아닌, 스프링 프레임워크에게 주입 받아 사용하는 기능 장점 :

  • 클래스들 간 의존관계를 최소화
  • 프로젝트 유지보수가 용이
  • 기존에는 개발자가 직접 객체의 생성과 소멸을 제어했는데 DI로 인해 객체의 생성과 소멸 등 클래스 간 의존관계를 스프링 컨테이너가 제어

필드 주입

setter 주입

생성자 주입

-> 자세한 내용은 스프링 핵심 원리 강의 듣고 추가할 예정!

Date:

댓글남기기