스프링 핵심원리 기본편 -3

조은지·2022년 3월 3일
0

스프링 핵심원리

목록 보기
1/3

Section3 - 객체 지향 원리 적용

DIP와 OCP 위반 문제 해결

public class AppConfig {
    //애플리케이션의 전체 동작 방식을 구성하기 위해, 구현 객체를 생성하고 연결하는 책임을 가진다.

    public MemberService memberService(){
        return new MemberServiceImpl(new MemoryMemberRepository());
    }
    public OrderService orderService(){
        return new OrderServiceImpl(new MemoryMemberRepository(),new FixDiscountPolicy());
    }
}

AppConfig를 통해서 각 클래스는 실행에만 집중을 할 수 있게 되었다.

+) 위의 코드로 MemoryMemberRepository를 각각 생성하게 되면 static 변수를 사용했었기 때문에 오류는 안나지만 서비스 객체 마다 달른 레포지토리 객체를 할당받게 된다.

AppConfig 리팩토링

위에서 언급한 점을 수정한 코드

public class AppConfig {
    //애플리케이션의 전체 동작 방식을 구성하기 위해, 구현 객체를 생성하고 연결하는 책임을 가진다.

    public MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }
    public MemberService memberService(){
        return new MemberServiceImpl(memberRepository());
    }
   public OrderService orderService(){
        return new OrderServiceImpl(memberRepository(),discountPolicy());
    }
    public DiscountPolicy discountPolicy(){
        return new FixDiscountPolicy();
    }
}

+) 멤버 변수를 사용해서 생성을 하게 되면 추후 스프링에서 제공하는 기능의 지원을 받지 못한다. (@Bean, @Scope)

팩토리 패턴

부모 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며, 자식 클래스가 어떤 객체를 생성할 지 결정하도록 하는 패턴이다. 부모 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.

참조

IoC

  • 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전

  • 프레임워크와 라이브러리
    프레임워크 - 내가 작성한 코드를 제어하고, 대신 실행(Junit)
    라이브러리 - 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 라이브러리이다.

DI

  • 의존관계 주입을 사용하면 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다.
  • 의존관계 주입을 사용하면 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다.

0개의 댓글