Spring 의존관계 주입(DI) 방법 4가지

2708 단어 SpringSpring

스프링의 의존관계 주입

스프링은 컴포넌트 스캔을 통해 Bean을 자동으로 생성하고 스프링 컨테이너에 해당 Bean들을 저장하여 관리한다.
Bean들을 자동으로 생성할 때 스프링 내부에서 자동으로 의존관계들을 주입하는 4가지 방법이 있다. 알아보자!

1. 생성자(constructor) 주입

생성자를 통해 의존관계를 주입하는 방법이다.
의존관계가 불변이거나, 필수 의존관계에 사용하면 좋다.

@Component
public class TestServiceImpl implements TestService{
    private final TestRepository testRepository;
    private final TestPolicy testPolicy;

    @Autowired //생성자가 1개일 경우 생략 가능
    public TestServiceImpl(TestRepository testRepository, TestPolicy testPolicy) {
        this.testRepository = testRepository;
        this.testPolicy = testPolicy;
    }
}

생성자가 1개일 경우 @Autowired를 생략 할 수 있다.

lombok을 사용 할 경우 @RequiredArgsConstructor를 통해 코드를 더 간단히 할 수 있다.

@Component
@RequiredArgsConstructor
public class TestServiceImpl implements TestService{
    private final TestRepository testRepository;
    private final TestPolicy testPolicy;
}

2. 수정자(setter) 주입

수정자(setter)를 통해 의존 관계를 주입하는 방법이다.
의존관계가 선택적으로 주입되거나, 변경 가능성이 있는 의존관계에 사용하면 좋다.
setter를 public으로 열어두어야 하기 때문에 누군가 변경 할 여지가 있어서 좋은 방법은 아니다.

@Component
public class TestServiceImpl implements TestService{
    private TestRepository testRepository;
    private TestPolicy testPolicy;

    @Autowired
    public void setTestRepository(TestRepository testRepository) {
        this.testRepository = testRepository;
    }

    @Autowired
    public void setTestPolicy(TestPolicy testPolicy) {
        this.testPolicy = testPolicy;
    }
}

만약 스프링 프로젝트를 시작할 때 주입할 대상없이 일단 동작하게 하려면 '@Autowired(required = false)'로 지정해주면 된다

3. 필드 주입

필드에서 바로 주입하는 방법이다.
코드가 간결하여 사용하기는 편하지만, 외부에서 변경이 불가능하여 테스트하기 어렵다.
추가로 DI 프레임워크가 없으면 아무것도 할 수 없다는 단점이 있다.
있다는 것만 알아두고 사용하지 말자. (Test할때는 사용해도 OK)

@Component
public class TestServiceImpl implements TestService{
    @Autowired
    private TestRepository testRepository;

    @Autowired
    private TestPolicy testPolicy;
}

4. 일반 메서드 주입

일반 메서드를 통해 주입하는 방법이다.
일반적으로 사용하지 않는다.
참고로만 알아두고 사용하지 말자.

@Component
public class TestServiceImpl implements TestService{
    private TestRepository testRepository;

    private TestPolicy testPolicy;

    @Autowired
    public void init(TestRepository testRepository, TestPolicy testPolicy) {
        this.testRepository = testRepository;
        this.testPolicy = testPolicy;
    }
}

내용 출처 : https://www.inflearn.com/users/@yh

좋은 웹페이지 즐겨찾기