05 ๊ฐ๋ฐ์ผ์ง๋ฅผ ๋ณด๊ณ ์ฌ ๊ฒ์ ์ถ์ฒ๋๋ฆฐ๋น.
์์์ ๋งํ๋ค์ํผ ์ปค๋งจ๋์ ์ฟผ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ์ mock ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก๋ง๋ค์๋ค. ์์ฐ์ค๋ ๊ฐ์ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ์ฐธ์กฐ ํ ์ ์๊ฒ ๋์๋ค.
์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ ๊น?
public class BaseFakeOrderDetailRepository {
protected Long autoGeneratedId = 0L;
protected List<OrderDetail> data = new ArrayList<>();
public void clear() {
data.clear();
}
}
public class FakeOrderDetailCommendRepository extends BaseFakeOrderDetailRepository implements OrderDetailCommendRepository {
@Override
public void save(OrderDetail orderDetail) {
if (orderDetail.getId() == null || orderDetail.getId() == 0) {
ReflectionTestUtils.setField(orderDetail, "id", ++super.autoGeneratedId, Long.class);
super.data.add(orderDetail);
} else {
super.data.removeIf(item -> Objects.equals(item.getId(), orderDetail.getId()));
super.data.add(orderDetail);
}
}
}
public class FakeOrderDetailQueryRepository extends BaseFakeOrderDetailRepository implements OrderDetailQueryRepository {
@Override
public List<OrderDetail> findByOrderNoAndProduct_IdIn(String orderNo, List<Long> productIds) {
return super.data.stream()
.filter(od -> od.getOrder().getOrderNo().equals(orderNo)
&& productIds.contains(od.getProduct().getId()))
.toList();
}
}
์ด๋ฐ์์ผ๋ก ๋ถ๋ชจ์ ํ๋์ ๊ณต์ ๊ฐ์ ๋ฃ๊ณ super๋ก ์ ๊ทผํด์ ์ฌ์ฉํ๋ฉด ๋์ง ์์๊น ์ถ์๋ค.
๊ทธ๋ฐ๋ฐ ์๊ฐ๊ณผ ๋ฌ๋ฆฌ save๋ฅผ ํ๋๋ผ๋ ์ ~๋ queryRepository ์ชฝ์์ ์ฐพ์ ์ฌ ์ ์์๋ค. ์ด๋์ ๊ฐ ๋๊ธฐํ๊ฐ ์๋๋ ๊ธฐ๋ถ์ด ๋ค์๋ค.
๊ทธ๋ ๊ฒ ์์ง์์ง? ๊ณ ๋ฏผ์ ํ๋ ๋์ค ์ด๊ฑด ๋๋ฌด๋.. ๊ฐ๋จํ ์๋ฐ ๊ธฐ๋ณธ์ด์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
๋ฐ๋ก ์์ฑ์ ํธ์ถ์ ๋ถ๋ชจ์ ์์ฑ์(super())๋ฅผ ๋จผ์ ํธ์ถํ๋ค๋ ์ ์ด๋ค.
์ด๊ฒ ์? ๋ผ๊ณ ์๊ฐํ๋ค๋ฉด ์ปค๋งจ๋์์ super()๋ฅผ ํธ์ถํ๋ฉด ์ธ์คํด์ค๊ฐ ํ๋ ๋ง๋ค์ด ์ง ๊ฒ์ด๋ค. ์ด์ด์ ์ฟผ๋ฆฌ ์ชฝ์์ super()๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด ํ๋์ ์ธ์คํด์ค๊ฐ ๋ ๋ง๋ค์ด์ง ๊ฒ์ด๋ค. ์ฆ ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๊ฐ Repository์์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ๋น์ฐํ ๋๊ธฐํ๊ฐ ๋์ง ์๋ ๊ฒ์ด ๋น์ฐํ๋ค...(์ฝ์ง ํ์๊ฐ์ ํ๋ฏ,,์ด๋์ ๊ธฐ์ด๊ฐ ์ค์ํ๊ตฌ๋ ใ
ใ
)
๊ทธ๋ ๋ค๋ฉด ์ด๊ฑธ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ ๊น?
๋ฐ๋ก ์ธ์คํด์ค๋ฅผ ํ๋๋ง ๋ง๋ค๋ฉด ํด๊ฒฐ๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ก ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค..! (์ง์ง ๊ธฐ์ด์ธ๋ฐ ๋๋ฌด๋๋ฌด ๊ฐ๊ณผํด๋ฒ๋ ธ๋ค..)
@Getter
public class BaseFakeOrderDetailRepository {
@Getter
private static final BaseFakeOrderDetailRepository instance = new BaseFakeOrderDetailRepository();
private Long autoGeneratedId = 0L;
private List<OrderDetail> data = new ArrayList<>();
protected Long increaseId() {
return ++autoGeneratedId;
}
public void clear() {
data.clear();
}
}
public class FakeOrderDetailCommendRepository extends BaseFakeOrderDetailRepository implements OrderDetailCommendRepository {
@Override
public void save(OrderDetail orderDetail) {
if (orderDetail.getId() == null || orderDetail.getId() == 0) {
ReflectionTestUtils.setField(orderDetail, "id", getInstance().increaseId(), Long.class);
getInstance().getData().add(orderDetail);
} else {
getInstance().getData().removeIf(item -> Objects.equals(item.getId(), orderDetail.getId()));
getInstance().getData().add(orderDetail);
}
}
}
public class FakeOrderDetailQueryRepository extends BaseFakeOrderDetailRepository implements OrderDetailQueryRepository {
@Override
public List<OrderDetail> findByOrderNoAndProduct_IdIn(String orderNo, List<Long> productIds) {
return getInstance().getData().stream()
.filter(od -> od.getOrder().getOrderNo().equals(orderNo)
&& productIds.contains(od.getProduct().getId()))
.toList();
}
}
์์์ ๋งํ๋ค์ํผ ๋ถ๋ชจ๋ฅผ ์ฑ๊ธํค์ผ๋ก ์์ฑํ๋ฉด ๋๋ค. ์ด๋ฌ๋ฉด ์์ ์ธ์คํด์ค์์ ๋ชจ๋ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ์ฅํ๊ณ ์ฐพ์ ์ ์๊ฒ๋๋ค!!!
์ฑ๊ธํค์ ์ฃผ์ํ ์ ์ ๋ญ๋ฌ๋ญ๋ํด๋ ๋์์ฑ ๋ฌธ์ ์ด๋ค.
์ฑ๊ธํค์์ ์ ~๋ ํ๋๋ฅผ ๊ฐ์ง๊ณ ์์ด์๋ ์๋๋ค. ๊ทธ๋ฐ๋ฐ ์ง๊ธ ์ฝ๋์๋ ๊ฐ์ง๊ณ ์์ง ์๋๊ฐ?
์ด๋ ํ
์คํธ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค๊ณ ๋งํ๊ณ ์ถ๋ค. ๋์์ ์์
์ด ๋์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํ ํ์๊ฐ ์๋ค.
์ค์ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋งค์ฐ๋งค์ฐ ์กฐ์ฌํด์ผํ๋ค..
ํ๋ก์ ํธ๊ฐ ๋๋๊ณ ๋์์ธ ํจํด์ ๋ํด ์ ๋ฆฌํ๋ ค๊ณ ํ๋๋ฐ ๊ถ๊ธํ๋ค๋ฉด ๋ณธ์ธ ๋ธ๋ก๊ทธ์ ์ฑ๊ธํค ํจํด์ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค..!