TL;DR
- module์ ์ฝ๋์ ์ด๋ฆยท๊ณต๊ฐ ๋ฒ์, crate๋ ์ปดํ์ผ ๋จ์, package๋ Cargo ์ค์ ยท์์กด์ฑ ๊ด๋ฆฌ ๋จ์์ ๊ตฌ๋ถ
- ํ์ผ ๋ถ๋ฆฌ ํ ์ฃผ๋ฌธยท๊ฒฌ์ ๋ binary๊ฐ ๊ฐ์ library์ ๊ฐ๊ฒฉ ๊ณ์ฐ API๋ฅผ ์ฌ์ฉํ๋ ํ์ฅ ์์
- ์ฌ๋ฌ package๋ฅผ ํจ๊ป ๊ฐ๋ฐํ ๋ ๋น๋ยทํ ์คํธ์ ๊ธฐ๋ณธ lockfileยท๋น๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ workspace์ ์ญํ
AI-assisted
1. ํจ์ ํ๋๋ก ์์ํ๋ package์ crate
๊ฐ๊ฒฉ์ ๊ณ์ฐํ๊ณ ์ถ๋ ฅํ๋ CLI๋ฅผ ๋ง๋ ๋ค๊ณ ํ์. ์ฒ์์๋ ํจ์ ํ๋์ main()์ด๋ฉด ์ถฉ๋ถํ๋ค.
cargo new shop --vcs none
cd shopsrc/main.rs์ ๋ด์ฉ์ ๋ค์์ผ๋ก ๋ฐ๊พผ๋ค.
fn total(unit_price: u32, quantity: u32) -> u32 {
unit_price * quantity
}
fn main() {
println!("{}", total(1000, 3)); // 3000
}cargo runํ๋ก์ ํธ์ ์ฃผ์ ํ์ผ์ ๋ค์๊ณผ ๊ฐ๋ค. ์ดํ 4์ ๊น์ง๋ ์ด shop ๋๋ ํฐ๋ฆฌ ์์์ ์ฝ๋๋ฅผ ์์ ํ๊ณ ๋ช
๋ น์ ์คํํ๋ค.
shop/
โโโ Cargo.toml
โโโ src/
โโโ main.rs- package:
Cargo.toml๋ก ์ด๋ฆ, ๋ฒ์ , ์์กด์ฑ๊ณผ ๋น๋ ๋์์ ๊ด๋ฆฌํ๋ Cargo ๋จ์. ์ด package์ ์ด๋ฆ์shop์ด๋ค. - crate: Rust ์ปดํ์ผ๋ฌ๊ฐ ํ๋์ ๋จ์๋ก ์ฒ๋ฆฌํ๋ ์ฝ๋. ์ฌ๊ธฐ์๋ ์คํ ํ์ผ์ ๋ง๋๋ binary crate ํ๋๊ฐ ์๋ค.
- crate root: ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๊ธฐ ์์ํ๋ ํ์ผ. ๊ธฐ๋ณธ Cargo ๊ตฌ์กฐ์์๋
src/main.rs๊ฐ binary crate์ root๋ค. - module: crate ์์์ ๊ด๋ จ ์ฝ๋๋ฅผ ๋ฌถ๊ณ ์ด๋ฆ๊ณผ ๊ณต๊ฐ ๋ฒ์๋ฅผ ๋๋๋ ๋จ์. ํ์ฌ ํจ์๋ crate์ ๋ฃจํธ module์ ์๋ค.
Rust Book 7์ฅ์ ์ฝ๋๊ฐ ๋์ด๋ ๋ ์ด ๊ตฌ์กฐ๋ฅผ ์ด๋ป๊ฒ ๋๋๋์ง ์ค๋ช
ํ๋ค.
Package์ crate๋ ๊ฐ๊ฐ Cargo์ ๊ด๋ฆฌ ๋จ์์ ์ปดํ์ผ ๋จ์์ด๋ฏ๋ก ๊ฐ์ ํ๋ก์ ํธ๋ฅผ ์ค๋ช
ํด๋ ๊ฐ๋ฆฌํค๋ ๋ฒ์๊ฐ ๋ค๋ฅด๋ค.
Cargo์ ๊ธฐ๋ณธ ๊ท์น: root ํ์ผ๊ณผ crate ์ข ๋ฅ
- Binary crate:
src/main.rs์์ ์์ํด ์คํ ํ๋ก๊ทธ๋จ์ ๋ง๋ ๋ค.- Library crate:
src/lib.rs์์ ์์ํด ๋ค๋ฅธ crate๊ฐ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.- Package ๊ตฌ์ฑ: library crate๋ ์ต๋ ํ๋, binary crate๋ ์ฌ๋ฌ ๊ฐ๋ฅผ ํฌํจ. ์ถ๊ฐ binary๋ ๋ณดํต
src/bin/์ด๋ฆ.rs์ ๋๋ค.- ํ์ผ ์: crate ํ๋์ ์ฌ๋ฌ module๊ณผ
.rsํ์ผ์ด ํฌํจ. ํ์ผ ๊ฐ์์ crate ๊ฐ์๋ ๋ณ๊ฐ๋ค.
Python ๋น๊ต: ํ๋ก์ ํธ ๊ด๋ฆฌ์ ์ฝ๋์ ์ฌ์ฉ ์ญํ
- Package ๊ด๋ฆฌ: Rust์
Cargo.toml์ Python์pyproject.toml์ ๋์ํ๋ฉฐ ์ด๋ฆยท๋ฒ์ ยท์์กด์ฑ์ ๊ด๋ฆฌํ๋ค.- Import ๋จ์: Python์์
import shop์ผ๋ก ์ฌ์ฉํ๋ package์ ์ด๋ฆ ๊ณต๊ฐ์ Rust์ module ๊ณผ ์ ์ฌ.- ์ฌ์ฉ ์ญํ : Python์ CLI ์ง์ ์ ์ Rust์ binary ์ญํ ์, importํด์ ์ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Rust์ library ์ญํ ์ ๊ฐ๊น๋ค.
2. ๋ฐฐ์ก๋น ๊ณ์ฐ์ ์ถ๊ฐํ๋ฉด์ module๋ก ๋ฌถ๋๋ค
๊ณ์ฐ์ ๋ฐฐ์ก๋น ๊ท์น์ ์ถ๊ฐํ๋ค. ์ํ ํฉ๊ณ๊ฐ 5,000 ๋ฏธ๋ง์ด๋ฉด ๋ฐฐ์ก๋น 300์ ๋ถ์ด๊ณ ๊ทธ ์ด์์ด๋ฉด ๋ฐฐ์ก๋น๋ฅผ ๋ฐ์ง ์๋๋ค.
CLI๋ ์ต์ข
๊ธ์ก๋ง ํ์ํ๋ฏ๋ก ๋ฐฐ์ก๋น ๊ณ์ฐ ํจ์๋ ๋ด๋ถ์ ๋๋ค. mod๋ก ๊ฐ๊ฒฉ ๊ณ์ฐ์ ๋ฌถ์ด src/main.rs๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊พผ๋ค.
mod pricing {
pub fn total(unit_price: u32, quantity: u32) -> u32 {
let subtotal = unit_price * quantity;
subtotal + shipping_fee(subtotal)
}
fn shipping_fee(subtotal: u32) -> u32 {
if subtotal < 5000 { 300 } else { 0 }
}
}
fn main() {
println!("{}", pricing::total(1000, 3)); // 3300
}- ์ด๋ฆ ๊ตฌ๋ถ:
pricing::total์ ๊ฐ๊ฒฉ ๊ณ์ฐ module ์์ ํจ์๋ค. ๋ค๋ฅธ module์๋total์ด๋ผ๋ ์ด๋ฆ์ ์ธ ์ ์๋ค. - ๊ณต๊ฐ ๊ธฐ๋ฅ:
pub fn total์ module ๋ฐ์main()์์ ํธ์ถํ๋ค. - ๋ด๋ถ ๊ตฌํ:
shipping_fee๋ ๊ณต๊ฐํ์ง ์์๋ค.main()์์ ์ง์ ํธ์ถํ๋ ค ํ๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋๋ค.
๋ฐฐ์ก๋น ๊ณ์ฐ ๋ฐฉ๋ฒ์ ๋ฐ๊ฟ๋ ํธ์ถ์๋ ์ต์ข
๊ธ์ก์ ๊ตฌํ๋ total()๋ง ์ฌ์ฉํ๋ค.
๊ณต๊ฐ ๋ฒ์: pub๋ ์ด๋ ๊ฒฝ๊ณ๊น์ง ํ์ฉํ๋๊ฐ
- ๊ธฐ๋ณธ ๋ฒ์: ๊ณต๊ฐํ์ง ์์ ํญ๋ชฉ์ ์ ์ํ module๊ณผ ๊ทธ ํ์ module์์ ์ฌ์ฉํ๋ค.
pub: ํญ๋ชฉ์ ๊ณต๊ฐ. ์ธ๋ถ์์ ์ ๊ทผํ๋ ค๋ฉด ๊ทธ ํญ๋ชฉ๊น์ง์ ๊ฒฝ๋ก๋ ์ ๊ทผ ๊ฐ๋ฅํด์ผ ํ๋ค.- Crate ๋ด๋ถ ๊ณต๊ฐ:
pub(crate)๋ ๊ฐ์ crate ์์์ ์ฌ์ฉํ๋๋ก ๋ฒ์๋ฅผ ์ ํํ๋ค.- ๊ฒ์ฌ ๋์: ๊ฒฝ๋ก์ ๊ณต๊ฐ ๋ฒ์๋ ์ปดํ์ผ๋ฌ๊ฐ ๊ฒ์ฌ. ํธ์ถํ ์ ์๋ ๋ด๋ถ ๊ธฐ๋ฅ์ ์์กดํ๋ ์ฝ๋๋ ์ปดํ์ผ๋์ง ์๋๋ค.
Python ๋น๊ต: ํจ์ ๋ชจ์๊ณผ ๊ณต๊ฐ ๋ฒ์
- ํจ์ ๋ชจ์: Rust์
pricingmodule์ Python์pricing.py์ฒ๋ผ ๊ฐ๊ฒฉ ๊ด๋ จ ํจ์๋ฅผ ๋ชจ์๋ค. Python์์pricing.total๋ก ์์์ ๋ํ๋ด๋ฏ Rust์์๋pricing::total๋ก ๋ํ๋ธ๋ค.- ํ์ผ ๋ฐฐ์น: Rust๋ ๊ฐ์ ํ์ผ์
mod pricing { ... }๋๋ ๋ณ๋pricing.rs์ module์ ์ ์ํ๋ค. Python์ ์ผ๋ฐ์ ์ธ.pymodule์ ํ์ผ ์์ฒด๋ก ์ ์ํ๋ค.- ๋ด๋ถ์ฉ ๊ด๋ก: Python์
_shipping_fee๋ ๋ด๋ถ์ฉ์ด๋ผ๋ ๊ด๋ก์ด๋ฉฐ ์ง์ importํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. Rust์ ๋น๊ณต๊ฐ ํจ์๋ ๋ถ๋ชจ module์์ ํธ์ถํ๋ฉด ์ปดํ์ผ ์ค๋ฅ๋ค.__all__: Python์ ์ฃผ๋กfrom module import *์ ํฌํจํ ์ด๋ฆ์ ์ ํ ๋ ์ฌ์ฉํ๋ค. Rust์pub์ฒ๋ผ ์ง์ ์ ๊ทผ์ ์ ํํ๋ ๊ธฐ๋ฅ์ ์๋๋ค.
3. ํ์ผ์ ๋๋ ๋ crate๋ ํ๋๋ค
๊ฐ๊ฒฉ ๊ณ์ฐ์ด ๊ธธ์ด์ง๋ฉด main.rs์์ ๋ณ๋ ํ์ผ๋ก ์ฎ๊ธด๋ค. ๊ฐ์ module์ ์ฝ๋๋ฅผ ๋ค๋ฅธ ํ์ผ์ ๋ณด๊ดํ๋ ๋ณํ๋ค.
shop/
โโโ Cargo.toml
โโโ src/
โโโ main.rs
โโโ pricing.rssrc/main.rs๋ฅผ ๋ค์์ผ๋ก ๋ฐ๊พผ๋ค.
mod pricing;
use crate::pricing::total;
fn main() {
println!("{}", total(1000, 3)); // 3300
}src/pricing.rs์๋ ์ด์ mod pricing { ... } ์์ ๋ด์ฉ์ ๋ฃ๋๋ค.
pub fn total(unit_price: u32, quantity: u32) -> u32 {
let subtotal = unit_price * quantity;
subtotal + shipping_fee(subtotal)
}
fn shipping_fee(subtotal: u32) -> u32 {
if subtotal < 5000 { 300 } else { 0 }
}| ํ๊ธฐ | ์ญํ |
|---|---|
mod pricing; | ํ์ฌ module์ ํ์ module์ ์ ์ธํ๊ณ ๋ณ๋ ํ์ผ์ ๋ณธ๋ฌธ์ ์ฐ๊ฒฐ |
crate::pricing::total | ํ์ฌ crate์ root๋ถํฐ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ๋ก |
use crate::pricing::total; | ํ์ฌ ๋ฒ์์์ ํจ์๋ฅผ total์ด๋ผ๋ ์งง์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ |
use๋ ๊ธฐ์กด ํญ๋ชฉ์ ์ด๋ฆ์ ํ์ฌ ๋ฒ์์ ๊ฐ์ ธ์จ๋ค.
Python ๋น๊ต: import์ ์ญํ ์ mod์ use๋ก ๋๋ ์ฝ๊ธฐ
- ์ด๋ฆ ๊ฐ์ ธ์ค๊ธฐ:
from pricing import total์ ์ฌ์ฉ ๋ฐฉ์์use crate::pricing::total;๊ณผ ๋น์ทํ๋ค. ๋ ์ธ์ด ๋ชจ๋as calculate_total์ ๋ถ์ฌ ํ์ฌ ๋ฒ์์ ๋ณ์นญ์ ์ง์ ํ ์ ์๋ค.- Module ์ฐ๊ฒฐ: Rust์์๋ ๋ณ๋ ํ์ผ์ module์
mod pricing;๋ก ์ ์ธํ๋ค. Python์ import๋ ๊ฒ์ ๊ฐ๋ฅํ module์ ์ฐพ๊ณ ํ์ํ๋ฉด ๋ก๋ฉยท์ด๊ธฐํ๋ ํ๋ค.- ์ฒ๋ฆฌ ์์ : Rust
modยทuse๋ ์ปดํ์ผํ ๊ตฌ์กฐ์ ์ด๋ฆ ํด์์ ์ ํ๋ค. Python์ module ์ต์์ ์ฝ๋๋ ์ด๊ธฐํํ ๋ ์คํ๋๋ค.
- ํ์ผ ๋ถ๋ฆฌ ๊ฒฐ๊ณผ: ์์ค ํ์ผ์ ๋ ๊ฐ์ง๋ง binary crate๋ ์ฌ์ ํ ํ๋๋ค.
- ์ปดํ์ผ ์์์ :
main.rs์์ ์์ํด ์ ์ธ๋pricingmodule๋ ํจ๊ป ์ปดํ์ผํ๋ค. - ๊ณต๊ฐ ๋ฒ์ ์ ์ง: ํ์ผ์ ์ฎ๊ฒจ๋
total์ ๊ณต๊ฐํ๊ณshipping_fee๋ ๋ด๋ถ์ ๋๋ ๊ด๊ณ๊ฐ ์ ์ง๋๋ค.
Module ํ์ผ: ์ ์ธ ์์น์ ๋ฐ๋ผ ๋ณธ๋ฌธ์ ์ฐพ์
- ํ์ฌ ์์ : root์
mod pricing;์src/pricing.rs๋๋src/pricing/mod.rs์์ ๋ณธ๋ฌธ์ ์ฐพ๋๋ค. ๋ ํ์ผ์ ๋์์ ๋๋ฉด ์ ๋๋ค.- ํ์ module:
src/pricing.rs์mod tax;๋ฅผ ์ถ๊ฐํ๋ฉด ๊ธฐ๋ณธ ์์น๋src/pricing/tax.rs๋๋src/pricing/tax/mod.rs๋ค.- ๋ช ์์ ์ฐ๊ฒฐ: ์ผ๋ฐ module ํ์ผ์ ๋๋ ํฐ๋ฆฌ์ ๋๋ ๊ฒ๋ง์ผ๋ก module tree์ ์ถ๊ฐ๋์ง ์๋๋ค. ์ ์ธ์ผ๋ก ์ฐ๊ฒฐํ๋ค.
- ๋ถ๋ฆฌ ์์น: ํ์ผ๋ก module ๋ถ๋ฆฌํ๊ธฐ๋ ์ฝ๋ ์์น๋ฅผ ๋ฐ๊พธ๋ฉฐ ๋ณ๋ crate๋ฅผ ๋ง๋๋ ์์ ๊ณผ ๊ตฌ๋ถ๋๋ค.
๊ฒฝ๋ก ํ๊ธฐ: ํ์ฌ ์์น์ ๋ถ๋ชจ ์์น
crate::: ํ์ฌ crate์ root์์ ์์ํ๋ค.self::: ํ์ฌ module์์ ์์ํ๋ค.super::: ๋ถ๋ชจ module์์ ์์ํ๋ค.- ์ธ๋ถ crate: ์์กดํ๋ library crate์ ์ด๋ฆ์ผ๋ก ์์ํ๋ค. ๋ค์ ์ ์
shop::total์ด ๊ทธ ์๋ค.
์ ํ ๊ธฐ์ค: ํ๋ก๊ทธ๋จ ๋ด๋ถ์ ์ฝ๋ ์ ๋ฆฌ
- ๋จ์ผ ํ๋ก๊ทธ๋จ: ํด๋น ํ๋ก๊ทธ๋จ์์๋ง ์ฐ๋ ๊ธฐ๋ฅ์
main.rs์ module๋ก ๊ตฌ์ฑํ๋ฉด ์ถฉ๋ถํ๋ค.- Library ๋ถ๋ฆฌ: ๋ค๋ฅธ binaryยทpackage์ ์ฌ์ฌ์ฉ์ด๋ ๋ ๋ฆฝ๋ ๊ณต๊ฐ API ๊ฒฝ๊ณ๊ฐ ํ์ํ ๋ ์ ํํ๋ค. ๋ค์ ์์ ์์๋ ๋ ์คํ ํ๋ก๊ทธ๋จ์ ๊ณ์ฐ ๊ธฐ๋ฅ์ ๊ณต์ ํ๋ค.
4. ์ฃผ๋ฌธ๊ณผ ๊ฒฌ์ ํ๋ก๊ทธ๋จ์ด ๊ณ์ฐ library๋ฅผ ๊ณต์ ํ๋ค
์ฃผ๋ฌธ CLI์ ๋ํด ๊ฒฌ์ ํ๋ก๊ทธ๋จ๋ ๋ณ๋๋ก ์คํํ ํ์๊ฐ ์๊ฒผ๋ค. ์ฃผ๋ฌธ CLI๋ ์ํ 3๊ฐ์ ๊ธ์ก์ ์ถ๋ ฅํ๊ณ ๊ฒฌ์ ํ๋ก๊ทธ๋จ์ ์ํ 5๊ฐ์ ์์ ๊ธ์ก์ ์ถ๋ ฅํ๋ค. ๊ฐ๊ฒฉ๊ณผ ๋ฐฐ์ก๋น ๊ท์น์ ๋ ํ๋ก๊ทธ๋จ์ ๋์ผํ๊ฒ ์ ์ฉํ๋ค.
๊ณตํต ๊ณ์ฐ ๊ธฐ๋ฅ์ library crate๋ก ์ฎ๊ธฐ๊ณ ๋ binary crate๊ฐ ๊ทธ API๋ฅผ ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑํ๋ค. ๊ฐ์ package ์์ src/lib.rs์ src/bin/quote.rs๋ฅผ ์ถ๊ฐํ๋ค.
shop/
โโโ Cargo.toml
โโโ src/
โโโ lib.rs
โโโ pricing.rs
โโโ main.rs
โโโ bin/
โโโ quote.rssrc/pricing.rs๋ 3์ ์ ์ฝ๋๋ฅผ ์ ์งํ๋ค. ์ src/lib.rs์๋ ๋ค์์ ๋ฃ๋๋ค.
mod pricing;
pub use pricing::total;์ฃผ๋ฌธ CLI์ธ src/main.rs๋ ๋ค์์ผ๋ก ๋ฐ๊พผ๋ค.
use shop::total;
fn main() {
println!("์ฃผ๋ฌธ ๊ธ์ก: {}", total(1000, 3)); // ์ฃผ๋ฌธ ๊ธ์ก: 3300
}๊ฒฌ์ ํ๋ก๊ทธ๋จ์ ๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
mkdir -p src/bin์ src/bin/quote.rs์๋ ๋ค์์ ๋ฃ๋๋ค.
use shop::total;
fn main() {
println!("๊ฒฌ์ ๊ธ์ก: {}", total(1000, 5)); // ๊ฒฌ์ ๊ธ์ก: 5000
}| Binary ์ด๋ฆ | Crate root | ์ญํ | ์ฌ์ฉํ๋ ๊ณตํต ํจ์ |
|---|---|---|---|
| shop | src/main.rs | ์ฃผ๋ฌธ ๊ธ์ก ์ถ๋ ฅ | shop::total |
| quote | src/bin/quote.rs | ๊ฒฌ์ ๊ธ์ก ์ถ๋ ฅ | shop::total |
- Library crate ํ๋:
lib.rs์์pricingmodule์ ์ฐ๊ฒฐํ๊ณtotal์ ๊ณต๊ฐํ๋ค. - Binary crate ๋ ๊ฐ: ๊ฐ root์
main()์ด ์๋ค. ์ฃผ๋ฌธยท๊ฒฌ์ ํ๋ก๊ทธ๋จ์ ๊ฐ์ library API๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ณ๋ ์คํ ํ์ผ๋ก ๋น๋๋๋ค. - Package ํ๋:
Cargo.toml๋ก ์ธ crate๋ฅผ ํจ๊ป ๊ด๋ฆฌํ๋ค. Cargo๊ฐ ๊ฐ์ package์ library๋ฅผ binary์์ ์ฌ์ฉํ ์ ์๊ฒ ์ฐ๊ฒฐํ๋ฏ๋ก ์ dependency ํญ๋ชฉ์ ํ์ํ์ง ์๋ค.
cargo build --bins
cargo run --bin shop
cargo run --bin quote์ฃผ๋ฌธ ํ๋ก๊ทธ๋จ์ ์ฃผ๋ฌธ ๊ธ์ก: 3300, ๊ฒฌ์ ํ๋ก๊ทธ๋จ์ ๊ฒฌ์ ๊ธ์ก: 5000์ ์ถ๋ ฅํ๋ค. Binary๊ฐ ๋ ๊ฐ์ด๋ฏ๋ก ์คํํ ๋์์ --bin์ผ๋ก ์ ํํ๋ค.
๋ ํ๋ก๊ทธ๋จ์ ๊ณ์ฐ์ pricing.rs์ ๊ตฌํ ํ๋๋ฅผ ์ฌ์ฉํ๋ค. ๋ฐฐ์ก๋น ๊ท์น์ ์์ ํ๋ฉด ๋ ํ๋ก๊ทธ๋จ์ ๋ค์ ๋น๋ํ์ ๋ ๊ฐ์ ๋ณ๊ฒฝ์ด ์ ์ฉ๋๋ค. ์คํ ์ง์
์ ๊ณผ ์ถ๋ ฅ ์ฒ๋ฆฌ๋ ๊ฐ binary์ ๋๊ณ ๊ณตํต ๊ท์น์ library์์ ๊ด๋ฆฌํ๋ค.
Python ๋น๊ต: ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ CLI ์ง์ ์
- ๊ณตํต ๊ธฐ๋ฅ:
pricing.py์ ๊ณ์ฐ ํจ์๋ฅผcli.py์quote.py๊ฐ ํจ๊ป importํ๋ ๊ตฌ์กฐ์ ๋น์ทํ๋ค.- ๊ณต๊ฐ ๊ฒฝ๋ก ๋ชจ์:
shop/__init__.py์์from .pricing import total๋กshop.total์ ์ ๊ณตํ๋ ๋ฐฉ์์pub use pricing::total๊ณผ ๋น์ทํ๋ค. Python์__init__.py๋ ์คํ๋๋ module์ด๊ณ Rust์ re-export๋ ์ปดํ์ผ ์ค ์ด๋ฆ์ ๊ณต๊ฐ ๊ฒฝ๋ก๋ฅผ ์ ํ๋ค.- ๋ช ๋ น ๋ฑ๋ก: ์ค์น ๊ฐ๋ฅํ Python ํ๋ก์ ํธ๋
pyproject.toml์[project.scripts]์shop = "shop.cli:main",quote = "shop.quote:main"์ ๋ฑ๋กํด ๋ช ๋ น ๋ ๊ฐ๋ฅผ ์ ๊ณตํ๋ค.- ์คํ ๋ฐฉ์: Rust๋ binary ๋ ๊ฐ๋ฅผ ์ปดํ์ผํ๋ค. Python์ ์ ์ค์ ์ ์ค์น ์ ์ง์ ํ ํจ์๋ฅผ ํธ์ถํ๋ CLI ๋ช ๋ น์ ์ ๊ณตํ๋ค.
๊ณต๊ฐ API: module ์ ์ฒด ๋์ ํ์ํ ํจ์ ๊ณต๊ฐ
mod pricing: library์ ๋ด๋ถ module ๊ตฌ์กฐ๋ ๊ณต๊ฐํ์ง ์๋๋ค.pub use pricing::total: ์ธ๋ถ์๋ root ๊ฒฝ๋ก์total์ ๊ณต๊ฐํ๋ค. ์ด๋ฐ ๊ณต๊ฐ๋ฅผ re-export๋ผ๊ณ ํ๋ค.- ๋์:
pub mod pricing์ผ๋ก module์ ๊ณต๊ฐํ๋ฉด ์ธ๋ถ์์shop::pricing::total๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ค.- ์ ์ง๋ณด์: re-export๋ก ๊ณต๊ฐ ๊ฒฝ๋ก๋ฅผ ์ ์งํ๋ฉด ๋ด๋ถ module ๋ฐฐ์น๋ฅผ ๋ฐ๊ฟ ๋ ํธ์ถ ์ฝ๋๋ฅผ ๋ ์์ ํ๋ค.
crate์ ๊ฒฝ๊ณ: ๊ฐ์ package์๋ root๋ ๊ฐ๊ฐ ์์
- Binary ๋ด๋ถ:
main.rs์quote.rs๋ ๊ฐ๊ฐ ๋ค๋ฅธ binary crate์ root๋ค.crate::๋ ๊ทธ ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ crate์ root๋ฅผ ๊ฐ๋ฆฌํจ๋ค.- Library ์ ๊ทผ: ๋ binary๋
shop::total๋ก library ํจ์๋ฅผ ์ฐธ์กฐํ๋ค.use shop::total;๋ก root ๋ฒ์์ ๊ฐ์ ธ์จ ํจ์๋ฅผcrate::total๊ฒฝ๋ก๋ก๋ ์ฐธ์กฐํ๋ค.- ๊ณต๊ฐ ๋ฒ์: library์
pub(crate)ํญ๋ชฉ์ ๊ฐ์ package์ binary์๋ ๊ณต๊ฐ๋์ง ์๋๋ค. ์๋ก ๋ค๋ฅธ crate์ด๊ธฐ ๋๋ฌธ์ด๋ค.
5. ์ฌ๋ฌ package๋ฅผ ํจ๊ป ๊ฐ๋ฐํ ๋ workspace๋ก ๋ฌถ๋๋ค
์ฃผ๋ฌธยท๊ฒฌ์ CLI๋ app package์ ํจ๊ป ๋๊ณ ๊ฐ๊ฒฉ ๊ณ์ฐ์ ์์กด์ฑยท๋ฒ์ ์ค์ ์ ๋ณ๋๋ก ๊ด๋ฆฌํ๋ pricing package๋ก ๋๋๋ค. ๋ package๋ฅผ ๊ฐ์ ์ ์ฅ์์์ ํจ๊ป ๋น๋ํ๊ณ ํ
์คํธํ๋ ค๋ฉด Cargo workspace๋ฅผ ์ฌ์ฉํ๋ค. Workspace๋ Rust Book 14.3์ ์์ ๋ค๋ฃฌ๋ค.
์์ shop์ ๋จ๊ฒจ ๋๊ณ ๊ทธ ์์ ์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ ๋ค. ํ์ฌ shop ๋๋ ํฐ๋ฆฌ์์ ๋ค์์ ์คํํ๋ค.
cd ..
mkdir shop-workspace
cd shop-workspace
cargo new app --vcs none
cargo new pricing --lib --vcs none
cp ../shop/src/pricing.rs pricing/src/calculation.rs
mkdir -p app/src/bin์ต์ข
ํ์ผ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค. ์ดํ ๋ช
๋ น์ shop-workspace root์์ ์คํํ๋ค.
shop-workspace/
โโโ Cargo.toml
โโโ app/
โ โโโ Cargo.toml
โ โโโ src/
โ โโโ main.rs
โ โโโ bin/
โ โโโ quote.rs
โโโ pricing/
โโโ Cargo.toml
โโโ src/
โโโ lib.rs
โโโ calculation.rs5.1 Workspace root๋ member๋ฅผ ์ง์ ํ๋ค
shop-workspace/Cargo.toml์ ์๋ก ์์ฑํ๋ค.
[workspace]
members = ["app", "pricing"]
resolver = "3"- Member:
app,pricing๋ package๋ฅผ ํจ๊ป ๊ด๋ฆฌํ๋ค. - Virtual workspace: ์ด root์๋
[package]๊ฐ ์๋ค. root ์์ฒด๋ package๋ crate๊ฐ ์๋๋ฉฐ member์ ๊ตฌ์ฑ์ ๊ด๋ฆฌํ๋ค. - Resolver: ์์ ๋ Rust 2024 edition์ ์ฌ์ฉํ๋ฉฐ virtual workspace์๋ ์์กด์ฑ resolver๋ฅผ ๋ช ์ํ๋ค.
5.2 Pricing package๋ ๊ณ์ฐ library๋ฅผ ์ ๊ณตํ๋ค
pricing/Cargo.toml์ ๋ค์์ผ๋ก ๋ฐ๊พผ๋ค.
[package]
name = "pricing"
version = "0.1.0"
edition = "2024"pricing/src/lib.rs๋ฅผ ๋ค์์ผ๋ก ๋ฐ๊พผ๋ค.
mod calculation;
pub use calculation::total;calculation.rs๋ ์ ๋ช
๋ น์ผ๋ก ๋ณต์ฌํ ๊ฐ๊ฒฉยท๋ฐฐ์ก๋น ๊ณ์ฐ ์ฝ๋๋ค. Library ๋ด๋ถ module ์ด๋ฆ์ calculation, library crate ์ด๋ฆ์ pricing์ด๋ค.
5.3 App package๋ pricing์ dependency๋ก ์ ์ธํ๋ค
app/Cargo.toml์ ๋ค์์ผ๋ก ๋ฐ๊พผ๋ค.
[package]
name = "app"
version = "0.1.0"
edition = "2024"
[dependencies]
pricing = { path = "../pricing" }app/src/main.rs๋ฅผ ๋ค์์ผ๋ก ๋ฐ๊พผ๋ค.
use pricing::total;
fn main() {
println!("์ฃผ๋ฌธ ๊ธ์ก: {}", total(1000, 3)); // ์ฃผ๋ฌธ ๊ธ์ก: 3300
}app/src/bin/quote.rs์๋ ๊ฒฌ์ ํ๋ก๊ทธ๋จ์ ๋ฃ๋๋ค. ๊ณตํต ํจ์์ ๊ฒฝ๋ก๋ ์ด์ pricing::total์ด๋ค.
use pricing::total;
fn main() {
println!("๊ฒฌ์ ๊ธ์ก: {}", total(1000, 5)); // ๊ฒฌ์ ๊ธ์ก: 5000
}- Member ๊ด๊ณ: workspace์์ ๋ package๋ฅผ ํจ๊ป ๊ด๋ฆฌํ๋ค.
- Dependency ๊ด๊ณ:
app์ดpricinglibrary๋ฅผ ์ฌ์ฉํ๋ ๊ด๊ณ๋app/Cargo.toml์ ๋ณ๋๋ก ์ ์ธํ๋ค. - ๊ฒฝ๋ก ๊ธฐ์ค:
path = "../pricing"์ ์ ์ธํapp/Cargo.toml์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ํด์ํ๋ค.
cargo run -p app --bin app
cargo run -p app --bin quote
cargo check --workspace- ํ๋ก๊ทธ๋จ ์คํ:
-p app์ package๋ฅผ ์ ํํ๊ณ--bin app,--bin quote๋ ๊ทธ ์์ ์คํ ํ๋ก๊ทธ๋จ์ ์ ํํ๋ค. ์ฃผ๋ฌธยท๊ฒฌ์ ์ถ๋ ฅ์ 4์ ๊ณผ ๊ฐ๋ค. - ์ ์ฒด ๊ฒ์ฌ: workspace์ member๋ฅผ ํ ๋ฒ์ ๊ฒ์ฌํ๋ค.
workspace: shop-workspace
โโโ package: app
โ โโโ binary crate: src/main.rs
โ โโโ binary crate: src/bin/quote.rs
โโโ package: pricing
โโโ library crate: src/lib.rs
โโโ module: calculation
binary crate app โโ dependency โโ> library crate pricing
binary crate quote โโ dependency โโ> library crate pricing- ํฌํจ ๊ด๊ณ: tree๋ workspace์ package ๊ตฌ์ฑ, package์ crate, crate ๋ด๋ถ module์ ๋ณด์ฌ์ค๋ค.
- ์ฌ์ฉ ๊ด๊ณ: ์๋ ํ์ดํ๋ ๋ binary๊ฐ library์ ์์กดํ๋ ๋ฐฉํฅ์ด๋ค. Workspace์ ํฌํจ๋๋ ๊ฒ๊ณผ library๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณ๋ ๊ด๊ณ๋ค.
Workspace ์ค์ : ๊ณต์ ๋๋ ๊ฒ๊ณผ ๋ณ๋์ธ ๊ฒ
- ๊ธฐ๋ณธ ๊ณต์ : Cargo workspace ์ค์ ์ ๋ฐ๋ผ root์
Cargo.lock๊ณผtarget๋๋ ํฐ๋ฆฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค.- ๋ณ๋ ๊ด๋ฆฌ: ๊ฐ package๋ ์์ ์
Cargo.toml๊ณผ dependency ๋ชฉ๋ก์ ์ ์งํ๋ค.- ์ ํ์ ๊ณต์ : ๋ฒ์ ยทedition ๋ฑ์
workspace.package, ๊ณตํต dependency๋workspace.dependencies๋ก ์ ์ํ๊ณ member์์ ๋ช ์์ ์ผ๋ก ์์ํ๋ค. ์ด ์์ ์์๋ ๊ฐ package์ ์ง์ ์ ์๋ค.
Python ๋น๊ต: workspace๋ uv์ ์ฌ๋ฌ ํ๋ก์ ํธ ๊ด๋ฆฌ์ ๋์
- ํ๋ก์ ํธ ๋ถ๋ฆฌ: uv workspace์ member๋ ๊ฐ๊ฐ
pyproject.toml์ ์ ์งํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ณ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ๋ค.- ๊ณต์ ์ค์ : uv๋
[tool.uv.workspace]๋ก member๋ฅผ ์ง์ ํ๊ณ ํ๋์uv.lock์ ๊ณต์ ํ๋ค. Rust ์์ ์[workspace]์Cargo.lock์ ๋์ํ๋ ์ญํ ์ด๋ค.- ๋๊ตฌ์ ๊ธฐ๋ฅ: uv workspace๋ Python ์ธ์ด ์์ฒด์ ๊ธฐ๋ฅ์ด ์๋๋ผ ํ๋ก์ ํธ ๊ด๋ฆฌ ๋๊ตฌ์ ๊ธฐ๋ฅ์ด๋ค. Cargo์ฒ๋ผ member ๊ด๊ณ์ ์ค์ dependency ๊ด๊ณ๋ฅผ ๋ฐ๋ก ์ ์ธํ๋ค.
6. ๊ณ์ฐ ํ ์คํธ๋ฅผ library์ ๋๊ณ ํจ๊ป ์คํํ๋ค
๊ฐ๊ฒฉ ๊ท์น์ ํ
์คํธ๋ฅผ CLI์ ๋ถ๋ฆฌํ๋ฉด ์ถ๋ ฅ ์ฒ๋ฆฌ ์์ด ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ค. pricing/src/lib.rs ๋์ ๋ค์์ ์ถ๊ฐํ๋ค.
#[cfg(test)]
mod tests {
use super::total;
#[test]
fn shipping_threshold() {
assert_eq!(total(1000, 3), 3300);
assert_eq!(total(1000, 5), 5000);
}
}mod tests: ํ ์คํธ ์ฝ๋๋ library ์์ module์ด๋ค.super::total: ๋ถ๋ชจ module์ธ library root๊ฐ ๊ณต๊ฐํ ๊ณ์ฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.- ํ์ธํ ๊ท์น: 5,000 ๋ฏธ๋ง์๋ ๋ฐฐ์ก๋น๋ฅผ ๋ถ์ด๊ณ ๊ฒฝ๊ณ ๊ธ์ก๋ถํฐ๋ ๋ฐฐ์ก๋น๋ฅผ ๋ฐ์ง ์๋๋ค.
cargo test -p pricing
cargo test --workspace์ฒซ ๋ช
๋ น์ ๊ณ์ฐ package๋ฅผ ์ ํํ๊ณ ๋์งธ ๋ช
๋ น์ member ์ ์ฒด์ ํ
์คํธ๋ฅผ ์คํํ๋ค. Library์ ๊ณ์ฐ ์ฝ๋๋ฅผ ์์ ํ๋ฉด ์ด ํ
์คํธ์ app์ ์ฌ์ฉ ์ฝ๋๋ฅผ ๊ฐ์ workspace์์ ํ์ธํ๋ค.
Python ๋น๊ต: ๊ณ์ฐ ํจ์ ํ ์คํธ์ ์คํ ํ๋ก๊ทธ๋จ ๋ถ๋ฆฌ
- ํ ์คํธ ์์น:
test_pricing.py์์ ๊ณตํตtotalํจ์๋ฅผ importํ๊ณ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฌํ๋ ๋ฐฉ์๊ณผ ๋น์ทํ๋ค.- ๊ตฌ์กฐ ์ ํ: Python์ import ๊ฐ๋ฅํ ํจ์๋ง ์์ด๋ ํ ์คํธํ๋ค. Rust๋ binary ๋ด๋ถ module์ unit test๋ฅผ ๋ ์ ์์ผ๋ฉฐ ์ด ์์ ์์๋ ์ฌ๋ฌ binary๊ฐ ์ฌ์ฉํ๋ library API๋ฅผ ๊ฒ์ฌํ๋ค.
7. ๊ตฌ์กฐ๋ ํ์ํ ๊ฒฝ๊ณ๋ถํฐ ๋๋๋ค
์์ ์ ๊ณ์ฐ ์ฝ๋๋ 2์ ๋ถํฐ ๊ฐ์ ๊ท์น์ ์ ์งํ๋ค. ์ดํ ํ์ฅ์ ๊ตฌํ ์์น, ๊ณต๊ฐ API, ์ปดํ์ผ ๋จ์, Cargo ๊ด๋ฆฌ ๋จ์๋ฅผ ๋ฐ๊พธ๋ ๊ณผ์ ์ด์๋ค.
| ๋จ๊ณ | Package ์ | ์ฃผ๋ crate ์ | ์ถ๊ฐํ ๊ฒฝ๊ณ | ํ์ํ ์ด์ |
|---|---|---|---|---|
| ํจ์ ํ๋ | 1 | Binary 1 | ํจ์ | ๊ฐ๋จํ ๊ณ์ฐยท์ถ๋ ฅ |
| Inline module | 1 | Binary 1 | Module์ ๊ณต๊ฐ ๋ฒ์ | ๋ด๋ถ ๋ฐฐ์ก๋น ๊ณ์ฐ ์จ๊น |
| Module ํ์ผ ๋ถ๋ฆฌ | 1 | Binary 1 | ํ์ผ | ๊ณ์ฐ ์ฝ๋์ CLI๋ฅผ ๋ฐ๋ก ์ฝ๊ณ ์์ |
| Library ์ถ์ถ | 1 | Library 1 + Binary 2 | Crate | ์ฃผ๋ฌธยท๊ฒฌ์ ํ๋ก๊ทธ๋จ์ด ๊ณตํต ๊ณ์ฐ API ์ฌ์ฉ |
| Workspace ๊ตฌ์ฑ | 2 | Library 1 + Binary 2 | Package, workspace | ๊ฐ๋ณ ์ค์ ๊ณผ ์ ์ฒด ๋น๋ยทํ ์คํธ ๋ณํ |
ํ์ crate ์: ๊ตฌํ์ ์ฃผ๋ ๊ฒฝ๊ณ ๊ธฐ์ค
- ์ง๊ณ ๋ฒ์: ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ libraryยทbinary๋ฅผ ์ ๋ค.
- ํ ์คํธ ๋์: Cargo๊ฐ ํ ์คํธ ์คํ ๋ฑ์ ๋ง๋๋ ์ถ๊ฐ target์ ํ์์ ์ ์ธํ๋ค.