Skip to main content
Bring your team and maximize your impact at Dreamforce. Register three or more to unlock $999 passes.

Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ์— ์Šคํƒ€์ผ ๋ฐ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ

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

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

  • ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ•จ๊ป˜ CSS ๋ฐ Lightning Design System ์‚ฌ์šฉํ•˜๊ธฐ
  • Salesforce org์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
  • ์กฐ์ง์— ์•ฑ์„ ๋ฐฐํฌํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ
์ฐธ๊ณ 

์ฐธ๊ณ 

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

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

๊ตฌ์„ฑ ์š”์†Œ ์กฐ์ •ํ•˜๊ธฐ

์ด์ œ Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์„ค๋ช…์˜ ๋ง‰๋ฐ”์ง€ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ชจ์–‘์„ ์ œ์–ดํ•˜๊ณ  ๋ผ์ด๋ธŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Lightning ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๋ชจ์–‘๊ณผ ๋А๋‚Œ์„ ์กฐ์ •ํ•˜๊ณ  ์กฐ์ง์—์„œ ๋ผ์ด๋ธŒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์œ ๋‹›์—์„œ๋Š” ํ…์ŠคํŠธ์˜ ๋ชจ์–‘์„ ์ƒ๋™๊ฐ ์žˆ๊ฒŒ ๋ฐ”๊พธ๊ณ  ์กฐ์ง์˜ ๋ ˆ์ฝ”๋“œ์—์„œ ์ด๋ฆ„์„ ๋™์ ์œผ๋กœ ๋Œ์–ด์™€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ง€๋‚œ ์œ ๋‹›์˜ Bike Selector ์•ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์œ ๋‹›์„ ์™„๋ฃŒํ•˜์„ธ์š”.

CSS ๋ฐ ๊ตฌ์„ฑ ์š”์†Œ ์Šคํƒ€์ผ๋ง

Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ์šฉ CSS์˜ ๊ตฌํ˜„์€ W3C ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. CSS ํŒŒ์ผ์—์„œ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด ํ•ด๋‹น HTML ํŒŒ์ผ์— ์ž๋™์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์บก์Аํ™”ํ•˜์—ฌ ์ „์—ญ DOM๊ณผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Shadow DOM์ด๋ผ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. Shadow DOM์€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ DOM์˜ โ€˜ํ•˜์œ„ ํŠธ๋ฆฌโ€™์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค(Shadow DOM์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฆฌ์†Œ์Šค ์„น์…˜์˜ ๋งํฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”). ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค๋ฅธ ์•ฑ ๋‚ด์—์„œ ๋˜๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ž์‹์œผ๋กœ ๊ทธ ๋ชจ์–‘๊ณผ ๋™์ž‘์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ž์ „๊ฑฐ์˜ ๊ฐ€๊ฒฉ์„ ๊ตต์€ ๋…น์ƒ‰ ํ…์ŠคํŠธ๋กœ ํ‘œ์‹œํ•˜๋„๋ก ์„ค์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. detail.css ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด .price๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

body{
  margin: 0;
}
.price{
  color: green;
  font-weight: bold;
}

ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

Note

detail ํด๋”์—์„œ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์œผ๋กœ ํด๋ฆญํ•˜๋ฉด ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•˜์ง€ ์•Š๊ณ  ์ƒˆ ํŒŒ์ผ๋งŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ์ง์—์„œ Bike Selector ์•ฑ ํŽ˜์ด์ง€๊ฐ€ ์บ์‹œ๋œ ๊ฒฝ์šฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๋ ค๋ฉด ์ƒˆ๋กœ ๊ณ ์นจํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž์ „๊ฑฐ๋ฅผ ์„ ํƒํ•˜๋ฉด ๊ฐ€๊ฒฉ์ด ๋…น์ƒ‰์˜ ๊ตต์€ ๊ธ€์”จ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋…น์ƒ‰์˜ ๊ตต์€ ๊ธ€์”จ๋กœ ํ‘œ์‹œ๋œ ๊ฐ€๊ฒฉ

Lightning Design System ์Šคํƒ€์ผ ์ ์šฉํ•˜๊ธฐ

