스프링 빈과 의존관계

현민·2022년 1월 4일
0

스프링 공부

목록 보기
3/9

인프런 김영한님의 스프링 강의를 듣고 정리한 내용입니다. 출처


스프링 빈

스프링 컨테이너가 관리하는 자바 객체를 빈 이라고 한다.
컨테이너에서 관리하기때문에 객체를 여러번 생성하지 않고 공용으로 사용가능하다.

@Controller
public class MemberController {
    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}
  • 클래스에 @Controller가 있으면 스프링은 스프링 컨테이너에 해당 객체를 생성하고 컨테이너 안에서 관리한다.

  • 생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.
    이처럼 객체 의존관계를 외부에서 넣어주는 것을 DI( Dependency Injection), 의존성 주입이라고 한다.

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

스프링 빈 등록방법

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

  • @Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.
  • @Controller 컨트롤러가 스프링 빈으로 자동 등록된것도 컴포넌트 스캔 때문이다.
  • @Component를 포함하는
    @Controller , @Service , @Repository도 스프링 빈으로 자동 등록된다.

서비스 스프링 빈 등록 예시

@Service
public class MemberService {

    private final MemberRepository memberRepository;

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

리포지토리 스프링 빈 등록 예시

@Repository
public class MemoryMemberRepository implements MemberRepository{
}

스프링 빈 등록 이미지

2. 자바 코드로 직접 스프링 빈 등록

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

예시

@Configuration
public class SpringConfig {

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

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

클래스위에 @Configuration을 붙이고 스프링 빈으로 등록할 객체들을 @Bean을 통해 직접 등록해준다.

의존성 주입(DI)

1. 필드 주입

@Controller
public class MemberController {
    @Autowired private MemberService memberService;
    }

생성자 없이 @Autowired로 필드에 직접 의존성을 주입하는 것이다.

2. setter 주입

    @Autowired
    public void setMemberService(MemberService memberService) {
        this.memberService = memberService
    }

setter를 통해 의존성을 넣어주는 방식이고 public으로 노출되어서 사용되기 때문에 안전하지 않다.

3. 생성자 주입

의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 주로 사용한다.

0개의 댓글