Skip to main content

Apex ์‹œ์ž‘ํ•˜๊ธฐ

ํ•™์Šต ๋ชฉํ‘œ

์ด ์œ ๋‹›์„ ์™„๋ฃŒํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Apex ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Apex ํด๋ž˜์Šค๋ฅผ ์ €์žฅํ•˜๊ณ  Anonymous.Apex๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Developer Console์„ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ 

์ฐธ๊ณ 

ํ•œ๊ตญ์–ด๋กœ ํ•™์Šตํ•˜์‹œ๊ฒ ์–ด์š”? Trailhead playground์—์„œ ํ•œ๊ตญ์–ด๋กœ ์‹ค์Šต ๊ณผ์ œ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ , ๊ด„ํ˜ธ ์•ˆ์— ์ œ๊ณต๋œ ๋ฒˆ์—ญ์„ ์‚ฌ์šฉํ•ด ํƒ์ƒ‰ํ•ด ๋ณด์„ธ์š”. ์˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์Šต ๊ณผ์ œ ๊ฒ€์ฆ์ด ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ์˜๋ฌธ์œผ๋กœ ํ‘œ์‹œ๋œ ๊ฐ’๋งŒ ๋ณต์‚ฌํ•ด ๋ถ™์—ฌ ๋„ฃ์Šต๋‹ˆ๋‹ค. ํ•œ๊ตญ์–ด ์กฐ์ง์—์„œ ์‹ค์Šต ๊ณผ์ œ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ, (1) ๋กœ์บ˜์„ ๋ฏธ๊ตญ์œผ๋กœ ๋ฐ”๊พธ๊ณ  (2) ์—ฌ๊ธฐ์— ์ œ์‹œ๋œ ์ง€์นจ์— ๋”ฐ๋ผ ์–ธ์–ด๋ฅผ ์˜์–ด๋กœ ๋ฐ”๊พผ ํ›„ (3) "Check Challenge(๊ณผ์ œ ํ™•์ธ)" ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋‹ค์‹œ ์ง„ํ–‰ํ•ด ๋ณด์„ธ์š”.

์›ํ•˜๋Š” ์–ธ์–ด๋กœ Trailhead ์‚ฌ์šฉํ•˜๊ธฐ ๋ฑƒ์ง€๋ฅผ ํ™•์ธํ•ด ํ˜„์ง€ํ™”๋œ Trailhead ๊ฒฝํ—˜์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ Apex ๋ชจํ—˜์„ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์–ด ๋Œ€๋‹จํžˆ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์—์„œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ๋‹ค๋ฃจ์ง€๋งŒ, ๊นŠ์ด ์žˆ๋Š” ๋‚ด์šฉ๋„ ํ•จ๊ป˜ ์‚ดํŽด๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์ด Apex์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ํ•™์Šต์ธ ๊ฒฝ์šฐ ๋จผ์ € ๋น ๋ฅธ ์‹œ์ž‘: Apex ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ ํ›„์— ๋‹ค์‹œ ๋Œ์•„์˜ค์„ธ์š”. ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค!

Apex๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

