스프링 빈과 의존관계

728x90

오늘은 스프링 빈과 의존관계에 대해서 알아보도록 하겠습니다.

 

키워드

- 스프링 빈, 스프링 컨테이너, @Controller, @Service, @Repository, @Autowired, DI, 의존관계 주입, 

 

 

@Controller, @Service, @Repository 어노테이션으로 스프링이 동작할 때 스프링컨테이너에 객체를 생성한다.

@Autowired를 통해 스프링컨테이너에 생성된 @Controller, @Service, @Repository 의 객체를 연결해주는데 사용한다.

@Controller 
public class MemberController {

    private final MemberService mebmerService;

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

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}
@Repository
public class MemoryMemberRepository implements MemberRepository {
 
}

 

스프링 컨테이너 [Controller, Service, repository] 가 있고, 스프링 빈으로 등록한 것이다. 

빈을 이어주는 역할이 @Autowired가 해준다.

 

이 방법은 컴포넌트 스캔, 자동 의존 관계 설정 방법이다.

@Component이 붙은 어노테이션은 스프링이 시작 될 때 객체로 다 생성시킨다. 그것을 이어주는게 @Autowired고 자동 의존 관계를 이어준 것이다.

 

스프링 컨테이너에 스프링 빈을 등록 할떄 에는 싱글톤으로 등록한다. 유일하게 하나만 등록해서 공유합니다. 스프링 빈이면 같은 인스턴스이다.

 

 

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

SpringConfig 를 만든다. 이렇게 만들면 스프링 컨테이너에 빈을 생성해주는 거랑 같다.

 

@Configuration
public class SpringConfig {

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

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

 

 

DI에는 필드 주입, Setter 주입, 생성자 주입 세가지 방법이 있다.

 

1. 생성자 주입 (생성 될때 한번 되고 변경이 불가하게 만들 수 있다.)

@Autowired
    public MemberController(MemberService mebmerService) {
        this.mebmerService = mebmerService;
    }

2. 필드 주입(별로 안좋음, 스프링 뜰 때만 주입해주고 바꿔치기 할 수가 없다.)

@Autowired  private MemberService mebmerService;

3. 세터 주입(public 으로 열려있어야 한다.)

@Autowired
    public void setMemberController(MemberService mebmerService) {
        this.mebmerService = mebmerService;
    }
반응형