스프링 입문 - 04. 스프링 빈과 의존관계

2023. 4. 23. 18:01Spring/Java

Dependency Injection (DI)

DI란 번역 그대로 의존관계 주입이라는 뜻이다. 객체의 의존관계를 외부에서 넣어주는 것이다. Controller 가 Service와 Repository를 사용할 수 있게 의존관계를 만들어주자.

 

public class MemberService {
    private final MemberRepository memberRepository = new MemoryMemberRepository();

기존 Service에서는 Repository를 이용하기 위해 new라는 키워드를 이용해 새로운 객체를 만들어 주었다. 이 코드를 DI를 적용해서 변경하면 아래와 같다.

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

스프링에서 DI를 이용하기 위해서는 @Autowired 라는 annotation을 이용한다.

Autowired를 사용하면 객체 생성 시점에 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.

(생성자가 1개만 있으면 생략 가능)

@Service
public class MemberService {

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

하지만 스프링 컨테이너가 객체를 찾으려면 스프링 Bean으로 등록이 되어 있어야 한다.

스프링 빈을 등록하는 2가지 방법

컴포넌트 스캔과 자동 의존관계 설정

  • @Component annotation이 있으면 스프링 빈으로 자동 등록된다.
  • @Component를 포함하는 annotation들도 스프링 빈으로 자동 등록 된다.
    • @Controller
    • @Service
    • @Repository

자바 코드로 직접 스프링 빈 등록하기

package hello.hellospring;

import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {

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

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

컴포넌트 스캔 방식으로 사용했던 annotation들을 지우고 SpringConfig라는 java class를 만들었다. @Configuration annotation을 적어주고 아래에서 @Bean annotation을 넣어주면 직접 Bean 객체로 등록할 수 있다.

 

실무에서는 주로 컴포넌트 스캔을 사용하지만, 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경(DB를 변경하는 등) 해야 하면 자바 코드로 설정을 통해 스프링 빈으로 등록한다.