SLDS(Salesforce Lightning Design System)๋Š” Lightning Experience์™€ ๋™์ผํ•œ ๋ชจ์–‘๊ณผ ๋А๋‚Œ์„ ์ œ๊ณตํ•˜๋Š” CSS ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. Lightning Experience ๋˜๋Š” Salesforce ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์žˆ๋Š” Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ๋Š” import ๋ฌธ์ด๋‚˜ ์ •์  ๋ฆฌ์†Œ์Šค ์—†์ด SLDS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, SLDS ์ œ๋ชฉ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ ํ…์ŠคํŠธ๋ฅผ ํ‘œ์ค€ Lightning ํ…์ŠคํŠธ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. detail.html ํŒŒ์ผ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด slds-text-heading_small ๋ฐ slds-text-heading_medium์œผ๋กœ ๊ธ€๊ผด ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

<template>
  <template lwc:if={product}>
    <div class="container">
      <div class="slds-text-heading_small">{product.fields.Name.value}</div>
      <div class="price">{product.fields.MSRP__c.displayValue}</div>
      <div class="description">{product.fields.Description__c.value}</div>
      <img class="product-img" src={product.fields.Picture_URL__c.value} alt={product.fields.Name.value}/>
      <p>
        <lightning-badge label={product.fields.Material__c.value}></lightning-badge>
        <lightning-badge label={product.fields.Level__c.value}></lightning-badge>
      </p>
      <p>
        <lightning-badge label={product.fields.Category__c.value}></lightning-badge>
      </p>
    </div>
  </template>
  <template lwc:else>
    <div class="slds-text-heading_medium">Select a bike</div>
  </template>
