본문 바로가기
프레임워크/Spring

[spring]스프링 핵심 원리 - 기본편 섹션 3

by 오오오니 2022. 3. 26.

섹션 3. 스프링 핵심 원리 이해2 - 객체 지향 원리 적용

 

Ctrl +shift +T를 누르면 다음과 같이 뜬다.

 

 

 

성공테스트도 중요하지만 실패테스트도 꼭 만들어 봐야한다.

 

OCP위반
인터페이스에만 의존 but NullPointerException

어떻게 해결할까?

AppConfig

-애플리케이션의 전체 동작 방식을 구성하기 위해, "구현 객체를 생성"하고,"연결"하는 책임을 가지는 별도의 설정 클래스를 만들자

package hello.core;

import hello.core.discount.FixDiscountPolicy;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;

public class AppConfig {

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

    public OrderService orderService(){
        return new OrderServiceImpl(new MemoryMemberRepository(),new FixDiscountPolicy());
        //생성자 주입
        
    }


}

Appconfig는 애플리케이션의 실제 동작에 필요한 "구현 객체를 생성"한다.

 

Ctrl + E 과거 히스토리가 나온다.

 

DIP완성

memberServiceImpl 입장에서 보면 의존관계를 마치 외부에서 주입 해주는 것  같다고 해서

DI (Dependency Injection) 우리말로 의존관계 주입 또는 의존성 주입이라 한다.

AppConfig 리팩터링

 

package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;

public class AppConfig {

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


    private MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    public OrderService orderService(){
        return new OrderServiceImpl(new MemoryMemberRepository(),discountPolicy());
    }

    public DiscountPolicy discountPolicy(){
        return new FixDiscountPolicy();
    }

}

리팩터링의 장점

new MemoryMemberRepository() 이 부분이 중복 제거되었다.

이제 MemoryMemberRepository를 다른 구현체로 변경할 때 한 부분만 변경하면 된다.

AppConfig를 보면 역할과 구현 클래스가 한눈에 들어온다. 애플리케이션 전체 구성이 어떻게 되어있는지 빠르게 파악할 수 있다.

 

새로운 구조와 할인 정책 적용

앞으로 할인 정책을 변경해도, 애플리케이션의 구성 역할을 담당하는 AppConfig만 변경하면 된다. 클라이언트 코드인

OrderServiceImpl를 포함해서 사용 영역의 어떤 코드도 변경할 필요가 없다.

 

 

출처

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com