๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๊ณต์œ  (share)

๐Ÿ”” ์ตœ์‹ ํ™” ์ผ์ž: 2025-02-20

๊ฐœ์š”โ€‹

share ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๊ณต์œ  UI๋ฅผ ํ†ตํ•ด ์ฝ˜ํ…์ธ ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ, ์นด์นด์˜คํ†ก ๊ณต์œ  ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋ฉฐ, ์ปค์Šคํ…€ ํ…œํ”Œ๋ฆฟ ๋˜๋Š” URL ์Šคํฌ๋žฉ ๋ฐฉ์‹์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํƒ€์ž… ์ •์˜โ€‹

KakaoShareTypeโ€‹

์นด์นด์˜คํ†ก ๊ณต์œ  ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ด๋Š” ์—ด๊ฑฐํ˜•(enum)์ž…๋‹ˆ๋‹ค.

declare enum KakaoShareType {
CUSTOM = 'custom',
SCRAP = 'scrap',
}
๊ฐ’์„ค๋ช…
custom์‚ฌ์ „์— ๋“ฑ๋ก๋œ ์ปค์Šคํ…€ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ์นด์นด์˜คํ†ก ๊ณต์œ  ๋ฉ”์‹œ์ง€ ์ „์†ก
scrapURL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์นด์นด์˜คํ†ก ์Šคํฌ๋žฉ ๊ณต์œ  ๋ฉ”์‹œ์ง€ ์ „์†ก

KakaoShareCustomโ€‹

์นด์นด์˜คํ†ก ์ปค์Šคํ…€ ํ…œํ”Œ๋ฆฟ ๊ณต์œ  ์‹œ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

declare type KakaoShareCustom = {
templateId: number;
templateArgs?: {
[key: string]: string;
};
serverCallbackArgs?: {
[key: string]: string;
};
};
ํ•„๋“œํƒ€์ž…์„ค๋ช…
templateIdnumber์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์„ผํ„ฐ์—์„œ ๋“ฑ๋กํ•œ ํ…œํ”Œ๋ฆฟ ID
templateArgs{ [key: string]: string } (optional)ํ…œํ”Œ๋ฆฟ์— ์ „๋‹ฌํ•  ๊ฐ€๋ณ€์ ์ธ ๊ฐ’
serverCallbackArgs{ [key: string]: string } (optional)๊ณต์œ  ๊ฒฐ๊ณผ๋ฅผ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ ํ•จ๊ป˜ ์ „๋‹ฌํ•  ๊ฐ’

KakaoShareScrapโ€‹

์นด์นด์˜คํ†ก URL ์Šคํฌ๋žฉ ๊ณต์œ  ์‹œ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

declare type KakaoShareScrap = {
requestUrl: string;
templateId?: number;
templateArgs?: {
[key: string]: string;
};
serverCallbackArgs?: {
[key: string]: string;
};
};
ํ•„๋“œํƒ€์ž…์„ค๋ช…
requestUrlstring์Šคํฌ๋žฉํ•  ๋Œ€์ƒ URL
templateIdnumber (optional)์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์„ผํ„ฐ์—์„œ ๋“ฑ๋กํ•œ ํ…œํ”Œ๋ฆฟ ID
templateArgs{ [key: string]: string } (optional)ํ…œํ”Œ๋ฆฟ์— ์ „๋‹ฌํ•  ๊ฐ€๋ณ€์ ์ธ ๊ฐ’
serverCallbackArgs{ [key: string]: string } (optional)๊ณต์œ  ๊ฒฐ๊ณผ๋ฅผ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ ํ•จ๊ป˜ ์ „๋‹ฌํ•  ๊ฐ’

KakaoShareResultStatusCodeโ€‹

์นด์นด์˜ค ๊ณต์œ  ์š”์ฒญ์˜ ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

declare enum KakaoShareResultStatusCode {
ERROR_JSON_FAILED = 102,
ERROR_JSON_FAILED_TO_MODEL = 103,
ERROR_JSON_FAILED_TO_KAKAO_MODEL = 104,
ERROR_JSON_WRONG_SHARE_TYPE = 105,
ERROR_JSON_EMPTY_REQUEST_URL = 106,
ERROR_JSON_EMPTY_TEMPLATE_ID = 108,
ERROR_KAKAO_FAILED = 199,
SUCCESS_KAKAO = 200,
SUCCESS_SAFARI = 201,
}
๊ฐ’์„ค๋ช…
102JSON ๋ณ€ํ™˜ ์‹คํŒจ
103JSON์„ ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
104JSON์„ ์นด์นด์˜ค ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
105์ž˜๋ชป๋œ ๊ณต์œ  ํƒ€์ž… ์ง€์ • (custom ๋˜๋Š” scrap์ด ์•„๋‹˜)
106scrap ๊ณต์œ  ํƒ€์ž…์—์„œ requestUrl์ด ๋น„์–ด ์žˆ์Œ
108custom ๊ณต์œ  ํƒ€์ž…์—์„œ templateId๊ฐ€ ๋น„์–ด ์žˆ์Œ
199์นด์นด์˜ค ๊ณต์œ  ์š”์ฒญ ์‹คํŒจ
200์นด์นด์˜ค ๊ณต์œ  ์„ฑ๊ณต
201Safari ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ณต์œ  ์„ฑ๊ณต

KakaoShareResultโ€‹

์นด์นด์˜ค ๊ณต์œ  ์š”์ฒญ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

