스프링 입문 맛보기 4

Spring 정리 2021. 7. 6. 20:49

인프런 강의 4일차.

 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (김영한 강사님)

 

1. 자바 코드로 직접 스프링 빈 등록해보기

 - @Bean 애노테이션을 통해 직접 스프링 빈 등록이 가능하다.

 - Service, Repository 전부 @Bean으로 설정이 가능하나, @Controller는 선언이 불가능하기에 항상 DI로 사용.

 - 과거엔 java 코드로 설정하지 않고 xml 문서로 설정하기도 했으나 실무에서 xml 문서로 설정하는 경우는 거의 없다.

package hello.hellospring;

import hello.hellospring.Service.MemberService;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {

    //사용자가 직접 Spring Bean 등록
    //Spring이 올라올 때 @Bean에 등록된 빈을 직접 넣어준다.
    //@Controller는 어쩔 수 없이 자동 의존관계 선언이 필요하다.
    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }

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

  

2. Dependency Injection 3가지 방법

 - field 주입 : 스프링 최초 실행 때 주입된 내용을 바꿀 수 없기 때문에 사용되지 않음.

 - Setter 주입 : setter()를 통해 주입되지만, 누군가 세터를 호출할 수 있게 public으로 열려있어야 하는 단점이 있다. (서비스는 어플리케이션 로딩 중 컨테이너 세팅할 때 바꾸는 것이지 중간에 바뀔 이유가 없기 때문에 public은 단점임)

 - Constructor 주입

  * 의존관계가 실행중에 동적으로 변경되는 경우는 거의 없기 때문에 Contructor 주입으로 구현하는 것을 권장함.

//필드 주입
@Autowired private MemberService memberService;

//세터 주입
@Autowired
public void setMemberService(MemberService memberService) {
	this.memberService = memberService;
}

//생성자 주입
@Autowired
public MemberController(MemberService memberService){
    this.memberService = memberService;
}

 

3. 참고

 - 실무에서는 주로 정형화된 컨트롤러, 서비스, 리파지토리 같은 코드는 컴포넌트 스캔을 통해 사용한다.

 - 정형화되지 않거나 상황에 따라 구현 클래스를 변경해야하면 @Bean을 통해 스프링 빈으로 등록 후 사용한다.

 - @Bean으로 등록한 경우 특정 상황 (예를 들어 DB가 변경될 경우) 해당 @Bean이 호출하는 @Repository만 변경하여 수정이 가능하므로 설정파일 관리가 간단하다.

 

4. 주의

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

 

 

 

 

 

'Spring 정리' 카테고리의 다른 글

스프링 입문 맛보기 6  (0) 2021.08.04
스프링 입문 맛보기 5  (0) 2021.07.14
스프링 입문 맛보기 3  (0) 2021.05.04
스프링 입문 맛보기 2  (0) 2021.04.29
스프링 입문 맛보기  (0) 2021.04.28