Spring(기초) - Spring Bean과 의존관계

Kwon Yongho·2023년 3월 30일
0

Spring

목록 보기
3/37
post-thumbnail

Spring Bean과 의존관계

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

  1. 컴포넌트 스캔과 자동 의존관계 설정
  2. 자바 코드로 직접 스플이 빈 등록하기
  3. xml 문서 설정(잘 사용하지 않음)

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

회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
  • 생성자에 @Autowired가 있으면 스프링이 연관된 객체를 컨테이너에서 찾아서 넣어준다. 이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI(Dependency Injection), 의존성 주입이라고 한다.
    • DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다. 의존관계가 실행중에
      동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.

컴포넌트 스캔 원리!

  • @Componet 애노테이션이 있으면 Spring Bean으로 자동 등록된다.
  • @Componet를 포함하는 다음 애노테이션도 Spring Bean으로 자동 등록된다.
    • @Controller
    • @Service
    • @Repository

그러므로 Controller, Service, Repository 에 각 애노테이션을 추가해주고 생성자에 @Autowired를 추가해준다.

  • 생성자에 @Autowired 를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서
    주입한다. 생성자가 1개만 있으면 @Autowired 는 생략할 수 있다.
  • 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다(유일하게 하나만
    등록해서 공유한다) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수
    있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.

2. 자바 코드로 직접 Spring Bean 등록하기

회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 애노테이션을 제거하고
진행

java/hello/SpringConfig.java 생성 후

@Configuration
public class SpringConfig {

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

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

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

참고
김영한: 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술(인프런)
Github - https://github.com/b2b2004/spring-ex

0개의 댓글