/* ์ด ๊ธ์ ๊น์ํ๋์ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ๋ ค๊ณ ์์ฑํ ๊ธ์ ๋๋ค.
๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์ฌ๋ฆฌ๋ ๊ธ์ด๋ฏ๋ก ์ค๊ฐ ์ค๊ฐ ์ฝ๋๋ ์๋ต๋์์ต๋๋ค. */
์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์
์คํ๋ง ์ ๋ฌธ์๊ฐ ์์ ๋ฅผ ๋ง๋ค์ด๊ฐ๋ฉด์ ์คํ๋ง์ ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์คํ๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ์คํ ๋ค์ง ์ ์์ต๋๋ค., ์คํ๋ง ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์ฑ์ฅํ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ณด์ธ์! ๐ข
www.inflearn.com
์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ
1. ์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ ์ค๊ณ
์ฃผ๋ฌธ ๋๋ฉ์ธ ํ๋ ฅ, ์ญํ , ์ฑ ์
1. ์ฃผ๋ฌธ ์์ฑ : ํด๋ผ์ด์ธํธ๋ ์ฃผ๋ฌธ ์๋น์ค์ ์ฃผ๋ฌธ ์์ฑ์ ์์ฒญ
2. ํ์ ์กฐํ : ํ์ ๋ฑ๊ธ๋ณ ํ ์ธ ๊ธ์ก์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฃผ๋ฌธ์๋น์ค๋ ํ์ ์ ์ฅ์์์ ํ์์ ์กฐํํ๋ค.
3. ํ ์ธ ์ ์ฉ : ์ฃผ๋ฌธ ์๋น์ค๋ ํ์ ๋ฑ๊ธ์ ๋ฐ๋ฅธ ํ ์ธ ์ ์ฑ ์ ์์ํ๋ค
4. ์ฃผ๋ฌธ ๊ฒฐ๊ณผ ๋ฐํ : ์ฃผ๋ฌธ ์๋น์ค๋ ํ ์ธ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ ์ฃผ๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
(์ค์ ๋ก๋ DB์ ์ ์ฅํ๊ฒ ์ง๋ง, ์์ ์ด๊ธฐ ๋๋ฌธ์ ๋จ์ํ ์ฃผ๋ฌธ ๊ฒฐ๊ณผ๋ง ๋ฐํ)
์ฃผ๋ฌธ ๋๋ฉ์ธ ์ ์ฒด
โพ ์ญํ ์ ๋จผ์ ๋ง๋ค๊ณ ๊ตฌํ์ ๋ค์์ ๋ง๋ค๋ฉด ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํด์ ์ค๊ณ๊ฐ ๊ฐ๋ฅํจ.
โพ ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํ์ ์ ์ฅ์, ํ ์ธ ์ ์ฑ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์์.
โพ ์ ์ก ํ ์ธ ์ ์ฑ = 1,000์ ํ ์ธ / ์ ๋ฅ ํ ์ธ ์ ์ฑ = 10% ํ ์ธ
์ฃผ๋ฌธ ๋๋ฉ์ธ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
์ฃผ๋ฌธ ๋๋ฉ์ธ ๊ฐ์ฒด ๋ค์ด์ด๊ทธ๋จ
โพ ํ์์ ๋ฉ๋ชจ๋ฆฌ/DB์์ ์กฐํํ๊ณ ์ ์ก/์ ๋ฅ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํด๋ ์ฃผ๋ฌธ ์๋น์ค๋ ๋ณ๊ฒฝํ์ง ์์๋ ๋จ.
2. ์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ ๊ฐ๋ฐ
Order
package hello.core.order;
public class Order {
private Long memberId;
private String itemName;
private int itemPrice;
private int discountPrice;
public Order(Long memberId, String itemName, int itemPrice, int discountPrice) {
this.memberId = memberId;
this.itemName = itemName;
this.itemPrice = itemPrice;
this.discountPrice = discountPrice;
}
public int calculatePrice(){
return itemPrice - discountPrice;
}
public Long getMemberId() {
return memberId;
}
public void setMemberId(Long memberId) {
this.memberId = memberId;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public int getItemPrice() {
return itemPrice;
}
public void setItemPrice(int itemPrice) {
this.itemPrice = itemPrice;
}
public int getDiscountPrice() {
return discountPrice;
}
public void setDiscountPrice(int discountPrice) {
this.discountPrice = discountPrice;
}
@Override
public String toString() {
return "Order{" +
"memberId=" + memberId +
", itemName='" + itemName + '\'' +
", itemPrice=" + itemPrice +
", discountPrice=" + discountPrice +
'}';
}
}
๐ก ๊ถ๊ธ์ฆ 1
: toString() ๋ฉ์๋์ ๋ํด ์์ธํ ์์๋ณด์.
toString ์ด๋ ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ํํํ๋๋ฐ ์ฌ์ฉ๋๋ค. Object ํด๋์ค์ ๋ฉ์๋ ์ค ํ๋์ด๋ฉฐ ๋ชจ๋ ์๋ฐ ํด๋์ค๋ Object ํด๋์ค๋ฅผ ์์ ๋ฐ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํด๋์ค์์ `toString()` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ด ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๋ฉด ๊ฐ์ฒด์ ๋ด๋ถ ์ ๋ณด๋ฅผ ํฌํจํ ์ํ๋ ํ์์ ๋ฌธ์์ด์ ๋ฐํํ ์ ์๋ค.
OrderServiceImpl
package hello.core.order;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
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();
@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);
}
}
๐ก ๊ถ๊ธ์ฆ 1
: ๋ด๊ฐ ๊ถ๊ธํ๋๊ฑด ์๋๋ฐ ์ธํ๋ฐ ์ปค๋ฎค๋ํฐ์์ ๋ฐ๊ฒฌํ ์ง๋ฌธ๊ธ๊ณผ ๊น์ํ๋ ๋ต๋ณ
Q. Member์ ๊ฒฝ์ฐ Memberํด๋์ค์ ์์ฑ์๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๋๋ฐ Order๋ฅผ ์์ฑํ ๋๋์์ฑ์๋ฅผ ์ฌ์ฉํ์ง์๊ณ createOrder๋ฅผ ์ฌ์ฉํ๋ ์ด์ ?
A. ์ด๊ฒ์ static factory ํจํด์ด๋ผ๊ณ ํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ ํจํด์ด๋ค. https://johngrib.github.io/wiki/static-factory-method-pattern/ ์ฌ๊ธฐ ๋งํฌ ์ฐธ์กฐ.
์ถ๊ฐ๋ก Member๊ฐ์ด ์์ฑ์ด ๋จ์ํ ๊ฒฝ์ฐ์๋ ์์ฑ์๋ฅผ ๊ทธ๋ฅ ์ฌ์ฉํ๋๊ฒ ๋ ์ข์!
โญ ๊นจ๋ฌ์ ์ 1
int discountPrice = discountPolicy.discount(member, itemPrice);
: ๊ฐ์๋ฅผ ๋ณด๊ธฐ ์ ๋๋ผ๋ฉด ํ ์ธ์ ์ฑ ์ ๋ง๋ค์ด ๋๊ณ ์ฃผ๋ฌธ ๊ตฌํ ๋จ๊ณ์์ if ์ด์ฉ๊ตฌ else ์ด์ฉ๊ตฌ~ ์ด๋ ๊ฒ ๋ง๋ค์ด์ ๋์ค์ ํ ์ธ ์ ์ฑ ๋ฑ์ด ๋ฐ๋๋ฉด ํ ์ธ์ชฝ๋ ์์ ํ๊ณ ์ฃผ๋ฌธ์ชฝ๋ ์์ ํ๊ณ ์ด๋ฌ์ํ ๋ฐ
์์ ํ ์ธ๊ณผ ์ฃผ๋ฌธ์ ํ ์ผ์ ๋๋ ์ ์ค๊ณํ๋๊น ๋ณ๊ฒฝ์ด๋ ์์ ์ด ๋ง์ด ์ฉ์ดํด์ง๋ค๋ ๊ฑธ ๊นจ๋ฌ์๊ณ
์ด๋ฐ๊ฒ ๋จ์ผ ์ฑ ์ ์์น์ ์ ์งํจ ์ค๊ณ๋ผ๋๊ฑธ ์๊ฒ๋์๋ค!
3. ํ ์คํธ ์ฝ๋ ์์ฑ
OrderServiceTest
package hello.core.order;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
public class OrderServiceTest {
MemberService memberService = new MemberServiceImpl();
OrderService orderService = new OrderServiceImpl();
@Test
void createOrder(){
Long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);
}
}
์ฑ๊ณต์ด์ฅฌ~