์ ์ด ๊ธ์ ์ฐ๊ฒ ๋์์๊น?
๋ถ์์์ ์ฌ์ฉํ๋ Java ํ๋ก์ ํธ๋ฅผ Kotlin์ผ๋ก ์ ํํ๋ ์์
์ ๋งก๊ฒ ๋์๋ค.
๋ฌธ์ ๋, ์ด ํ๋ก์ ํธ์ ๋๋ฉ์ธ๋ ์ ๋๋ก ์์ง ๋ชปํ๊ณ , ๊ธฐ์กด ๊ฐ๋ฐ์๊ฐ ๋ถ์์ ๋จ์ ์์ง๋ ์์๋ค. ๊ฒ๋ค๊ฐ ์ ํ ์์
๋ง ํ ์ ์๋ ๊ฒ๋ ์๋๊ณ , ๊ธฐ์กด์ ๋ค๋ฅธ ์
๋ฌด๋ค๋ ๋ณํํด์ผ ํ๋ ์ํฉ์ด์๋ค.
์ด๋ฐ ์กฐ๊ฑด์ด๋ผ๋ฉด ๋น์ฐํ ์ค์๊ฐ ๋์ฌ ์๋ฐ์ ์๋ค. ์ฝ๋ ํ ์ค ์์ ํ ๋๋ง๋ค ‘์ด๊ฒ ์ ๋ง ์๋ ๊ธฐ๋ฅ๋๋ก ๋์ํ ๊น?’๋ผ๋ ์๋ฌธ์ด ๋ค์๋ค. ๋คํํ๋, ์ด ํ๋ก์ ํธ์๋ ํ
์คํธ ์ฝ๋๊ฐ ์ ์์ฑ๋์ด ์์๋ค. ๋๋ถ์ ํ
์คํธ ์ฝ๋๊ฐ ์์๋ค๋ฉด ํจ์ฌ ๋ ๋ง์ ์ํ์ฐฉ์ค๋ฅผ ๊ฒช์์ ๊ฒ์ด๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
์ด ๊ฒฝํ์ ๋ฐํ์ผ๋ก, ์ด๋ฒ ๊ธ์์๋ Java์์ Kotlin์ผ๋ก ์ ํํ๋ ๊ณผ์ ์์ ํ ์คํธ ์ฝ๋๊ฐ ์ด๋ค ๋์์ด ๋์๋์ง๋ฅผ ์ ๋ฆฌํ๋ ค ํ๋ค. ํนํ, ๋ ๊ฐ์ง ์ธก๋ฉด์์ ํ ์คํธ ์ฝ๋๊ฐ ์ ์ฉํ๋ค.
- ๋ณ๊ฒฝ ํ์๋ ๊ธฐ๋ฅ์ด ์ ์ ๋์ํ๋์ง ์ฆ์ ํ์ธํ ์ ์์๋ค.
- ์ด์ ๊ฐ๋ฐ์๊ฐ ๊ณ ๋ คํ๋ ํต์ฌ ๋ก์ง๊ณผ ๋น์ฆ๋์ค ๊ท์น์ ํ ์คํธ ์ฝ๋์์ ํ์ธํ ์ ์์๋ค. (๊ฐ์ธ์ ์ผ๋ก ๊ฐ๋ฐ ๊ณผ์ ์์ ์์ธ ์ผ์ข ์ ํ์คํ ๋ฆฌ ์ญํ ์ ํ๋ค๊ณ ์๊ฐํ๋ค.)
๋ถ์ ์ฝ๋ ์์ฒด๋ฅผ ๊ฐ์ ธ์์ ์ค๋ช ํ ์๋ ์๊ธฐ ๋๋ฌธ์, ์ดํดํ๊ธฐ ์ฌ์ด ๊ฐ์์ ์์คํ ์ ๋ง๋ค์ด Java์์ Kotlin์ผ๋ก ๋ณํํ๋ ๊ณผ์ ๊ณผ ํ ์คํธ ์ฝ๋์ ์ญํ ์ ์ ๋ฆฌํด ๋ณด๊ฒ ๋ค. ์ด ์์ ๋ ์ค์ ํ๋ก์ ํธ์ ์ฝ๋๊ฐ ์๋, ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ๋ง๋ ๊ฐ์์ ์ฃผ๋ฌธ(Order) ์์คํ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
๊ฐ์์ ๋๋ฉ์ธ: ์ฃผ๋ฌธ ์์คํ (Order System)
์ดํดํ๊ธฐ ์ฌ์ด ๋๋ฉ์ธ์ผ๋ก ์ฃผ๋ฌธ(Order)๊ณผ ๊ด๋ จ๋ ๊ฐ๋จํ ์์คํ
์ ์ค์ ํด๋ณด์. ์ฃผ๋ฌธ์ ์์ฑํ๊ณ , ์ด ๊ธ์ก์ ๊ณ์ฐํ๋ฉฐ, ํ ์ธ ์ ์ฑ
๋ฐ ์ถ๊ฐ ๋น์ฉ(์: ๋ฐฐ์ก๋น, ์ฟ ํฐ ์ ์ฉ ๋ฑ)์ด ํฌํจ๋ ๋ก์ง์ ๊ตฌํํ๋ค.
ํ์ง๋ง, ๋๋ฉ์ธ๊ณผ ๊ธฐํ ์๊ตฌ์ฌํญ์ ์ ํํ ์ดํดํ์ง ๋ชปํ ์ํ์์ Kotlin์ผ๋ก ๋ณํํ๋ ๊ณผ์ ์์ ์ด๋ค ์ค์๊ฐ ๋ฐ์ํ ์ ์๋์ง๋ ํจ๊ป ์ดํด๋ณด๊ฒ ๋ค.
๊ธฐ์กด Java ์ฝ๋
import java.util.List;
public class OrderService {
public int calculateTotalPrice(List<OrderItem> items, DiscountPolicy discountPolicy, ShippingFeeCalculator shippingFeeCalculator) {
int total = items.stream()
.mapToInt(item -> item.getPrice() * item.getQuantity())
.sum();
total = discountPolicy.applyDiscount(total);
return total + shippingFeeCalculator.calculateShippingFee(total);
}
}
public class DiscountPolicy {
public int applyDiscount(int totalPrice) {
if (totalPrice >= 500) return totalPrice - 50;
if (totalPrice >= 300) return totalPrice - 20;
return totalPrice;
}
}
public class ShippingFeeCalculator {
public int calculateShippingFee(int totalPrice) {
return totalPrice >= 400 ? 0 : 30;
}
}
Java ํ ์คํธ ์ฝ๋
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import java.util.Arrays;
class OrderServiceTest {
@Test
void testCalculateTotalPrice() {
OrderService orderService = new OrderService();
DiscountPolicy discountPolicy = new DiscountPolicy();
ShippingFeeCalculator shippingFeeCalculator = new ShippingFeeCalculator();
List<OrderItem> items = Arrays.asList(
new OrderItem(200, 2),
new OrderItem(100, 1)
);
assertEquals(430, orderService.calculateTotalPrice(items, discountPolicy, shippingFeeCalculator));
}
}
Java → Kotlin ์ ํ ํ ์ฝ๋ (์๋ชป๋ ๋ณํ)
๋จ์ํ Java ์ฝ๋๋ฅผ Kotlin ๋ฌธ๋ฒ์ผ๋ก ์ฎ๊ธฐ๋ ๊ฒ๋ง ์๊ฐํ๋ค๊ฐ ์ฝ๋ ๋ก์ง์ ์ ๋๋ก ์ดํดํ์ง ์๊ณ ๋ณํํ๋ฉด ํ ์ธ ์ ์ฑ ๊ณผ ๋ฐฐ์ก๋น ๊ณ์ฐ์ด ๋น ์ง๋ ์ค์๋ฅผ ์ ์ง๋ฅผ ์ ์๋ค.
๋ณํ๋ (์๋ชป๋) Kotlin ์ฝ๋
class OrderService {
fun calculateTotalPrice(items: List<OrderItem>): Int {
return items.sumOf { it.price * it.quantity }
}
}
Kotlin ํ ์คํธ ์ฝ๋ ์คํ ๊ฒฐ๊ณผ (์คํจ)
class OrderServiceTest {
@Test
fun `์ด ์ฃผ๋ฌธ ๊ธ์ก ๊ณ์ฐ`() {
val orderService = OrderService()
val items = listOf(
OrderItem(200, 2),
OrderItem(100, 1)
)
assertEquals(430, orderService.calculateTotalPrice(items)) // ์คํจ: ํ ์ธ ์ ์ฑ
, ๋ฐฐ์ก๋น ๊ณ์ฐ ๋๋ฝ๋จ
}
}
๊ฒฐ๊ณผ์ ์ผ๋ก ํ
์คํธ๊ฐ ์คํจํ๋ค. ์๋๋ 430์ด ๋์์ผ ํ๋๋ฐ, ํ
์คํธ ๊ฒฐ๊ณผ๋ 500์ด ๋์จ๋ค. ์ด์ ์ฝ๋์์ ์กด์ฌํ๋ ํ ์ธ ์ ์ฑ
๊ณผ ๋ฐฐ์ก๋น ๊ณ์ฐ์ด ์ ์ฉ๋์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
Kotlin์ผ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์์ ํ ์ฝ๋
ํ ์คํธ ์ฝ๋ ๋๋ถ์ ๋ฌธ์ ๋ฅผ ๋น ๋ฅด๊ฒ ๋ฐ๊ฒฌํ๊ณ ์์ ํ ์ ์์๋ค.
์์ ๋ Kotlin ์ฝ๋
class OrderService {
fun calculateTotalPrice(items: List<OrderItem>, discountPolicy: DiscountPolicy, shippingFeeCalculator: ShippingFeeCalculator): Int {
val total = items.sumOf { it.price * it.quantity }
val discountedTotal = discountPolicy.applyDiscount(total)
return discountedTotal + shippingFeeCalculator.calculateShippingFee(discountedTotal)
}
}
๋ค์ ์คํํ ํ ์คํธ ์ฝ๋ (์ฑ๊ณต)
class OrderServiceTest {
@Test
fun `์ด ์ฃผ๋ฌธ ๊ธ์ก ๊ณ์ฐ`() {
val orderService = OrderService()
val discountPolicy = DiscountPolicy()
val shippingFeeCalculator = ShippingFeeCalculator()
val items = listOf(
OrderItem(200, 2),
OrderItem(100, 1)
)
assertEquals(430, orderService.calculateTotalPrice(items, discountPolicy, shippingFeeCalculator)) // ์ฑ๊ณต
}
}
๊ทธ๋์ ๊ฒฐ๋ก ์?
์ฒ์์๋ ๋จ์ํ ์ฝ๋๋ฅผ Kotlin์ผ๋ก ์ฎ๊ธฐ๋ ์์
๋ง ํ์ง๋ง, ํ
์คํธ๊ฐ ์คํจํ๋ฉด์ ๋์น ์๊ตฌ์ฌํญ์ ๊นจ๋ฌ์ ์ ์๋ค. ๋ง์ฝ ํ
์คํธ ์ฝ๋๊ฐ ์์๋ค๋ฉด, ์ค์ํ ์ฑ๋ก ๋ฐฐํฌ๋ ๊ฐ๋ฅ์ฑ์ด ์ปธ์ ๊ฒ์ด๋ค.
์ด์ฒ๋ผ, ํ ์คํธ ์ฝ๋๋ ๋จ์ํ ๋ฒ๊ทธ๋ฅผ ์ก๋ ๊ฒ ์ด์์ ์ญํ ์ ํ๋ค.
- ์ฝ๋ ๋ณ๊ฒฝ ํ ์ ์ ๋์ํ๋์ง ํ์ธํ๋ ์์ ๋ง ์ญํ ์ ํ๊ณ ,
- ์ด์ ๊ฐ๋ฐ์๊ฐ ๊ณ ๋ คํ๋ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ท์น์ ๋ณด์กดํ๋ ์ญํ ๋ ํ๋ค.
- ๋ฌธ์๋ฅผ ๋จ๊ธฐ์ง ์๋๋ผ๋, ํ ์คํธ ์ฝ๋๋ง ๋ณด๋ฉด ์ด๋ค ์๊ตฌ์ฌํญ์ด ์์๋์ง ์ถ๋ก ํ ์ ์๋ ๊ฐ๋ฐ ํ์คํ ๋ฆฌ ์ญํ ์ ํ๋ค.
ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ท์ฐฎ์ ์๋ ์์ง๋ง, ๊ฒฐ๊ตญ ๋ฏธ๋๋ฅผ ์ํ ๋ณดํ๊ณผ๋ ๊ฐ๋ค. Kotlin ์ ํ์ ํ๋ฉด์ ํ
์คํธ ์ฝ๋ ๋๋ถ์ ์๋ง์ ์ํ์ฐฉ์ค๋ฅผ ์ค์ผ ์ ์์๊ณ , ๊ฐ๋ฐ์๊ฐ ๋ฐ๋๋๋ผ๋ ์ฝ๋์ ์ ๋ขฐ์ฑ์ ์ ์งํ ์ ์์๋ค.
๊ทธ๋์, ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋จ์ํ '์ ํ'์ด ์๋๋ผ, ๋ ์ข์ ๊ฐ๋ฐ์ ์ํ ํ์ ๊ณผ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค. (๋ค๋ง, ํ ์คํธ ์ฝ๋์ ์ค์์ฑ์ ๊นจ๋ฌ์๋ค๊ณ ํด์ ๋ฐ๋์ TDD๊ฐ ํ์๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ ์๋๋ค. ์ด๋ ๋ ๋ค๋ฅธ ๋ ผ์์ ์์ญ์ด๋ผ๊ณ ์๊ฐํ๋ค...)
'ํ๊ธฐ, ํ๊ณ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ค ๊ฐ๋ฐ์๋ก์์ ์ฑ์ฅ์ ๋ํด ๊ณ ๋ฏผํ๋ฉฐ (0) | 2025.03.30 |
---|---|
๊ฐ๋ฐ์ ์ทจ์ ํ๊ณ ์ ํฌํธํด๋ฆฌ์ค (8) | 2022.08.17 |
AWS CLF-C01 ์ทจ๋ ํ๊ธฐ (0) | 2022.03.17 |