
์๋ฌธ: https://blog.logrocket.com/debugging-session-with-claude/
โ ๏ธ ํ์ฌ ์๋ฌธ์ ์ ๊ทผ๋์ง ์์ต๋๋ค.
์ง๋ 2๋ ๋์ ์ํํธ์จ์ด ๊ฐ๋ฐ์๋ค์ AI๊ฐ ์ฐ๋ฆฌ๋ฅผ ๋์ฒดํ ์ง๋ ๋ชจ๋ฅธ๋ค๋ ์ด์ผ๊ธฐ๋ฅผ ๋ค์ด์์ต๋๋ค. ํํธ์ผ๋ก๋ AI๊ฐ ๊ฐ๋ฐ์๋ฅผ ๋์ฒดํ์ง๋ ์๊ณ , ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ๋ ๊ฑฐ๋ผ๊ณ ์ฃผ์ฅํ๋ ์ฌ๋๋ค๋ ์์ต๋๋ค. ์ต๊ทผ ์ ๋ ์ ๋ํ ๊น๋ค๋ก์ด UI ๋ฒ๊ทธ๋ฅผ ๋ง๋ฌ๊ณ , ์ด ์ฃผ์ฅ์ ์ง์ ๊ฒ์ฆํด ๋ณด๊ธฐ๋ก ํ์ต๋๋ค. AI๋ ๋์ฒด์ฌ์ผ๊น์, ์๋๋ฉด ๋๊ตฌํจ์ ํ๋ ๋ ์น์ ๋๊ตฌ์ผ ๋ฟ์ผ๊น์?
๋ฐฐ๊ฒฝ์ ์กฐ๊ธ ๋ง์๋๋ฆฌ๋ฉด, ์ ๋ 10๋ ๋๊ฒ ์ ๊ณ ๊ฒฝ๋ ฅ์ ์์ ์จ ํ์คํ ์๋์ด ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ๋๋ค. ์ปดํจํฐ ๊ณตํ ํ์ฌ ํ์๋ฅผ ๋ฐ๊ณ ์กธ์ ํ ๋ค๋ก ํฌ์ค์ผ์ด, ๊ธ์ต, ๊ต์ก ๋ฑ ๋ค์ํ ์ ๊ณ์์ IC์ ํ ๋ฆฌ๋๋ฅผ ๋๋ฃจ ๊ฑฐ์ณค์ต๋๋ค. ๊ทธ๋์ ๋ธ๋ก์ฒด์ธ๋ถํฐ ๋ ธ์ฝ๋ ํ๋ซํผ์ ์ด๋ฅด๊ธฐ๊น์ง ์๋ง์ "ํ๊ดด์ " ๊ธฐ์ ์ด ๋ด๋ค ์ฌ๋ผ์ง๋ ๋ชจ์ต์ ์ง์ผ๋ดค์ต๋๋ค.
๋ค๋ง ์ด๋ฒ AI์ ๋ฌผ๊ฒฐ์ ๊ฒฐ์ด ์ข ๋ค๋ฆ ๋๋ค. ๊ทธ ๋ฅ๋ ฅ์ด ๋ถ์ ํ ์ ์์ ๋งํผ ์ธ์์ ์ด์ด์, ์ค์ ํ์ฅ์์๋ ์ด๋ค ๋ชจ์ต์ผ์ง ์ง์ ์ํํด ๋ณด๊ณ ์ถ์์ต๋๋ค.
์ด ๊ธ์์๋ Claude ๋ชจ๋ธ๊ณผ ์ฃผ๊ณ ๋ฐ์ ๋ํ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ค์๊ฐ ๋๋ฒ๊น ์ฌ์ ์ ํ์ด๋ด ๋๋ค. ๋๋ถ๋ถ์๋ ๊ทธ ๊ณผ์ ์์ ๋๋ ์ ๊ณผ ํจ๊ป ์ฅ๋จ์ ์ ์ ๋ฆฌํด ๋์์ต๋๋ค.
์ค์๊ฐ ๋๋ฒ๊น ์ฌ์
์ฐธ๊ณ . ์ดํด๋ฅผ ๋๊ธฐ ์ํด ๋ํ๋ ์ผ๋ถ ์ค์ฌ์ ์ฎ๊ฒผ์ต๋๋ค.
์ํฉ์ ์ข ๋ ์ค๋ช ๋๋ฆฌ์๋ฉด, ์ ๋ ํฌ์ ์ ์์๋ฅผ ๋ง๋ค์ด ๋ด๋ ์ผ์ ์ ๋ฌธ์ผ๋ก ํ๋ ์์ฐ์ด์ฉ ํ์ฌ์์ ์ผํ๊ณ ์์ต๋๋ค. ์ฌ์ฉ์, ์ฆ ์ด ๊ฒฝ์ฐ์ ์ฌ๋ฌด ์๋ฌธ๊ฐ๊ฐ ํ ํ๋ฆฟ์ ๊ณ ๋ฅด๋ฉด, ๊ณง๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ์ ์์๋ฅผ ์์ฑํด ์ค ์์์ ์์ฑํ๋ผ๋ ์๋ด๋ฅผ ๋ฐ์ต๋๋ค. ๊ทธ ๋ค์์๋ ํ ํ๋ฆฟ์ ๋ฐ๊ฟ ์ ์๋๋ฐ, ํ ํ๋ฆฟ์ ๋ฐ๊พธ๋ฉด ๋ค์ ์์ ํ๋ฉด์ผ๋ก ๋์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ์์์ด ์ผ์ด๋ถ์ด, ์ด๋ค ์ ํ์ง๋ ํด๋ฆญ๋์ง ์์ต๋๋ค. ํด๋น ํ์ด์ง๋ ์๋จ ๋ฐ, ๊ฐ๊ด์ ๋ต๋ณ์ผ๋ก ๊ตฌ์ฑ๋ ๋ ๊ฐ์ ์ง๋ฌธ, ๊ทธ๋ฆฌ๊ณ ์์ฑ ๋ฒํผ์ผ๋ก ์ด๋ฃจ์ด์ง ํ๋ฒํ Next.js ํ์ด์ง์ ๋๋ค. ์ด ์์ ์ ์ ๊ฐ ์๋ ๊ฑฐ๋ผ๊ณค, ์ด๋ ๋ต๋ณ๋ ํด๋ฆญ๋์ง ์๋๋ค๋ ์ฌ์ค๋ฟ์ด์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ๊ฐ์ค: ์์์ ๋นํ์ฑํ ์ํ
Claude์๊ฒ ๋์ง ์ฒซ ํ๋กฌํํธ.
์ด์ํ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. ์ฒ์ ์ด ํ์ด์ง์ ๋ค์ด์์ ๋๋ ์ ๋์ํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ํ๋ก์ฐ ๋์ค์ ์ด ํ์ด์ง๋ก ๋์์ค๋ฉด, ํ์ด์ง๋ ๋ ๋๋ง๋์ง๋ง ์์ ์ต์ ์ ์ด๋ ๊ฒ๋ ํด๋ฆญํ ์ ์๊ณ , ๋ฒํผ๋ ๋นํ์ฑํ๋์ด ์์ต๋๋ค. ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํด์ผ๋ง ๋ค์ ๋์ํฉ๋๋ค.
์ฒ์์ Claude๋ Form ์ปดํฌ๋ํธ๋ฅผ ์ดํด๋ณด๊ณ ๋ ๊ฐ์ ๋ก์ปฌ ์ํ๋ฅผ ์ง์ด ๋
๋๋ค. isProcessing๊ณผ isCreating์
๋๋ค. Claude๊ฐ ๋ณด๋ ๊ฑด ์ด ์ปดํฌ๋ํธ๋ฟ์ด๋ผ, ์ด๊ธฐ ๊ฐ์ค์ ๋ฎคํ
์ด์
์ก์
์ชฝ์ผ๋ก ํฅํฉ๋๋ค.
Claude: AutoCreatePage ์ปดํฌ๋ํธ๋ฅผ ์ดํด๋ณด๋ ๋ฌธ์ ๊ฐ ๋ณด์ ๋๋ค. tRPC์์ ๋ฐ์ ์จ ๋ฎคํ ์ด์ ์ํ(autoCreatePresentationMutation๊ณผ createPresentationMutation)๊ฐ ํ์ด์ง๋ก ๋ค์ ๋์์์ ๋ ๋ก๋ฉ ์ํ๋ ์๋ฌ ์ํ๋ฅผ ๊ทธ๋๋ก ์ ์งํ๊ณ ์์ด์, ๋ก์ปฌ isCreating ์ํ๊ฐ ์ ๋๋ก ๋ฆฌ์ ๋์ง ์๋ ๊ฒ์ด ์์ธ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ด ๊ฐ์ค์ ์ฑ๋ฆฝํ์ง ์์ต๋๋ค. ๋ ๊น์ด ํ๊ณ ๋ค๊ธฐ ์ํด Claude๋ ์ํ๋ฅผ ์ถ์ ํ๋ console.log ์ฌ๋ฌ ๊ฐ๋ฅผ ์ถ๊ฐํ๊ณ , ์ ๋ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๊ณต์ ํฉ๋๋ค.
๋ช ์ฐจ๋ก ์ฃผ๊ณ ๋ฐ์ ๋์, Claude๋ ๋ง์นจ๋ด ์ง์ง ์์ธ์ ์ฐพ์๋
๋๋ค. ์ง๋ฌธ ์์์ disabledclassname์ด ์ ์ฉ๋ผ ์์์ต๋๋ค. Claude๋ disabled prop์ ๋ช
์์ ์ผ๋ก false๋ก ๋์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
className={clsx(' px-4', {
'pointer-events-none select-none opacity-15': disabled,
})}
ํ์ง๋ง ์ด ์์ ์ผ๋ก๋ ์๋ฌด๊ฒ๋ ํด๊ฒฐ๋์ง ์์๊ธฐ์, Claude์ ์ฒซ ๊ฐ์ค์ ๋ช ๋ฐฑํ ๋น๋๊ฐ ์ ์ ๋๋ค. ์ ๋ ์ง์ ์กฐ์ฌ๋ฅผ ์ข ํด ๋ณด๋ฉด์ Claude์ ์ปจํ ์คํธ ํ๊ณ๊ฐ ์ด๋๊น์ง์ธ์ง ์ํํด ๋ด ๋๋ค.
๋ ๋ฒ์งธ ๊ฐ์ค: ํ๋ฉด์ ๋ง๊ณ ์๋ ๋ก๋ฉ ์คํฌ๋ฆฐ
ํ๋กฌํํธ: ๊ณ์ ํ ์คํธํด ๋ดค๋๋, ์ง๋ฌธ ์์๋ง์ด ์๋๋ผ ํ์ด์ง ์ ์ฒด๊ฐ ๋ฉ์ถ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค. ์๋จ ๋ฐ์ ๋ค๋ก ๊ฐ๊ธฐ ๋ฒํผ๋, '์๋์ผ๋ก ์ค์ ' ๋ฒํผ๋ ํด๋ฆญ์ด ์ ๋ฉ๋๋ค. ์ด๋ค ์์ธ์ด Next.js ํ์ด์ง๋ฅผ ์ด ์ ๋๋ก ๋ฌด๋ฐ์ ์ํ๋ก ๋ง๋ค ์ ์์๊น์? ์์๋ ์คํฌ๋กค์ ๋ฉ๋๋ค.
๊ทธ๋ฌ์ Claude๋ ์ปจํ ์คํธ๋ฅผ ๋ํ ํ์ด์ง ์ ์ฒด๋ฅผ ์ฝ์ด๋ณด๋๋, ๊ทธ ์์ fixed๋ก ์๋ฆฌ ์ก์ ๋ก๋ฉ ์คํฌ๋ฆฐ์ด ์๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํฉ๋๋ค.
<div
role="status"
data-testid="loading-screen"
className="fixed left-0 top-0 z-50 flex h-full w-full flex-col items-center justify-center bg-primary-navy/[.65] p-3"
>
Claude๋ ์ฌ์ ํ isProcessing๊ณผ isCreating ๋ ๋ณ์๋ฅผ ๊ธฐ์ตํ๊ณ ์์ด์, ์๋ก์ด ๊ฐ์ค์ ์ฒซ ๋ฒ์งธ ์์ ์ ์ถ ์ดํ isCreating์ด false๋ก ๋ฆฌ์
๋์ง ์์ ํ์ด์ง๊ฐ ๋ฌด๋ฐ์์ด ๋์๋ค๋ ์ชฝ์ผ๋ก ํ๋ฆ
๋๋ค.
์ด ๊ฐ์ค์ ๋ฐ๋ฐํ๊ธฐ ์ฌ์ ์ต๋๋ค. ์ ๊ฐ ๋ณด๊ณ ์๋ ๊ฑด ์์์ด์ง, ๋ก๋ฉ ํ๋ฉด์ด ์๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ์์ ์์ Claude๋ ์์ด๋์ด๊ฐ ๋ฐ๋ฅ๋ฌ๊ณ , ์ ๊ฐ ๋๋ฒ๊น ์ ๋์์ค์ผ ํ์ต๋๋ค.
Claude: ์, ์ด์ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ ํญ๋ชฉ๋ค์ ํ์ธํ๋ฉด์ ๋๋ฒ๊น ์ ๋์์ฃผ์ธ์.
- ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ ์ด๊ธฐ (F12)
- Elements ํญ์ผ๋ก ์ด๋ํด ํ์ด์ง ์์ ํ์ธ
- ๋ค์๊ณผ ๊ฐ์ CSS๊ฐ ๊ฑธ๋ฆฐ ์์ ์ฐพ๊ธฐ
- z-index๊ฐ ๋์ position: fixed
- ๋ถ๋ชจ ์์์ ๊ฑธ๋ฆฐ pointer-events: none
- ํ์ด์ง๋ฅผ ๋ฎ๊ณ ์๋ ๋ณด์ด์ง ์๋ div
- Console ํญ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ฅ ํ์ธ
- ํ์ด์ง์์ ์ฐํด๋ฆญ ์๋ — ์ปจํ ์คํธ ๋ฉ๋ด๊ฐ ๋จ๋์ง
Claude๋ ์์ง ๊นจ๋ซ์ง ๋ชปํ์ง๋ง, ์ฌ์ฌ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋ค์ด์๊ณ ์์์ต๋๋ค.
์ธ ๋ฒ์งธ ๊ฐ์ค: ๋ซํ์ง ์๋ ๋ชจ๋ฌ
ํ๋กฌํํธ: ๋ฌด๋ฐ์์ ์์ธ์ ์ฐพ์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌด์ธ๊ฐ๊ฐ body ์ ์ฒด์ pointer-events: none;์ ์ถ๊ฐํ๊ณ ์์ด์.
Claude: ์กฐ์ฌํ ๋ด์ฉ์ ์ข ํฉํด ๋ณด๋ฉด, ์ด ๋ฌธ์ ๋ ์ญ์คํ๊ตฌ Radix UI ๋ชจ๋ฌ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. (์ ํฌ ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์) Modal ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉํ๋ Radix UI๋ ๋ณดํต ๋ชจ๋ฌ์ด ์ด๋ ค ์๋ ๋์ ๋ค์ชฝ ์ฝํ ์ธ ์์ ์ธํฐ๋์ ์ ๋ง์ผ๋ ค๊ณ body์ pointer-events: none์ ์ ์ฉํฉ๋๋ค.
์ด์ Claude๋ ๋ชจ๋ฌ์ด ์ ๋๋ก ๋ซํ์ง ์๋ ๊ฒ ๋ฌธ์ ๋ผ๊ณ ๊ฐ์ ํ๊ณ , useEffect๋ฅผ ์ถ๊ฐํด isModalOpen์ false๋ก ์ค์ ํฉ๋๋ค. ์ฐธ๊ณ ๋ก, ์ฌ์ฉ์๋ 'Change template' ์ต์
์ ๊ณจ๋ผ ํ
ํ๋ฆฟ์ ๋ฐ๊ฟ ์ ์๋๋ฐ, ์ด ์ต์
์ ๋๋ฅด๋ฉด ํ
ํ๋ฆฟ ๋ชฉ๋ก์ด ๋ด๊ธด ๋ชจ๋ฌ์ด ์ด๋ฆฝ๋๋ค. ์ฌ์ฉ์๊ฐ ํ๋๋ฅผ ๊ณ ๋ฅด๋ฉด ๋ค์ ์์ ํ๋ฉด์ผ๋ก ๋์์ต๋๋ค.
Claude: TemplateSelectorModal์ onSelectHandler ํจ์๋ฅผ ๋ณด๋ฉด, SaveTemplateModal์์ ์ฐ๋ฆฌ๊ฐ ๊ณ ์น ๊ฒ๊ณผ ๋๊ฐ์ ํจํด์ด ์์ต๋๋ค. catch ๋ธ๋ก์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ๋ชจ๋ฌ์ด ์์ ๋ซํ์ง ์๋ ๊ฑฐ์ฃ .
ํ๋นํ ๊ฐ์ ์ด์ง๋ง, ์ด ์ ๊ทผ์๋ ํ ๊ฐ์ง ๊ฑธ๋ฆผ๋์ด ์์ต๋๋ค. ์ด ๊ฐ์ค์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ ์ ์ ๋ฅผ ๊น๊ณ ์๋๋ฐ, ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
์ด ์์ ์์ Claude๋ ์ด๋ฆฐ ๋ชจ๋ฌ์ด ์๋์ง ์ถ์ ํ๋ console.log๋ฅผ ์๋ฉ ์ถ๊ฐํ๊ณ , ์ ๋ ์ด๋ฆฐ ๋ชจ๋ฌ์ด ์๋ค๊ณ ๋ณด๊ณ ํฉ๋๋ค.
// Radix ๋ค์ด์ผ๋ก๊ทธ ์ค๋ฒ๋ ์ด๊ฐ ์๋์ง ํ์ธํฉ๋๋ค (์ด๋ก ์ธํด body์ pointer-events: none์ด ๋ฐ์ํฉ๋๋ค)
console.log('Dialog overlays:', document.querySelectorAll('[data-radix-dialog-overlay]').length);
// ์ด๋ ค์๋ ๋ชจ๋ฌ ๋ํ ์์๋ฅผ ํ์ธํฉ๋๋ค
console.log('Open modals:', document.querySelectorAll('[role="dialog"]').length);
// body ์คํ์ผ์ ํ์ธํฉ๋๋ค
console.log('Body pointer-events:', getComputedStyle(document.body)['pointer-events']);
// aria-hidden=true ์์ฑ์ ๊ฐ์ง ์์ ์ค์์ ํ๋ฉด์ ๊ฐ๋ฆด ์ ์๋ ์์๋ฅผ ์ฐพ์๋ด
๋๋ค
console.log('Hidden overlays:', document.querySelectorAll('[aria-hidden="true"]'));
์กฐ์ฌ๋ฅผ ์ข ๋ ์งํํ ๋์, pointer-events: none์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ธ๋ผ์ธ ์คํ์ผ์ ์ง์ ์ค์ ๋๊ณ ์๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์ต๋๋ค(document.body.style.pointerEvents = 'none'). CSS ๊ท์น์ผ๋ก ์ ์ฉ๋๋ ๊ฒ ์๋์์ต๋๋ค.
์ฌ๊ธฐ์ Claude๋ ๊ทธ ์คํ์ผ์ด ์ธ์ ์ ์ฉ๋๋์ง ์์๋ด๋ ค๊ณ ์ถ์ ์ฉ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ผ๊ณ ํ์ต๋๋ค.
Object.defineProperty(document.body.style, 'pointerEvents', {
get: function () {
return this._pointerEvents || '';
},
set: function (value) {
console.log('Setting pointerEvents to:', value);
if (value === 'none') {
console.trace('Stack trace for setting pointer-events: none');
}
this._pointerEvents = value;
}
});
console.log('Trace set up - now trigger the issue');
๋ค ๋ฒ์งธ ๊ฐ์ค: ๋ชจ๋ฌ ์ธ๋ง์ดํธ ์ด์ + Claude์ ์ฒซ ์์ ์
์ถ์ ๊ธฐ๋ ์ ํ
ํ๋ฆฟ์ ๊ณ ๋ฅด๋ ค๊ณ ๋ชจ๋ฌ์ ์ด์๋ค๊ฐ ์์์ผ๋ก ๋์์ฌ ๋ pointer-events๊ฐ ์ถ๊ฐ๋๋ค๋ ์ฌ์ค์ ๋ฐํ๋
๋๋ค.
Claude: ์ข์ต๋๋ค! ๋ฌธ์ ๋ TemplateSelectorModal์ ์ด ๋ ๋ฐ์ํ๊ณ ์์ด์. ์ฌ์ค ์ด๊ฑด ์๋๋ ๋์์ ๋๋ค. Radix UI ๋ชจ๋ฌ์ ๋ชจ๋ฌ์ด ์ด๋ฆด ๋ ๋ฐฐ๊ฒฝ๊ณผ์ ์ธํฐ๋์ ์ ๋ง์ผ๋ ค๊ณ body์ pointer-events: none์ ์ค์ ํฉ๋๋ค.
๋ฐ๋ผ์ ์ง์ง ๋ฌธ์ ๋ ๋ชจ๋ฌ์ด ๋ซํ ๋ ๊ทธ ์คํ์ผ์ด ์ ๊ฑฐ๋์ง ์๋๋ค๋ ์ ์ ๋๋ค.
์ฌ๊ธฐ์๋ถํฐ ์ ๋, ๋ชจ๋ฌ์์ ํญ๋ชฉ์ ์ ํํ์๋ง์ ํ๋ฉด ์ด๋์ด ์ผ์ด๋๋ค๊ณ ์ค๋ช ํ์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ํ๋ฉด ์ด๋์ด ์ผ์ด๋๊ธฐ ์ ์ ๋ชจ๋ฌ์ด ์์ ํ ๋ซํ๋๋ก ๋ง๋ค ์ ์๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์๋ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค Claude๊ฐ ์ธ๋ผ์ธ ์คํ์ผ์ ์ ๋ฆฌํ๋ ๋ฐฉ์์ ์ ์ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์์ ์: Modal.tsx ์์์
// ๋ชจ๋ฌ์ด ๋ซํ ๋ pointer-events๊ฐ ๋ฆฌ์
๋๋๋ก ๋ณด์ฅ
// ๋ชจ๋ฌ์ด ์ด๋ฆฐ ์ํ์์ ํ๋ฉด ์ด๋์ด ์ผ์ด๋๋ฉด ๋ชจ๋ฌ์ด ์ธ๋ง์ดํธ๋์ง ์์ ์ ์๊ณ ,
// ๊ทธ๋ฌ๋ฉด body์ ๊ฑธ๋ฆฐ pointer-events:none์ด ๊ทธ๋๋ก ๋จ์ ์ ํ์ด์ง์ ์ธํฐ๋์
์ ๋ง์ ์ ์์ด ์ถ๊ฐํจ. (Switch template ์ก์
์ฌ๋ก์ฒ๋ผ)
useEffect(() => {
if (open === false) {
// ๋ชจ๋ฌ์ด ๋ช
์์ ์ผ๋ก ๋ซํ ๋ pointer-events ๋ฆฌ์
document.body.style.pointerEvents = '';
}
}, [open]);
๋๋์ด ์ค์ ๋ก ๋์ํ๋ ์์ ์์ด ๋์์ต๋๋ค. ๋ค๋ง ์ข ์์๋ฐฉํธ ๊ฐ์์, Claude์๊ฒ ์ข ๋ ๊ผผ๊ผผํ๊ฒ ๋ฐ์ ธ๋ณด๋ผ๊ณ ํ์ต๋๋ค.
Claude: Modal ์ปดํฌ๋ํธ๋ฅผ ์ดํด๋ณด๋ฉด, ์ด ์ปดํฌ๋ํธ๋ Radix UI์ dialog ๊ธฐ๋ณธ ์์๋ฅผ ๊ฐ์ผ ๋ํผ์ ๋๋ค. ๋ฌธ์ ๋ Radix UI๊ฐ ๋ชจ๋ฌ์ ์ด ๋ pointer-events: none์ ์ค์ ํ์ง๋ง, ํ๋ฉด ์ด๋์ด ์ผ์ด๋๋ฉด ๊ทธ ์ ๋ฆฌ๊ฐ ์์ ์ ์ผ๋ก ์ด๋ฃจ์ด์ง์ง ์์ ์ ์๋ค๋ ์ ์ ๋๋ค.
ํ๋นํด ๋ณด์ด๋ ์ง์ ์ด๋ผ, ํ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๊ธฐ ์ํด PR์ ์ฌ๋ ธ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ด ์ ์ฌ ์๊ฐ์ด ๋์ด ๋ ธํธ๋ถ์ ๋ฎ๊ณ ์๋ฆฌ๋ฅผ ์์ํ๋ฌ ๋์ฐ์ต๋๋ค. ์๊ฒฉ ๊ทผ๋ฌด์ ์ฅ์ ์ค ํ๋์ฃ . ๋ ๊ทธ๋ฌ๋ฏ, ์์ด ์์ง์ด๋ ๋์ ๋จธ๋ฆฟ์์ ์ฌ๊ทธ๋จธ๋ ๋ค๋ฅธ ์๊ฐ์ผ๋ก ํ๋ฌ๊ฐ๊ณ ์ด๋ฐ ์๋ฌธ์ด ๋ ์ฌ๋์ต๋๋ค. ์ ํํ ์ง๊ธ์์์ผ ๋ฌธ์ ๊ฐ ๋ ๊ฑธ๊น?
์ด ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๊ธฐ ์ ๊น์ง๋ pointer-events ๋ฌธ์ ๊ฐ ํ ๋ฒ๋ ์์์ต๋๋ค. ์ ํ์ ๋ค๋ฅธ ๋ถ๋ถ์์๋ ๋ชจ๋ฌ์ ์ฐ๊ณ ์์์ง๋ง ์ด๋ฐ ๋ฌธ์ ๋ ๊ฒช์ ์ ์ด ์์์ต๋๋ค. ์ ๋ง ํ๋ฉด ์ด๋ ๋๋ฌธ์ผ๊น์? ๋ง์ฝ ๊ทธ๊ฒ ์ฌ์ค์ด๋ผ๋ฉด, ์ด๋ ๊ฒ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ Radix๊ฐ ์ง์ ์๋ดค์ ํ ๋ฐ์. ์๋ฌด๋๋ ์์ง ํต์ฌ์ ๋ฟ์ง ์์ ๊ฒ ๊ฐ๋ค๋ ๋๋์ด ๊ฐ์์ง ์์, ๋ช ๊ฐ์ง ํ ์คํธ๋ฅผ ํด ๋ดค์ต๋๋ค.
์ ๋ ๋ชจ๋ฌ์ ์ด๊ณ ๋ฐ๊นฅ์ ํด๋ฆญํ๋ฉด ๋ชจ๋ฌ์ด ๋ซํ๋๋ฐ, ๊ทธ ์๊ฐ์๋ pointer-events: none ๋ฌธ์ ๊ฐ ๊ทธ๋๋ก ๋ฐ์ํ๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด๋ ํ๋ฉด ์ด๋์ด ๋ฌธ์ ์ ์์ธ์ด๋ผ๋ ๊ฐ์ค์ ๋ฐ์ฆํฉ๋๋ค.
ํ๋กฌํํธ: ์, ์ด ๋ฌธ์ ๋ก ํ ์คํธ๋ฅผ ์ข ๋ ํด ๋ดค์ต๋๋ค. ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก๋ pointer-events๊ฐ ์ ๊ฑฐ๋์ง ์๋ ์ํฉ์ ์ฌํํ ์ ์๋์ง ๋ณด๊ณ ์ถ์ด์, ๋ชจ๋ฌ์์ ์ฐ๋ฆฌ๊ฐ ํ ์์ ์ ์ฃผ์ ์ฒ๋ฆฌํด ๋ดค์ด์. ๊ทธ๋ฌ๋๋ ๋ค๋ฅธ ๋ชจ๋ฌ์์๋ ๋ชจ๋ฌ ํ์ด์ง ๋ฐ๊นฅ์ ํด๋ฆญํด์ ์ด๊ณ ๋ซ์ ๋ ๋๊ฐ์ ๋ฒ๊ทธ๊ฐ ์ฌํ๋ฉ๋๋ค. ์ด๋ค ์ด์ ์์์ธ์ง ๋ชจ๋ฌ์ด ๋ซํ๋, ํ๋ฉด ์ด๋์ด ์๋๋ฐ๋, pointer-events: none์ด ์ถ๊ฐ๋ฉ๋๋ค.
Claude: ์ ๋ง ์๋ฏธ ์๋ ๋ฐ๊ฒฌ์ด์์! ์ด๊ฑธ๋ก ๋ฌธ์ ๊ฐ ํ๋ฉด ์ด๋์๋ง ํ์ ๋ ๊ฒ ์๋๋ผ๋ ์ ์ด ํ์ธ๋์ต๋๋ค. ์ค๋ฒ๋ ์ด ํด๋ฆญ์ผ๋ก ๋ชจ๋ฌ์ ๋ซ์ ๋์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ซ์ ๋, Radix UI ๋ชจ๋ฌ์ ์ ๋ฆฌ ๋ก์ง์ด ์ด๋ป๊ฒ ๋์ํ๋๋์ ์ฝํ ๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ๋๋ค.
์ด ์์ ์์ Claude๋ Radix์ ๋ฌธ์ ๋ผ๊ณ ํ์ ํ๊ณ ์์์ต๋๋ค. ์ ๋ ๋ชจ๋ฌ์ ์ทจ์ ๋ฒํผ์ด ์๊ณ , ๊ทธ ๋ฒํผ์ ํด๋ฆญํด๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค๊ณ ์ง์์ต๋๋ค. ๋ ์ ํํ ์ง๊ธ์์์ผ ์ด ๋ฌธ์ ๊ฐ ์๊ธฐ๋์ง๊ฐ ์ด์ํ๋ค๋ ์ ๋ ๋ค์ ํ๋ฒ ์ง์์ต๋๋ค.
Claude๋ Radix UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ต์ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํด ๋ฌด์ธ๊ฐ ์์ธ์ด ๋ ๋งํ ๊ฒ ์๋์ง ๋ณด์๋ ๋ฑ์ ๋ช ๊ฐ์ง ์ ํ์ง๋ฅผ ์ ์ํ์ต๋๋ค.
ํด๊ฒฐ
์ด์ฏค ๋๋ Claude๋ ์์ด๋์ด๊ฐ ๋ฐ๋ฅ๋ฌ๊ณ , Radix ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ธ์ผ ๊ฑฐ๋ผ๊ณ ํ์ ํ๊ณ ์์์ต๋๋ค. ๊ทธ๋์ ์ ๋ ์๋ ๋ฐฉ์๋๋ก ๊ตฌ๊ธ๋ง์ ๋์ฐ์ต๋๋ค.
์ ๋ GitHub ์ด์ ํ๋๋ฅผ ๋ฐ๊ฒฌํ๋๋ฐ, ๊ฑฐ๊ธฐ์ ๋๊ตฐ๊ฐ๊ฐ ์ด๋ ๊ฒ ๋๊ธ์ ๋ฌ์ ๋์์ต๋๋ค.
์ด ๋ฌธ์ ๋ ๋ชจ๋ฌ๊ณผ, ๊ทธ๊ฒ์ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐ ์ฐ์ด๋ ๋ค๋ฅธ ๋ชจ๋ฌ ์ง์ ์ปดํฌ๋ํธ ์ฌ์ด์ ์ถฉ๋ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค. ์ญ์คํ๊ตฌ ๋๋กญ๋ค์ด์ด์ฃ . ํด๊ฒฐํ๋ ค๋ฉด ํธ๋ฆฌ๊ฑฐ ์ปดํฌ๋ํธ์ modal={false}๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
์๊ณ ๋ณด๋ ์ ๋ชจ๋ฌ์ ๋๋กญ๋ค์ด ๋ฉ๋ด ์์์ ํธ๋ฆฌ๊ฑฐ๋๊ณ ์์๊ณ , ๊ทธ ์ถฉ๋ ๋๋ฌธ์ ๋ชจ๋ฌ์ด ๋ซํ๋๋ฐ๋ pointer-events: none์ด ์ถ๊ฐ๋๊ณ ์์์ต๋๋ค.
์ด ์์ ๋ถํฐ๋ Claude๊ฐ ๋ ํ์ํ์ง ์์, ์ง์ ์์ ์ ๋ค์ด๊ฐ์ต๋๋ค.
์ต์ข ์์ ์:
<DropdownMenu
ariaLabel={ariaLabel}
items={menu}
dataTestId={dataTestId}
modal={modal}
>
...
</DropdownMenu>
Claude์ ๋๋ฒ๊น ํ๋ฉด์ ๋ ๋๋
์ ๋ฐ์ ์ผ๋ก ๊ฒฝํ์ ๊ฝค ๊ธ์ ์ ์ด์์ต๋๋ค. ๋ค๋ฅธ ๊ฐ๋ฐ์์ ํจ๊ป ์ง ํ๋ก๊ทธ๋๋ฐํ๋ ์์ ์ด ๋ง์ด ๋ ์ฌ๋์ต๋๋ค.
๋ช ๋ ์ , ์ ํ์ฌ์ ํฉ๋ฅํ์ ๋ ์ ๋ ์ฒซ ํ ๋ฌ์ ๋ ๋ค๋ฅธ ์ ๊ท ์ ์ฌ์์ ์ง ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด์ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ตํ์ต๋๋ค. ๊ทธ ๊ณผ์ ์ด ์ ๋ง ์ฆ๊ฑฐ์ ์ต๋๋ค. ๋ฐฐ์์ด ์ปธ์ ๋ฟ ์๋๋ผ, ํ์ ํ๋ฉด์ ์ฌ๋ฌ ์์ด๋์ด๋ฅผ ์๋ํด ๋ณด๊ณ , ์ฌ์ค์ ๊น๊นํ ์ด๋ ์์ ๋๋ฌ์ด ๊ฐ๋ฉฐ ๋ฌด์ธ๊ฐ๋ฅผ ์์๋ด๋ ๊ณผ์ ์์ฒด๊ฐ ๋ณด๋์ฐผ์ต๋๋ค. ๊ทธ๋ฐ ์๋ฏธ์์ Claude์ ์ผํ๋ ๊ฑด ๊ทธ๋์ฒ๋ผ ์๋ก ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ๊ธธ์ ์ฐพ์๊ฐ๋ ๋๋๊ณผ ๋ฌด์ฒ ๋น์ทํ์ต๋๋ค.
๋ฌผ๋ก ๋จ์ ๋ ์์ต๋๋ค. Claude๋ ๋น์ ์ ์ ๊ทผ ๋ฐฉ์์ ๊ทธ๋ค์ง ์ด์๋ฅผ ์ ๊ธฐํ์ง ์์ต๋๋ค. ์ผ๋ฆฌ๋ ์์ต๋๋ค. Claude๋ ์คํ์๋๊น์. ํ๋กฌํํธ๋ฅผ ์ฃผ๋ฉด ๊ทธ๋๋ก ์ํํฉ๋๋ค. ๋ธ๋ ์ธ์คํ ๋ฐ ์๋๋ก๋ ํ๋ฅญํ์ง๋ง, ์๋ชป๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์๋์ง ์๋ ค ์ฃผ์ง๋ ์์ต๋๋ค.
๋ ์๊ธฐ ์์ด๋์ด์ ์ข ๊ฐํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ํ์๊ฐ Radix๊ฐ ๋ฌธ์ ๋ผ๊ณ ํ์ ํ๋๋, ๊ฑฐ๊ธฐ๋ก ์๊พธ ํ๊ทํ๋ ๋ชจ์ต์ ๋ณด์์ต๋๋ค. ์ฌ๋๊ณผ ํจ๊ป๋ผ๋ฉด ๋ณดํต ์์ด๋์ด๊ฐ ์งํํ๋ ๋์ ๋ ํ๋ฐํ๊ฒ ์๊ฒฌ์ด ์ค๊ฐ๋๋ค.
๊ฒฐ๊ตญ Claude๋ ๋๊ตฌ์ด๊ณ , ์ง์ง ์ง๋ฌธ์ ์ด๋ป๊ฒ ํจ๊ณผ์ ์ผ๋ก ์ธ ๊ฒ์ด๋๋ก ๋ฐ๋๋๋ค.
๊ฑฐ๊ธฐ์ ๋ ํ๋์ ์๊ฐ์ด ์ด์ด์ง๋๋ค. ๋ง์ฝ ์ ๊ฐ ์ด๋ฐ์ ์กฐ๊ธ๋ง ๋ ์กฐ์ฌํด ๋์๋ค๋ฉด, ๋ ๋นจ๋ฆฌ ๊ทผ๋ณธ ์์ธ์ ๋ฟ์์๊น์? ์ฐ๋ฆฌ๋ ์ด๋ฐ๋ถ์ ์์์ ์๊ฐ์ ๋๋ฌด ๋ค์์ต๋๋ค. ํ์ด์ง ์ ์ฒด๊ฐ ์ผ์ด๋ถ์๋ค๋ ์ฌ์ค์ ๋ ๋นจ๋ฆฌ ์์์ฑ๋ค๋ฉด, ์ ํ๋กฌํํธ๋ ๋ ์ ํํ์ ๊ฒ์ด๊ณ , ๊ทธ๋งํผ ์๋๋ ๋นจ๋์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. Claude๊ฐ ๋ด๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ง์ ๊ฒฐ๊ตญ ์ ๋ ฅ์ ํ์ง์ ํฌ๊ฒ ์ข์ฐ๋ฉ๋๋ค.
๊ทธ๋ผ์๋ ์ ๋ ์ด ๊ฒฝํ์ด ์ง์ฌ์ผ๋ก ์ ์ฉํ๋ค๊ณ ๋๋๋๋ค. ๋ธ๋ ์ธ์คํ ๋ฐ ํํธ๋๋ก์ ์ค์ ๋ก ๊ฐ์น๋ฅผ ๋ํด ์ฃผ์์ต๋๋ค. ํ๋ฃจ ์ข ์ผ ๋๋ฒ๊น ํ์ ๋ฒํ ์ผ์ด ์ด๋ฅธ ์คํ์ ๋ง๋ฌด๋ฆฌ๋์ต๋๋ค. ํ์ค์ ์ผ๋ก ๋ฐ์ง๋ฉด ์ฝ 4์๊ฐ์ ์ ์ฝํด ์ค ์ ์ ๋๋ค.
์ฅ๋จ์
TL: DR์ด ํ์ํ ๋ถ๋ค์ ์ํด, ์ ๊ฐ ๋ฉ๋ชจํด ๋ ์ฅ๋จ์ ์ ์ ๋ฆฌํด ๋ก๋๋ค.
Claude๊ฐ ์ํ๋ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฝ๋๋ฒ ์ด์ค์์ ๋ฌธ์์ด ํจํด์ ๊ฒ์ํ๊ณ , ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ ์๋น์ค์ ์ฐ๊ฒฐ ์ง๊ธฐ.
- ๋๋ฒ๊น ํธ๋ฆญ ์ ์ํ๊ธฐ. (ํธ๋์ปค ๊ธฐ๋ฒ์ ์นญ์ฐฌํ ๋งํ๋๋ฐ, Claude ๋๋ถ์ ์๊ฒ ๋์ต๋๋ค.)
- ๋น ๋ฅด๊ฒ ๋์ ๊ฐ์ค ๋ด๋๊ธฐ.
Claude๊ฐ ์ด๋ ค์ํ๋ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ปจํ ์คํธ: ์ข์ ์ปจํ ์คํธ์์ ์ถ๋ฐํ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ๊ณณ๋ ์ดํด๋ณด๋ผ๊ณ ๋ค๊ทธ์ณ์ผ ํฉ๋๋ค.
- ์์ ๊ฐ: ๊ทธ๋ด๋ฏํ๊ฒ ๋ค๋ฆฌ์ง๋ง ๋ฏธ๋ฌํ๊ฒ ํ๋ฆฐ ์์ ๋ง๋งํ ์ค๋ช ์ ๋ด๋๊ธฐ๋ ํฉ๋๋ค. ๋ฐ๋ก ๋ก๋ฉ ์คํฌ๋ฆฐ ๊ฐ์ค์ฒ๋ผ์.
- ๊ทผ๋ณธ ์์ธ: ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ๋ง ๊ด์ฌ์ด ์์ด์, ๊ทธ๊ฒ ์์ ์ฒ๋ฐฉ์ด๋ผ๋ ์ผ๋จ ํด๊ฒฐํ๋ ค ํฉ๋๋ค. ๋ณ๋๋ก ์ง์ํ์ง ์์ผ๋ฉด ๋ ๊น์ด ํ๊ณ ๋ค์ง ์์ต๋๋ค.
๋ง์น๋ฉฐ
๊ฒฐ๋ก ์ ์ผ๋ก, ์ ๋ ๋๋ฒ๊น ์ Claude๋ฅผ ๋ค์ ์ธ ์๊ฐ์ ๋๋ค. ๋ค๋ง ์ข ๋ ์์์ ์ธ ๋ฐฉ์์ผ๋ก ์ฐ๋ ค๊ณ ํฉ๋๋ค. ์ ๊ฐ ์ด๊ธฐ ์กฐ์ฌ๋ฅผ ์ด๋ ์ ๋ ๋ง์น๊ณ ๋ฌธ์ ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ดํด๋ฅผ ๊ฐ์ถ ๋ค์ ํจ๊ป ์ผํ ๋, Claude๊ฐ ๊ฐ์ฅ ํจ๊ณผ์ ์ด๋ผ๋ ์ฌ์ค์ ์๊ฒ ๋์ต๋๋ค. ๊ทธ ์ง์ ๋ถํฐ Claude๋ ๊ฐ์น ์๋ ์์ด๋์ด ๊ณต๊ธ์์ด ๋๋ฉฐ, ์ ๊ฐ ๋ ์ฌ๋ฆฌ์ง ๋ชปํ ์๊ฐ์ ๋ํด ์ค๋๋ค.
ํนํ UI ๋ฒ๊ทธ์์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. UI ๋ฒ๊ทธ๋ ๊ฐ์ ํ๋ํ๋๊ฐ ๋ํ๋ฅผ ์๋ฑํ ๊ณณ์ผ๋ก ๋ฐ๊ณ ๊ฐ๊ธฐ ์ญ์์ด๊ฑฐ๋ ์. ๋ธ๋ผ์ฐ์ ์์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๊ณ ์๋์ง ๋จ๋จํ ์ก์ ๋๋ฉด ๋ ผ์๋ฅผ ์ด๋์ด ๊ฐ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์์์๋ ๋ง์๋๋ ธ๋ฏ, Claude์ ์๋ต ํ์ง์ ํ๋กฌํํธ์ ํ์ง์ ์ง์ ๋ฌ๋ ค ์์ต๋๋ค. ์ ๋ ฅ์ด ๋ช ํํ๊ณ ์ ํํ ์๋ก, ์ถ๋ ฅ ๋ํ ๋ ์ ์ฉํ๊ณ ์ ์ ํด์ง๋๋ค.
๐ฌ ๋๊ธ