[OOP] 의존성 주입(Dependency Injection)을 통한 설계 원칙 준수: Java에서의 DIP 원칙 적용 사례

객체지향적 코드 작성과 DIP 원칙의 중요성

객체지향 프로그래밍을 하다 보면, 때때로 구현체에 의존하게 되는 상황이 발생합니다. 이는 DIP(의존 관계 역전 원칙) 원칙을 어기는 사례로 볼 수 있습니다. DIP는 객체지향 설계의 SOLID 원칙 중 마지막 원칙으로, "추상화에 의존해야 하며, 구체화에 의존하면 안 된다"는 원칙을 강조합니다.


DIP 원칙 위반 사례

아래 예시는 간단한 상품 구매 및 회원 관리 시나리오에서 DIP 원칙을 어기는 경우를 보여줍니다.

시나리오에는 OrderService 인터페이스와 그 구현체인 OrderServiceImpl, 그리고 MemberRepository 인터페이스와 그 구현체인 MemoryMemberRepository, DbMemberRepository가 있습니다. 또한, DiscountPolicy 인터페이스와 그 구현체인 FixDiscount, RateDiscount가 존재합니다.

초기 코드는 다음과 같습니다:

public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
MemberService memberService = new MemberServiceImpl(new MemoryMemberRepository());
Member memberA = new Member(1L, "memberA", Grade.VIP);
memberService.join(memberA);

Member findMember = memberService.findMember(1L);
System.out.println("memberA.getName() = " + memberA.getName());
System.out.println("findMember.getName() = " + findMember.getName());
}
}
위 코드에서 MemberService는 구현체에 직접 의존하고 있습니다. 이는 DIP 원칙을 준수하지 못하는 사례입니다.

DIP 원칙 준수를 위한 해결 방안

문제를 해결하기 위해 AppConfig라는 클래스를 도입합니다. 이 클래스는 memberService 함수를 통해 구현체에 접근하고, MemberApp에서는 AppConfig 객체를 생성하여 의존성을 주입합니다.

개선된 코드는 다음과 같습니다:

public class AppConfig {


public MemberService memberService(){
return new MemberServiceImpl(new MemoryMemberRepository());
}

public OrderService orderService(){
return new OrderSeviceImpl(new MemoryMemberRepository() , new FixDiscountPolicy());
}
}
public class MemberApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
Member memberA = new Member(1L, "memberA", Grade.VIP);
memberService.join(memberA);

Member findMember = memberService.findMember(1L);
System.out.println("memberA.getName() = " + memberA.getName());
System.out.println("findMember.getName() = " + findMember.getName());
}
}

댓글

이 블로그의 인기 게시물

[AWS] openVidu(ver3) + ec2(t2.micro) 배포 실패 및 성공기