์๋ก์ด ํ ์ธ ์ ์ฑ
์ ํ์ฅํด๋ณด์.
๊ฐ์๋ฅผ ๋ณด๊ธฐ์ ์
์ค์ค๋ก ์๋ก์ด ํ ์ธ ์ ์ฑ ( ์ ๋ฅ ํ ์ธ ) ์ผ๋ก ๋ณ๊ฒฝํ๋ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์๋ค.
1. RateDiscountPolicy ํด๋์ค๋ฅผ ์์ฑํ๊ณ (๊ตฌํ์ฒด ์์ฑ) ์ด๊ฒ์ DiscountPolicy Interface(์ญํ ) ๋ฅผ implements ํ๋ค
2. RateDiscountPolicy ๊ตฌํ์ฒด์ ๋ฉ์๋๋ฅผ ์์ฑํด๋ณด์ ( ์ค๋ฒ๋ผ์ด๋ฉ )
์ฝ๋
package hello2.demo.discount;
import hello2.demo.member.Grade;
import hello2.demo.member.Member;
public class RateDiscountPolicy implements DiscountPolicy {
private double DiscountRate = 0.1; // 10% ํ ์ธ
@Override
public int discount(Member member, int price) {
if (member.getGrade() == Grade.VIP){
return (int)(price * DiscountRate);
}
else {
return 0;
}
}
}
ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์
@Test
@DisplayName("VIP๋ 10% ํ ์ธ์ด ์ ์ฉ๋์ด์ผ ํ๋ค")
class RateDiscountPolicyTest {
RateDiscountPolicy discountPolicy = new RateDiscountPolicy();
@Test
@DisplayName("VIP๋ 10% ํ ์ธ์ด ์ ์ฉ๋์ด์ผ ํ๋ค")
void vip_o() {
//given
Member member = new Member(1L,"memberVIP",Grade.VIP);
//when
int discount = discountPolicy.discount(member, 10000);
//then
assertThat(discount).isEqualTo(1000);
}
@Test
@DisplayName("VIP๊ฐ ์๋๋ฉด ํ ์ธ์ด ์ ์ฉ๋์ง ์์์ผ ํ๋ค")
void vip_x() {
//given
Member member = new Member(2L,"memberBASIC",Grade.BASIC);
//when
int discount = discountPolicy.discount(member, 10000);
//then
assertThat(discount).isEqualTo(0);
}
}
3. ์๋ก์ด ํ ์ธ ์ ์ฑ ์ ์ฉ
OrderServiceImpl ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ๋ณ๊ฒฝ
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
๋ฌธ์ ์ ์ด ๋ฐ์ํ๋ค
FixDiscountPolicy -->. RateDiscountPolicy ๋ก ๋ณ๊ฒฝํด์ผํจ ( OCP ์๋ฐ )
OrderServiceImpl ์ฝ๋๋ฅผ ์์ ํด์ผํ๋ค
OCP ๊ฐ๋ฐฉ-ํ์ ์์น ( open/closed principle )
- ์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค.

์ถ์(์ธํฐํ์ด์ค) ์์กด: DiscountPolicy
๊ตฌ์ฒด(๊ตฌํ) ํด๋์ค: FixDiscountPolicy , RateDiscountPolicy
DIP ์์กด๊ด๊ณ ์ญ์ ์์น ( Dependency inversion principle )
" ์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์ ๋๋ค. "
- ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ๋ง๊ณ , ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป์ด๋ค.
์ธํฐํ์ด์ค์ ์์กดํ์ง๋ง , ๊ตฌํ ํด๋์ค๋ ๋์์ ์์กดํ๋ค.
์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ์ค๊ณ๋ฅผ ํด์ผ ํ๋ค.
๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น(SOLID)
https://endyd1567.tistory.com/172
[์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ] - 2. ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น(SOLID)
์ ๋ ๋ฉด์ ๊ด์๊ฒ ๊ฑธ๋ฆฌ๋ฉด ๋ฌผ์ด๋ณผ ์๋ ์๋ค๋ ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น SOLID๋ฅผ ์์๋ณด์... SRP ๋จ์ผ ์ฑ ์ ์์น ( single responsibilty principle ) - ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค. - ํ๋
endyd1567.tistory.com
DIP๋ฅผ ์๋ฐํ์ง ์๋๋ก ์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ์์กด๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ์ค๊ณ๋ฅผ ๋ณ๊ฒฝํ์
private DiscountPolicy discountPolicy;
๊ตฌํ์ฒด๊ฐ ์์ด์ NPE(null point exception)๊ฐ ๋ฐ์ํ๋ค

ํด๊ฒฐ๋ฐฉ์
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋๊ตฐ๊ฐ๊ฐ ํด๋ผ์ด์ธํธ์ธ OrderServiceImpl ์ DiscountPolicy ์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ์์ฑํ๊ณ ์ฃผ์ ํด์ฃผ์ด์ผ ํ๋ค.
์ถ์ฒ:
์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์
์คํ๋ง ์ ๋ฌธ์๊ฐ ์์ ๋ฅผ ๋ง๋ค์ด๊ฐ๋ฉด์ ์คํ๋ง์ ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์คํ๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ์คํ ๋ค์ง ์ ์์ต๋๋ค., - ๊ฐ์ ์๊ฐ | ์ธํ๋ฐ...
www.inflearn.com