inflearn logo
강의

Khóa học

Chia sẻ kiến thức

CS Knowledge Essentials | Mạng lưới thiết kế mẫu Hệ điều hành Cơ sở dữ liệu Cấu trúc dữ liệu

DI và DIP ★★★

DI 관련 질문입니다

268

poowermann

19 câu hỏi đã được viết

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

import java.util.*;

class BackendDeveloper {
  public void writeJava() {
    System.out.println("자바가 좋아 인터네셔널~");
  }
}

class FrontEndDeveloper {
  public void writeJavascript() {
    System.out.println("자바스크립트가 좋아 인터네셔널~");
  }
}

public class Project {

  private final BackendDeveloper backendDeveloper;
  private final FrontEndDeveloper frontEndDeveloper;

  public Project(
    BackendDeveloper backendDeveloper,
    FrontEndDeveloper frontEndDeveloper
  ) {
    this.backendDeveloper = backendDeveloper;
    this.frontEndDeveloper = frontEndDeveloper;
  }

  public void implement() {
    backendDeveloper.writeJava();
    frontEndDeveloper.writeJavascript();
  }

  public static void main(String args[]) {
    Project a = new Project(new BackendDeveloper(), new FrontEndDeveloper());
    a.implement();
  }
}

의존성 주입이란 객체가 필요로 하는 의존성(다른 객체나 서비스)을 외부에서 생성하여 주입하는 것으로 알고 있었습니다. 설명하실 때는 위 코드가 의존성 주입, DI가 적용되지 않은 코드라고 하셨는데, 의존성 주입의 3가지 방법중 생성자 주입 방식이 적용된 코드인 것으로 보여서 질문드립니다.
인터페이스가 아닌 구체적인 백엔드와 프론트엔드라서 DIP는 위반했지만 DI는 잘 된게 아닌지 헷갈립니다 ㅠㅠ

di 의존성주입

Câu trả lời 1

1

kundol

안녕하세요 라이언님 ㅎㅎ

네 라이언님말씀이 어느정도는 맞습니다.

 

이 예시에서 Project 클래스는 BackendDeveloper와 FrontEndDeveloper 인스턴스를 생성자를 통해 전달받습니다. 이는 생성자 주입(Constructor Injection)의 한 형태로, Project 객체가 생성될 때 필요한 의존 객체들을 외부에서 받아오게 됩니다.

즉, 생성자를 주입하고 있다는 측면에서 어느정도는 DI라고 볼 수 있습니다.

그러나 Project 클래스는 BackendDeveloperFrontEndDeveloper 클래스의 구체적인 인스턴스에 직접적으로 의존하고 있습니다.

이는 DIP를 완전히 준수하지 않습니다. 왜냐하면, Project가 구체적인 클래스가 아닌 추상화에 의존하도록 설계되어야 하지만, 코드 상에서는 직접적인 클래스 타입에 의존하고 있기 때문입니다.

즉, DIP를 준수하지 않은 DI라고 볼 수 있습니다.

여기서 보통은 DIP를 준수하지 않은 DI를 보면서 올바르게 DI가 적용되었다 라고 하지는 않습니다.

예를 들어, 어떤 서비스 클래스가 데이터베이스 접근 인터페이스에 의존하고 있을 때, 개발 환경에서는 인메모리 데이터베이스 구현을, 운영 환경에서는 실제 SQL 데이터베이스 구현을 DI를 통해 주입할 수 있습니다. 이렇게 함으로써, 서비스 클래스는 데이터베이스 접근의 구체적인 구현 방법을 몰라도 되게 만드는 것인데 이 때 DI를 적용했다라고 하면 (DIP를 따르는) DI라고 보통은 판단합니다.


해당 부분에 대한 설명은 추가로 교안내에 수정하도록 하겠습니다. 😃



또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

@Autowired를 제거해도 의존 관계 주입이 가능한지

0

256

1

(솔루션 수정)'tsyringe' Error: TypeInfo not known for "클래스명"

0

712

2

싱글톤패턴 DIP 위반

1

361

1

DI 적용해보기

1

427

2

IoC 컨테이너와 DI 컨테이너의 차이점

0

518

1

한 클래스 내 생성자가 2개 이상이면 @Autowired 붙여야만 의존관계 주입이 이뤄지나요??

0

397

1

빈으로 등록하지 않았는데 @Autowired를 통해 의존성 주입할 때 충돌이 납니다.

0

817

2

팩토리 패턴의 의존성 주입과 관련해서 질문이 있습니다!

0

686

1

DI 의존성 주입 질문

0

472

1

의존 관계 주입 @Autowired vs @Inject

0

314

0

@RequiredArgsConstructor 로 의존성 주입시, 테스트 코드 서비스 생성에러

1

279

1

BeanPropertyBindingResult 구현체가 넘어오는 과정이 궁금합니다.

1

392

1

의존성 주입에 대한 질문입니다.

0

307

1

할인 정책을 동시에 적용하고 싶은 경우 AppConfig 설정 방법

5

540

1

DI를 필드주입에서 생성자주입으로 변경하니 오류발생하였습니다.

0

1013

1

jpaRepository 의존성 주입 중복문제????

0

9332

7

@Autowired 를 통하여 여러개의 Repository 를 하나의 메소드에서 처리해도되나요?

0

881

2

질문입니다.

0

309

2

안녕하세요 영한님 @Transactional 및 open에 관하여 질문이 있습니다.

0

794

1

의존성 외부주입 관련 질문입니다!.

0

333

1