EEALL@ONCE
๐ฑ์๋น์ค ๋ถ๋ถ ๋ก์ง ๋ฐ๊พธ๊ธฐ ( OCP, DIP ๋ฌด์ ๋ฒ์ ) ๋ณธ๋ฌธ
๐ฑ์๋น์ค ๋ถ๋ถ ๋ก์ง ๋ฐ๊พธ๊ธฐ ( OCP, DIP ๋ฌด์ ๋ฒ์ )
์ฌ์ฃ์์ค 2023. 7. 3. 23:011. ์ ์์ผ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ ์ธ (๊ณํ์ ๋ฐ๋ฅด๊ธฐ๋ณด๋ค ๋ณํ์ ๋์ ์์ํ๊ธฐ๋ฅผ!)
๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด, ์ ์์ผ ๋ฐฉ์์ ์ฌ์ฉํ ์ ๋ฐ์ ์๋ค.
์ฌ์ค ๊ธฐํ์๋ ์์ ์ด ๋ญ ํ๊ณ ์ถ์์ง ์ ํํ๊ฒ ๋ชจ๋ฅผ ๋๊ฐ ๋ง๋ค! ๊ทธ๋๋ง๋ค, ๊ฐ๋ฐ์๋ ๋ง๋ค์ด์ ๋ณด์ฌ์ฃผ๊ณ ๊ธฐํ์์๊ฒ ์ญ์ผ๋ก ๋ฐฉ๋ฒ์ ์ฌ์ํ๋ค๋๊ฐ, ์๋ ๊ธฐํ์๊ฐ ์ค๊ฐ์ ์์ ์ด ๊นจ๋ซ์ง ๋ชปํ ๋ถ๋ถ์ ์ถ๊ฐํ๊ณ ์ถ์ ๋, ๋ณํ๊ฒ ์์ํด์ ๋ ๊ทธ๋ ๊ฒ ๋ง๋ค์ด์ค์ผํ๋ค.
์๋๋ฉด... ๊ธฐํ์ด๋ ๊ทธ๋ฐ๊ฑฐ๊ณ ... ๊ฐ๋ฐ์๋ ๊ทธ๊ฑธ ์คํ์ํค๋ ์ญํ ์ด๋๊น... ์ด์ฉ ์ ์๋ค.
2. ๋ค์ ๋ฐ๋ ํ ์ธ ์ ์ฑ ์ด์ผ๊ธฐ๋ก ๋์๊ฐ์
๊ณ ์ ๊ธ์ก ํ ์ธ์์
๊ณ ์ ํผ์ผํธ ํ ์ธ์ผ๋ก ๋ฐ๊พผ๋ค.
๐ฅ RateDiscountPolicy(%ํ ์ธ์จ)
package hello.core.discount;
import hello.core.member.Grade;
import hello.core.member.Member;
public class RateDiscountPolicy implements DiscountPolicy {
private int discountPercent = 10;
@Override
public int discount(Member member, int price) {
if(member.getGrade()== Grade.VIP){
return price*discountPercent/100;
}else{
return 0;
}
}
}
๐ฅ OrderServiceImpl(%ํ ์ธ์จ)
package hello.core.order;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository=new MemoryMemberRepository();
//private final DiscountPolicy discountPolicy=new FixDiscountPolicy();
private final DiscountPolicy discountPolicy=new RateDiscountPolicy();
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member=memberRepository.findById(memberId);
int discountPrice=discountPolicy.discount(member, itemPrice);
return new Order(memberId,itemName,itemPrice,discountPrice);
}
}
๐ฅ TEST
package hello.core.discount;
import hello.core.member.Grade;
import hello.core.member.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class RateDiscountPolicyTest {
RateDiscountPolicy discountPolicy=new RateDiscountPolicy();
@Test
@DisplayName("VIP๋ 10% ํ ์ธ์ด ์ ์ฉ๋์ผ ํ๋ค.")
void vip_๋ง์(){
//given
Member member=new Member(1L,"memberVIP", Grade.VIP);
//when
int discount=discountPolicy.discount(member,9000);
//then
Assertions.assertThat(discount).isEqualTo(900);
}
@Test
@DisplayName("VIP๊ฐ ์๋๋ฉด 10% ํ ์ธ์ด ์ ์ฉ๋์ง๋ง์์ผ ํ๋ค.")
void vip_์๋(){
//given
Member member=new Member(1L,"memberBasic", Grade.BASIC);
//when
int discount=discountPolicy.discount(member,10000);
//then
Assertions.assertThat(discount).isEqualTo(0);
}
}
3. ์ ํด๋น ์ฝ๋๋ OCP, DIP ๋ฌด์๋ ๊ฒ ์ผ๊น?
DIP: ์์กด๊ด๊ณ ์ญ์ ์์น (Dependency inversion principle)
ํ๋ก๊ทธ๋๋จธ๋ ์ถ์ํ์ ์์กดํด์ผ์ง ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค.
OrderServiceImpl ๊ฒฝ์ฐ ํด๋น ํด๋์ค๋ฅผ ํด๋ผ์ด์ธํธ๋ผ๊ณ ์๊ฐํ๋ฉด,
์ถ์(์ธํฐํ์ด์ค) ์์กด์ ๊ฒฝ์ฐ: DiscountPolicy์ ์์กดํ๊ณ ์๊ณ
๊ตฌ์ฒด(๊ตฌํํด๋ ์ค)์์กด์ ๊ฒฝ์ฐ: FixDiscountPolicy() -> RateDiscountPolicy()์ ์์กดํ๊ณ ์๋ค.
• OCP: ๊ฐ๋ฐฉ-ํ์ ์์น (Open/closed principle)
์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค๋ ์์น
FixDiscountPolicy() -> RateDiscountPolicy()๋ก ์ฝ๋๋ฅผ ํ์ฅํด์ ๋ณ๊ฒฝํ๋ฉด
ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ฐ๊ฟ์ค์ผํ๋ค!!
//private final DiscountPolicy discountPolicy=new FixDiscountPolicy();
private final DiscountPolicy discountPolicy=new RateDiscountPolicy();
.
.
.
๊ทธ๋ผ ์ด๋ป๊ฒ ํ๋ฉด..DIP ์ OCP๋ฅผ ์งํค๋ ํ๋ก๊ทธ๋จ์ ์ค๊ณํ ์ ์์๊น...? ๋ค์๊ธ์์ ์ด์ด ์ฐ๋๋ก ํ๊ฒ ๋ค..!!
'Spring๐ฑ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ฑ AppConfig ๋ฆฌํฉํฐ๋ง (0) | 2023.07.21 |
---|---|
๐ฑ์๋น์ค ๋ถ๋ถ ๋ก์ง ๋ฐ๊พธ๊ธฐ ( OCP, DIP ์ ์ฉ ๋ฒ์ ) (0) | 2023.07.11 |
๐ฑ๋ง์์ ์ ํ์ง ์์ ์ฌ์ฅ๊ณผ Spring์ ์ฌ์ฉํด์ ์ ์ฐํ๊ฒ ์ฝ๋๋ฅผ ์งํํ๋ ๊ฐ๋ฐ์ (0) | 2023.06.23 |
๐ฑ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID) (0) | 2023.06.23 |
๐ฑ์คํ๋ง ํต์ฌ ์ปจ์ (0) | 2023.06.23 |