OOP with 의존과 DI

백엔드·2023년 9월 11일
0

OOP

목록 보기
2/2

들어가며

해당 강의를 보며 정리한 내용입니다.

의존

의존은 소프트웨어 개발에서 중요한 개념 중 하나이며, 이를 관리하는 것은 코드의 유지보수성과 확장성에 매우 중요합니다. 의존은 기능 구현을 위해 다른 구성 요소를 사용하는 것을 의미하며, 이로 인해 변경이 전파될 가능성이 있습니다.

순환 의존

순환 의존은 서로를 의존하는 상황을 가리킵니다. 이러한 순환 의존은 변경이 연쇄적으로 전파될 가능성을 높이므로 피해야 합니다. 클래스, 패키지, 모듈 등 모든 수준에서 순환 의존을 최소화하는 것이 중요합니다.

의존하는 대상이 많다면?

한 클래스에서 많은 기능을 제공하는 경우

class UserService {
  async regist(req: Request) {}

  async changePw(changeRq: ChangeRq) {}

  async blockUser(userId: string, reason: string) {}
}

하나의 클래스나 모듈에서 많은 기능을 제공하는 경우, 각 기능이 다른 의존 대상을 가질 수 있습니다. 이는 한 기능의 변경이 다른 기능에도 영향을 미칠 가능성을 높입니다. 이러한 경우에는 다음과 같은 고려 사항이 있습니다:

기능 별 분리 고려

class UserRegistService {
  async regist(changeRq: ChangeRq) {}
}

class ChangePwService {
  async changePw(req: Request) {}
}

class UserBlockService {
  async blockUser(userId: string, reason: string) {}
}

각 기능을 별도의 클래스 또는 모듈로 분리하고, 각각의 기능이 필요한 의존 대상을 가지도록 설계합니다. 이렇게 하면 각 기능이 독립적으로 변경 가능하며, 의존 대상을 최소화할 수 있습니다.

묶어보기

일부 의존 대상이 비슷한 특성을 가질 때, 이러한 의존 대상을 묶어서 공통된 기능으로 처리할 수 있습니다. 이를 통해 의존 대상을 줄이고 코드의 모듈화를 높일 수 있습니다.

의존 대상 객체를 직접 생성하면?

의존 대상 객체를 직접 생성하는 것은 변경에 취약한 코드를 만들 수 있으며, 유지보수와 테스트에 어려움을 겪을 수 있습니다.

의존 대상 객체를 직접 생성하지 않는 방법

  • 팩토리, 빌더
  • 의존 주입 (Dependency Injection)
  • 서비스 로케이터 (Service Locator)

의존 주입 (Dependency Injection)

의존 주입은 외부에서 의존 객체를 주입하는 방식으로 작동합니다. 즉, 클래스나 메서드가 직접 의존 객체를 생성하지 않고 외부에서 의존 객체를 주입받습니다. 주입되는 방법은 생성자 주입, 메서드 주입 등이 있으며, 주로 인터페이스를 통해 의존 객체를 주입받습니다.

조립기 (Assembler)

조립기는 객체 생성과 의존 주입을 처리하는 역할을 합니다. 주로 스프링 프레임워크에서 의존 주입 컨테이너를 사용하여 조립기를 구성합니다. 조립기를 사용하면 객체 생성과 의존 주입을 관리하기 편리하며, 객체의 라이프사이클을 관리할 수 있습니다.

DI의 장점

유연성: 의존 주입을 사용하면 의존 객체를 손쉽게 교체할 수 있습니다. 즉, 코드의 변경 없이 다른 의존 객체를 주입할 수 있으므로 유연성이 향상됩니다.

테스트 용이성: 의존 객체를 주입받을 수 있으므로 테스트에서 모의 객체(Mock) 또는 대역 객체(Stub)를 사용하여 테스트할 수 있습니다. 이를 통해 단위 테스트와 통합 테스트가 더 쉬워집니다.

의존 주입은 변경에 유연하게 대처할 수 있는 구조를 만들며 테스트 가능한 소프트웨어를 개발하는 데 중요한 역할을 합니다. 따라서 의존 주입을 사용하는 습관을 가지고 코드를 작성하는 것이 좋습니다.

profile
백엔드 개발자

0개의 댓글

관련 채용 정보