Skip to main content
์ƒˆ๋กœ์šด ์ปค๋ฎค๋‹ˆํ‹ฐ ๋Œ€ํ™”๋ฅผ Slack์œผ๋กœ ์ด์ „ํ•จ์— ๋”ฐ๋ผ ์˜จ๋ผ์ธ Trailblazer Community๋Š” 2026๋…„ 10์›” 30์ผ๋ถ€ํ„ฐ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. FAQ๋ฅผ ์ฝ์–ด๋ณด์‹ญ์‹œ์˜ค.

์ƒ˜ํ”Œ ์•ฑ ๋„๊ตฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ

์ฐธ๊ณ 

์ฐธ๊ณ 

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

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

์ด ๋‹จ๊ณ„์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ƒ˜ํ”Œ ์•ฑ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋„๊ตฌ์™€ ๊ตฌ์„ฑ์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด LWC ๋ ˆ์‹œํ”ผ ์ƒ˜ํ”Œ ์•ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.ย 

  1. ๋ธŒ๋ผ์šฐ์ €์—์„œ github.com/trailheadapps๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. LWC ๋ ˆ์‹œํ”ผ ์•ฑ ํƒ€์ผ์—์„œ LWC Recipes๋ผ๋Š” ์ œ๋ชฉ์„ ํด๋ฆญํ•˜์—ฌ lwc-recipes ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

Salesforce ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ

๋จผ์ €, sfdx-project.json ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ Salesforce ํ”„๋กœ์ ํŠธ ์„ค์ •์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

GitHub์˜ sfdx-project.json ํŒŒ์ผ

  1. ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด sfdx-project.json์˜ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
{
  "packageDirectories": [
    {
      "path": "force-app",
      "default": true,
      "package": "LWCRecipes",
      "versionName": "Summer '23",
      "versionNumber": "58.0.0.NEXT"
    }
  ],
  "namespace": "",
  "sourceApiVersion": "58.0",
  "sfdcLoginUrl": "https://login.salesforce.com",
  "packageAliases": {
    "LWCRecipes": "0Ho3t000000KywNCAS",
    "LWCRecipes@57.0.0-2": "04t3t000002wSUgAAM",
    "LWCRecipes@58.0.0-5": "04t3t0000037toQAAQ",
    "LWCRecipes@58.0.0-6": "04t3t0000037tozAAA",
    "LWCRecipes@58.0.0-7": "04t3t0000037tp9AAA",
    "LWCRecipes@58.0.0-8": "04t3t0000037tpEAAQ"
  }
}
  1. packageDirectories ๊ตฌ์„ฑ์—์„œ ์ด ์•ฑ์— ๋Œ€ํ•ด ์ž ๊ธˆ ํ•ด์ œ๋œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์ •ํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํŒจํ‚ค์ง€ ์ด๋ฆ„, ํŒจํ‚ค์ง€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ํŒŒ์ผ ๊ฒฝ๋กœ ๋ฐ ๋ฒ„์ „ ์ •๋ณด์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  2. sourceApiVersion ๊ตฌ์„ฑ๋„ ์ฐธ๊ณ ํ•˜์„ธ์š”. ์›์น™์ ์œผ๋กœ ์ƒ˜ํ”Œ ์•ฑ์€ ๊ตฌ์„ฑ ํŒŒ์ผ๊ณผ ๋ชจ๋“  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๊ฑธ์ณ ํ˜„์žฌ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค์˜ API ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ sourceApiVersion์—๋Š” ๋‹ค๋ฅธ ๊ฐ’์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ธŒ๋ผ์šฐ์ €์—์„œ Back(๋’ค๋กœ ๊ฐ€๊ธฐ) ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์ฝ”๋“œ ํ’ˆ์งˆ ๋„๊ตฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ–ˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.ย 

์ฝ”๋“œ ํ’ˆ์งˆ ๋„๊ตฌ ์„ค์ •

