[Spring boot] 스프링빈과 DI

Ho·2022년 6월 30일
0

Spring Boot 입문

목록 보기
5/7

스프링 빈

Spring IoC 컨테이너가 관리하는 자바 객체를 스프링빈(Spring Bean)이라고 한다.

IOC

오브젝트 생성, 관계설정, 사용, 제거 등 오브젝트 전반에 걸친 모든 제어권을 애플리케이션이 갖는게 아니라 프레임워크의 컨테이너에게 넘기는 개념

DI(Dependency Injection)

DI는 의존관계 주입을 뜻한다. 클래스 간의 의존성을 클래스 외부에서 주입하는 것을 의미한다.


public class MemberService {
    private final MemberRepository memberRepository;


    public MemberService() {
        this.memberRepository = new MemoryMemberRepository();
    }
}

MemberService 클래스는 객체를 생성하기 위해 생성자에서 MemberRepository에 대한 객체를 생성하여 초기화해야 할 것이다.

@Service
public class MemberService {
    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

하지만 위와 같이 의존관계를 주입하면 클래스의 외부에서 스프링이 관리하는 객체인 스프링빈을 통해 memberRepository를 세팅할 수 있다.

DI의 장점

  • Unit Test가 용이해진다.
  • 코드의 재활용성을 높여준다.
  • 객체 간의 의존성(종속성)을 줄이거나 없앨 수 있다.
  • 객체 간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다.

스프링빈을 등록하는 방법은 크게 두가지가 있다.

1. ComponentScan

  • @Service
  • @Repository
  • @Controller

이 세가지 Annotation은 내부에 @Component 를 포함하고 있다. 스프링은 이러한 Annotation이 사용된 클래스의 객체를 생성하여 스프링빈으로 관리한다.

@SpringBootApplication은 @ComponentScan를 포함한다. 이는 동일 패키지 및 하위 패키지에 포함된 소스에서 위의 세가지 Annotation이 사용된 클래스를 찾아 객체를 생성한다.

@Autowired가 사용된 생성자, 필드, setter 함수는 스프링빈이 관리하는 객체를 파라미터로 받아 초기화한다.

2. 자바 코드로 직접 스프링 빈을 등록하는 방법

@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

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

스프링부트가 실행될때 @Configuration을 보고 @Bean으로 등록된 메소드를 실행하여 스프링빈으로 등록한다.


@Autowired를 통한 DI는 스프링이 관리하는 객체에서만 동작한다.
직접 생성한 객체에서는 동작하지 않는다.

의존관계 주입은 생성자, 필드, setter 의 세가지 방법으로 구현할 수 있다.
스프링 컨테이너가 실행되면서 스프링빈이 등록된 이후 실행중에 의존관계가 바뀌는 경우는 거의 없으므로 생성자주입을 사용하는게 좋다.

정리

주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 상황에 따라 구현 클래스를 변경해야하는 경우 설정을 통해 스프링 빈으로 등록한다.

0개의 댓글