본문 바로가기
Back-End/Spring Boot

스프링 빈과 의존관계 - 자바 코드로 직접 스프링 빈 등록하기

by 달의 조각 2022. 2. 25.
이 글은 김영한 님의 스프링 입문 강의(https://inf.run/hcic)를 수강하며 학습한 내용을 정리한 글입니다.

 

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

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

Service의 @Service, @Autowired와 Repository의 @Repository, @AutowiredController는 그대로 둔다
→ Controller는 컴포넌트 스캔으로 컨테이너에 올라가고, 때문에 @Controller와 @Autowired가 사용된다

 

˙ SpringConfig클래스 생성

@Configuration
@Bean

 

실습에서 메모리 리포지토리를 다른 리포지토리로 변경할 예정이므로,
컴포넌트 스캔 방식 대신에 자바 코드로 스프링 빈을 설정한다

 

DI 3가지 방법

1. 필드 주입

//필드 주입
//좋은 방법 X 바꿀 수 있는 방법이 없다

@Controller
public class MemberController {

    @Autowired private MemberService memberService;
    }
}

 

2. setter 주입

누군가 MemberController를 호출할 때 public으로 열려 있어야 한다(setter)
애플리케이션 조립 시점에 한번 세팅되면 변경할 일이 없도록 해야 하는데,
다른 개발자도 접근 가능하게 열려 있으므로 잘못 바뀌어서 문제가 생길 수도 있다

//setter 주입

@Controller
public class MemberController {

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

 

3. 생성자 주입

의존관계가 실행 중에 동적으로 변하는 경우(런타임, 서버가 열린 상태에서 바뀌는 것)는 거의(아예) 없으므로 생성자 주입을 권장한다

//생성자 주입 - 권장
//memberService가 생성자를 통해 MemberController에 주입된다

@Controller
public class MemberController {

    private final MemberService memberService;

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

 

˙ XML로 설정하는 방식은 최근 잘 사용하지 않는다

˙ 실무
    컴포넌트 스캔: 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드
    스프링 빈: 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면(현재 예제)
                   설정을 통해 스프링 빈으로 등록
                   → 다른 소스 코드의 수정 없이 변경이 가능하다

˙ 주의
   @Autowired를 통한 DI는 helloConroller, memberService 등과 같이 스프링이 관리하는 객체에서만 동작
   스프링 빈으로 등록하지 않고 내가 직접 생성한 객체(스프링 컨테이너 외)에서는 동작하지 않는다

 

댓글