인프런 커뮤니티 질문&답변

YUNHA PARK님의 프로필 이미지
YUNHA PARK

작성한 질문수

스프링 핵심 원리 - 기본편

전체 흐름 정리

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

해결된 질문

작성

·

453

4

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]

안녕하세요 객체지향 개발에 관심이 생겨 공부중인 개발자 입니다.

좋은 강의 잘 듣고 있습니다.

 

한번에 하나의 할인 정책을 적용하는 경우는 AppConfig에서 지정을 해주면 되는데 만약 동시에 두 개 이상의 할인 정책을 적용하는 경우 어떤 방법으로 구현하면 좋을지 궁금해서 질문드립니다.

 

1. 현재 적용하고 있는 할인 정책이 하나인 경우

 

아래와 같이 AppConfig에서 제어흐름을 담당하면서 어떤 할인 정책을 적용할지 결정을 한다는 점은 이해했습니다.

 

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

 

2. 할인 정책을 모두(정액, 정률) 사용하고 싶은 경우

 

예를 들어 할인 정책을 적용할 수 있는 쿠폰이 정액, 정률 두 개가 동시에 존재한다고 했을 때 클라이언트의 변경 없이(OCP) 할인정책을 적용하고 싶다면 AppConfig 에서 `discountPolicy()` 메소드를 호출할 때 정률 할인 쿠폰인 경우 `new RateDiscountPolicy()`를 리턴해야하고 정액 할인 쿠폰인 경우 `new  FixDiscountPolicy()`를 리턴해줘야 합니다.

 

2-1. AppConfig 를 인터페이스로 변경하고 구현체를 별도로 생성

 

public class FixDiscountAppConfig implements AppConfig {
    …
}

 

public class RateDiscountAppConfig implements AppConfig {
    …
}

 

// OrderApp
AppConfig appConfig;

if (“정률할인 쿠폰”) {
 appConfig = new RateDiscountAppConfig();
} else If (“정액할인 쿠폰”) {
 appConfig = new FixDiscountAppConfig();
}

AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
OrderService orderService = appConfig.orderService();

 

 

2.2 AppConfig 내 discountPolicy 메소드 호출 시 파라미터를 넘겨 구분

 

public DiscountPolicy discountPolicy(String 할인정책) {
 if (“정액”.equals(할인정책)) {
  return new FixDiscountPolicy();
 } else {
  return new RateDiscountPolicy();
 } 
}

 

한번에 하나의 정책을 적용하는 것보단 동시에 여러 정책을 적용하는 경우가 더 많을 것 같다고 생각이 들었습니다. 이 경우에는 어떤 방식으로 구현하는게 좋은 객체 지향원칙을 지키며 구현하는 것일지 조언을 구하고자 합니다.

답변 1

1

안녕하세요, YUNHA PARK 님. 공식 서포터즈 codesweaver 입니다.
.
2에서 작성한 코드처럼 분기를 주는 방법을 사용합니다. 

이런 방법을 '팩토리 패턴'이라고 합니다. 디자인 패턴 중 하나죠.

스스로 해결 방법을 생각해 내시다니 대단합니다 :)

추가로, 파라미터를 String으로 넘겨도 좋지만, Enum으로 정형화 한다면 엉뚱한 값이 들어올 가능성을 없앨 수 있겠죠.

 

팩토리 패턴과 관련한 추가정보는 아래 링크를 확인해주세요.

https://jusungpark.tistory.com/14
.
감사합니다.

 

YUNHA PARK님의 프로필 이미지
YUNHA PARK
질문자

네 답변 감사합니다.

제가 고민하고 있던 내용이 이미 좋은 기술과 이름으로 사용되고 있었군요. ㅎㅎ

이해하기 쉬운 사례가 담긴 블로그글을 소개해 주셔서 감사합니다.

많은 도움이 되었습니다!

YUNHA PARK님의 프로필 이미지
YUNHA PARK

작성한 질문수

질문하기