Salesforce ๋ช…๋ น์ค„์— ํฌํ•จ๋œ ๋„๊ตฌ ์™ธ์—๋„ Salesforce๋Š” npm๊ณผ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋Ÿฐํƒ€์ž„ Salesforce ์ฝ”๋“œ์— Node.js๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ package.json์ด ์žˆ์–ด npm์œผ๋กœ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ย 

์ฐธ๊ณ 

npm์€ Node.js์˜ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋กœ, ํŒจํ‚ค์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ, ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค(CLI), ์›น ์‚ฌ์ดํŠธ npmjs.com์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. npm์€ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋Š” ๋ฌผ๋ก , Salesforce CLI ๋ฐ ์˜คํ”ˆ CLI ํ”„๋ ˆ์ž„์›Œํฌ(OCLIF)๋ฅผ ๋น„๋กฏํ•œ ๋ฒ”์šฉ ๋ช…๋ น์ค„ ๋„๊ตฌ๊นŒ์ง€ ๊ตฌํ˜„ํ•˜๋Š” ์•ฑ ๊ตฌ์ถ•์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ์•ฑ์—์„œ๋Š” ์ฝ”๋“œ ๋ฆฐํŒ…, ์ฝ”๋“œ ์„œ์‹ ์ง€์ •, ์œ ๋‹› ํ…Œ์ŠคํŠธ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ(ALM) ์ž๋™ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์™€ ํ•จ๊ป˜ npm ๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. npm์„ ์„ค์น˜ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ npm์„ ๋ฒˆ๋“ค๋กœ ์ œ๊ณตํ•˜๋Š” Node.js๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. npm์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ npmjs.com์„ ๋ฐฉ๋ฌธํ•ด ๋ณด์„ธ์š”.ย 

  1. ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด package.json์˜ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ dependencies(์ข…์†์„ฑ)์€ ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”.
  3. devDependencies ๊ตฌ์„ฑ์„ ๋ณด๋ฉด ๋„๊ตฌ์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. Salesforce์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋†’์€ ์ˆ˜์ค€์˜ ํŒจํ‚ค์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • prettier: ์ฝ”๋“œ ์„œ์‹ ์ง€์ •์šฉ
    • eslint: ์ฝ”๋“œ ๋ฆฐํŒ…์šฉ
    • @salesforce/sfdx-lwc-jest: Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ Jest ํ™•์žฅ ๊ธฐ๋Šฅ
    • husky: ๋ฒ„์ „ ๊ด€๋ฆฌ์— ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋Š” ์ž‘์—… ์‹คํ–‰
  5. ๋˜ํ•œ scripts ๊ตฌ์„ฑ์— ํŠน์ • ๊ณตํ†ต ๋ช…๋ น์–ด๋ฅผ ์บก์Аํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์‚ฌ๋ก€์—์„œ ๋ช…๋ น์€ npm run์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•œ ์˜ˆ๋กœ, test:unit ์Šคํฌ๋ฆฝํŠธ ํ‚ค๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”. ๋ช…๋ น์ค„์—์„œ npm run test:unit์„ ์‹คํ–‰ํ•˜์—ฌ Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

npm run test:unit์œผ๋กœ ์œ ๋‹› ํ…Œ์ŠคํŠธ ์‹คํ–‰

  1. ๋ธŒ๋ผ์šฐ์ €์—์„œ Back(๋’ค๋กœ ๊ฐ€๊ธฐ) ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ package.json ๋‘˜๋Ÿฌ๋ณด๊ธฐ๋ฅผ ๋งˆ์นฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์— ์„ค์น˜๋œ ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย 

์œ ๋‹› ํ…Œ์ŠคํŠธ ๊ตฌ์„ฑ

๋ช‡ ๊ฐ€์ง€ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Salesforce๋Š” Jest ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ sfdx-lwc-jest๋ผ๋Š” LWC ์ „์šฉ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.ย 

  1. ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด jest.config.js์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. moduleNameMapper JavaScript ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ sfdx-lwc-jest์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๊ธฐ๋ณธ ๋ชจํ˜•์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ์˜ ํ™•์žฅ ๊ธฐ๋Šฅ์€ ์—ฌ๊ธฐ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