declare type KakaoShareResult = {
status: 'error' | 'success';
statusCode: KakaoShareStatusCode;
message?: string;
};
ํ•„๋“œํƒ€์ž…์„ค๋ช…
status'error' | 'success'๊ณต์œ  ์„ฑ๊ณต ์—ฌ๋ถ€
statusCodeKakaoShareResultStatusCode์š”์ฒญ ๊ฒฐ๊ณผ ์ƒํƒœ ์ฝ”๋“œ
messagestring (optional)์š”์ฒญ ์‹คํŒจ ์‹œ, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ํฌํ•จ

๋ฉ”์„œ๋“œ ๋ชฉ๋กโ€‹

๋ฉ”์„œ๋“œ์„ค๋ช…์ถ”๊ฐ€๋œ ๋ฒ„์ „
openSharing(url)๋„ค์ดํ‹ฐ๋ธŒ ๊ณต์œ  UI๋ฅผ ์—ด์–ด ์ฝ˜ํ…์ธ ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.ver.1.1.0
sendKakao(type, data, callback?)์นด์นด์˜คํ†ก ๊ณต์œ ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.ver.1.2.0

๋ฉ”์„œ๋“œ ์ƒ์„ธโ€‹

openSharing(url: string): voidโ€‹

  • since ver.1.1.0

์„ค๋ช… (openSharing)โ€‹

์ง€์ •๋œ url์„ ๋„ค์ดํ‹ฐ๋ธŒ ๊ณต์œ  UI๋ฅผ ํ†ตํ•ด ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
๋„ค์ดํ‹ฐ๋ธŒ ๊ณต์œ  UI๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ๋””๋ฐ”์ด์Šค์— ์„ค์น˜๋œ ๊ณต์œ  ๊ฐ€๋Šฅํ•œ ์•ฑ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ (openSharing)โ€‹

์ด๋ฆ„ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€์„ค๋ช…
urlstringโœ…๊ณต์œ ํ•  ๋Œ€์ƒ URL

๋ฐ˜ํ™˜ ๊ฐ’ (openSharing)โ€‹

ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์ œ (openSharing)โ€‹

// ๊ณต์œ  ํ•  URL. ex) 'https://nachocode.io'
const sharedURL = 'https://nachocode.io';
// ๊ณต์œ ํ•  URL์„ ์ง€์ •ํ•˜์—ฌ ๋„ค์ดํ‹ฐ๋ธŒ ๊ณต์œ  UI๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
Nachocode.share.openSharing(sharedURL);

sendKakao(type: KakaoShareType, data: KakaoShareCustom | KakaoShareScrap, callback?: (result: KakaoShareResult) => void): voidโ€‹

  • since ver.1.2.0

์„ค๋ช… (sendKakao)โ€‹

์นด์นด์˜คํ†ก ๊ณต์œ  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์ปค์Šคํ…€ ํ…œํ”Œ๋ฆฟ(custom) ๋˜๋Š” URL ์Šคํฌ๋žฉ(scrap) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ณต์œ  ๊ฒฐ๊ณผ๋Š” ์„ ํƒ์ ์œผ๋กœ callback ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ (sendKakao)โ€‹

์ด๋ฆ„ํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€์„ค๋ช…
typeKakaoShareTypeโœ…custom ๋˜๋Š” scrap ๊ณต์œ  ๋ฐฉ์‹ ์„ ํƒ
dataKakaoShareCustom | KakaoShareScrapโœ…๊ณต์œ ํ•  ๋ฐ์ดํ„ฐ (ํ…œํ”Œ๋ฆฟ ID ๋˜๋Š” URL ํ•„์š”)
callback(result: KakaoShareResult) => void (optional)โŒ๊ณต์œ  ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜

๋ฐ˜ํ™˜ ๊ฐ’ (sendKakao)โ€‹

ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ณต์œ  ๊ฒฐ๊ณผ๋Š” callback ํ•จ์ˆ˜์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์ œ (sendKakao)โ€‹

// ์ปค์Šคํ…€ ํ…œํ”Œ๋ฆฟ์„ ํ™œ์šฉํ•œ ์นด์นด์˜คํ†ก ๊ณต์œ 
Nachocode.share.sendKakao(
'custom',
{
templateId: 12345,
templateArgs: { title: 'nachocode SDK' },
},
result => {
console.log('์นด์นด์˜ค ๊ณต์œ  ๊ฒฐ๊ณผ:', result);
}
);
// URL์„ ํ™œ์šฉํ•œ ์นด์นด์˜คํ†ก ๊ณต์œ 
Nachocode.share.sendKakao(
'scrap',
{
requestUrl: 'https://nachocode.io',
},
result => {
if (result.status === 'success') {
console.log('์นด์นด์˜คํ†ก ๊ณต์œ  ์„ฑ๊ณต');
} else {
console.error(`์นด์นด์˜คํ†ก ๊ณต์œ  ์‹คํŒจ: ${result.message}`);
}
}
);

์ถ”๊ฐ€ ์ •๋ณดโ€‹

  • custom ๊ณต์œ  ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ, ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์„ผํ„ฐ์—์„œ ์‚ฌ์ „ ๋“ฑ๋ก๋œ ํ…œํ”Œ๋ฆฟ ID๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • scrap ๊ณต์œ  ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ, ์นด์นด์˜ค ์Šคํฌ๋žฉ API๋ฅผ ํ†ตํ•ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ๊ณต์œ ๊ฐ€ ์‹คํŒจํ•  ๊ฒฝ์šฐ, KakaoShareResult์˜ status ๊ฐ’์ด 'error'๋กœ ์„ค์ •๋˜๋ฉฐ message ํ•„๋“œ์— ์˜ค๋ฅ˜ ์›์ธ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.