Apex๋Š” Java์™€ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ ํ”„๋กœ์‹œ์ €์™€ ๊ฐ™์ด ์ž‘๋™ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. Apex๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋ฒ„ํŠผ ํด๋ฆญ, ๊ด€๋ จ ๋ ˆ์ฝ”๋“œ ์—…๋ฐ์ดํŠธ ๋ฐ Visualforce ํŽ˜์ด์ง€์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ธ์–ด๋กœ์„œ์˜ Apex๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํ˜ธ์ŠคํŒ…๋จ - Apex๋Š” ์„œ๋ฒ„์ธ Salesforce Platform์—์„œ ์ €์žฅ, ์ปดํŒŒ์ผ ๋ฐ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ์ฒด - ์ง€ํ–ฅ - Apex๋Š” ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ์ƒ์†์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ•๋ ฅํ•œ ํ˜•์‹ - Apex๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ€ํ‹ฐ ํ…Œ๋„ŒํŠธ ์ธ์‹ - Apex๋Š” ๋ฉ€ํ‹ฐ ํ…Œ๋„ŒํŠธ ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ๊ณต์œ  ๋ฆฌ์†Œ์Šค๋ฅผ ๋…์ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์ œํ•œ์„ ์ ์šฉํ•˜์—ฌ ๋Ÿฐ์–ด์›จ์ด ์ฝ”๋“œ๋ฅผ ์ฒ ์ €ํžˆ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ตํ•ฉ - ๋ ˆ์ฝ”๋“œ์— ์•ก์„ธ์Šคํ•˜๊ณ  ์ด๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Apex๋Š” ๋ ˆ์ฝ”๋“œ ๋ฐ ํ•ด๋‹น ํ•„๋“œ์— ๋Œ€ํ•œ ์ง์ ‘ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ ๋ฐ ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ - Apex๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ํŠธ๋žœ์žญ์…˜ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ž‘์—…์„ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ์šฉ์ด์„ฑ - Apex๋Š” ์นœ์ˆ™ํ•œ Java ๊ด€์šฉ๊ตฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ - Apex๋Š” ์œ ๋‹› ํ…Œ์ŠคํŠธ ์ƒ์„ฑ, ์‹คํ–‰ ๋ฐ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Salesforce๋Š” ํ”Œ๋žซํผ ์—…๊ทธ๋ ˆ์ด๋“œ ์ „์— ๋ชจ๋“  ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ Apex ์ฝ”๋“œ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฒ„์ „ ๊ด€๋ฆฌ - ์‚ฌ์šฉ์ž ์ •์˜ Apex ์ฝ”๋“œ๋Š” API์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์— ๋งž๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Apex๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

Apex ์–ธ์–ด ํ•˜์ด๋ผ์ดํŠธ

๋‹ค๋ฅธ ๊ฐœ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค์Œ์€ Apex๊ฐ€ ์ง€์›ํ•˜๋Š” ์–ธ์–ด ๊ตฌ์„ฑ ์ค‘ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

  • ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ์†์„ฑ, ์ปฌ๋ ‰์…˜(๋ชฉ๋ก, ๋งต, ์„ธํŠธ)
  • ๊ฐœ์ฒด ๋ฐ ๋ฐฐ์—ด ํ‘œ๊ธฐ๋ฒ•
  • ํ‘œํ˜„์‹, ๋ณ€์ˆ˜ ๋ฐ ์ƒ์ˆ˜
  • ์กฐ๊ฑด๋ฌธ(if-then-else) ๋ฐ ์ œ์–ด ํ”Œ๋กœ ๋ฌธ(for ๋ฃจํ”„ ๋ฐ while ๋ฃจํ”„)

๋‹ค๋ฅธ ๊ฐœ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ Apex๋Š” ๋‹ค์Œ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • Apex๋กœ์„œ์˜ ํด๋ผ์šฐ๋“œ ๊ฐœ๋ฐœ์€ ํด๋ผ์šฐ๋“œ์—์„œ ์ €์žฅ, ์ปดํŒŒ์ผ ๋ฐ ์‹คํ–‰๋จ.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์˜ ํŠธ๋ฆฌ๊ฑฐ์™€ ์œ ์‚ฌํ•œ ํŠธ๋ฆฌ๊ฑฐ.
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ˜ธ์ถœ ๋ฐ ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” Database ๋ฌธ.
  • ํŠธ๋žœ์žญ์…˜ ๋ฐ ๋กค๋ฐฑ.
  • public ์ˆ˜์ •์ž๋ณด๋‹ค ๊ถŒํ•œ์ด ๋” ์žˆ๋Š” global ์•ก์„ธ์Šค ์ˆ˜์ •์ž๋กœ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•จ.
  • ์‚ฌ์šฉ์ž ์ •์˜ ์ฝ”๋“œ์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ.

