인프런 커뮤니티 질문&답변

김예찬님의 프로필 이미지

작성한 질문수

Java/Spring 주니어 개발자를 위한 오답노트

설계 (1) : 의존성이란 무엇인지? (DI vs DIP)

의존성 주입에서 파라미터 주입과 필드 주입 관련 질문 드립니다.

작성

·

92

0

안녕하세요 강사님 좋은 강의 감사드립니다.

  1. 의존성 주입의 예시가 Chef의 멤버 변수에 대한 의존성 주입 예시라고 이해했는데 파라미터 주입 예시 코드에서

    Chef의 멤버변수에 값을 넣어주는 코드가 없는거 같아서 잘 이해가 되지 않아 질문드립니다.

  2. 강사님께서 7분 34초에 setter와 멤버 변수를 이용해서 받는 필드 주입이 있다고 하셨는데

    제가 다른 래퍼런스를 찾아본 결과 강사님께서 설명해주신 부분을 setter 주입이라고 하고

    필드 주입은 @Autowired 어노테이션을 통한 주입이라고 설명하더라고요 그래서 이 부분에서 혼동이 생겨 질문 드립니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

김예찬님의 질문에 답변 드리겠습니다.

  1. 의존성 주입에서 파라미터 주입(생성자 주입)은 생성자를 통해 의존성이 필요한 객체를 전달받아 멤버 변수에 할당하는 방식입니다. 예를 들어 Chef 클래스가 Knife 클래스에 의존할 경우, Chef 클래스의 생성자에서 Knife 객체를 파라미터로 받아 이를 내부 멤버 변수에 할당하는 것입니다. 아래는 Spring Framework에서 파라미터로 객체를 주입하는 코드 예시입니다.
import org.springframework.stereotype.Service;

@Service
public class MyAccountService implements AccountService {

private final RiskAssessor riskAssessor;

public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}

// ...
}

이 코드 예시처럼 MyAccountService 클래스는 생성자를 통해 RiskAssessor 객체를 파라미터로 받고, 이를 멤버 변수 riskAssessor에 할당합니다.

  1. 필드 주입은 클래스 내의 필드에 직접 @Autowired 어노테이션을 사용하여 Spring이 자동으로 해당 타입의 빈을 찾아서 할당하는 방법입니다. 반면, setter 주입은 setter 메소드에 @Autowired 어노테이션을 부여하여 해당 메소드를 통해 의존성을 주입받는 방식입니다. 두 방식은 사용하는 위치(필드 또는 setter 메소드)와 때에 따라 구분됩니다.

필드 주입 예시:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {
    @Autowired
    private RiskAssessor riskAssessor;

    // ...
}

setter 주입 예시:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {
    private RiskAssessor riskAssessor;

    @Autowired
    public void setRiskAssessor(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }

    // ...
}

이렇듯 setter와 필드 주입은 주입 방식에서 차이를 가집니다. 필드 주입은 직접 필드에 어노테이션을 붙여 사용하고, setter 주입은 setter 메소드를 통해 의존성을 주입받습니다.

질문에 대한 답변이 되었기를 바랍니다.