스프링 입문 - 스프링 빈과 의존관계

hyuk·2023년 10월 5일
0
post-thumbnail

📌 컴포넌트 스캔/자동 의존관계

: MemberControllermemberServicememberRepository를 사용할 수 있도록 의존관계를 설정한다.


@Controller // 스프링에서 제공하는 @Componenet의 종류로 스프링 빈 자동 등록
public class MemberController {

  private final MemberService memberService;
 
  @Autowired // 의존관계 설정 (생성자가 1개만 있을 경, @Autowired는 생략 가능)
  public MemberController(MemberService memberService) { 
 	this.memberService = memberService;
  }
}

@Autowired 애노테이션은 연관된 스프링 빈으로 등록된 객체를 찾아 넣어준다.
이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI(Dependency Injection) 이다.

@Component가 있다면 스프링 빈으로 등록이 된다.
하위 애노테이션인 @Controller, @Service , @Repository 도 자동 등록이 된다.

스프링 빈 : Spring IoC Container가 관리하는 자바 객체
컴포넌트 스캔범위 : Application이 속한 Package를 포함한 하위 패키지의 Class

📌 (자바 코드) 스프링 빈 등록

스프링에서 제공하는 @Controller, @Service, @Repository와 같은 @Component가 아닌 설정을 통해 직접 스프링 빈을 등록하는 방법에 대해 알아보자.

main/.../SpringConfig


@Configuration
public class SpringConfig { 

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

SpringConfig 클래스를 생성한 뒤, @Bean 애노테이션으로 스프링 빈으로 등록하도록 해준다.

@Bean 애노테이션을 통해 memberServicememberRepository를 스프링 컨테이너에 등록한 뒤, memberRepositorymemberService에 주입하여 의존관계가 설정이 된다.

@Controller의 경우, 스프링이 제공하여, 스프링빈으로 자동 등록이 된다.

📌 의존성 주입 방식

필드 주입

: 외부에서 접근이 불가능하여 테스트하기 힘들다는 단점을 가지고 있어, 권장하지 않는다.

    @Autowired private final MemberService memberService;

setter 주입

: setter를 의존관계를 설정하는 방식으로, 누구나 해당 메소드를 호출할 수 있다는 단점을 가지고 있다. 한 번 주입하면 변경할 일이 드물기에 setter 주입은 좋은 방식이라 하기 힘들다.

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

생성자 주입

: 실행 중 의존관계가 동적으로 변하는 일이 거의 없기에 생성자 주입으로 의존관계 설정을 권장한다.

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

: 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용하며, 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다


📌 본 포스트는 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 통해 학습한 내용을 요약 및 정리한 것입니다.

profile
차곡차곡쌓아가는학습노트

0개의 댓글