2.2.2
(iOS์์ # 279๋ก ์ธํด ์ต์ ๋ฒ์ ์ด ์คํจํ๊ธฐ ๋๋ฌธ์)
iOS
์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์์ผํฉ๋๋ค. ๊ตฌ๋งค ์ฑ๊ณต (์ค์๊ฐ ๋ฐ ์์ฐ ์ค)
Promise์์ E_UNKNOWN
์ค๋ฅ๊ฐ ๋ฐํ ๋จ
Sentry.io ์ค๋ฅ ์ถ์ ์ ๋ค์์๋ณด๊ณ ํฉ๋๋ค.
{"framesToPop":1,"code":"E_UNKNOWN","nativeStackIOS":["0 LuCoaching 0x000000010062f6fc LuCoaching + 1996540","1 LuCoaching 0x000000010060aa98 LuCoaching + 1845912","2 LuCoaching 0x00000001007cad98 __cxa_throw + 438380","3 LuCoaching 0x00000001007cc62c __cxa_throw + 444672","4 libdispatch.dylib 0x000000019d078484 <redacted> + 16","5 libdispatch.dylib 0x000000019d025610 <redacted> + 56","6 LuCoaching 0x00000001007cc46c __cxa_throw + 444224","7 libdispatch.dylib 0x000000019d0776c8 <redacted> + 24","8 libdispatch.dylib 0x000000019d078484 <redacted> + 16","9 libdispatch.dylib 0x000000019d0249ec <redacted> + 1068","10 CoreFoundation 0x000000019d5ce1bc <redacted> + 12","11 CoreFoundation 0x000000019d5c9084 <redacted> + 1964","12 CoreFoundation 0x000000019d5c85b8 CFRunLoopRunSpecific + 436","13 GraphicsServices 0x000000019f83c584 GSEventRunModal + 100","14 UIKitCore 0x00000001ca444bc8 UIApplicationMain + 212","15 LuCoaching 0x000000010044d110 LuCoaching + 20752","16 libdyld.dylib 0x000000019d088b94 <redacted> + 4"],"userInfo":{"NSLocalizedDescription":"Verbindung mit iTunes Store nicht mรถglich"},"domain":"SKErrorDomain","line":26,"column":1877,"sourceURL":"/var/containers/Bundle/Application/818C8439-E250-42E8-AD57-EC4FB5FE5547/LuCoaching.app/main.jsbundle"}
์ค์ ์ฅ์น. ๋ผ์ด๋ธ ๊ณ ๊ฐ. ๋งค์ฐ ์ผ๊ด์ฑ์๋ ์คํจ
Sandbox ์ฌ์ฉ์์ ํจ๊ป ์ ์ฐจ๋ฅผ ํ ์คํธ ํ ๋ ์ค๋ฅ๋ฅผ ์ฌํ ํ ์ ์์ต๋๋ค.
@ Gaia-Nutrition์ด ์ค๋๋ ๋ฌธ์ ๋ฅผ ํ์ธ ํ์๊ฒ ์ต๋๊น? ๊ฐ์ ์์ธ ์ผ ์ ์์ต๋๋ค.
https://github.com/dooboolab/react-native-iap/issues/201
# 201์ @JJMoon ์ค๋ฅ๋ E_DEVELOPER_ERROR
์ด๊ณ getSubscriptions()
์ฌ์ฉํ์ฌ validProducts
๋ชฉ๋ก์ ์ฑ์ฐ์ง ์์ ๋ฐ์ํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฒดํฌ ์์์ ์ํํ๊ธฐ ์ ์ ํจ์๋ฅผ ํธ์ถํ๊ณ ์์ผ๋ฉฐ ๋ค๋ฅธ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํ์ง๋ง ์ด์ ์๊ฐํด ๋ณด์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๊ตฌ๋งค๋ฅผ ์ํ๋์ง ๋ค์ ๊ณ ๋ คํ์ฌ getSubscriptions()
์ buySubscription()
ํตํ ์ฌ์ด์ ์๋นํ ์๊ฐ ์ง์ฐ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๊น? ๊ทธ ๋์ ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ค์ ๋์์ ์ ์์ต๋๋ค.
ํธ์ง :ํ์ง๋ง ๋ค์ ๊ตฌ๋งค๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋๋ฏ๋ก ๋ฌธ์ ๋ ์ฑ ์คํ ์ด ์๋ต์ด ์ฒ๋ฆฌ๋๋ ๊ณณ์ด์ด์ผํฉ๋๋ค.
์๋ ํ์ธ์,
"buyProductWithoutFinishTransaction"๋๋ "buyProduct"์ ๋์ผํ ๋ฌธ์ ๋์.
๋ฒ์ 2.2.1
์ ์ฅ๋ ๋ฐํ์
{
"framesToPop": 1,
"code": "E_UNKNOWN",
"nativeStackIOS": [...],
"userInfo": {
"NSLocalizedDescription": "Connexion ร lโiTunes Store impossible"
},
"domain": "SKErrorDomain",
"line": 16,
"column": 1599,
"sourceURL": "..."
}
์ด ๋ฒ๊ทธ๋ฅผ ์ด์ ๋ฒ์ ์ผ๋ก ํ๋ก๋์ ์์ ์ฌํํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋์ ์ ๋ฐ์ดํธํ์ต๋๋ค.
ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ฉด ๋ด ์ฌ์ฉ์์๊ฒ๋ ๋ณต์ ๊ตฌ๋งค๊ฐ ์คํจํ๋ค๋ ๊ฒ์ ๋๋ค. iOS ์ฌ์ฉ์์ ์ฝ 1 %์๊ฒ๋ง ๋ฐ์ํฉ๋๋ค.
@fierysolid ๊ฐ์ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๋ ์คํจํ iOS ๊ตฌ๋งค์ ์ฝ 5 %์ ๋๋ค. ๊ณ ๊ฐ์ด ๋ค์ ๊ตฌ๋งคํ๋ ค๊ณ ํ๋ฉด ๋ณต์ ๊ตฌ๋งค ํ์ ์ด ๋ํ๋ฉ๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ. ์ค๋ ์ ๋ฒ์ ์ธ 2.3.15
์์ ์์ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. iOS์์ NSDictionary
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์์ ํ ์ฌ์ฉํ๊ธฐ์ ์์ ํ์ง ์์ผ๋ฉฐ ์๊ธฐ์น ์์ ๋์์ ์ ๋ฐํ ์ ์์์ ํ์ธํ์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ผ๋ฉฐ ์ด์ ๋ชจ๋ ์ฅ์น์์ ์ ์์ ์ผ๋ก ์๋ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด๊ฒ์ ํ
์คํธํ์ญ์์ค.
๋ฌธ์ ๊ฐ ๊ณ์๋๋ฉด ๋ค์์ฌ์ญ์์ค.
๋ฟก ๋นต๋จ
iPhone 6S๋ฅผ ์ฌ์ฉํ๋ ์๋ ๋ฐ์ค ํ
์คํฐ ์ฌ์ฉ์์ buySubscription()
์ ์ฌ์ฉํ๋ ๋์ ์ฌ์ ํ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
{"userInfo":{"NSLocalizedDescription":"Cannot connect to iTunes Store"}}
@danrevah 2.3.15
์ ๋ฒ์ ์ ์ฌ์ฉํด ๋ณด์
จ๋์ ? @JJMoon ํ ๋ฒ ๋ ํ
์คํธ ํด ์ฃผ์๊ฒ ์ต๋๊น?
@dooboolab yes ํด๋น ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@danrevah 2.3.16
์๋ํด์ฃผ์ธ์.
@dooboolab ํ ๋ฒ ์๋ํ์ง๋ง ๋ค์ ์๋ํ๋ ๋์์ด ์ค๋ฅ๊ฐ ๊ณ์ ๋ฐ์ํ์ต๋๋ค. (v 2.3.17 ์ฌ์ฉ)
@JJMoon ์ด๊ฒ์ ๋ํ ๋จ์๊ฐ ์์ต๋๊น? ๊ทธ๋ iPhone6S๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ฌธ์ ๋ฅผ ๋ค์ ์ด์์ต๋๋ค. cc @JJMoon
๋ ๋ง์ ์ฌ๋๋ค์ด์ด ๋ฌธ์ ์ ํฌํํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ๋ ๊น์ด ํํค ์น๊ธฐ ์ํด ๋ ์ด์ฌํ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
@danrevah ์ด ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์๊ธฐ ๋ฐ๋๋๋ค.
https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Subscriptions.html#//apple_ref/doc/uid/TP40008267 -CH7-SW6
์๋ ๋ฐ์ค ๋ชจ๋์์ ๊ตฌ๋
์ ํ
์คํธํ๋ ค๋ฉด ์ ์ ํ ๊ตฌ๋
์ ๋ค์ ๊ตฌ๋งคํด์ผํฉ๋๋ค.
๋ค์ ๊ตฌ๋งคํ๋ ค๋ฉด ์ทจ์ํด์ผ ํ ์๋ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Apple ์๋ ๋ฐ์ค ์๋ฒ์์ ์ด์ํ ๋ฐ์์ด์์ด ํ
์คํธ๋ฅผ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
@JJMoon ์ผ์ด์ค๊ฐ ๋ฟก๋ฟก
@JJMoon ๋๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค. ์ด๋ค ํด๊ฒฐ์ฑ
? buySubscription์์ ์์ธ๊ฐ ๋ฐ์ํ์ง๋ง ์ง๋ถ์ด ์ฐจ๊ฐ๋ฉ๋๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ํ์ธํด์ผํฉ๋๋ค.
์ซ๋ผ๋ฆฌ
+1 ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค
buySubscription
์์๋ addAdditionalSuccessPurchaseListenerIOS ๋ฅผ ์ฌ์ฉํด๋ณด์ญ์์ค. ์ด๊ฒ์ # 307๊ณผ ๋์ผํ ๋ฌธ์ ์
๋๋ค.
buySubscription
์์๋ addAdditionalSuccessPurchaseListenerIOS ๋ฅผ ์ฌ์ฉํด๋ณด์ญ์์ค. ์ด๊ฒ์ # 307๊ณผ ๋์ผํ ๋ฌธ์ ์ ๋๋ค.
๋๊ตฐ๊ฐ ์ด๋ฏธ ํ๋ก๋์ ์์ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
@hyochan , ๋๋ ๊ทธ๊ฒ์ ์๋ํ์ง๋ง ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค.
if (subscription && subscription.success) {
this.props.subscribe(subscription.result);
} else {
if (Platform.OS === 'ios') {
const sub = RNIap.addAdditionalSuccessPurchaseListenerIOS(async (purchase) => {
this.props.subscribe(purchase); // -> This code is never fired
sub.remove();
});
}
}
@cbfranca ์ค์ ์ฝ๋๋ฅผ ๋ฐ๋ฅด์ญ์์ค. promises
๋ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ฝ์ ๊ฑฐ๋ถ ํ addAdditionalSuccessPurchaseListenerIOS
์ ๋ค์ด์ผํฉ๋๋ค.
๋ํ ์ถ๊ฐ Platform.OS === 'ios'
๊ฐ ํ์ํ์ง ์์ต๋๋ค.
ํจ์ฐฌ
๋ฌด์งํด์ ๋ฏธ์ํ์ง๋ง ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด ์๋๋ฆฌ์ค์ ๋ง๊ฒ ์์ ์ ๋์ผํ ๊ธฐ์ค์ ๋ฐ๋์ต๋๋ค. async / await๋ฅผ ์ฌ์ฉํ์ฌ์ด ์ฝ์์ ์ฒ๋ฆฌํ๋ ์ถ์ํ๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ด ๊ตฌ๋
๊ฐ์ฒด๋ ๋ด ์ถ์ํ์ ์ํด ๋ฐํ๋ฉ๋๋ค.
static purchaseSubscription(newSubscriptionID, currentSubscriptionID) {
if (Platform.OS === 'ios') {
const purchaseResult = KinvoBilling.purchaseSubscriptionIOS(newSubscriptionID);
return purchaseResult;
}
const purchaseResult = KinvoBilling.purchaseSubscriptionANDROID(newSubscriptionID, currentSubscriptionID);
return purchaseResult;
}
static purchaseSubscriptionANDROID = async (newSubscriptionID, currentSubscriptionID) => {
const hasCurrentSubscription = currentSubscriptionID !== null;
if (hasCurrentSubscription) {
const purchaseResult = KinvoBilling.updateSubscription(newSubscriptionID, currentSubscriptionID);
return purchaseResult;
}
const purchaseResult = KinvoBilling.buySubscription(newSubscriptionID);
return purchaseResult;
}
static purchaseSubscriptionIOS = async (subscriptionID) => {
await KinvoBilling.getSubscriptions();
const purchaseResult = await KinvoBilling.buySubscription(subscriptionID);
return purchaseResult;
}
๋ฟก๋ฟก
```
static purchaseSubscriptionIOS = ๋น๋๊ธฐ (subscriptionID) => {
KinvoBilling.getSubscriptions ();๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.
{
const purchaseResult = KinvoBilling.buySubscription (subscriptionID);
} catch (err) {
const ๊ตฌ๋
= RNIap.addAdditionalSuccessPurchaseListenerIOS (async (purchase) => {
// dooboolab => ์ฌ๊ธฐ์์ ํธ์ถ์ ํ์ธํ์ญ์์ค.
this.setState ({์์์ฆ : purchase.transactionReceipt}, () => this.goToNext ());
subscription.remove ();
}
}
return purchaseResult;
}
````
์์ ์ฝ๋๋ฅผ ํ์ธํ์ญ์์ค. ๋ผ์ดํ ์ฌ์ดํด์ ๋ง๊ฒ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@hyochan ๋๋ฅผ ์ํด ์๋ํ์ง ์์ต๋๋ค.
๋ด ํ ์คํธ ์๋๋ฆฌ์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ ๋ค๋ฅธ ์์ฌ : ๊ตฌ๋ ์์๋ finishTransaction ()์ ์ฌ์ฉํด์ผํฉ๋๊น?
์ด ์ค๋ฅ๋ ํ์๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ ์ฌํํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
^ 2.4.1
https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz
iOS, ์ค์ ์ฅ์น์์ TestFlight์์ ํ ์คํธ ํ ๋.
๋ด ์ฑ์์ RNIap ํจ์๊ฐ ํธ์ถ๋๋ฉด iOS๊ฐ ์ด์ iTunes / App Store ์ฌ์ฉ์ (์ดํ ๋ก๊ทธ ์์ํ๊ณ iOS ์ค์ ์ ํตํด ๋์ฒด)์ ์ํธ๋ฅผ ์ ๋ ฅํ๋ผ๋ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. ๋๋ ์จ๋ผ์ธ ์ด๋๊ฐ์์ ์ด๊ฒ์ด ๋๋๋ก iPhone ์ฌ์ฉ์๋ฅผ ๊ดด๋กญํ๋ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์ฝ์์ต๋๋ค. ๋๋ก๋ ํ๋์ iTunes ๊ณ์ ์ผ๋ก ์ฑ์ ๊ตฌ์ ํ ๋ค์ ์ ํ๊ฐ ์ iTunes ๊ณ์ ์ผ๋ก ์ ํ๋์ง๋ง ์ฑ์ ๊ณ์ํด์ ์ํธ๋ฅผ ๋ฌป์ต๋๋ค. ์ด์ iTunes ๊ณ์ .
๋ด ์ฑ (๋ฐ TestFlight)์ ์ญ์ ํ๊ณ ์ App Store ์ฌ์ฉ์๋ก ๋ค์ ์ค์นํ๋ ค๊ณ ํ์ง๋ง ์๋ฌด ์์ฉ์ด ์์์ต๋๋ค. ์ด ๋์์ ์ ๊ฑฐ ํ ์์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์ฅ์น๋ฅผ ์ง์ฐ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ ํ์๋ ๋ ์ด์์ด ์ค๋ฅ๋ฅผ ์ฌํ ํ ์ ์์ต๋๋ค.
{
code: E_UNKNOWN,
column: 1565,
domain: NSURLErrorDomain,
framesToPop: 1,
line: 20,
nativeStackIOS: [...],
sourceURL: ...,
userInfo: {
_kCFStreamErrorCodeKey: -4,
_kCFStreamErrorDomainKey: 4,
NSErrorFailingURLKey: None,
NSErrorFailingURLStringKey: https://p100-sandbox.itunes.apple.com/WebObjects/MZFinance.woa/wa/inAppBuy,
NSLocalizedDescription: Cannot connect to iTunes Store,
NSUnderlyingError: {
code: "-1005",
domain: "kCFErrorDomainCFNetwork",
message: "underlying error",
nativeStackIOS: [...],
userInfo:{"NSErrorPeerAddressKey":null,"_kCFStreamErrorCodeKey":-4,"_kCFStreamErrorDomainKey":4}
}
}
}
์ด๊ฒ์ด ๋๊ตฐ๊ฐ๋ฅผ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
ํจ์ฐฌ
๋ง์ ๊ฒ์ ์๋ํ ํ์๋ ์ฌ์ ํ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ ์ฝ๋์์ RNIap.buySubscription (sku)์ undefined๋ฅผ ๋ฐํํฉ๋๋ค. ๋๊ตฐ๊ฐ ํด๊ฒฐ ํ๋์?
```
static purchaseSubscriptionIOS = ๋น๋๊ธฐ (subscriptionID) => {
KinvoBilling.getSubscriptions ();๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.
try {
const purchaseResult = await RNIap.buySubscription(subscriptionID);
return createResponse(true, purchaseResult);
} catch (error) {
const subscription = RNIap.addAdditionalSuccessPurchaseListenerIOS(async (purchase) => {
// dooboolab => check the call here.
console.tron.log('--- ERROR ----');
console.tron.log(error);
console.tron.log('--- PURCHASE ----');
console.tron.log(purchase);
const result = purchase;
subscription.remove();
console.tron.log(result);
if (result) {
return createResponse(true, result);
}
return createResponse(false, result);
});
}
};
```
: +1 : ์ฐ๋ฆฌ๋์ด ๋ฌธ์ ๋ฅผ ์ ๊ฒฝํํ๊ณ ์์ต๋๋ค. ํ์ฌ ์ฝ 10 %์ ์ฌ์ฉ์์๊ฒ ๋ฐ์ํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๋์ด ์ฒญ์ทจ์๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํ์ง๋ง ๊ถ๊ทน์ ์ผ๋ก ์ด๊ฒ์ด ํ๋ฅญํ ํด๊ฒฐ์ฑ ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. @hyochan ์ด๊ฒ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋ ์์ธํ ์ ๋ณด๋ฅผ ์ป์ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
3.4.6์์๋ ๋งค์ฐ ์ ์ฌํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. E_UNKOWN
์ฒซ ๋ฒ์งธ ๊ตฌ๋งค ์๋๊ฐ ์คํจํ๊ณ ์ฌ ์๋๊ฐ ์ฑ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ์๊ฒ ์ด๊ฒ์ buyProduct
๊ฐ ์๋๋ผ buySubscription
ํฉ๋๋ค. @hyochan ์ด ์ฌ์ ํ ๋์ผํ ๊ทผ๋ณธ ์์ธ ์ผ ์ ์์ต๋๊น?
์๋ ํ์ธ์! RNIap.requestSubscription ()์ ํธ์ถ ํ ํ์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ์๋์ง ์์ ๊ฒฐ๊ณผ๊ฐ ํ์๋์ง๋ง ๊ฒฐ์ ๊ฐ ์ฑ๊ณตํ๋ฉด ์ ์ฉ ์นด๋์ ์๊ธ์ด ์ฒญ๊ตฌ๋ฉ๋๋ค.
ํด๋น ์ฌ์ฉ์๊ฐ ๊ณผ๊ฑฐ๋ฅผ ์ป๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๊ตฌ๋งค๋ฅผ ๋ณต์ํ๋ ๊ฒ์ ๋๋ค.
๋๊ตฌ๋ ์ง ์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ป์์ต๋๊น? ๋ฒ์ 3.5.9๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
: +1 : ์ฐ๋ฆฌ๋์ด ๋ฌธ์ ๋ฅผ ์ ๊ฒฝํํ๊ณ ์์ต๋๋ค. ํ์ฌ ์ฝ 10 %์ ์ฌ์ฉ์์๊ฒ ๋ฐ์ํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๋์ด ์ฒญ์ทจ์๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํ์ง๋ง ๊ถ๊ทน์ ์ผ๋ก ์ด๊ฒ์ด ํ๋ฅญํ ํด๊ฒฐ์ฑ ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. @hyochan ์ด๊ฒ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋ ์์ธํ ์ ๋ณด๋ฅผ ์ป์ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?