Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TDD로 앞서가는 프론트엔드: 디자인, API 없이도 개발을 시작하는 방법

kakao
November 01, 2024

TDD로 앞서가는 프론트엔드: 디자인, API 없이도 개발을 시작하는 방법

#front-end #TDD #Vue.js

1년간 진행된 카카오맵 매장관리 프로젝트에서 TDD를 활용하여, 디자인, 마크업, API 없이도 프론트엔드 개발을 사전에 진행했던 경험을 바탕으로 새로운 프로세스를 제안합니다. 이를 통해 프론트엔드 개발을 보다 효율적으로 진행할 수 있는 방법론을 소개하고자 합니다.

발표자 : cayde.abdo
카카오의 지도서비스 및 매장관리 서비스 프론트엔드 업무를 담당하고 있습니다.

kakao

November 01, 2024
Tweet

More Decks by kakao

Other Decks in Programming

Transcript

  1. ӝദࢲ ѐߊ੄߽ݾਃࣗ ೐ۿ౟ূ٘ ݃௼স ٣੗ੋઁҕ '& ӝദࢎ೦੹׳ "1*ઁҕ ݃௼সઁҕ ٣੗ੋ

    ӝദࢎ೦੹׳ #& ӝദࢎ೦੹׳ ஠஠য়೐ۿ౟ূ٘੄ѐߊ೒۽਋઺ೞա
  2. ӝദࢲ ٣੗ੋ ѐߊ੄߽ݾਃࣗ ೐ۿ౟ূ٘ #& ݃௼স '& "1*ઁҕ ٣੗ੋઁҕ ݃௼সઁҕ

    ӝദࢎ೦੹׳ ӝദࢎ೦੹׳ ӝദࢎ೦੹׳ ٣੗ੋ ݃௼স "1*হ੉ޖ঺ਸೡࣻ੓ਸө
  3. ӝദࢲ ٣੗ੋ ѐߊ੄߽ݾਃࣗ ೐ۿ౟ূ٘ #& ݃௼স '& ӝദࢎ೦੹׳ "1*ઁҕ ٣੗ੋઁҕ

    ݃௼সઁҕ ӝദࢎ೦੹׳ ӝദࢎ೦੹׳ ӝദࢎ೦੹׳ ٣੗ੋ ݃௼স "1*হ੉ޖ঺ਸೡࣻ੓ਸө
  4. ׮ܰѱ߄ۄࠁӝചݶ੄ҳࢿਃࣗ ஹನք౟ $PNQPOFOU ചݶਃࣗ ӝמਃࣗ  ஹನք౟חചݶ੄ҳࢿਃࣗੑפ׮  زदীӝמਃࣗ੉ӝب೤פ׮ 

    ӝמҳഅী݃௼স਷೙ࣻ੸ੋਃࣗחইתפ׮  ӝמਃҳࢎ೦਷ӝദࢲী੿੄غয੓णפ׮ ৘द  ߡౡਸ௿ܼೞݶ 00ಕ੉૑۽੉زೠ׮ զ૞ܳ௿ܼद զ૞оೞ੉ۄ੉౟ػ׮ ಕ੉૑૓ੑद ࢎ੉٘߄ח೦࢚јनػ׮
  5.  ஹನք౟ח࢚క TUBUF ܳੑ۱߉Ҋ ࠭ WJFX ܳ߈ജೞחੌઙ੄ೣࣻੑפ׮  ױਤపझ౟ղীࢲ਋ܻחҳ୓੸ੋ݃௼স੉ࢿҕ੸ਵ۽Ӓ۰૑Ҋ੓ח૑ঌ೙ਃоহणפ׮ 

    Ӓ੷೙ਃೠਃࣗܳࢶఖೞৈ ੄بೠч੉֢୹غҊ੓ח૑ഛੋೞݶؾפ׮ ݃௼স ٣੗ੋহ੉5%%۽೐ۿ౟ূ٘ѐߊೞӝ // view <div data-testid="wrapper"> <button data-testid="testButton">{{text}}</button> </div> // test const wrapper = document.querySelector('[data-testid="wrapper"]); const button = document.querySelector('[data-testid="button"]);
  6. ஹನք౟౵ੌ੘ࢿ <script setup lang="ts"> const props = defineProps<{title: string}>(); const

    emits = defineEmits<{click: []}>(); function onClick () { emits.click(); } </script> <template> <button data-testid="button" onClick="onClick"> <span data-testid=“title”>{{props.title}}</span> </button> </template> 7VF$PNQPOFOU'JMF
  7. పझ౟౵ੌ੘ࢿ  describe('ੑ۱ೠ ఫझ౟о ੿࢚੸ਵ۽ ߡౡী ֢୹ػ׮.', () => {

    // ஹನք౟ܳ ݃਍౟ೞҊ, ୡӝ ࢚కܳ ࠗৈೠ׮. const wrapper = mount(SampleComponent, { props: { title: 'Sample', } }); // ഛੋೡ ਃࣗܳ ࢶఖೠ׮. const buttonTitleElement = findByTestId(wrapper, ‘[data-testid=“title"]'); // ഛੋೠ׮. expect(buttonTitleElement.innerText).toStrictEqual(‘Sample’); }) 5FTU'JMF
  8. పझ౟౵ੌ੘ࢿ  describe('ߡౡਸ ௿ܼ द, ௿ܼ ੉߮౟о ߊࢤೠ׮.', () =>

    { // ஹನք౟ܳ ݃਍౟ೞҊ, ୡӝ ࢚కܳ ࠗৈೠ׮. const wrapper = mount(SampleComponent, { props: { title: 'Sample', } }); // ഛੋೡ ਃࣗܳ ࢶఖೠ׮. const button = findByTestId(wrapper, '[data-testid="button"]'); await triggerEvent(button, 'click'); // ഛੋೠ׮. expect(wrapper.emitted('click')).toBeTruthy(); }) 5FTU'JMF
  9. ஹನք౟ী݃௼সਸ߄ੋ٬ೞחҗ੿ <div class="btn wrapper"> <h2 class="btn main-title">!</h2> <button type="button" class="btn

    btn-outline-primary"></button> <span class="btn description">ߡౡ ޙҳ</span> </div> ઱য૓.BSLVQ'JMF
  10. ஹನք౟ী݃௼সਸ߄ੋ٬ೞחҗ੿ <div class="btn wrapper"> <h2 class="btn main-title">!</h2> <button type="button" class="btn

    btn-outline-primary"></button> <span class="btn description">ߡౡ ޙҳ</span> </div> ઱য૓.BSLVQ'JMF ӝઓ੘ࢿػ݃௼স <button data-testid="button" onClick="onClick"> <span data-testid=“title”>{{props.title}}</span> </button>
  11. ஹನք౟ী݃௼সਸ߄ੋ٬ೞחҗ੿ <div class="btn wrapper"> <h2 class="btn main-title">!</h2> <button type="button" class="btn

    btn-outline-primary"></button> <span class="btn description">ߡౡ ޙҳ</span> </div> ઱য૓.BSLVQ'JMF పझ౟ࢶఖ੗ܳ੸ਊೠ.BSLVQ'JMF <div class="btn wrapper"> <h2 class="btn main-title">!</h2> <button type="button" class="btn btn-outline-primary" data-testid=“button” /> <span class="btn description" data-testid=“title”>{{text}}</span> </div>
  12. ݃௼সҳઑо߸҃غযبࢶఖ੗ооܻఃחч੉ӝઓҗزੌೞӝٸޙীపझ౟חాҗೠ׮ ஹನք౟ী݃௼সਸ߄ੋ٬ೞחҗ੿ describe('ੑ۱ೠ ఫझ౟о ੿࢚੸ਵ۽ ߡౡী ֢୹ػ׮.', () => {

    // ࢤۚ const buttonTitleElement = findByTestId(wrapper, ‘[data-testid=“title"]'); }) describe('ߡౡਸ ௿ܼ द, ௿ܼ ੉߮౟о ߊࢤೠ׮.', () => { // ࢤۚ const button = findByTestId(wrapper, '[data-testid="button"]'); }) <div class="btn wrapper"> <h2 class="btn main-title">!</h2> <button type="button" class="btn btn-outline-primary" data-testid=“button” /> <span class="btn description" data-testid=“title”>{{text}}</span> </div>
  13. "1*হ੉ӝמѐߊೞӝ ӝദࢲ ٣੗ੋ #& ӝദࢎ೦੹׳ ӝ ദ ࢎ ೦ ੹

    ׳ ӝദࢲחӝמਃҳࢎ೦ਸഈস੗ীѱ੹׳೤פ׮ '&חࢲߡ۽ࠗఠ"1*ܳ਽׹߉ইചݶਸӒ۰շפ׮ ೞ૑݅ӒѪ੉"1*੄ҳઑী'&੄7JFXоઙࣘؽਸ੄޷ೞ૑ঋणפ׮ '&ীࢲ೙ਃೠ7JFX.PEFM਷"1*৬߹ب۽'&о੿੄ೡࣻ੓णפ׮ '& ӝദࢎ೦੹׳ '&
  14. 7JFX.PEFMਸ੘ࢿೞחҗ੿ function useProfileViewModel () { const state = ref({ nickName:

    'nickName', phoneNumber: '010-xxxx-xxxx', }) function getNickName () { return state.value.nickName; } function getPhoneNumber () { return state.value.phoneNumber; } return { getNickName, getPhoneNumber, } } ੐੄۽рױೠೣࣻ੄ഋకܳஂ೮ਸࡺ TUPSF৬э਷ഋకܳࢎਊ೧بޖҙ
  15. 7JFX.PEFMਸ߄ఔਵ۽7JFX੘ࢿ <script setup lang="ts"> const { getNickName, getPhoneNumber } =

    useProfileViewModel(); </script> <template> <div> <span data-testid="nickName">{{getNickName()}}</span> <span data-testid="phoneNumber">{{getPhoneNumber()}}</span> </div> </template>
  16. పझ౟౵ੌ੘ࢿ describe('ߡౡਸ ௿ܼ द, ௿ܼ ੉߮౟о ߊࢤೠ׮.', () => {

    // ஹನք౟ܳ ݃਍౟ೞҊ, ୡӝ ࢚కܳ ࠗৈೠ׮. const wrapper = mount(SampleComponent); // ഛੋೡ ਃࣗܳ ࢶఖೠ׮. const nickName = findByTestId(wrapper, '[data-testid="nickName"]'); const phoneNumber = findByTestId(wrapper, '[data-testid="phoneNumber"]'); // ഛੋೠ׮. expect(nickName.innerText).toStrictEqual('nickName'); expect(phoneNumber.innerText).toStrictEqual('010-xxxx-xxxx'); })
  17. "1*-BZFSܳ੘ࢿೞחҗ੿ async function fetchProfile() { try { const response =

    await fetch('/profile', { method: 'GET', headers: { 'Content-Type': 'application/json' } }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return await response.json(); } catch (error) { throw error; } } ࢲߡীࢲ੿੄ػJOUFSGBDFܳӒ؀۽߈ജ೤פ׮
  18. 7JFX.PEFMী"1*੸ਊ function useProfileViewModel () { const state = ref({ nickName:

    '', phoneNumber: '', }) try { const {phone, nickname} = await fetchProfile(); const {first, middle, last} = phone; state.value = { nickName: nickname, phoneNumber: `${first}-${middle}-${last} }; } catch (e) {} // code… } "1*ೣࣻܳഝਊೞৈ7JFX.PEFMীݏѱ߸ജ೤פ׮ "1*ഐ୹Ѿҗܳ ޷ܻ੿೧૓࢚కী ݏ୾ࢲ౵य
  19. పझ౟౵ੌࣻ੿ describe('ߡౡਸ ௿ܼ द, ௿ܼ ੉߮౟о ߊࢤೠ׮.', () => {

    createMockAPI<APIResponse>('/profile', { nickName: 'nickName', phone: { first: '010', middle: 'xxxx', last: 'xxxx' }, name: 'test' }); const wrapper = mount(SampleComponent); const nickName = findByTestId(wrapper, '[data-testid="nickName"]'); const phoneNumber = findByTestId(wrapper, '[data-testid="phoneNumber"]'); expect(nickName.innerText).toStrictEqual('nickName'); expect(phoneNumber.innerText).toStrictEqual('010-xxxx-xxxx'); }) "1*਽׹ਸ.PDLJOH೤פ׮ӝઓ࢚క৬э਺ਵ۽పझ౟חాҗ೤פ׮ "1*.PDLJOH
  20. ੿ܻ "1*হ੉೐ۿ౟ূ٘ѐߊೞӝ  "1*৬7JFX.PEFM 7JFXр੄ۨ੉যܻܳ࠙  "1*-BZFSীࢶ"1*੄਽׹ਃ୒ਸ׮ܖب۾ѐߊ  7JFX.PEFM-BZFSীࢲחӝמਃҳࢎ೦ীݏب۾'&ীࢲࢎਊೡJOUFSGBDF߹بѐߊ 

    7JFX-BZFSীࢲח7JFX.PEFMۨ੉যܳా೧"1*ղਊী੽Ӕೡࣻ੓ب۾ѐߊ  ୶റ"1*ѐߊ৮ܐद 7JFX.PEFMࣻ੿߂"1*.PDLJOHਸాೞৈࣻ੿୭ࣗച
  21. ೐۽ࣁझ੸ਊҗ੿ળ࠺җ੿  nnnnnn nnnnnn nnnnnn ӝദࢲ ӝמܻ࠙ " # $

    % ӝמਃҳࢎ೦ ௿ܼೞݶ000ೠ׮ "1*ਃ୒Ѿҗীٮۄ 
 000ചݶਸ֢୹ೠ׮ ૓ੑदۄ਋ఠܳ"۽੉زೠ׮ ੑ۱ػчী؀೧ࢲ 
 ਬബࢿѨࢎܳೠ׮ ੌ੿࢑੿ ೒ې׬ನழ NE NE NE NE ӝמױਤ੄ੌ੿࢑੿
  22. పझ౟ 5FTU" 5FTU# 5FTU$ 5FTU% 5FTU4FMFDUPS" 5FTU4FMFDUPS# 5FTU4FMFDUPS$ 5FTU4FMFDUPS% ೐۽ࣁझ੸ਊҗ੿ળ࠺җ੿

     ӝמਃҳࢎ೦ ௿ܼೞݶ000ೠ׮ "1*ਃ୒Ѿҗীٮۄ 
 000ചݶਸ֢୹ೠ׮ ૓ੑदۄ਋ఠܳ"۽੉زೠ׮ ੑ۱ػчী؀೧ࢲ 
 ਬബࢿѨࢎܳೠ׮ ӝמܻ࠙ܳాೠױਤపझ౟दաܻয়ഝਊ పझ౟दաܻয় ௿ܼೞݶ000ೠ׮ "1*ਃ୒Ѿҗীٮۄ 
 000ചݶਸ֢୹ೠ׮ ૓ੑदۄ਋ఠܳ"۽੉زೠ׮ ੑ۱ػчী؀೧ࢲ 
 ਬബࢿѨࢎܳೠ׮ ஹನք౟ $PNQPOFOU" $PNQPOFOU# $PNQPOFOU$
  23. ೐۽ࣁझ੸ਊҗ੿ࢸٙҗ੿  ೐۽ࣁझبੑী؀ೠܻझ௼ '&ੌ੿࢑੿ ѐਘ ٣੗ੋ૑ো৘࢚दр ѐਘ '&ੌ੿࢑੿઺ ݃௼সҙ۲ੌ੿ ѐਘ

    ѐਘ ѐਘ ୨ѐߊ৘࢚ӝр ѐਘ ࢶ೯ѐߊ۽ੋೠ '&୶о࠺ਊ ੹୓'&ѐߊੌ੿઺݃௼সҙ۲ੌ੿ѐਘ
  24. ೐۽ࣁझ੸ਊҗ੿ࢸٙҗ੿  '&ੌ੿࢑੿ ѐਘ ٣੗ੋ૑ো৘࢚दр ѐਘ '&ੌ੿࢑੿઺ ݃௼সҙ۲ੌ੿ ѐਘ ѐਘ

    ѐਘ ୨ѐߊ৘࢚ӝр ѐਘ ࢶ೯ѐߊ۽ੋೠ '&୶о࠺ਊ ѐਘ ೐۽ࣁझبੑറ 
 ୨ѐߊ৘࢚ӝр ѐਘ ୶о࠺ਊ੄୭؀஖о૑ো৘࢚दрࠁ׮ૣ׮ݶ ୭ࣗѐਘ੉࢚ѐߊӝрਸױ୷оמೡѪਵ۽౸ױ _ѐਘ _ѐਘ ೐۽ࣁझبੑী؀ೠܻझ௼ ୭؀৘࢚ӝр ݃௼স੸ਊҙ۲ੌ੿ਸ׮द୊਺ࠗఠࣗചೞח҃਋
  25. ೐۽ࣁझ੸ਊҗ੿प೯җ੿  ಁఢ৻ࠗীࢲঐޗ੸ਵ۽࢚కܳ઱ੑ߉ই۪؊݂೧઱חஹನք౟ $PNQPOFOU 1SPQT )5.- 4UBUF QSPQT PVUQVU HTML

    = component(props) + state ಁఢ੄ஹನք౟оэ਷ੑ۱ী؀೧э਷Ѿҗܳઁҕೡࣻ੓ب۾ ࠗࣻബҗੋTUBUFܳ.PDLJOHೞৈ࢚ࣻചदఈפ׮ $PNQPOFOU TUBUF
  26. ೐۽ࣁझ੸ਊҗ੿प೯җ੿  ಁఢৈ۞ஹನք౟۽ҳࢿػా೤ஹನք౟ $PNQPOFOU )5.- $PNQPOFOU" $PNQPOFOU# $PNQPOFOU QSPQT PVUQVU

    HTML = component(props*(componentB(propsB) + componentC(propsC))) ಁఢ੄ஹನք౟оэ਷ੑ۱ী؀೧э਷Ѿҗܳઁҕೡࣻ੓ب۾ ࠗࣻബҗੋ੗धஹನք౟੄QSPQTܳ.PDLJOHೞৈѾҗчਸ࢚ࣻചदఈפ׮ $PNQPOFOU QSPQT PVUQVU $PNQPOFOU QSPQT PVUQVU
  27. ೐۽ࣁझ੸ਊҗ੿प೯җ੿  ҳ࢚೮؍ஹನք౟৬׮ܲҳઑ੄݃௼স $PNQPOFOU" $PNQPOFOU$ $PNQPOFOU# $PNQPOFOU$ ӝמ੸ਵ۽э਷ӝמਵ۽р઱ೞৈ݅ٚஹನք౟੄݃௼ੑҳઑо࢚੉ೠ҃਋  ݃௼সীਃ୒ೞৈ೧׼ҳઑܳݏ୻פ׮

     ೞա੄ஹನք౟۽݅٘חؘ࠺ਊ੉௼׮ݶ  
 ӝמਸ߹ب੄ݽٕ۽ܻ࠙ೞৈ ৈ۞ѐ੄ஹನք౟оӝמਸҕਬ೤פ׮  ӝദ੸ਃࣗ੄߸҃ਵ۽ӝמਸҕాചदఃӝয۵׮ݶ 
 ߹ب੄ஹನք౟۽ܻ࠙೤פ׮ ੉࢚җഅप੄࠺ਊਸ೤ܻ੸ਵ۽ݏ୶חҗ੿੉೙ਃ
  28. ೐۽ࣁझ੸ਊҗ੿प೯җ੿  పझ౟ࣄ۩ఠ੄࢚ࣘޙઁ $PNQPOFOU$ $PNQPOFOU" $PNQPOFOU$ DBTF DBTF EBUB -

    UFTUJE 
 XSBQQFS EBUB - UFTUJE 
 DPNQPOFOU$ ৈ۞ஹನք౟ܳղನೠஹನք౟ܳపझ౟ೞח҃਋ ࢶఖ੗੄਋ࢶࣽਤ  оמೞ׮ݶ੉޷పझ౟ػஹನք౟੄Ѿҗܳन܉ೞҊ 
 TIBMMPX.PVOUӝמਸഝਊೞৈ  
 पઁஹನք౟о۪؊݂غ૑ঋ਷࢚క۽పझ౟  పझ౟੄઱୓оࠗݽஹನք౟੐ਵ۽  
 فࣘࢿч੉୽جೡ҃਋ ࠗݽஹನք౟ীࢲࠗৈೠࣘࢿчਸ਋ࢶद 
 ߹ب੄ஹನք౟۽ܻ࠙ೠ׮ ೧׼పझ౟੄઱୓оغחஹನք౟ܳݺഛೞѱഛੋ
  29. ஠஠য়ݗݒ੢ҙܻ1$ѐߊఋ੐ۄੋ ӝദࢲ ੌ੿࢑੿ '&ѐߊ ٣੗ੋ ݃௼স  ٣੗ੋ߂݃௼সܻࣗझѐਘٍైੑ  ٣੗ੋܻࣗझੋೠైੑदӝ૑ো

     ਍৔੉ग۽ੋೠ"1*ѐߊੋ۱ࠗ઒  5%%ܳాೠࢶ೯ѐߊद੘  ࢑੿غ঻؍ੌ੿NE  ୭ઙӝദࢲ࠙۝Q
  30. ஠஠য়ݗݒ੢ҙܻ1$ѐߊఋ੐ۄੋ ੌ੿࢑੿ '&ѐߊ ٣੗ੋ ݃௼স '&ѐߊ৮ܐ  ٣੗ੋ߂݃௼সѐߊ৮ܐ  ѐߊػ݃௼সӝઓীѐߊػӝמਃࣗ৬Ѿ೤

     ٣੗ੋ߂݃௼সܻࣗझѐਘٍైੑ  ٣੗ੋܻࣗझੋೠైੑदӝ૑ো  ਍৔੉ग۽ੋೠ"1*ѐߊੋ۱ࠗ઒  5%%ܳాೠࢶ೯ѐߊद੘  ࢑੿غ঻؍ੌ੿NE  ୭ઙӝദࢲ࠙۝Q  ٣੗ੋܻࣗझੋೠైੑदӝ૑ো  ਍৔੉ग۽ੋೠ"1*ѐߊੋ۱ࠗ઒  5%%ܳాೠࢶ೯ѐߊद੘  ࢑੿غ঻؍ੌ੿NE  ୭ઙӝദࢲ࠙۝Q
  31. ஠஠য়ݗݒ੢ҙܻ1$ѐߊఋ੐ۄੋ ٣੗ੋ ݃௼স '&ѐߊ৮ܐ 2" ܾܻૉ  ٣੗ੋ߂݃௼সѐߊ৮ܐ  ѐߊػ݃௼সӝઓীѐߊػӝמਃࣗ৬Ѿ೤

     ٣੗ੋ߂݃௼সܻࣗझѐਘٍైੑ  ٣੗ੋܻࣗझੋೠైੑदӝ૑ো  ਍৔੉ग۽ੋೠ"1*ѐߊੋ۱ࠗ઒  5%%ܳాೠࢶ೯ѐߊद੘  ࢑੿غ঻؍ੌ੿NE  ୭ઙӝദࢲ࠙۝Q  2"߂ܾܻૉ૓೯  ٣੗ੋ߂݃௼সѐߊ৮ܐ  ѐߊػ݃௼সӝઓীѐߊػӝמਃࣗ৬Ѿ೤  ٣੗ੋ߂݃௼সܻࣗझѐਘٍైੑ  ٣੗ੋܻࣗझੋೠైੑदӝ૑ো  ਍৔੉ग۽ੋೠ"1*ѐߊੋ۱ࠗ઒  5%%ܳాೠࢶ೯ѐߊद੘  ࢑੿غ঻؍ੌ੿NE  ٣੗ੋܻࣗझੋೠైੑदӝ૑ো  ਍৔੉ग۽ੋೠ"1*ѐߊੋ۱ࠗ઒  5%%ܳాೠࢶ೯ѐߊद੘  ࢑੿غ঻؍ੌ੿NE
  32. Ѿҗ "4 - *4 50 - #& '& ѐਘ ѐਘ

    ୶оࣗਃػ'&ӝр  ѐਘ ٣੗ੋܻࣗझ۽ੋೠ'&ѐߊ૑ো ѐਘ  ઴যٚ੹୓ѐߊӝр  ѐਘ ୨ѐߊӝр ѐਘ ѐਘ ੿ࠁٜ਷بݫੋীٮۄо߸੸ੌࣻ੓णפ׮ ೦ݾ ӝр ٣੗ੋ ѐਘ ݃௼স ѐਘ ࢲߡ ѐਘ
  33. Ѿҗ "4 - *4 50 - #& '& ѐਘ ѐਘ

    ୶оࣗਃػ'&ӝр  ѐਘ ٣੗ੋܻࣗझ۽ੋೠ'&ѐߊ૑ো ѐਘ  ઴যٚ੹୓ѐߊӝр  ѐਘ ୨ѐߊӝр ѐਘ ѐਘ ੿ࠁٜ਷بݫੋীٮۄо߸੸ੌࣻ੓णפ׮ ೦ݾ ӝр ٣੗ੋ ѐਘ ݃௼স ѐਘ ࢲߡ ѐਘ ୨ѐߊӝрডױ୷
  34. ੿ܻ ٣੗ੋ ݃௼সহ੉೐ۿ౟ূ٘ѐߊೞӝ  పझ౟ࢶఖ੗ܳഝਊೞৈ ӝמݢ੷ѐߊ  ചݶ؀नపझ౟۽ӝמਃҳࢎ೦ഛੋ  ୶റ݃௼সѐߊद

    ࢶఖ੗ܳ݃௼সҳઑীݏѱ৤ӣਵ۽ࢲࣻ੿୭ࣗച "1*হ੉೐ۿ౟ূ٘ѐߊೞӝ  "1*৬7JFX.PEFM 7JFXр੄ۨ੉যܻܳ࠙  ୶റ"1*ѐߊ৮ܐद 7JFX.PEFMࣻ੿߂"1*.PDLJOHਸాೞৈࣻ੿୭ࣗച
  35. ੿ܻ ੸ਊױ҅  ೐۽ࣁझܳ੸ਊೞӝ੉੹ী ޙઁ࢚ടী؀ೠ੸೤ೠ೧Ѿߑߨੋ૑Ҋ޹  ӝמױਤ۽সޖܻܳ࠙ೡࣻ੓ח૑  ױਤపझ౟ܳ೐۽ં౟ী੸ਊೡࣻ੓ח૑ 

    '&ܻࣗझীৈਬо੓ח૑  ѐߊী೙ਃೠױਤపझ౟੄ݾ੸੿ܻ߂ҕਬ  ୶о੸ਵ۽ࣗਃغח࠺ਊ੉੹୓೐۽ં౟ੌ੿ী৔ೱ੉੓ਸ૑Ѩష
  36. 2"