๋˜ํ•œ Apex๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ๋„๊ตฌ

Visual Studio Code์šฉ Salesforce ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ปดํ“จํ„ฐ์—์„œ Apex๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Salesforce ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋˜ํ•œ Salesforce ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ Apex๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋””๋ฒ„๊น… ์ •๋ณด์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Your Name(์ด๋ฆ„)์—์„œ Developer Console์„ ์—ด๊ฑฐ๋‚˜ ๋น ๋ฅธ ์•ก์„ธ์Šค ๋ฉ”๋‰ด(์„ค์ • ํ†ฑ๋‹ˆ๋ฐ”ํ€ด ์•„์ด์ฝ˜)๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ํ˜•์‹ ๊ฐœ์š”

Apex๋Š” Salesforce์— ํŠน์ •ํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์ธ sObject ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ํฌํ•จํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Apex๋Š” ๋‹ค์Œ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • Integer, Double, Long, Date, Datetime, String, ID, Boolean ๋“ฑ๊ณผ ๊ฐ™์€ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ.
  • ์ผ๋ฐ˜ sObject ๋˜๋Š” ๊ณ„์ •, ์—ฐ๋ฝ์ฒ˜ ๋˜๋Š” MyCustomObject__c์™€ ๊ฐ™์€ ํŠน์ • sObject๋กœ์„œ์˜ sObject. (sObject์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ดํ›„ ์œ ๋‹›์—์„œ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.)
  • ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” ์ปฌ๋ ‰์…˜.
    • ๊ธฐ๋ณธ ์š”์†Œ ์ง‘ํ•ฉ, sObject, ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐœ์ฒด, Apex ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋œ ๊ฐœ์ฒด ๋˜๋Š” ์ปฌ๋ ‰์…˜์˜ ์„ค์ •
    • ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์—์„œ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ, sObject ๋˜๋Š” ์ปฌ๋ ‰์…˜์œผ๋กœ์˜ ๋งต
  • ํ˜•์‹ํ™”๋œ ๊ฐ’ ๋ชฉ๋ก(์—ด๊ฑฐํ˜•์ด๋ผ๊ณ ๋„ ํ•จ)
  • ์‚ฌ์šฉ์ž ์ •์˜ Apex ํด๋ž˜์Šค
  • ์‹œ์Šคํ…œ ์ œ๊ณต Apex ํด๋ž˜์Šค

Apex ์ปฌ๋ ‰์…˜: ๋ชฉ๋ก

๋ชฉ๋ก์—๋Š” ๋™์ผํ•œ ์œ ํ˜•์˜ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ ์ปฌ๋ ‰์…˜์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‘ ์„ ์–ธ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. colors ๋ณ€์ˆ˜๋Š” List ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค.

List<String> colors = new List<String>();

colors ๋ณ€์ˆ˜๋Š” ๋ฐฐ์—ด ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

String[] colors = new List<String>();

List.add() ๋ฉ”์„œ๋“œ๋กœ ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•„์š”์— ๋”ฐ๋ผ ์ปฌ๋ ‰์…˜์„ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค. ๋Œ€๊ด„ํ˜ธ ๋ฐฐ์—ด ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋กœ ์ปฌ๋ ‰์…˜์˜ ๊ธฐ์กด ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๊ด„ํ˜ธ ๋ฐฐ์—ด ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ๋Š” ๋ชฉ๋ก์„ ๋งŒ๋“ค ๋•Œ ๋ชฉ๋ก์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , add() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.ย 

// Create a list and add elements to it in one step
List<String> colors = new List<String> { 'red', 'green', 'blue' };
// Add elements to a list after it has been created
List<String> moreColors = new List<String>();
moreColors.add('orange');
moreColors.add('purple');