</template>

ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์กฐ์ง์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ณ  ์ฐจ์ด๋ฅผ ํ™•์ธํ•˜์„ธ์š”(ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์นจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

SLDS ์ œ๋ชฉ์— ํ•ด๋‹น ๊ธ€๊ผด์ด ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฉ‹์ง€๋„ค์š”! ์ด์ œ ๋ชจ์–‘๊ณผ ๋А๋‚Œ์ด ์™„์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (๋งˆํฌ์—… ๋ณ€๊ฒฝ ๋ฐ SLDS ์Šคํƒ€์ผ๋ง์€ ์ด ๋ชจ๋“ˆ์„ ์™„๋ฃŒํ•œ ํ›„ ์ˆ˜ํ–‰ํ•  ์—ฐ์Šต ๊ณผ์ œ๋กœ ๋‚จ๊ฒจ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๊ฐœ๋…์€ Mobile-Friendly Markup (๋ชจ๋ฐ”์ผ ์นœํ™”์ ์ธ ๋งˆํฌ์—…)์„ ํ™•์ธํ•˜๊ณ  ์ด ์•ฑ์œผ๋กœ ์‹คํ—˜ํ•ด ๋ณด์„ธ์š”!)

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๊ฐ€์ ธ์˜จ ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€์— ๋™์  ๋ฐ์ดํ„ฐ๋ผ๋Š” ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Salesforce ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

์ด ์•ฑ์€ ๊ฒฐ๊ตญ Salesforce ์•ฑ์ด๋ฉฐ, Salesforce org์—์„œ ๋™์  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ๋Š” Lightning Data Service๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ ๋ฐ˜์‘ํ˜• ์™€์ด์–ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์— ์ด๋ฆ„์„ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ฑ์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์™€์ด์–ด ์„œ๋น„์Šค

์™€์ด์–ด ์„œ๋น„์Šค๋Š” ํ”Œ๋žซํผ์˜ ์ผ๋ถ€๋กœ, ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ ์ž ๊น ์–ธ๊ธ‰ํ–ˆ๋˜ @wire ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์•ฑ์—์„œ ์™€์ด์–ด ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์™€์ด์–ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. JavaScript ํŒŒ์ผ์—์„œ ์™€์ด์–ด ์–ด๋Œ‘ํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  2. @wire ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์†์„ฑ์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ์ฝ”๋ ˆ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import { adapterId } from 'adapter-module';
@wire(adapterId, adapterConfig) propertyOrFunction;
  • adapterId(์‹๋ณ„์ž)-์™€์ด์–ด ์–ด๋Œ‘ํ„ฐ์˜ ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.
  • adapter-module(๋ฌธ์ž์—ด)-์™€์ด์–ด ์–ด๋Œ‘ํ„ฐ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ๋ชจ๋“ˆ์˜ ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.
  • adapterConfig(๊ฐœ์ฒด)-์™€์ด์–ด ์–ด๋Œ‘ํ„ฐ์™€ ๊ด€๋ จ๋œ ๊ตฌ์„ฑ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค.
  • propertyOrFunction-์™€์ด์–ด ์„œ๋น„์Šค์—์„œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์ˆ˜์‹ ํ•˜๋Š” ๊ฐœ์ธ ์†์„ฑ ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์†์„ฑ์ด @wire๋กœ ๋ฐ์ฝ”๋ ˆ์ดํŠธ๋œ ๊ฒฝ์šฐ, ์†์„ฑ์˜ ๋ฐ์ดํ„ฐ ์†์„ฑ ๋˜๋Š” ์˜ค๋ฅ˜ ์†์„ฑ์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ @wire๋กœ ๋ฐ์ฝ”๋ ˆ์ดํŠธ๋œ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ์†์„ฑ๊ณผ ์˜ค๋ฅ˜ ์†์„ฑ์ด ์žˆ๋Š” ๊ฐœ์ฒด๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ž‘์—… ์ค‘์ธ ํ”„๋กœ์ ํŠธ์˜ selector.js ํŒŒ์ผ์— ์ด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์กฐ์ง์—์„œ ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

import { LightningElement, wire } from 'lwc';
import { getRecord, getFieldValue } from 'lightning/uiRecordApi';
import Id from '@salesforce/user/Id';
import NAME_FIELD from '@salesforce/schema/User.Name';
const fields = [NAME_FIELD];
export default class Selector extends LightningElement {
  selectedProductId;
  handleProductSelected(evt) {
    this.selectedProductId = evt.detail;
  }
  userId = Id;
  @wire(getRecord, { recordId: '$userId', fields })
  user;
  get name() {
    return getFieldValue(this.user.data, NAME_FIELD);
  }
}
  • ์ค„ 1์€ lwc์—์„œ wire ์„œ๋น„์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์ค„ 2๋Š” lightning/uiRecordApi์—์„œ getRecord ๋ฐ getFieldValue์— ๋Œ€ํ•œ adapterId ๋ฐ adapter-module์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์ค„ 3์€ @salesforce ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ํ˜„์žฌ ์‚ฌ์šฉ์ž ID๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์ค„ 4๋Š” User.Name์— ๋Œ€ํ•œ @salesforce ์Šคํ‚ค๋งˆ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์ค„ 12๋Š” @wire ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์™€์ด์–ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด userId๋ฅผ ์ „๋‹ฌํ•˜๊ณ  fields๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” getRecord๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ์ค„ 13์€ user๋ฅผ @wire ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ˆ˜์‹ ์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

selector.html ํŒŒ์ผ์„ ํŽธ์ง‘ํ•ด ์ด๋ฆ„์„ ํฌํ•จํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ ์˜ˆ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

<template>
  <div class="wrapper">
    <header class="header">Available Bikes for {name}</header>
    <section class="content">
      <div class="columns">
        <main class="main" >
          <c-list onproductselected={handleProductSelected}></c-list>
        </main>
        <aside class="sidebar-second">
          <c-detail product-id={selectedProductId}></c-detail>
        </aside>
      </div>
    </section>
  </div>
</template>

์„ ํƒ๊ธฐ ๊ตฌ์„ฑ ์š”์†Œ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ์กฐ์ง์— ๋ฐฐํฌํ•˜๋ฉด(๋ฐฐํฌ์— ์„ ํƒ๊ธฐ ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ ํ•„์š”) Mary Jones๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ๋‹ค์Œ ๋‚ด์šฉ์ด ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์นจํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

UI์— ๋™์ ์œผ๋กœ ๋กœ๋“œ๋œ ์‚ฌ์šฉ์ž ์ด๋ฆ„

๋ชจ๋ฐ”์ผ ์นœํ™”์ ์ธ ๋งˆํฌ์—…

Bike Selector ์•ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” Lightning ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋งˆํฌ์—…์€ ๊น”๋”ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ๋ถ„์ด Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ธฐ๋ณธ์„ ์ตํž ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋ฐ”์ผ ์นœํ™”์ ์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. Salesforce ๋ชจ๋ฐ”์ผ ์•ฑ์—์„œ ์‚ดํŽด๋ณด๊ฑฐ๋‚˜ ๋ชจ๋ฐ”์ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด ๋ณด์„ธ์š”. ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜์ง€๋งŒ ๊ทธ๋‹ค์ง€ ์ข‹์€ ๋ชจ๋ฐ”์ผ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋Š” ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ์•„์ฃผ ํ˜•ํŽธ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

SLDS๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์žฅ์ ์€ ์•ฝ๊ฐ„์˜ ๋…ธ๋ ฅ๋งŒ์œผ๋กœ ๋ฐ์Šคํฌํ†ฑ๊ณผ ๋ชจ๋ฐ”์ผ์—์„œ ๋ชจ๋‘ ์ •๋ˆ๋˜์–ด ๋ณด์ด๊ณ  ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์ด ๋ชจ๋“ˆ์—์„œ ๋‹ค๋ฃฌ ๋‚ด์šฉ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ์กฑ์‹œํ‚ฌ Lightning ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ๋„๊ตฌ์™€ ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ์ด ์œ ๋‹›์˜ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ง€๊ธˆ์€ ๋ชจ๋ฐ”์ผ์„ ์ œ์ณ๋‘๊ณ  ์žˆ์ง€๋งŒ, '์‹ค์ œ' Lightning ๊ตฌ์„ฑ ์š”์†Œ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ๋ฐ˜๋Œ€๋กœ ํ•  ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋ฐ”์ผ ์„ธ๋ถ€ ์‚ฌํ•ญ๊ณผ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•˜์„ธ์š”. SLDS์™€ ๋ชจ๋ฐ”์ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์ž‘๋ถ€ํ„ฐ ๋ชจ๋ฐ”์ผ๊ณผ ๋ฐ์Šคํฌํ†ฑ์„ ํ•จ๊ป˜ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“ˆ์€ ๋ชจ๋ฐ”์ผ์„ ์ดˆ๊ธฐ ๋‹จ๊ณ„๋ถ€ํ„ฐ ๊ณ ๋ คํ•˜์ง€ ์•Š์„ ๋•Œ์˜ ์œ„ํ—˜์„ฑ์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. Bike Selection ์•ฑ์ด ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ๋ณด๊ธฐ ์ข‹์ง€ ์•Š๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜์„ ๋•Œ, ์•ฝ๊ฐ„์˜ ์ž‘์—…๋งŒ ํ•˜๋ฉด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ๋ณ€๊ฒฝ ์ž‘์—…์— ์ฐฉ์ˆ˜ํ•˜๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ฑ์˜ ๋งˆํฌ์—…์ด ๊น”๋”ํ•˜๊ณ  ์˜๋ฏธ๋ก ์ ์œผ๋กœ ์ž˜ ์งœ์—ฌ์ ธ ์žˆ๋”๋ผ๋„ ๊ธฐ์กด์— ๊ตฌ์ถ•๋œ ํ™˜๊ฒฝ์— ๋ชจ๋ฐ”์ผ์„ ์‚ฌํ›„์— ์–ต์ง€๋กœ ๋ผ์›Œ ๋งž์ถ”๋Š” ๋ฐฉ์‹์€ ์˜ฌ๋ฐ”๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ๋งˆํฌ์—…๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋งˆํฌ์—…์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ์‹ค์Šต ๊ณผ์ œ๊นŒ์ง€ ๋ชจ๋‘ ๋‹ค์‹œ ์ž‘์—…ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์˜ ๊ตฌ์กฐ์™€ ํ”Œ๋กœ์— ๋Œ€ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค! ๋ฏธ๋ฆฌ ์ž‘์—…ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์†์ด ๋” ๋งŽ์ด ๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค! ๊ธฐ์ˆ  ์‹œ์Šคํ…œ ๊ตฌํ˜„์—๋Š” ์–ธ์ œ๋‚˜ ์ ˆ์ถฉ์•ˆ์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ๊ณ , ์—ฌ๋Ÿฌ๋ถ„๋„ ํŒ€๊ณผ ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ์ ์ ˆํ•œ ์ ˆ์ถฉ์•ˆ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ์ด ์ ˆ์ถฉ์•ˆ์„ ์—ผ๋‘์— ๋‘์„ธ์š”. ๋ฏธ๋ฆฌ ์•Œ๋ฉด ๋Œ€๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์ด๋Š” Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ ๋ชจ๋ธ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์˜ ์‹œ์ž‘์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์—๋Š” ํ…Œ์ŠคํŠธ, ๋ณด์•ˆ, Apex ํ†ตํ•ฉ ๋“ฑ์— ๋Œ€ํ•œ ์ง€์›์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ณ„์† ํƒ์ƒ‰ํ•˜๊ณ , ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ , ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”. W3C ์›น ๊ตฌ์„ฑ ์š”์†Œ ํ‘œ์ค€์˜ ๋ฐœ์ „๊ณผ ํ•จ๊ป˜ ์ €ํฌ ๋ชจ๋ธ๋„ ๋ฐœ์ „ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Lightning ์›น ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ฏธ๋ž˜๋กœ ๊ฐ€๋Š” ๊ธธ

๋ฆฌ์†Œ์Šค

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

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

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