moduleNameMapper: {
  /* CSS library import fix in test context. See:
  https://github.com/salesforce/sfdx-lwc-jest/issues/288) */
  '^c/cssLibrary$':
      '/force-app/main/default/lwc/cssLibrary/cssLibrary.css',
  // Jest mocks
  '^@salesforce/apex$': '/force-app/test/jest-mocks/apex',
  '^@salesforce/schema$': '/force-app/test/jest-mocks/schema',
  '^lightning/navigation$':
      '/force-app/test/jest-mocks/lightning/navigation',
  '^lightning/platformShowToastEvent$':
      '/force-app/test/jest-mocks/lightning/platformShowToastEvent',
  '^lightning/uiRecordApi$':
      '/force-app/test/jest-mocks/lightning/uiRecordApi',
  '^lightning/messageService$':
      '/force-app/test/jest-mocks/lightning/messageService',
  '^lightning/actions$':
      '/force-app/test/jest-mocks/lightning/actions',
  '^lightning/alert$':
      '/force-app/test/jest-mocks/lightning/alert',
  '^lightning/confirm$':
      '/force-app/test/jest-mocks/lightning/confirm',
  '^lightning/prompt$':
      '/force-app/test/jest-mocks/lightning/prompt',
  '^lightning/modal*':
      '/force-app/test/jest-mocks/lightning/modal'
},
  1. ^lightning/navigation$ ํ‚ค๋Š” ๋ชจํ˜•์˜ ์œ„์น˜๋ฅผ <rootDir>/force-app/test/jest-mocks/lightning/navigation์œผ๋กœ ์ •์˜ํ•œ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•˜์„ธ์š”. GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ด ๋ชจ์˜ JS ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  2. ๋ธŒ๋ผ์šฐ์ €์—์„œ Back(๋’ค๋กœ ๊ฐ€๊ธฐ) ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. Force-app,, test/jest-mocks, lightning ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ชจ๋“  Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ ์„œ๋น„์Šค์˜ ๋ชจํ˜•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋งํฌ๋ฅผ ํด๋ฆญํ•ด navigation.js ํŒŒ์ผ ์ฝ˜ํ…์ธ ๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
  5. ์—ฌ๊ธฐ์—์„œ Lightning NavigationMixin์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ๋œ ํ•จ์ˆ˜ ์ผ๋ถ€๊ฐ€ Jest ํ…Œ์ŠคํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ๋ชจ์˜๋กœ ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. ๋ธŒ๋ผ์šฐ์ €์—์„œ Back(๋’ค๋กœ) ๋ฒ„ํŠผ์„ ๋„ค ๋ฒˆ ํด๋ฆญํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

์ž๋™ํ™”๋œ ์ฝ”๋“œ ์„œ์‹ ์ง€์ • ๊ตฌ์„ฑ

์ง€๊ธˆ๊นŒ์ง€ sfdx-lwc-jest ๋„๊ตฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์•˜๊ณ , ์ด์ œ Prettier ์ฝ”๋“œ ์„œ์‹ ์ง€์ • ๋„๊ตฌ์˜ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. sfdx-lwc-jest๋Š” LWC๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉ๋˜์ง€๋งŒ, Prettier๋Š” ๋‹ค์–‘ํ•œ ํŒŒ์ผ์—์„œ ์ฝ”๋“œ ์„œ์‹์„ ์ง€์ •ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. XML ๋ฐ Apex์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.ย LWC ์ „์šฉ ์„œ์‹ ์ง€์ • ๊ทœ์น™์€ Prettier๊ณผ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

package.json์„ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋ฉด, ๋‹ค์Œ ์ค„์—์„œ ๋‹ค์–‘ํ•œ ํŒŒ์ผ ์œ ํ˜•์— ๋Œ€ํ•ด Prettier ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๊ตฌ์„ฑํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย 

"prettier": "prettier --write \"**/*.{cls,cmp,component,css,html,js,json,md,page,trigger,xml,yaml,yml}\""

