개발/Spring

[Spring] 스프링 입문 - 자바 코들 직접 스프링 빈 등록하기

y_lime 2024. 11. 7. 22:20

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

하나하나 직접 스프링한테 등록하기 !

 

@Bean 어노테이션과 @Configuration 어노테이션 ]

만약 다음과 같은 클래스를 스프링 컨테이너에 등록하고자 한다면,

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

 

설정 클래스에서 @Bean 어노테이션을 사용하여 수동으로 스프링 컨테이너에 빈을 등록한다.

이때 설정 클래스에서는 @Configuration 어노테이션을 클래스에 붙여준다.

@Bean을 사용해 수동으로 빈을 등록해줄 때에는 메소드 이름으로 빈 이름이 결정된다. 그러므로 중복된 빈 이름이 존재하지 않도록 주의해야 한다.
@Configuration
public class SpringConfig {

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

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


}

 

이제 MemberService와 MemberRepository 모두 Spring Bean에 올라간다 !!

 

What about Controller ?

컨트롤러는 어떻게 할 수가 없다. 그냥 @Autowired를 사용하면 된다.

어차피 @Controller를 사용하면 컴포넌트 스캔이기 때문에 상관 없음 ! !

 


 

DI (Dependency Injection)의 3가지 종류

  1. 필드 주입 (비추천)
  2. setter 주입 (비추천)
  3. 생성자 주입 (추천)

필드 주입

아예 필드에서 주입을 하는 방법 (not recommended)

@Controller
public class MemberController {

    @Autowired private  MemberService memberService;

}

Setter 주입

setter을 통해서 주입되는 방법 (not recommended)

단점 : 누군가가 MemberController를 호출했을 때 public으로 되어있어야함→ 아무 개발자가 수정 가능 → 중간에 잘 못 바꾸면 문제 발생 !

@Controller
public class MemberController {

    private MemberService memberService;

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

생성자 주입

ex ) 생성자를 통해서 MemberService가 MemberController로 들어온다. (RECOMMENDED)

@Controller
public class MemberController {

    private final MemberService memberService;

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

 



정형화된 컨트롤러, 서비스, 리포지토리  → 컴포넌트 스캔 사용
정형화 되지 않거나, 상황에 따라 구현 클래스를 변경 필요 →  설정을 통해 스프링 빈으로 등록

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

@참고자료

[인프런] 김영한 - 스프링 입문 강의 (무료)