๋ชฉ๋ก ์š”์†Œ๋Š” ๋Œ€๊ด„ํ˜ธ ์‚ฌ์ด์— ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ๋ฐฐ์—ด ํ‘œ๊ธฐ๋ฒ•์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ get() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชฉ๋ก ์š”์†Œ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋Š” ์ด์ „ ์˜ˆ์ œ์—์„œ ๋งŒ๋“  ๋ชฉ๋ก์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ ๋‘ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชฉ๋ก ์š”์†Œ๋ฅผ ์ฝ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋Š” ๋ชฉ๋ก ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

// Get elements from a list
String color1 = moreColors.get(0);
String color2 = moreColors[0];
System.assertEquals(color1, color2);
// Iterate over a list to read elements
System.debug('Print out the colors in moreColors:');
for(String color : moreColors) {
    // Write value to the debug log
    System.debug(color);
}

์ถ”๊ฐ€ ๊ธฐ๋ณธ ์ •๋ณด

Apex๋Š” Set ๋ฐ Map์˜ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ์œ ํ˜•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Apex ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ์˜ ์ปฌ๋ ‰์…˜ ์„น์…˜์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Apex ํด๋ž˜์Šค

Apex ํด๋ž˜์Šค์˜ ์ด์  ์ค‘ ํ•˜๋‚˜๋Š” ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์ž…๋‹ˆ๋‹ค. Class ๋ฉ”์„œ๋“œ๋Š” ํŠธ๋ฆฌ๊ฑฐ ๋ฐ ๊ธฐํƒ€ ํด๋ž˜์Šค์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ์กฐ์ง์— ์˜ˆ์ œ ํด๋ž˜์Šค๋ฅผ ์ €์žฅํ•˜๊ณ  ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๊ณ  ๋””๋ฒ„๊ทธ ๋กœ๊ทธ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

Apex ํด๋ž˜์Šค ์ €์žฅ

์กฐ์ง์—์„œ EmailManager ํด๋ž˜์Šค๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  1. Your Name(์ด๋ฆ„)์—์„œ Developer Console์„ ์—ด๊ฑฐ๋‚˜ ๋น ๋ฅธ ์•ก์„ธ์Šค ๋ฉ”๋‰ด(์„ค์ • ํ†ฑ๋‹ˆ๋ฐ”ํ€ด ์•„์ด์ฝ˜)๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
  2. Developer Console์—์„œ File(ํŒŒ์ผ) | New(์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ) | Apex Class(Apex ํด๋ž˜์Šค)๋ฅผ ํด๋ฆญํ•˜๊ณ  ํด๋ž˜์Šค ์ด๋ฆ„์— ๋Œ€ํ•ด EmailManager๋ฅผ ์ž…๋ ฅํ•œ ๋‹ค์Œ OK(ํ™•์ธ)๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ธฐ๋ณธ ํด๋ž˜์Šค ๋ณธ๋ฌธ์„ EmailManager ํด๋ž˜์Šค ์˜ˆ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋ฉ”์ผ์„ ์ „์†กํ•˜๊ณ  Apex ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋ณธ ์ œ๊ณต Messaging ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” EmailManager ํด๋ž˜์Šค์—๋Š” ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ(sendMail())๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ํด๋ž˜์Šค์—๋Š” ๋น„๊ณต๊ฐœ ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ(inspectResults())๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด๋Š” ๋น„๊ณต๊ฐœ์ด๋ฏ€๋กœ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์ง€๋งŒ ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฉ”์ผ ๋ณด๋‚ด๊ธฐ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  sendMail()์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
    public class EmailManager {
        // Public method
        public void sendMail(String address, String subject, String body) {
            // Create an email message object
            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
            String[] toAddresses = new String[] {address};
            mail.setToAddresses(toAddresses);
            mail.setSubject(subject);
            mail.setPlainTextBody(body);
            // Pass this email message to the built-in sendEmail method
            // of the Messaging class
            Messaging.SendEmailResult[] results = Messaging.sendEmail(
                                     new Messaging.SingleEmailMessage[] { mail });
            // Call a helper method to inspect the returned results
            inspectResults(results);
        }
        // Helper method
        private static Boolean inspectResults(Messaging.SendEmailResult[] results) {
            Boolean sendResult = true;
            // sendEmail returns a list of result objects.
            // Iterate through the list to inspect results.
            // In this class, the methods send only one email,
            // so we should have only one result.
            for (Messaging.SendEmailResult res : results) {
                if (res.isSuccess()) {
                    System.debug('Email sent successfully');
                }
                else {
                    sendResult = false;
                    System.debug('The following errors occurred: ' + res.getErrors());
                }
            }
            return sendResult;
        }
    }
  4. File(ํŒŒ์ผ) | Save(์ €์žฅ)๋ฅผ ํด๋ฆญํ•˜์—ฌ ํด๋ž˜์Šค๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    ์ฐธ๊ณ : ์ฝ”๋“œ์˜ ๊ตฌ๋ฌธ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ Problems(๋ฌธ์ œ) ํƒญ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Salesforce๋Š” ํด๋ž˜์Šค๋ฅผ ์ €์žฅํ•  ๋•Œ ํด๋ž˜์Šค๋ฅผ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๊ธฐ๋ณธ ์ •๋ณด

