스프링 빈과 의존 관계

2023. 5. 2. 05:04카테고리 없음

package hello.hellospring.controller;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller //스프링 빈(컨테이너)에 넣어주고 스프링이 관리할 수 있게끔 해주는 역할.
public class MemberController {
 private final MemberService memberService;
 @Autowired // 스프링 컨테이너에서 memberService를 가져와 연결시켜주는 역할임.
 public MemberController(MemberService memberService) { // 생성자 주입 
 this.memberService = memberService;
 }
}

스프링 안에 있는 스프링 컨테이너 작동방식이다.

@Service // 스프링 컨테이너에 MemberService를 넣어주는 역할.
public class MemberService {
 private final MemberRepository memberRepository;
 @Autowired // 멤버 서비스와 레퍼지토리를 연결시켜줌.
 public MemberService(MemberRepository memberRepository) {
 this.memberRepository = memberRepository;
 }
}

@Repository // Repository를 스프링 컨테이너에 넣어주는 역할
public class MemoryMemberRepository implements MemberRepository {}


@Component // 사실 @Controller, @Service, @Repository 들은 다 @Component를 내장하고 있음. 그래서 원래는 @Component만 적어도 가능함.
           // 이것이 바로 컴포넌트 스캔과 자동 의존관계 설정이다.    
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() { //memberService를 
 return new MemberService(memberRepository());
 }
 // 위 아래 둘다 스프링 빈에 등록을 해주고 밑에서 등록했던 메모리를 위 서비스에 넣어준 다는 것이다.
 @Bean
 public MemberRepository memberRepository() { //
return new MemoryMemberRepository();
 }
}

멤버서비스가 메모리레퍼지토리를 필요로 하기때문에 먼저 둘다 빈으로 등록을 해주고, 멤버서비스에 메모리를 넣어주도록 저렇게 설계를 해주면, 아까 위에있던 멤버 컨트롤러에서 정의한 멤버서비스에 위 값을 넣어준다. 고로 다음 사진과 같은 형태가 이루어 지게 되는 것이다.

스프링 컨테이너들의 의존관계 음..약간 Controller(Service(Repository)))이런식인가,,,?

DI : DependencyInjection DI에는 3가지 주입 방식이 있다. 필드 주입, setter 주입, 생성자 주입 이렇게 있다.

생성자 주입 : 밑에 코드와 같이 생성자를 만들어서 외부에서 주입해주는 경우. (가장많이 사용하는 주입이다.)

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

필드 주입 : 필드에서 그냥 바로 적어서 만드는 것.(근데 별로 안좋음)

@Autowired private MemberService memberService;

Setter 주입 : setter로 만드는 주입이다.

private MemberService memberService;

@Autowired
publilc voidd setMemberService(MemberService memberService) {
this,memberService = memberService;
}