Prettier ๋„๊ตฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ด…์‹œ๋‹ค. ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Prettier ๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย 

  1. ๋งํฌ๋ฅผ ํด๋ฆญํ•ด .prettierrc ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค.
  2. ํ›„ํ–‰ ์‰ผํ‘œ ์ ์šฉ, ์ž‘์€๋”ฐ์˜ดํ‘œ ๋ฐ ํƒญ ๋„ˆ๋น„ ํ—ˆ์šฉ ๋“ฑ ์ฝ”๋“œ ์„œ์‹์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ Prettier๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์— ์œ ์˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋˜ํ•œ overrides(์žฌ์ •์˜) ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ๋ฌธ ๋ถ„์„ ๊ทœ์น™์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ค‘๊ด„ํ˜ธ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ HTML ์†์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด lwc ํŒŒ์„œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
"trailingComma": "none",
"singleQuote": true,
"tabWidth": 4,
"overrides": [
    {
        "files": "**/lwc/**/*.html",
        "options": { "parser": "lwc" }
    },
    {
        "files": "*.{cmp,page,component}",
        "options": { "parser": "html" }
    }
]
  1. ๋ธŒ๋ผ์šฐ์ €์—์„œ Back(๋’ค๋กœ) ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

๋ฌด์‹œํ•˜๊ธฐ

๋งŽ์€ ๋„๊ตฌ์—์„œ ์‹คํ–‰๋˜๋Š” ํŒŒ์ผ์— ๋Œ€ํ•˜์—ฌ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Git, Prettier, ESLint ๋ฐ Salesforce CLI ๋“ฑ์€ ๋ชจ๋‘ ์–ด๋–ค ํŒŒ์ผ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.ย 

Salesforce ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์ผ๋ถ€ ์กฐ์ง(์Šคํฌ๋ž˜์น˜ ์กฐ์ง)์€ ์†Œ์Šค๋ฅผ ์ถ”์ ํ•˜๋Š”๋ฐ, ์ด๋Š” API๊ฐ€ ๋กœ์ปฌ ๋ฐ ์กฐ์ง์—์„œ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์„ ์ถ”์ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ sf project deploy start ๋˜๋Š” sf project retrieve start๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์ง๊ณผ ๋กœ์ปฌ ํ”„๋กœ์ ํŠธ ๊ฐ„์˜ ๋™๊ธฐํ™”๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋Š” ๋ถ€๋ถ„์€ .forceignore๋ผ๋Š” ํŒŒ์ผ์— ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.ย 

  1. .forceignore, .gitignore, .prettierignore ํŒŒ์ผ์— ์ฃผ๋ชฉํ•˜์„ธ์š”. ์—ฌ๊ธฐ์—๋Š” ๋‹ค์–‘ํ•œ ๋„๊ตฌ์— ๋Œ€ํ•œ ๋ฌด์‹œ ๊ทœ์น™์ด ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. .forceignore๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. .forceignore์— ์ •์˜๋œ ํ•ญ๋ชฉ์€ SourceSync API๊ฐ€ ์ถ”์ ํ•˜๊ฑฐ๋‚˜ ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  4. ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์˜ ๋‹ค๋ฅธ ํ•ญ๋ชฉ ์ค‘์—์„œ settings(์„ค์ •) ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  5. ๋ธŒ๋ผ์šฐ์ €์—์„œ Back(๋’ค๋กœ) ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

GitHub ์ž‘์—…

์ข‹์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CI/CD ํ”„๋กœ์„ธ์Šค์—์„œ ๋„๊ตฌ๋ฅผ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Salesforce์˜ ์ƒ˜ํ”Œ ์•ฑ์—์„œ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๊ณ  ๋ถ„๊ธฐ ๊ฐ„์— ์ด๋™ํ•  ๋•Œ GitHub ์ž‘์—…์„ ์‚ฌ์šฉํ•ด ์ด๋Ÿฌํ•œ ๋„๊ตฌ์˜ ์‚ฌ์šฉ์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ๋“ค์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์ฐพ์•„๋ณด๊ณ  ์•ž์„œ ์‚ดํŽด๋ณธ ๋„๊ตฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์˜ ์‹คํ–‰ ์ด๋ ฅ์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.ย 

