Java/Spring Boot

Spring bin 등록하기

오개발 2021. 1. 1. 19:29

어노테이션으로 설정하기

 

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

 

참고적으로 위에 어노테이션

 

@Service은 자동으로 스프링 빈으로 등록된다.

 

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

 

@Controller

@Service

@Repository

 

스프링 빈을 등록하는 2가지 방법

 

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

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

 

 

 

자바코드로 설정하기

 

 

SpringConfig 파일 생성

@Configuration
public class SpringConfig {

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

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

 

 

1.과거 XML 문서로 설정 지금은 사용하지 않음, 코드로 설정함

 

2. DI에서 필두 

 

생성자주입

@Controller
public class MemberController {

    private final MemberService memberService;

    // 맴버 서비스를 스프링 컨테이너에 가져다가 연결시켜준다
    // 스프링 컨테이너에서 맴버서비스를 가져온다 ,
    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

필드 주입 (별루 안좋다) 

 - field injection 를 사용하면 작성된 클래스라면 단위테스트시 의존관계를 가지는 객체를 생성해서 주입할수 없다. 즉 다시 말해 스프링 빈에 등록이 되어 있어여 가져올수 있다.

 

@Controller
public class MemberController {

    @Autowired private  MemberService memberService;

    // 맴버 서비스를 스프링 컨테이너에 가져다가 연결시켜준다
    // 스프링 컨테이너에서 맴버서비스를 가져온다 ,
//    @Autowired
//    public MemberController(MemberService memberService) {
//        this.memberService = memberService;
//    }
}

set 주입

 

@Controller
public class MemberController {

    private MemberService memberService;

    // 맴버 서비스를 스프링 컨테이너에 가져다가 연결시켜준다
    // 스프링 컨테이너에서 맴버서비스를 가져온다 ,
    @Autowired
    public void setMemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

 

set 주입은 아무개발자나 호출할수 있어서 권장하지 않음

 


생성자 주입방식은 아래와 같은 장점을 가진다

  • 의존관계 설정이 되지 않으면 객체생성 불가 -> 컴파일 타임에 인지 가능, NPE 방지
  • 의존성 주입이 필요한 필드를 final 로 선언가능 -> Immutable
  • (스프링에서) 순환참조 감지가능 -> 순환참조시 앱구동 실패
  • 테스트 코드 작성 용이

필드 인젝션은 아래와 같은 장점을 가진다

  • 편하다는 것 말고는 없다

 

 

직접 bin에 구현하는 이유

 

- 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.