chae._.chae

[Spring] 스프링 빈과 의존관계 본문

스프링

[Spring] 스프링 빈과 의존관계

walbe0528 2022. 1. 21. 21:29
728x90
반응형

controller, service, repository

  • controller를 통해서 외부 요청을 받는다
  • service에서 비즈니스 로직을 만든다
  • repository에서 데이터를 저장한다

 

@Controller   // 스프링 컨테이너에 등록을 하고 사용한다
public class MemberController {

    private final MemberService memberService;

    @Autowired  // 연결(연관관계)
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

}

 

  • @Autowired를 사용해 MemberController와 memberService를 연결시켜준다. (즉, 의존성을 주입(DI)해준다.)
  • @Component : 에노테이션이 있으면 스프링 빈으로 자동 등록
  • @Component를 포함하는 @Controller, @Service, @Repository의 에노테이션도 스프링 빈으로 자동 등록된다.  

 

 

스프링 빈을 등록하는 방법

1. 컴포넌트 스캔과 자동 의존관계 설정(위에 적은 방법)

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

 

 

>> 그럼 아무데나 @Component를 넣어도 되는가? (X)

(예. java밑에 다른 패키지를 만들어서 넣는경우)

 

HelloSpringApplication에서 hello.hellospring의 하위파일들은

자동으로 스프링이 찾아서 스프링빈으로 등록한다.

hello.hellospring의 상위파일이거나 동일한 위치에 있으면 

스프링빈에서 기본적으로 탐색하지 않는다. 

(따로 설정해주면 가능)

 

 

 

 

 

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

@Configuration
public class SpringConfig {

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

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

 

  • 스프링이 @Configuration을 읽고 스프링 빈에 등록해준다. 
  • memberService와 memberRepository를 스프링 빈에 등록하고, 스프링 빈에 등록되어 있는 memberRepository를 memberService에 넣어줌.

 

 

 

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

 

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

-> 생성자 주입 (권장 방법 -> 의존관계가 실행중에 동적으로 변하지X 때문에)

 

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

 

-> setter 주입

 

 

개발 상황에서 구현클래스를 변경해야 하는 경우에는 스프링 빈에 등록해야한다. 

 

아직 데이터 저장소가 결정되지 않았으므로, 인터페이스르 MemberRepository를 설계하고, 구현체로 MemoryMemberRepository를 사용하고 있었음.

이후에 MemoryMemberRepository를 다른 repos로 변경할때, 기존의 코드를 바꾸지 않고 변경하는 방법

 

728x90