GitHub ์ž‘์—…์€ GitHub์— ๋‚ด์žฅ๋œ ๊ธฐ๋Šฅ์œผ๋กœ, GitHub ๋‚ด์—์„œ ์ „์ฒด CI/CD ํ”„๋กœ์„ธ์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Salesforce ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋Š” CI/CD ๋„๊ตฌ์™€ ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ์„ ํ˜ธํ•˜๋Š” ๋‹ค๋ฅธ CI/CD ๋„๊ตฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋‹ค๋ฅธ ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ๋Š” ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.ย 

  1. .github ๋ฐ workflows์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋งํฌ๋ฅผ ํด๋ฆญํ•ด github CI ์›Œํฌํ”Œ๋กœ๊ฐ€ ์žˆ๋Š” YAML ํŒŒ์ผ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ci-pr.yml ๋งํฌ๋ฅผ ํด๋ฆญํ•ด ํŒŒ์ผ ์ฝ˜ํ…์ธ ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๊ณ  run:npm run prettier:verify๋ผ๋Š” ์ค„์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
  4. CI ํ”„๋กœ์„ธ์Šค์—์„œ Prettier๋Š” ์ฝ”๋“œ๊ฐ€ ์„ค์ •์— ์ง€์ •๋œ ์„œ์‹ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  5. GitHub UI ์ƒ๋‹จ์—์„œ Actions(์ž‘์—…) ํƒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

GitHub ์ž‘์—… ํƒญ

  1. ๋ชจ๋“  GitHub ์ž‘์—… ์›Œํฌํ”Œ๋กœ ๋ชฉ๋ก์€ ์™ผ์ชฝ์— ์žˆ์Šต๋‹ˆ๋‹ค. CI๋ฅผ ํด๋ฆญํ•˜์—ฌ ํ•ด๋‹น ์›Œํฌํ”Œ๋กœ๊ฐ€ ์‹คํ–‰๋œ ๋ชจ๋“  ์‹œ๊ฐ„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ lwc-recipes GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋„๊ตฌ ์„ค์ •์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ƒ˜ํ”Œ ์•ฑ์—์„œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ ๊ตฌ์„ฑ์€ ์ตœ๋Œ€ํ•œ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์•ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠธ๋ ˆ์ผ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„๋ฃŒํ•˜์—ฌ ํ•ด๋‹น ์•ฑ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

Salesforce์˜ ์˜คํ”ˆ ์†Œ์Šค์— ๋Œ€ํ•œ ํ•œ๋งˆ๋””

trailheadapps github org์— ์žˆ๋Š” ์ƒ˜ํ”Œ์€ Salesforce ๊ฐœ๋ฐœ์ž ๊ด€๊ณ„ ํŒ€์—์„œ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์•ฑ์€ ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋”ฐ๋ผ ๊ตฌ์ถ•๋˜์—ˆ์œผ๋ฉฐ, ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์˜ ๋„๊ตฌ ๊ธฐ๋Šฅ์„ ์„ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒ˜ํ”Œ ์•ฑ์„ ์‚ดํŽด๋ณธ ๋‹ค์Œ Salesforce ํŒ€์—์„œ ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋ณด๊ณ  ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด ๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ƒ˜ํ”Œ ๋ฐ SDK ์›น ํŽ˜์ด์ง€์—์„œ ์˜คํ”ˆ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋‹จ๊ณ„์—์„œ๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ์ž‘์—…๋ฌผ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Verify step to earn 100 points(๋‹จ๊ณ„๋ฅผ ํ™•์ธํ•˜๊ณ  100ํฌ์ธํŠธ ํš๋“)๋ฅผ ํด๋ฆญํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„๋ฃŒํ•˜์„ธ์š”.

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

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

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