์ €์žฅํ•œ ํด๋ž˜์Šค๋Š” ๊ฐœ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์ด๋ฉ”์ผ ๊ด€๋ฆฌ์™€ ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค. OOP์˜ ์™„๋ฒฝํ•œ ์˜ˆ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค์—๋Š” ํ•ด๋‹น ์†์„ฑ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์„ฑ์› ๋ณ€์ˆ˜(์†์„ฑ) ๋ฐ ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๋„ ํฌํ•จ๋˜์ง€๋งŒ ๊ฐ„์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค์—๋Š” ์ด๋Ÿฌํ•œ ์š”์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ต๋ช… Apex ์‹คํ–‰์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ต๋ช… Apex๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ์ค„์„ ์ฆ‰์„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํŠนํžˆ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด Apex๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ Apex ์‹คํ–‰๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์˜ˆ๋ฅผ ๋“ค์–ด ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํ†ตํ•ด Apex๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ํŠธ๋ฆฌ๊ฑฐ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. Developer Console์—์„œ Debug(๋””๋ฒ„๊ทธ) | Open Execute Anonymous Window(์ต๋ช… ์‹คํ–‰ ์ฐฝ ์—ด๊ธฐ)๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  2. ์—ด๋ฆฌ๋Š” ์ฐฝ์—์„œ ๋‹ค์Œ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. 'Your email address'๋ฅผ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
    EmailManager em = new EmailManager();
    em.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
  3. Execute(์‹คํ–‰)๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    ์ด์ œ ๋ฐ›์€ ํŽธ์ง€ํ•จ์— ์ด๋ฉ”์ผ์ด ์ˆ˜์‹ ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฉ”์ผ์„ ํ™•์ธํ•˜์„ธ์š”.

๋””๋ฒ„๊ทธ ๋กœ๊ทธ ๊ฒ€์‚ฌ

