jhhan의 블로그

Spring - DI(2) 본문

Spring

Spring - DI(2)

jhhan000 2020. 9. 26. 14:29

저번 글에서 스프링에 빈을 등록하는 방법이 2가지 있다고 했습니다.

그중에서 첫번째 방법을 다뤘습니다.

이번 포스트에서는 2번째 방법을 다뤄보겠습니다.

 

2번째 방법은 자바 코드로 직접 스프링 빈을 등록하는 것입니다.

다음과 같은 프로젝트 구조로 진행합니다.

보시면 SpringConfig라는 클래스가 새로 생겼습니다. - 자바 클래스로 추가해주세요.

그리고 잠깐 해야할 일이 있습니다.

@Service, @Repository로 설정한 것을 주석 처리하거나 지워주세요
(그리고 Run을 한다면 Spring Bean에 등록되어 있지 않다는 오류가 뜰 것입니다.)

그리고 SpringConfiguration에 다음처럼 입력합니다.

@Configuration
public class SpringConfig {

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

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

 

그리고 Run을 해본다면 정상적으로 작동하는 것을 확인할 수 있습니다.

 

빈을 등록하는 2가지 방법에 대해 알아봤는데요

  1. 컴포넌트 스캔과 자동 의존관계 설정
  2. 자바 코드로 직접 스프링 빈 등록

1번이 더 편하기는 합니다.

 

** 참고로 DI 방법에는 3가지가 있습니다. **

  1. 필드 주입
  2. setter 주입
  3. 생성자 주입

일단 이 3개에 대해 알아보겠습니다.

먼저 필드주입 입니다.

기존 코드를 주석 처리하고 했습니다.

@Autowired만 붙여주면 됩니다. 제일 간단합니다.

하지만 코드를 입력하면 위의 그림처럼 노란색 밑줄이 생깁니다.

이 필드 주입은 추천하지 않는 방식이라고 뜹니다.
(스프링이 처음 실행될 때 넣고 그 다음에 중간에 바꿀 수 있는 방법이 없습니다.)

 

두번째는 setter 주입 입니다.

setter 메서드를 사용하는 것처럼 주입됩니다.

하지만 이 방식도 현 스프링에서는 권장되는 방식은 아닙니다.
(setter가 public으로 되어있어야 한다는 문제가 있다고 하네요... 자세한 것은 따로 찾아봐야 하겠습니다...)

 

세 번째는 생성자 주입입니다.

생성자를 통해 주입합니다.

이전 포스트에서 계속 썼던 방식입니다. 그리고 이 방식이 현 스프링에서 추천되는 방식입니다.
(의존 관계가 실행 중에 동적으로 변하는 경우가 거의 없기 때문)

 

** DI 방식 3가지 였습니다. **

 

 

 

일반적으로 스프링 빈 등록에 대해서는

  1. 컴포넌트 스캔과 자동 의존관계 설정: 정형화된 코드를 작성할 때 (- @Controller, @Service, @Repository가 명확할 때...?)
  2. 자바 코드로 직접 스프링 빈 등록: 정형화 되지 않았거나, 상황에 따라 구현클래스를 변경해야 하는 경우

-상황에 따라 구현클래스 변경- 을 알아보겠습니다.

  • 이전에 코드에서 MemoryMemberRepository라는 클래스를 만들어놨습니다.
  • 근데 클래스를 새로 만들어서 (예를 들어) DbMemberRepository라는 클래스를 만들었습니다.
  • 그러면 다음과 같이 하면 바로 적용이 됩니다.
@Configuration
public class SpringConfig {

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

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

MemoryMemberRepository -> DbMemberRepository로 바꾸기만 하면 끝납니다.

컴포넌트 스캔 방식을 쓴다면 바꿔야할 코드들이 좀 있습니다. (어노테이션, DI 등등)

이럴 때 자바 코드로 직접 스프링 빈 등록이 편합니다.

 

 

 

이렇게 DI와 스프링 빈 등록에 대해 알아봤습니다.

끝~

'Spring' 카테고리의 다른 글

Spring - JdbcTemplate  (0) 2020.10.17
Spring - 웹 기능(MVC)  (0) 2020.09.28
Spring - DI(의존성 주입)  (0) 2020.09.20
Spring - Test Code 작성(2)  (0) 2020.09.13
Spring - Test Code 작성  (0) 2020.09.12