๋””๋ฒ„๊ทธ ๋กœ๊ทธ๋Š” ์ฝ”๋“œ ๋””๋ฒ„๊น…์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. Apex ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ํ˜ธ์ถœ์ด ๋””๋ฒ„๊ทธ ๋กœ๊ทธ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋กœ๊ทธ์— ๊ณ ์œ ํ•œ ๋””๋ฒ„๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. sendMail()์—์„œ ํ˜ธ์ถœ๋˜๋Š” inspectResults() ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ๋Š” System.debug() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์— ๋ฉ”์‹œ์ง€๋ฅผ ์จ์„œ ์ด๋ฉ”์ผ ๋ณด๋‚ด๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ƒ์„ฑ๋œ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ์—์„œ ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Developer Console์—์„œ Logs(๋กœ๊ทธ) ํƒญ์„ ํด๋ฆญํ•˜๊ณ  ๋ชฉ๋ก์—์„œ ๊ฐ€์žฅ ์ตœ๊ทผ ๋กœ๊ทธ๋ฅผ ๋‘ ๋ฒˆ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  2. Debug Only(๋””๋ฒ„๊ทธ ์ „์šฉ)๋ฅผ ์„ ํƒํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋ฉด System.debug() ๋ฌธ์— ๋Œ€ํ•œ ๋กœ๊ทธ ํ–‰๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Developer Console์—์„œ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ๋ฅผ ํ•„ํ„ฐ๋งํ•˜์—ฌ ๋””๋ฒ„๊ทธ ๋ฉ”์‹œ์ง€ ๋ณด๊ธฐ

์ด๋ฉ”์ผ์ด ์˜ค๋ฅ˜ ์—†์ด ์ „์†ก๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ํ•„ํ„ฐ๋ง๋œ ๋กœ๊ทธ ๋ณด๊ธฐ์— ๋‹ค์Œ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

DEBUG|Email sent successfully
์ฐธ๊ณ 

๋˜ํ•œ Filter(ํ•„ํ„ฐ) ํ•„๋“œ์—์„œ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์˜ต์…˜์„ ์„ ํƒํ•˜์—ฌ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ๋ฅผ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋กœ๊ทธ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ •์  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

ํด๋ž˜์Šค์˜ sendMail() ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค ๊ตฌ์„ฑ์› ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. static ํ‚ค์›Œ๋“œ๋ฅผ ํ•ด๋‹น ์„ ์–ธ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ •์  ๋ฉ”์„œ๋“œ๋กœ ๋ณ€๊ฒฝํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ •์  ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—์„œ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ํด๋ž˜์Šค ์ด๋ฆ„์—์„œ ์ง์ ‘ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ณด๋‹ค ํ˜ธ์ถœํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

  1. Developer Console์—์„œ EmailManager ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์—ด๋ ค ์žˆ๋Š” ํƒญ์„ ์ฐพ๊ณ  sendMail() ๋ฉ”์„œ๋“œ ์ •์˜์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค(์œ ์ผํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ static ํ‚ค์›Œ๋“œ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.).
    public static void sendMail(String address, String subject, String body) {
  2. File(ํŒŒ์ผ) | Save(์ €์žฅ)๋ฅผ ํด๋ฆญํ•˜์—ฌ ํด๋ž˜์Šค๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  3. Execute Anonymous(์ต๋ช… ์‹คํ–‰) ์ฐฝ์—์„œ ๋ฌธ์„ ์ˆ˜์ •ํ•˜์—ฌ ํด๋ž˜์Šค ์ด๋ฆ„์— ๋Œ€ํ•œ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
    EmailManager.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
  4. Execute(์‹คํ–‰)๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด์ „ ๋‹จ๊ณ„์—์„œ์™€ ๊ฐ™์ด ์ด๋ฉ”์ผ์„ ํ™•์ธํ•˜๊ณ  ์„ ํƒ์ ์œผ๋กœ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค

Salesforce ๋„์›€๋ง์—์„œ Trailhead ํ”ผ๋“œ๋ฐฑ์„ ๊ณต์œ ํ•˜์„ธ์š”.

Trailhead์— ๊ด€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์˜๊ฒฌ์— ๊ท€ ๊ธฐ์šธ์ด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ Salesforce ๋„์›€๋ง ์‚ฌ์ดํŠธ์—์„œ ์–ธ์ œ๋“ ์ง€ ์ƒˆ๋กœ์šด ํ”ผ๋“œ๋ฐฑ ์–‘์‹์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ ์˜๊ฒฌ ๊ณต์œ ํ•˜๊ธฐ