nhcodingstudio
@nhcodingstudio
Students
1,854
Reviews
111
Course Rating
4.8
์๋ ํ์ธ์, ์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค!
์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค๋ ์นด๋ค๊ธฐ ๋ฉ๋ก , ์์ฑํด, ํ ๋ก ํ , ์ํฐ๋ฃจ ๋ฑ ๋ถ๋ฏธ์ ์ฃผ์ ๋ํ์์ ์ปดํจํฐ๊ณตํ์ ์ ๊ณตํ๊ณ , Google, Microsoft, Meta ๋ฑ ๊ธ๋ก๋ฒ IT ๊ธฐ์ ์์ ์ค๋ฌด ๊ฒฝํ์ ์์ ๊ฐ๋ฐ์๋ค์ด ํจ๊ป ๋ง๋ ๊ต์ก ๊ทธ๋ฃน์ ๋๋ค.
์ฒ์์๋ ๋ฏธ๊ตญ๊ณผ ์บ๋๋ค์ ์ปดํจํฐ๊ณตํ ์ ๊ณต์๋ค๋ผ๋ฆฌ ํจ๊ป ๊ณต๋ถํ๋ฉฐ ์ฑ์ฅํ๊ณ ์ ๋ง๋ ์คํฐ๋ ๋ชจ์์์ ์์๋์์ต๋๋ค. ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ํ, ๋ค๋ฅธ ์๊ฐ๋์ ์์์ง๋ง ํจ๊ป ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์๋ก์๊ฒ ๋ฐฐ์ด ๊ทธ ์๊ฐ์ ๋งค์ฐ ํน๋ณํ๊ณ , ์์ฐ์ค๋ฝ๊ฒ ์ด๋ฐ ์๊ฐ์ด ๋ค์์ต๋๋ค.
โ์ฐ๋ฆฌ๊ฐ ๊ณต๋ถํ๋ ์ด ๋ฐฉ์, ๊ทธ๋๋ก ๋ค๋ฅธ ์ฌ๋์๊ฒ๋ ์ ํ๋ฉด ์ด๋จ๊น?โ
๊ทธ ๋ฌผ์์ด ๋ฐ๋ก ์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค์ ์ถ๋ฐ์ ์ด์์ต๋๋ค.
ํ์ฌ๋ ์ฝ 30๋ช ์ ํ์ง ๊ฐ๋ฐ์์ ์ปดํจํฐ๊ณตํ ์ ๊ณต ๋ํ์๋ค์ด ๊ฐ์์ ์ ๋ฌธ ๋ถ์ผ๋ฅผ ๋งก์, ์ ๋ฌธ๋ถํฐ ์ค์ ๊น์ง ์์ฐ๋ฅด๋ ์ปค๋ฆฌํ๋ผ์ ์ง์ ์ค๊ณํ๊ณ ๊ฐ์ํฉ๋๋ค. ๋จ์ํ ์ง์ ์ ๋ฌ์ ๋์ด, ์ง์ง ๊ฐ๋ฐ์์ ์์ ์ผ๋ก ๋ฐฐ์ฐ๊ณ ํจ๊ป ์ฑ์ฅํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
โ์ง์ง ๊ฐ๋ฐ์๋, ์ง์ง ๊ฐ๋ฐ์์๊ฒ ๋ฐฐ์์ผ ํฉ๋๋ค.โ
์ ํฌ๋ ์น ๊ฐ๋ฐ์ ์ ๊ณผ์ ์ ์ฒ์๋ถํฐ ๋๊น์ง ์ฒด๊ณ์ ์ผ๋ก ๋ค๋ฃจ๋, ์ด๋ก ์ ๋จธ๋ฌด๋ฅด์ง ์๊ณ ์ค์ต๊ณผ ์ค์ ์ค์ฌ์ ํผ๋๋ฐฑ์ ํตํด ์ค๋ ฅ์ ํค์๋๋ฆฝ๋๋ค.
์๊ฐ์ ํ ์ฌ๋, ํ ์ฌ๋์ ์ฑ์ฅ์ ํจ๊ป ๊ณ ๋ฏผํ๊ณ ์ด๋์ด๊ฐ๋ ๊ฒ์ด ์ฐ๋ฆฌ์ ์ฒ ํ์
๋๋ค.
๐ฏ ์ฐ๋ฆฌ์ ์ฒ ํ์ ๋ถ๋ช
ํฉ๋๋ค.
"์ง์ ํ ๋ฐฐ์์ ์ค์ฒ์์ ์ค๊ณ , ์ฑ์ฅ์ ํจ๊ปํ ๋ ์์ฑ๋๋ค."
๊ฐ๋ฐ์ ์ฒ์ ์์ํ๋ ์
๋ฌธ์๋ถํฐ, ์ค๋ฌด ๋ฅ๋ ฅ์ ํค์ฐ๊ณ ์ถ์ ์ทจ์
์ค๋น์, ์ง๋ก๋ฅผ ํ์ ์ค์ธ ์ฒญ์๋
๊น์ง.
์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค๋ ๋ชจ๋์ ์ถ๋ฐ์ ์ด์, ํจ๊ป ๊ฑท๋ ๋ ๋ ํ ๋๋ฐ์๊ฐ ๋๊ณ ์ ํฉ๋๋ค.
์ด์ , ํผ์ ๊ณ ๋ฏผํ์ง ๋ง์ธ์.
์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค๊ฐ ์ฌ๋ฌ๋ถ์ ์ฑ์ฅ์ ํจ๊ปํ๊ฒ ์ต๋๋ค.
Welcome to Neighborhood Coding Studio!
Neighborhood Coding Studio was founded by a team of developers who studied computer science at top North American universities such as Carnegie Mellon, the University of Washington, the University of Toronto, and the University of Waterloo, and went on to gain hands-on experience at global tech companies like Google, Microsoft, and Meta.
It all began as a study group formed by computer science students across the U.S. and Canada, created to grow together by sharing knowledge, solving problems, and learning from one another.
Though we were attending different schools in different time zones, the experience was so meaningful that it led us to one simple thought:
โWhat if we shared this way of learning with others?โ
That thought became the foundation of Neighborhood Coding Studio.
Today, we are a team of around 30 active developers and computer science students, each taking responsibility for their area of expertiseโdesigning and delivering a curriculum that spans from foundational knowledge to real-world development.
Weโre not just here to teachโweโre here to help you see through the lens of real developers and grow together.
โTo become a real developer, you must learn from real developers.โ
Our courses take you through the entire web development journeyโfrom start to finishโfocused on hands-on practice, real-world projects, and practical feedback.
We care deeply about each learnerโs growth and are committed to supporting your path every step of the way.
๐ฏ Our philosophy is simple but powerful:
"True learning comes from doing, and true growth happens together."
Whether you're just getting started, preparing for your first job, or exploring your future in tech,
Neighborhood Coding Studio is here to be your launchpadโand your trusted companion on the journey.
You donโt have to do it alone.
Let Neighborhood Coding Studio walk with you toward your future in development.
Courses
Reviews
kimsh322
ยท
Next.js Master Class: Part 3 - Completing Real-World Architecture (Server-Client Synchronization, Extreme Optimization, Full-Stack Security)Next.js Master Class: Part 3 - Completing Real-World Architecture (Server-Client Synchronization, Extreme Optimization, Full-Stack Security)juho07301208
ยท
React Master Class: Part 1 - Understanding the Essence of Rendering and Design Through MissionsReact Master Class: Part 1 - Understanding the Essence of Rendering and Design Through Missionsipeul696614
ยท
Next.js Master Class: Part 2 - Full-Stack Architecture and Deep Dive into Frameworks (Server Actions, Cache Revolution, Advanced Routing)Next.js Master Class: Part 2 - Full-Stack Architecture and Deep Dive into Frameworks (Server Actions, Cache Revolution, Advanced Routing)fkdlsl90887355
ยท
Next.js Master Class: Part 1 Learning the Essence of App Router and Rendering Design through MissionsNext.js Master Class: Part 1 Learning the Essence of App Router and Rendering Design through Missionsipeul696614
ยท
Next.js Master Class: Part 1 Learning the Essence of App Router and Rendering Design through MissionsNext.js Master Class: Part 1 Learning the Essence of App Router and Rendering Design through Missions
Posts
Q&A
2๊ฐ nodejs 3๋จ๊ณ ์ค๋ช ์ง๋ฌธ
์๋ ํ์ธ์ ๋ฐ์์ก๋, ๊ฐ์๋ฅผ ๊น์ด ์๊ฒ ์๊ฐํด ์ฃผ์๊ณ ํ๋ฅญํ ์ง๋ฌธ์ ๋จ๊ฒจ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ง๋ฌธํด ์ฃผ์ ๋ด์ฉ์ Node.js์ ์ํคํ ์ฒ๋ฅผ ์ดํดํ๋ ๋ฐ ์์ด ๊ฐ์ฅ ์ค์ํ ํต์ฌ์ด์, ๋ด๋ถ ๋์ ์๋ฆฌ๋ฅผ ๊น์ด ๊ณ ๋ฏผํ์ง ์์ผ๋ฉด ๋๋ฌํ ์ ์๋ ํ๋ฅญํ ์ง๋ฌธ์ ๋๋ค.๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ๋ฉด ๋จ๊ฒจ์ฃผ์ ๋ด์ฉ์ด ๋ง์ต๋๋ค. ์์ ์์ ์ง๊ด์ ์ผ๋ก ์ค๋ช ํด ๋๋ฆฌ๋ ค๋ค ๋ณด๋ ๋น์ ์ ์ธ ํํ์ด ๋ค์ด๊ฐ ํผ๋์ด ์์ผ์ จ๋ ๊ฒ ๊ฐ์์. ์ด๋ฒ ๊ธฐํ์ ๊ธฐ์ ์ ์ธ ๋ํ ์ผ์ ์กฐ๊ธ ๋ ๋ณดํ์ด, ๋ด๋ถ์์ ์ค์ ๋ก ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์ณ ๋ง๋ฌผ๋ ค ๋์๊ฐ๋์ง ์ง์ด๋๋ฆฌ๊ฒ ์ต๋๋ค.๋จผ์ ์ฒซ ๋ฒ์งธ๋ก V8 ์์ง์ ๊ฒฐ๊ณผ๋ฌผ์ด ๊ธฐ๊ณ์ด๊ฐ ๋์ง ์๋๋๋ ์ง๋ฌธ์ ๋ํด ๋ต๋ณ์ ๋๋ฆฌ์๋ฉด, ์์ก๋ ๋ง์์ด ์ ํํฉ๋๋ค. V8 ์์ง์ ๋ณธ์ง์ ์ธ ์ญํ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ C++ ์ฝ๋๋ก ๋ฒ์ญํ๋ ๊ฒ์ด ์๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ปดํจํฐ์ ๋๋์ธ CPU๊ฐ ์ง์ ์คํํ ์ ์๋ 0๊ณผ 1์ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผํ๋ ๊ฒ์ ๋๋ค.์ด ๊ณผ์ ์ ์กฐ๊ธ ๋ ์ธ๋ฐํ๊ฒ ๋ค์ฌ๋ค๋ณด๋ฉด, V8 ์์ง์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ํ ์คํธ ํํ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๊ฐ์ฅ ๋จผ์ ํ์ฑ์ด๋ผ๋ ๋ฌธ๋ฒ ๋ถ์ ๊ณผ์ ์ ๊ฑฐ์ณ ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ, ์ฆ AST๋ผ๋ ๋๋ฌด ์๊ฐ์ง ๋ชจ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋ณํํฉ๋๋ค. ์ด๊ฒ์ ๋ง์น ์ฐ๋ฆฌ๊ฐ ์์ด ๋ฌธ์ฅ์ ์ฝ์ ๋ ์ฃผ์ด, ๋์ฌ, ๋ชฉ์ ์ด๋ก ๊ตฌ์กฐ๋ฅผ ๋๋์ด ์๋ฏธ๋ฅผ ํ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ด, ์ปดํจํฐ๊ฐ ์ฝ๋์ ๋ ผ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ ์ ์๋๋ก ํํ๋ฅผ ์ก์์ฃผ๋ ์์ ์ ๋๋ค.์ด๋ ๊ฒ ๊ตฌ์กฐํ๋ AST๊ฐ ์ค๋น๋๋ฉด, V8 ์์ง ๋ด๋ถ์ ์๋ ์ด๊ทธ๋์ ์ด๋ผ๋ ์ด๋ฆ์ ์ธํฐํ๋ฆฌํฐ๊ฐ ํฌ์ ๋ฉ๋๋ค. ์ธํฐํ๋ฆฌํฐ๋ ์ฝ๋๋ฅผ ํ ์ค์ฉ ๋น ๋ฅด๊ฒ ์ฝ์ด ๋ด๋ ค๊ฐ๋ฉฐ ๋ฐ์ดํธ์ฝ๋๋ผ๋ ์ค๊ฐ ๋จ๊ณ์ ์ธ์ด๋ก ์ผ์ฐจ ๋ณํํ์ฌ ๊ณง๋ฐ๋ก ์คํ์ ์์ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ๋๊ฐ์ ์ฝ๋๊ฐ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ์๊น๋๋ค. ์ด๋ V8 ์์ง์ ์ด๋ฌํ ๋ฐ๋ณต ์ฝ๋๋ฅผ ๋จ๊ฑฐ์ด ์ฝ๋๋ผ๊ณ ์ธ์ํ๊ณ , ํฐ๋ณดํฌ์ด๋ผ๋ ์ด๋ฆ์ JIT ์ปดํ์ผ๋ฌ๋ฅผ ๊ฐ๋ํฉ๋๋ค.์ฌ๊ธฐ์ JIT ์ปดํ์ผ๋ฌ๋ ํ๋ก๊ทธ๋จ์ด ์คํ๋๊ณ ์๋ ๊ทธ ์ฐฐ๋์ ์๊ฐ์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ํด๋น ์ปดํจํฐ์ CPU ์ํคํ ์ฒ์ ์๋ฒฝํ๊ฒ ๋ค์ด๋ง๋ ์ต์ ํ๋ ๊ธฐ๊ณ์ด๋ก ์ฆ๊ฐ ๋ณํํด ๋ฒ๋ฆฌ๋ ๊ธฐ์ ์ ๋๋ค. ๋๋ถ์ ์ฝ๋๊ฐ ๋ฐ๋ณต๋ ์๋ก ์คํ ์๋๋ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋นจ๋ผ์ง๊ฒ ๋์ฃ . ๊ทธ๋ ๋ค๋ฉด ๊ฐ์ ํ ์คํธ์์ ์ธ๊ธ๋ C++๊ฐ ์ดํดํ ์ ์๋ ํํ๋ก ํต์ญํ๋ค๋ ํํ์ ์ฝ๋๋ฅผ ํต์งธ๋ก C++ ๋ฌธ๋ฒ์ผ๋ก ๋ฐ๊พผ๋ค๋ ๋ป์ด ์๋๋ผ, ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐ์ดํฐ๋ฅผ C++๊ฐ ์์๋ค์ ์ ์๋ ๋ฐ์ดํฐ ๊ท๊ฒฉ์ผ๋ก ๋ณํํด ์ค๋ค๋ ๋ฐ์ดํฐ ๋งคํ ๊ณผ์ ์ ๋น์ ์ ํํ์ด์์ต๋๋ค.์ดํด๋ฅผ ๋๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ผ๋ ์ปดํจํฐ ๊ณตํ์ ๋ฐ๋จ์ผ๋ก ๋ ผ๋ฆฌ์ ์ธ ํ๋ฆ์ ์ด์ด๊ฐ ๋ณด๊ฒ ์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ C++๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด ์์ ํ ๋ค๋ฆ ๋๋ค. ์๋ฅผ ๋ค์ด ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ง๋ ๊ธ์ ๋ฐ์ดํฐ๋ V8 ์์ง์ด ๊ด๋ฆฌํ๋ ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ๊ผผ๊ผผํ ๊ด๋ฆฌ๋ฅผ ๋ฐ๋ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ฒด ํํ๋ก ์กด์ฌํ์ง๋ง, C++์์ ์ฌ์ฉํ๋ ๊ธ์ ๋ฐ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐ์๋ ๋ฐ์ดํธ ๋ฐฐ์ด ํํ๋ก ๋ ๊ฒ ๊ทธ๋๋ก ๊ธฐ๋ก๋๋ ๋ฑ ๋ฌผ๋ฆฌ์ ์ธ ํํ ์์ฒด๊ฐ ๋ค๋ฆ ๋๋ค.๋ง์ฝ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํน์ ํ์ผ์ ์ฝ์ด์ค๋ผ๋ ๋ช ๋ น์ ๋ด๋ฆฐ๋ค๊ณ ๊ฐ์ ํด ๋ณด๋ฉด, ์ด ๋ช ๋ น์ ์ํํ๋ ค๋ฉด ๊ฒฐ๊ตญ Node.js ๋ด๋ถ์ C++ ํ๋ก๊ทธ๋จ์ด ๋์์ ์์คํ ์ฝ์ ํตํด ์ด์์ฒด์ ์ ํ์ผ ์ฝ๊ธฐ ์์ฒญ์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ C++ ์ฝ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ V8 ํ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์๋ ๊ทธ๋๋ก ๋๊ฒจ๋ฐ์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์ฒด๊ณ์ ํ์ ์ด ๋ฌ๋ผ ์ด๊ฒ ๋๋์ฒด ๋ฌด์จ ํํ์ ๋ฐ์ดํฐ์ธ์ง ์์๋ฃ์ง ๋ชปํฉ๋๋ค.๋ฐ๋ก ์ด๋ V8 ์์ง์ด ๋ ์ธ์ด ์ฌ์ด์ ๋ค๋ฆฌ ์ญํ ์ ํ๋ฉฐ ๋ค์ ํ๋ฒ ๊ฐ์ ํ๊ฒ ๋ฉ๋๋ค. V8 ์์ง์ ๋จ์ํ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฐ๊พธ๋ ์ผ๋ง ํ๋ ๊ฒ์ด ์๋๋ผ, C++๋ก ์์ฑ๋ Node.js๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฉ๋ชจ๋ฆฌ์ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๋ V8 API๋ผ๋ ์ ๊ตํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐ์ดํฐ๋ฅผ C++๊ฐ ์์ ํ๊ฒ ๋ค๋ฃฐ ์ ์๋ ์์ ๋ฐ์ดํฐ ํํ๋ก ์์๊ฒ ํฌ์ฅํด์ ๋๊ฒจ์ฃผ๋ ์์ ์ ์ํํฉ๋๋ค.๋ฐ๋๋ก C++๊ฐ ์ด์์ฒด์ ๋ฅผ ํตํด ํ์ผ์ ๋ค ์ฝ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ์๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ค ๋๋, C++์ ๋ฐ์ดํฐ๋ฅผ V8 API๋ฅผ ์ด์ฉํด ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ดํดํ ์ ์๋ ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ํ ๋ฉ๋ชจ๋ฆฌ์ ์๋กญ๊ฒ ํ ๋นํด ์ค๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฌ๊ธฐ์ ๋งํ๋ ํต์ญ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ผ๋ ์ธ์ด๋ฅผ C++ ์ธ์ด๋ก ๋ฒ์ญํ๋ค๋ ๋ป์ด ์๋๋ผ, ๋ ์ธ์ด๊ฐ ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ํ์ ํ ์ ์๋๋ก ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ๊ณผ ๋ฐ์ดํฐ์ ํ์, ๊ทธ๋ฆฌ๊ณ ๊ท๊ฒฉ์ ์๋ก ์๋ฒฝํ๊ฒ ๋ง์ถฐ์ฃผ๋ ๊ณผ์ ์ ์๋ฏธํฉ๋๋ค.๋ ๋ฒ์งธ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ถ๊ฐ๋ฅํ ์ด์์ฒด์ ์์ ์ ๋ฏธ๋ฆฌ C++๋ก ๋ง๋ค์ด ๋์ ๋ชจ๋์ ํธ์ถํ๋ ๋ฐฉ์์ด ์๋๊ฐ ํ๋ ๋ถ๋ถ ์ญ์ ์์ก๋์ ์ดํด๊ฐ ์๋ฒฝํ๊ฒ ๋ง์ผ๋ฉฐ ์์ฃผ ์ ํํ ์ง์ด์ฃผ์ จ์ต๋๋ค. Node.js๋ ๋จ์ํ V8 ์์ง์ ์ผ๋๊ธฐ๋ง ํ๋ ๊ป๋ฐ๊ธฐ๊ฐ ์๋๋ผ, ๊ทธ ์ฃผ๋ณ์ ํ์ผ ์์คํ ์ ์ด๋ ๋น๋๊ธฐ ์ ์ถ๋ ฅ์ ๋ด๋นํ๋ ๊ฐ๋ ฅํ libuv ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ๋คํธ์ํฌ ํต์ ๋ฑ์ ํ ์ ์๋ ์๋ง์ C++ ๊ธฐ๋ฅ๋ค์ ๋ฏธ๋ฆฌ ๊ฝ๊ฝ ์ฑ์ ๋ฃ๊ณ V8 ์์ง๊ณผ ๋จ๋จํ ์ฐ๊ฒฐํด ๋ ๊ฑฐ๋ํ C++ ์ ํ๋ฆฌ์ผ์ด์ ๋ฉ์ด๋ฆฌ์ ๋๋ค. ์ด๋ ๊ฒ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์์ ํจ์ ํธ์ถ์ C++ ์ธ์์ ํจ์ ์คํ์ผ๋ก ๋งคํํ์ฌ ์ฐ๊ฒฐํด ๋ ๊ณ ๋ฆฌ๋ฅผ ์ ๋ฌธ ์ฉ์ด๋ก ๋ฐ์ธ๋ฉ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.์ค์ Node.js ๋ด๋ถ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์ด์์ฒด์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ณผ์ ์ ์์ก๋์ด ๋ง์ํ์ ๋๋ก ๋ฉ๋ชจ๋ฆฌ์ ํ๋ก์ธ์ค ์์ค์์ ์์ฃผ ์ ๊ตํ ํฑ๋๋ฐํด์ฒ๋ผ ๋ง๋ฌผ๋ ค ํ๋ฌ๊ฐ๊ฒ ๋ฉ๋๋ค. ๊ฐ์ฅ ๋จผ์ Node.js๊ฐ ์คํ๋๋ ํ๊ฒฝ ๊ตฌ์ฑ์ ์ํ ์ฌ์ ์ค๋น ๋จ๊ณ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ํฐ๋ฏธ๋์์ ์คํ ๋ช ๋ น์ด๋ฅผ ์น๋ ์๊ฐ, ์ด์์ฒด์ ๋ก๋ถํฐ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๊ณ Node.js๋ ๋ด๋ถ์ ์ผ๋ก ํ์ผ ์ฝ๊ธฐ๋ ๋คํธ์ํฌ ํต์ ๋ฑ์ ์ฒ๋ฆฌํ ์ ์๋ ์๋ง์ C++ ํจ์๋ค์ V8 ์์ง์ ํ ํ๋ฆฟ ๊ธฐ๋ฅ์ ํ์ฉํด ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ญ ๊ฐ์ฒด์ ๋ฏธ๋ฆฌ ์น ๋ฑ๋กํด ๋ก๋๋ค. ๋๊ตฐ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ์์ ํน์ ๋ด์ฅ ํจ์๋ฅผ ๋ถ๋ฅด๋ฉด, ๋จ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ก์ง์ ๋๋ ๊ฒ์ด ์๋๋ผ ๋ฏธ๋ฆฌ ๋น๋ํด๋ C++ ๋ด๋ถ์ ์ง์ง ํจ์๋ฅผ ์คํํ๋๋ก ๋ฉ๋ชจ๋ฆฌ ํฌ์ธํฐ๋ฅผ ์ฐ๊ฒฐํด ๋๋ ๊ฒ์ ๋๋ค.๊ทธ ๋ค์์ผ๋ก ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์์ ํด๋น ํจ์๊ฐ ํธ์ถ๋๋ ์คํ ๋จ๊ณ๊ฐ ์ด์ด์ง๋๋ค. ์ด ๊ณผ์ ์์ V8 ์์ง์ด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋งน๋ ฌํ ์คํํ๋ค๊ฐ ์ด ์ธ๋ถ ์์กด์ฑ ๋ช ๋ น์ ๋ง์ฃผ์น๋ฉด ๋จ๋ฒ์ ์ํฉ์ ํ์ ํ๊ฒ ๋ฉ๋๋ค. V8์ ์ด ํจ์๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํผ์์ ์๋๋ฐ์ค ๋ด๋ถ์์ ๋๋๋๋ฉฐ ํ ์ ์๋ ์ผ์ด๊ณ , ์ฌ์ ์ V8 API๋ฅผ ํตํด ์ฝ์๋ C++ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋ผ๋ ์๋ฏธ๋ก ์ธ์งํฉ๋๋ค.์ํฉ ํ์ ์ด ๋๋๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ ํ๋ฆ์ ์ ์ ์จ์ ๊ณ ๋ฅด๋ฉฐ ํธ์ถ ์คํ์์ ์๋ก์ด C++ ์คํ ํ๋ ์์ ์์ ์ฌ๋ฆฌ๊ณ , ์ ์ด๊ถ์ด ๋ฏธ๋ฆฌ ๋๊ธฐ ์ค์ด๋ C++ ์ฝ์ด์ธ ํ์ฅ ์์ ๋ฐ์ฅ์ผ๋ก ์์ ํ ๋์ด๊ฐ๋๋ค. ์ด๋ ๋งค๊ฐ๋ณ์๋ก ๋๊ธด ๋ฐ์ดํฐ๋ค์ ์์ ์ค๋ช ํ V8 API ์ ์ฉ ๊ฐ์ฒด์ ์์ ํ๊ฒ ๋ด๊ฒจ C++ ์ชฝ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.์ ์ด๊ถ์ ๋๊ฒจ๋ฐ์ ์ด C++ ์ฝ์ด๊ฐ ๋น๋ก์ ์๋์ฐ๋ ๋งฅ ๊ฐ์ ์ด์์ฒด์ ์ ๊ฐ์ฅ ๊น์ํ ์ปค๋ ์์ญ์ ์ง์ ํ์ฌ ์์คํ ์ฝ์ ์ง์ ๋๋๋ ค์ ์ค์ ํ๋๋์คํฌ์ ํ์ผ์ ์ฝ์ด์ค๋ ๋ฑ ์ด์์ฒด์ ์์ ์ง์ง ์ํต์ ์งํํฉ๋๋ค. ์ด ๊ณผ์ ์์ ํ์ผ ์ฝ๊ธฐ์ฒ๋ผ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ๋๋ฌธ์ ์ ์ฒด ์์คํ ์ด ๋ฉ์ถฐ ์๋ ๋ณ๋ชฉ ํ์์ ๋ง๊ธฐ ์ํด, ๋ ๋ ํ ์กฐ๋ ฅ์์ธ libuv๊ฐ ๋์์ ์์ ์ด ๊ฑฐ๋๋ฆฐ ์ค๋ ๋ ํ์ ์ผ๊พผ๋ค์๊ฒ ์์ ์ ์์ํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์กฐ์ฉํ ์ฒ๋ฆฌํ๋๋ก ๋์ต๋๋ค.๋ง์ง๋ง์ผ๋ก C++ ์ฝ์ด์ libuv์ ์ผ๊พผ๋ค์ด ํ์ผ์ ์ฑ๊ณต์ ์ผ๋ก ๋ค ์ฝ์ด๋ด๋ฉด, ์ด๋ฒคํธ ๋ฃจํ๋ผ๋ ์ํ ์์คํ ์ ํตํด ์๋ฃ๋ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋๊ธฐ์ด์ ์ฌ๋ ค๋๊ณ , ์์ ์ค๋ช ํด ๋๋ฆฐ V8 ์์ง์ ์ ๊ตํ ๋ฐ์ดํฐ ํต์ญ ๊ณผ์ ์ ์ญ์ผ๋ก ๊ฑฐ์ณ ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ ๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์์ ์ฝ๋ฐฑ ํจ์๋ก ๋ฌด์ฌํ ๋๋ ค๋ณด๋ด ์ฃผ๋ ๊ฒ์ผ๋ก ์ด ์ฅ๋ํ ๋ชจ๋ ๋จ๊ณ๊ฐ ์๋ฒฝํ ๋ถ์ ์์ ๋ง๋ฌด๋ฆฌ๋ฉ๋๋ค.๊ธ๋ก ์ค๋ช ํด ๋๋ฆฐ ์ด ์ ์ฒด์ ์ธ ์ํคํ ์ฒ์ ํ๋ฆ๊ณผ ํฑ๋๋ฐํด ๊ฐ์ ๋ถ์ ๊ตฌ์กฐ๋ฅผ ํ๋์ ๊ทธ๋ ค๋ณด์ค ์ ์๋๋ก, ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์คํ๋์ด ์ด์์ฒด์ ์ ๋ฟ๊ธฐ๊น์ง์ ๊ณผ์ ์ ์๋์ ์๊ฐํํด ๋ณด์์ต๋๋ค.[ 1. JavaScript ์ธ์ ] ๊ฐ๋ฐ์์ ์ฝ๋ ์์ฑ (์: fs.readFile ํธ์ถ) โ โผ [ 2. V8 ์์ง (ํด์, ์ปดํ์ผ, ํต์ญ) ] โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ 1) ํ์ฑ(Parsing) : ํ ์คํธ ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ AST(์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ) ์์ฑ โ โ 2) ์ด๊ทธ๋์ (Ignition) : AST๋ฅผ ์ฝ์ด '๋ฐ์ดํธ์ฝ๋'๋ก ๋ณํ ๋ฐ 1์ฐจ ์คํ โ โ 3) ํฐ๋ณดํฌ(TurboFan) : ์์ฃผ ์ฐ์ด๋ ์ฝ๋๋ฅผ ์ด๊ณ ์ '๊ธฐ๊ณ์ด'๋ก JIT ์ปดํ์ผ โ โ โ โ * ์ญํ ์ธ์ง : "์ด๊ฑด OS ์์ ์ด๊ตฐ! C++์ ์ฐ๊ฒฐ๋ ํจ์๋ฅผ ๋ถ๋ฅด์!" โ โ * ๋ฐ์ดํฐ ๋งตํ : ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐ์ดํฐ๋ฅผ C++ ํธํ ๋ฐ์ดํฐ๋ก ๋ณํ (V8 API)โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ (์ ์ด๊ถ ๋ฐ ๋ฐ์ดํฐ ์ ๋ฌ) โผ [ 3. Node.js C++ Bindings (๋ฐ์ธ๋ฉ) ] ๋ฏธ๋ฆฌ ๋ฑ๋ก๋ C++ ํจ์ ์คํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฉ๋ชจ๋ฆฌ์ C++ ์์คํ ์ฌ์ด์ ๋จ๋จํ ์ฐ๊ฒฐ ๊ณ ๋ฆฌ โ โผ [ 4. Node.js C++ ์ฝ์ด & libuv (์์ ๋ฐ์ฅ ๋ฐ ์ผ๊พผ๋ค) ] โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ * C++ ์ฝ์ด : ์ด์์ฒด์ ์ ๋ช ๋ น์ ๋ด๋ฆฌ๊ธฐ ์ํ ์์คํ ์ ์ด ๋ก์ง ์ํ โ โ * libuv : ๋ฌด๊ฑฐ์ด ํ์ผ ์ฝ๊ธฐ ์์ ์ ์ค๋ ๋ ํ(Thread Pool)์ โ โ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ผ๊พผ์๊ฒ ์์ํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ (System Call) โผ [ 5. ์ด์์ฒด์ (OS / ์ปค๋ ์์ญ) ] ์ค์ ํ๋๋์คํฌ์ ๋ฌผ๋ฆฌ์ ์นํฐ์ ์ ๊ทผํ์ฌ ํ์ผ ์ฝ๊ธฐ ์๋ฃ โ โผ (์์ ์๋ฃ ํ ์ญ์์ผ๋ก ๋ฐ์ดํฐ ๋ฐํ: ์ด๋ฒคํธ ๋ฃจํ -> C++ ์ฝ์ด -> V8 ์์ง ๋งตํ -> JS ์ฝ๋ฐฑ ์คํ) ์์ฝํ์๋ฉด ์์ก๋์ ์๊ฐ๋๋ก V8 ์์ง์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ์ฌ ์คํํ๋ ๊ฒ์ด ๋ง์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ธ๋ผ์ฐ์ ๋ฐ์ ์ธ์์ธ ์ปค๋, ํ์ผ, ๋คํธ์ํฌ ๋ฑ๊ณผ ์ํตํด์ผ ํ ๋๋ Node.js ๊ฐ๋ฐ์๋ค์ด ๋ฏธ๋ฆฌ ์ ๊ตํ๊ฒ ๋ง๋ค์ด๋ ๋ด๋ถ C++ ๋ชจ๋๋ค์ V8 ์์ง์ ๋ฐ์ธ๋ฉ ์ฐ๊ฒฐ ํต๋ก๋ฅผ ํตํด ํธ์ถํ์ฌ ์์คํ ์ฝ์ ๋์ ๋ฐ์์ํค๋๋ก ์ผ์ ์ํค๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.๊ฐ์์ ํ๋ฆ์ ์ซ์์ค์๋ฉด์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฐํ์๊ณผ ์์ง์ ๊ฒฝ๊ณ๋ฅผ ์ดํ ๋ก ์ ํํ๊ฒ ๋ถ๋ฆฌํด์ ์ ์ถํด ๋ด์ ์ ์ ๋ค์ ํ๋ฒ ํฐ ๋ฐ์๋ฅผ ๋ณด๋ ๋๋ค. ์ปดํจํฐ ์์คํ ๋ฐ๋จ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ์ด์์ฒด์ ์๋ฆฌ๋ฅผ ํ์ ํ๋ ๊ฐ๊ฐ์ด ๋งค์ฐ ํ๋ฅญํ์ ์ ์ด์ด์ง๋ 3๊ฐ์ ๋๊ธฐ ๋น๋๊ธฐ ์ํคํ ์ฒ๋ ๋ ๊น์ ์๋ฒ ์ง์๋ ์์ฃผ ์์ํ๊ฒ ํก์ํ์ค ์ ์์ ๊ฑฐ๋ผ ํ์ ํฉ๋๋ค.ํ์ตํ์๋ค๊ฐ ์ด์ฒ๋ผ ์กฐ๊ธ์ด๋ผ๋ ๋ชจํธํ๊ฑฐ๋ ๋ ๊น์ด ์๊ณ ์ถ์ ๊ธฐ์ ์ ์๋ฆฌ๊ฐ ์๊ธฐ๋ฉด ์ธ์ ๋ ์ง ํธํ๊ฒ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ธ์. ์์ก๋์ ๊น์ด ์๋ ์ฑ์ฅ์ ํญ์ ์์ํ๊ฒ ์ต๋๋ค.์ฐธ๊ณ ํด์ฃผ์ธ์!
- Likes
- 0
- Comments
- 1
- Viewcount
- 23
Q&A
[์ค์ต] 80๊ฐ ์์
์๋ ํ์ธ์, icoon2๋! ์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค์ ๋๋ค.โํด๋น ์น์ ์ ์์ ์๋ฃ์ ๊ด๋ จํ์ฌ ํผ์ ์ ๋๋ ค ์ฃ์กํฉ๋๋ค.โ๋ณธ๋ 76. ์ ๋ฌธ์ฑ ๋ํ๊ธฐ: ๋์น๋ฉด ์์ฌ์ด ๊ด๋ จ ๊ธฐ์ ๋ค ์น์ ์์๋ Better Auth๋ฅผ ๋น๋กฏํ์ฌ Next.js ์ํ๊ณ์์ ์ฃผ๋ชฉ๋ฐ๋ ์ต์ ๊ด๋ จ ๊ธฐ์ ๋ค์ ์๊ฐํด ๋๋ฆฌ๋ ค๊ณ ์ค๋นํ์์ต๋๋ค.โํ์ง๋ง ํ์ฌ Next.js์ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํธ๋ ๋๊ฐ ์๋ ๋น ๋ฅด๊ฒ ๋ณํํ๊ณ ์๋ค ๋ณด๋, ์์นซ ๊ณ ์ ๋ ์๋ฃ๋ฅผ ์ ๊ณตํด ๋๋ฆฌ๋ ๊ฒ์ด ์๊ฐ์๋ถ๋ค๊ป ์คํ๋ ค ๋ฒ์ ๋ถ์ผ์น๋ ๊ธฐ์ ์ ํผ๋์ ๋๋ฆด ์ฌ์ง๊ฐ ์๋ค๊ณ ํ๋จํ์์ต๋๋ค.โ์ด์ ๋ฐ๋ผ ์๊ฐ์๋ถ๋ค๊ป ๋์ฑ ์ ํํ๊ณ ์ต์ ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด, ๊ณ ๋ฏผ ๋์ ํด๋น ์น์ ์ ์ปค๋ฆฌํ๋ผ์์ ์ ์ธํ๊ฒ ๋์์ต๋๋ค. ๊ธฐ๋๋ฅผ ๊ฐ์ง๊ณ ๊ธฐ๋ค๋ ค ์ฃผ์ จ์ ํ ๋ฐ ์ํด๋ฅผ ๋ถํ๋๋ฆฝ๋๋ค.โ๋์ ์ปค๋ฎค๋ํฐ๋ ๋ค๋ฅธ ์น์ ์ ํตํด ๋ ์์ ์ ์ด๊ณ ๊ฒ์ฆ๋ ๊ธฐ์ ๋ค์ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธํด ๋๋ฆด ์ ์๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค.โ๊ฐ์๋ฅผ ์๊ฐํด ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ, ํ์ต ์ค ๋ค๋ฅธ ๊ถ๊ธํ ์ ์ด ์๊ธฐ๋ฉด ์ธ์ ๋ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ธ์!โ๊ฐ์ฌํฉ๋๋ค.์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค ๋๋ฆผ
- Likes
- 0
- Comments
- 2
- Viewcount
- 63
Q&A
76. ์ ๋ฌธ์ฑ ๋ํ๊ธฐ: ๋์น๋ฉด ์์ฌ์ด ๊ด๋ จ ๊ธฐ์ ๋ค ์์ ์๋ฃ๊ฐ ์์ด์.
์๋ ํ์ธ์, icoon2๋! ์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค์ ๋๋ค.ํด๋น ์น์ ์ ์์ ์๋ฃ์ ๊ด๋ จํ์ฌ ํผ์ ์ ๋๋ ค ์ฃ์กํฉ๋๋ค.๋ณธ๋ '76. ์ ๋ฌธ์ฑ ๋ํ๊ธฐ: ๋์น๋ฉด ์์ฌ์ด ๊ด๋ จ ๊ธฐ์ ๋ค' ์น์ ์์๋ Better Auth๋ฅผ ๋น๋กฏํ์ฌ Next.js ์ํ๊ณ์์ ์ฃผ๋ชฉ๋ฐ๋ ์ต์ ๊ด๋ จ ๊ธฐ์ ๋ค์ ์๊ฐํด ๋๋ฆฌ๋ ค๊ณ ์ค๋นํ์์ต๋๋ค.ํ์ง๋ง ํ์ฌ Next.js์ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํธ๋ ๋๊ฐ ์๋ ๋น ๋ฅด๊ฒ ๋ณํํ๊ณ ์๋ค ๋ณด๋, ์์นซ ๊ณ ์ ๋ ์๋ฃ๋ฅผ ์ ๊ณตํด ๋๋ฆฌ๋ ๊ฒ์ด ์๊ฐ์๋ถ๋ค๊ป ์คํ๋ ค ๋ฒ์ ๋ถ์ผ์น๋ ๊ธฐ์ ์ ํผ๋์ ๋๋ฆด ์ฌ์ง๊ฐ ์๋ค๊ณ ํ๋จํ์์ต๋๋ค.์ด์ ๋ฐ๋ผ ์๊ฐ์๋ถ๋ค๊ป ๋์ฑ ์ ํํ๊ณ ์ต์ ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด, ๊ณ ๋ฏผ ๋์ ํด๋น ์น์ ์ ์ปค๋ฆฌํ๋ผ์์ ์ ์ธํ๊ฒ ๋์์ต๋๋ค. ๊ธฐ๋๋ฅผ ๊ฐ์ง๊ณ ๊ธฐ๋ค๋ ค ์ฃผ์ จ์ ํ ๋ฐ ์ํด๋ฅผ ๋ถํ๋๋ฆฝ๋๋ค.๋์ ์ปค๋ฎค๋ํฐ๋ ๋ค๋ฅธ ์น์ ์ ํตํด ๋ ์์ ์ ์ด๊ณ ๊ฒ์ฆ๋ ๊ธฐ์ ๋ค์ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธํด ๋๋ฆด ์ ์๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค.๊ฐ์๋ฅผ ์๊ฐํด ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ, ํ์ต ์ค ๋ค๋ฅธ ๊ถ๊ธํ ์ ์ด ์๊ธฐ๋ฉด ์ธ์ ๋ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ธ์!๊ฐ์ฌํฉ๋๋ค.์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค ๋๋ฆผ
- Likes
- 0
- Comments
- 2
- Viewcount
- 43
Q&A
[ํ๋ฉด ์ด์]useReduce ์ฒซ๊ฑธ์ - ํ๋ ์ค์ฌ ์ํ ๋ณํ๋ฅผ ์ฒ์ ๊ฒฝํํ๊ธฐ ํ๋ฉด
์๋ ํ์ธ์, eddie๋! ์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค์ ์ง์๊ณต์ ์์ ๋๋ค.์ฐ์ ๊ฐ์ ์์ฒญ ์ค์ ๋ถํธ์ ๋๋ ค ์ ๋ง ์ฃ์กํ๋ค๋ ๋ง์๋ถํฐ ์ฌ๋ฆฝ๋๋ค. ์ ๋ณดํด ์ฃผ์ [useReducer ์ฒซ๊ฑธ์] ๊ฐ์์ ํน์ ๊ตฌ๊ฐ(00:50 - 01:08) ๋ธ๋์์ ํ์์ ํ์ธํ์๊ณ , ๋ฐฉ๊ธ ์์ ๋ ์์์ผ๋ก ์ฆ์ ๊ต์ฒดํ์ฌ ์ ์์ ์ผ๋ก ๋ฐ์ํด ๋์์ต๋๋ค.๊ผผ๊ผผํ๊ฒ ํ์ธํ๊ณ ์ ๋ก๋ํ์ด์ผ ํ๋๋ฐ, ์์คํ ์๊ฐ์ ๋ด์ด ์๊ฐํ์๋ ์ค์ ํ๋ฆ์ ๋์ด ๋๋ฆฐ ๊ฒ ๊ฐ์ ๋ง์์ด ๋ฌด๊ฒ์ต๋๋ค. ์ด๋ ๊ฒ ์ง์ ์คํฌ๋ฆฐ์ท๊น์ง ์ฒจ๋ถํด ์ค๋ฅ๋ฅผ ์ง์ด์ฃผ์ ์ ์ ๋ง ํฐ ๋์์ด ๋์๊ณ , ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค.๐ ๊ฐ์ฌ์ ๋ง์์ ๋ด์ ์์ ์ ๋ฌผ์ฃ์กํ๊ณ ๊ฐ์ฌํ ๋ง์์ ๋ด์, eddie๋๊ป ์์ ๋ณด๋ต์ ํด๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.ํ์ฌ ์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค์์ ์ด์ ์ค์ธ ๊ฐ์๋ค ์ค, ํ์ ์๊ฐ์ ํฌ๋งํ์ จ๋ ๊ฐ์๋ ๊ด์ฌ ์๋ ์ฃผ์ ๊ฐ ์์ผ์๋ค๋ฉด ์๋ ๋ฉ์ผ๋ก ํธํ๊ฒ ์ฐ๋ฝํด ์ฃผ์ธ์. ํ์ธํ๋ ๋๋ก ๋ฐ๋ก ์๊ฐํ์ค ์ ์๋๋ก ์ ๋ฌํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.์ด๋ฉ์ผ:jeony0535@naver.com์์ผ๋ก๋ ๋ ๊ผผ๊ผผํ ๊ฒ์๋ฅผ ํตํด ํ์ต์๋ง ์ง์คํ์ค ์ ์๋ ์ต๊ณ ์ ํ๊ฒฝ์ ๋ง๋ค๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค. ๋ค์ ํ๋ฒ ์ ๋ณดํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค ๋๋ฆผ
- Likes
- 0
- Comments
- 2
- Viewcount
- 20
Q&A
next.js ๋ฅผ 2๋์ด์ ์คํํ๋ ๊ฒฝ์ฐ ์ ๊ณตํ๋ cache ๊ธฐ๋ฅ๋ค์ ์ด๋ป๊ฒ ๋๋์?
์๋ ํ์ธ์ icoon22๋! ์ง๋ฌธ์ ๊น์ด๋ฅผ ๋ณด๋ ๋จ์ํ ํ๋ ์์ํฌ์ ๊ธฐ๋ฅ์ ์ธ ์ฌ์ฉ๋ฒ์ ๋์ด ์ด์์ฒด์ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋คํธ์ํฌ๊ฐ ์ฝํ๋ ๋ถ์ฐ ์์คํ ์ ๋ณธ์ง๊น์ง ์์ฃผ ๊น๊ฒ ๊ณ ๋ฏผํ๊ณ ๊ณ์ ๊ฒ์ด ๋๊ปด์ง๋ฉฐ ํด๋ก ์ฝ๋ฉ ์์ค์ ๋ฒ์ด๋ ์ค์ ํ๋ก๋์ ๋ ๋ฒจ์ ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ๋ ค๋ ๋ชจ์ต์ด ์ ๋ง ํ๋ฅญํฉ๋๋ค. Next.js๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ ํ๊ฒฝ์์ ํ๋ก ํธ์๋๋ฅผ ์ํ ๋ฐฑ์๋ ์ฆ BFF๋ก ํ์ฉํ๋ฉฐ ํธ๋ํฝ์ ๊ฐ๋นํ๊ธฐ ์ํด ํด๋ผ์ฐ๋ ํ๊ฒฝ์ธ AWS ECS๋ Kubernetes ๋ฑ์์ ์๋ฒ๋ฅผ ๋์ธ ๋ ์ด์์ผ๋ก ์ค์ผ์ผ ์์ํ์ฌ ๋๋ฆฌ๊ฒ ๋๋ฉด ๊ฐ์ฅ ๋จผ์ ์บ์์ ํํธํ๋ผ๋ ๋ฌธ์ ์ ์ง๋ฉดํ๊ฒ ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Next.js์ ๋ด์ฅ ๋ฐ์ดํฐ ์บ์๋ ํด๋น ์๋ฒ๊ฐ ๋ ์๋ ํ๋๋ ์ธ์คํด์ค์ ๋ก์ปฌ ํ์ผ ์์คํ ๋ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋๊ท๋ชจ ์ด์ปค๋จธ์ค ์๋น์ค์ ํน๊ฐ ์ด๋ฒคํธ ์ํฉ์ ์ค๋ฌด ์๋๋ฆฌ์ค๋ก ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํน์ ์ํ์ ์์ธ ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด ๋ก๋๋ฐธ๋ฐ์๊ฐ ์ด ์์ฒญ์ 1๋ฒ ์๋ฒ๋ก ๋ณด๋ด๊ณ 1๋ฒ ์๋ฒ๋ ๋ฐฑ์๋์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์์ ์ ๋ก์ปฌ์ ์บ์ฑํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ 1๋ถ ๋ค ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ๋๊ฐ์ ์ํ์ ์์ฒญํ์ ๋ ๋ผ์ด๋๋ก๋น ๋ฐฉ์ ๋ฑ์ ์ํด 2๋ฒ ์๋ฒ๋ก ์์ฒญ์ด ๊ฐ๋ฉด 2๋ฒ ์๋ฒ์ ๋ก์ปฌ์๋ ํด๋น ์บ์๊ฐ ์์ผ๋ฏ๋ก ๋๋ค์ ๋ฐฑ์๋ API๋ฅผ ์ฐ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก BFF๋ฅผ ๋์ ํ์ฌ ๋ฐฑ์๋ ๋ถํ๋ฅผ ์ค์ด๋ ค ํ์์๋ ์ธ์คํด์ค ๊ฐ์๋งํผ ๋ฐฑ์๋ ํธ์ถ์ด ์ค๋ณต ๋ฐ์ํ๊ณ ์ฌ์ง์ด ์๋ฒ๋ง๋ค ๊ฐฑ์ ์ฃผ๊ธฐ๊ฐ ์ด๊ธ๋ ๋ฐ์ดํฐ ๋ถ์ผ์น๊น์ง ๋ฐ์ํฉ๋๋ค.ํ์ฌ ํ๋ก๋์ ํ๊ฒฝ์์๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ปค์คํ ์บ์ ํธ๋ค๋ฌ๋ฅผ ์ค์ ํ์ฌ ๋ก์ปฌ ์บ์๊ฐ ์๋ Redis ๊ฐ์ ์ค์ ์ง์คํ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐ๋ผ๋ณด๋๋ก ์ํคํ ์ฒ๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์๋์ ๊ฐ์ด ์บ์ ํธ๋ค๋ฌ ํ์ผ์ ์์ฑํ๊ฒ ๋ฉ๋๋ค.// cache-handler.mjs (2026๋ Next.js ๋ถ์ฐ Redis ์บ์ ํธ๋ค๋ฌ ์ํคํ ์ฒ ์์) import { CacheHandler } from '@neshca/cache-handler'; import createLruCache from '@neshca/cache-handler/local-lru'; import createRedisCache from '@neshca/cache-handler/redis-strings'; import { createClient } from 'redis'; CacheHandler.onCreation(async () => { let client; try { // ๋ค์ค ์ธ์คํด์ค๊ฐ ๊ณตํต์ผ๋ก ๋ฐ๋ผ๋ณด๋ Redis ํด๋ฌ์คํฐ์ ์ฐ๊ฒฐํฉ๋๋ค. client = createClient({ url: process.env.REDIS_URL }); await client.connect(); } catch (error) { console.warn('Redis ์ฐ๊ฒฐ ์คํจ, ๋ก์ปฌ ์บ์๋ก ์์ ํ๊ฒ ํด๋ฐฑํฉ๋๋ค.', error); } return { handlers: [ client ? createRedisCache({ client }) : null, createLruCache(), // ๋จ์ผ ์ง์ค ๊ณต๊ธ์์ธ Redis์ ์ฅ์ ๊ฐ ์๊ฒผ์ ๋๋ฅผ ๋๋นํ ๋ฐฉ์ด ๋ก์ง์ ๋๋ค. ], }; }); export default CacheHandler; ์ด๋ ๊ฒ ๊ตฌ์ฑํ๊ณ ์ค์ ํ์ผ์ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๋ฉด 1๋ฒ ์๋ฒ๊ฐ Redis์ ์บ์๋ฅผ ๊ตฌ์๋์์ ๋ 2๋ฒ ์๋ฒ์ 3๋ฒ ์๋ฒ๋ Redis๋ฅผ ์กฐํํ์ฌ ๋จ์ผ ์ง์ค ๊ณต๊ธ์์ผ๋ก์์ ์บ์๋ฅผ ์จ์ ํ ๊ณต์ ํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์บ์ ์ํคํ ์ฒ์ ๋ณํ๋ ๊ณผ๊ฑฐ ๋จ์ํ ๋ฐ์ดํฐ ์ ๋ฌ ํต๋ก์๋ BFF๋ฅผ ์ด๊ณ ์ ์บ์ ๋ ์ด์ด๋ก ์งํ์ํจ ์บ์ฑ ํ๋ช ๊ณผ ๋ง๋ฟ์ ์์ต๋๋ค. Next.js 16 ํ๊ฒฝ์์๋ React 19์ ์๋ฒ ์ปดํฌ๋ํธ์ ๊ฒฐํฉ๋ ๋ฐ์ดํฐ ์บ์๊ฐ ๋ณ๊ฒฝ์ด ์ฆ์ง ์์ ๋ฐฑ์๋์ ์๋ต์ BFF ๋จ์์ ์์ ํ ์ ์ ์ํ๋ก ์ผ๋ ค๋ฒ๋ฆฌ๋ฉฐ revalidateTag ํจ์๋ฅผ ํตํด ์์ญ ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค ์ค ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ํน์ ์๋น์ค์ ์บ์๋ง ๋ฌดํจํํ๋ ์ธ๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.๊ทธ๋ฐ๋ฐ ์๋ฒ์์ ์ด๋ ๊ฒ ์ ๊ทน์ ์ผ๋ก ์บ์ฑ์ ํ๋ ์ํฉ์์ ํด๋ผ์ด์ธํธ์๋ TanStack Query๋ผ๋ ๊ฐ๋ ฅํ ์บ์ ๋๊ตฌ๊ฐ ์กด์ฌํ๋ค๋ฉด ์ด๋ ์บ์๊ฐ ์ต์ ๋ฐ์ดํฐ์ธ๊ฐ๋ฅผ ๋๊ณ ์ถฉ๋์ด ๋ฐ์ํ ์๋ฐ์ ์์ผ๋ฏ๋ก ์ด ๋์ ์ญํ ์ ๋ช ํํ ๋ถ๋ฆฌํ๊ณ ๋๊ธฐํํ๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์ข์์๋ฅผ ๋๋ฅด๊ฑฐ๋ ๋ฆฌ๋ทฐ๋ฅผ ์์ ํ๋ ๋ฑ์ ์ํ ๋ณ๊ฒฝ ์ก์ ์ ์ทจํ ๋ ์๋ฒ์ ์บ์์ ํด๋ผ์ด์ธํธ์ ์บ์๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ ๋ ค์ฃผ๋ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํด์ผ ์ด์ ๋ฐ์ดํฐ๊ฐ ๋ค์ ๋ํ๋๋ ๊ณ ์คํธ ๋ฐ์ดํฐ ๋ฒ๊ทธ๋ฅผ ๋ง์ ์ ์์ต๋๋ค. 2026๋ ์ค๋ฌด์์๋ Next.js์ ์๋ฒ ์ก์ ๊ณผ TanStack Query์ v5 ์ด์์ ๊ฒฐํฉํ์ฌ ์ด ๋๊ธฐํ๋ฅผ ์๋์ ๊ฐ์ด ์๋ฒฝํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.// 1. Server Action (actions/review.ts) 'use server'; import { revalidateTag } from 'next/cache'; export async function updateReviewAction(reviewId: string, content: string) { // ๋ง์ดํฌ๋ก์๋น์ค ๋ฐฑ์๋์ ๋ฆฌ๋ทฐ ์์ API๋ฅผ ํธ์ถํ์ฌ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. const res = await fetch(`http://api.internal/reviews/${reviewId}`, { method: 'PUT', body: JSON.stringify({ content }), }); if (!res.ok) throw new Error('๋ฆฌ๋ทฐ ์์ ์คํจ'); // Redis์ ์ ์ฅ๋ ํด๋น ๋ถ์ฐ ์บ์๋ฅผ ์ฆ์ ๋ฌดํจํํ์ฌ ๋ชจ๋ BFF ์ธ์คํด์ค๊ฐ ์ต์ ์ํ๋ฅผ ์๊ฒ ํฉ๋๋ค. revalidateTag(`review-${reviewId}`); return { success: true }; } // 2. Client Component (components/ReviewEditor.tsx) 'use client'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { updateReviewAction } from '@/actions/review'; export default function ReviewEditor({ reviewId }: { reviewId: string }) { const queryClient = useQueryClient(); const mutation = useMutation({ mutationFn: (content: string) => updateReviewAction(reviewId, content), onSuccess: () => { // ์๋ฒ ์ธก Redis ์บ์๊ฐ ๋ ์๊ฐ ์ฑ๊ณต ์๋ต์ ๋ฐ์ ์งํ, ํด๋ผ์ด์ธํธ์ ์บ์๋ ๋ ๋ ค์ค๋๋ค. // ์ด๋ฅผ ํตํด ์ฆ์ ๊ฐ์ฅ ์ต์ ์ ์๋ฒ ์ํ๋ฅผ ๋ค์ Fetching ํ์ฌ ์๋ฒฝํ ๋๊ธฐํ๋ฅผ ์ด๋ฃน๋๋ค. queryClient.invalidateQueries({ queryKey: ['review', reviewId] }); } }); return ( // ์ฌ์ฉ์ UI ๋ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฐ์ธ๋ฉ... mutation.mutate('์ ๋ฐ์ดํธ๋ ๋ฆฌ๋ทฐ ๋ด์ฉ')}>์ ์ฅ ); } ์ด ์ฝ๋๋ฅผ ํตํด ์๋ฒ ์ก์ ์์ ์๋ฒ ์บ์๋ฅผ ๋จผ์ ๋ฌดํจํํ๊ณ ์ฑ๊ณต ์๋ต ํ ํด๋ผ์ด์ธํธ์์ TanStack Query์ ์บ์๋ฅผ ๋ฌดํจํํ์ฌ ์์ฐจ์ ์ผ๋ก ๊ฐ์ฅ ์ต์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ฐ์์ค๊ฒ ๋ง๋๋ ๊ฒ์ด ์๋ฒฝํ ๋๊ธฐํ ํ์ดํ๋ผ์ธ์ ๋๋ค. ์ถ๊ฐ์ ์ผ๋ก ๋ค์ค ์ธ์คํด์ค BFF ํ๊ฒฝ์ ์ค์ ํด๋ผ์ฐ๋์ ๊ตฌ์ถํ์ค ๋ ๋ฐ์ํ ์ ์๋ ์ฅ์ ์ํฉ๋ค์ ๊ณ ๋ คํ์ฌ ์บ์ ์คํฌํผ๋ ํน์ ์ฌ๋๋ง ํ๋๋ผ๊ณ ๋ถ๋ฆฌ๋ ํ์์ ๋ฐฉ์งํ๋ ๊ฒ์ ๋ฐ๋์ ์ง๊ณ ๋์ด๊ฐ์ ์ผ ํฉ๋๋ค. ๋ฌด๊ฑฐ์ด ํต๊ณ ๋ฐ์ดํฐ ์บ์๊ฐ ๋ง๋ฃ๋ ์ฐฐ๋์ ์๊ฐ์ ๋๊ท๋ชจ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ฉด 3๋์ BFF ์ธ์คํด์ค๊ฐ ๋์์ ์บ์๊ฐ ์์์ ์ธ์งํ๊ณ ๋ฐฑ์๋๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ฌด์ํ ๋ ๋ ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ป์ด๋ฒ๋ฆด ์ ์์ผ๋ฏ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์บ์๋ฅผ ๊ฐฑ์ ํ๋ ํจํด์ ํ์ฉํ๊ณ Redis ๋ถ์ฐ ๋ฝ ๊ธฐ์ ์ ๋์ ํ์ฌ ์ฌ๋ฌ ์ธ์คํด์ค ์ค ๋จ ํ๋์ ์ธ์คํด์ค๋ง์ด ๊ฐฑ์ ์์ ์ ์ํํ๋๋ก ์ ์ดํด์ผ ํฉ๋๋ค. ๋ํ ์ธ์ ๊ณผ ์ธ์ฆ ์ํ์ ๋ฌด์ํ์ฑ์ ์ฒ ์ ํ ์ ์งํ์ฌ ์ ์ ๊ฐ 1๋ฒ ์๋ฒ์์ ๋ก๊ทธ์ธํ ํ ๋ก๋๋ฐธ๋ฐ์์ ์ํด 2๋ฒ ์๋ฒ๋ก ์ ์ํ์ ๋๋ ๋ก๊ทธ์ธ ์ํ๊ฐ ์ ์ง๋๋๋ก JWT ๊ธฐ๋ฐ์ ๋ฌด์ํ ์ธ์ฆ์ ๊ตฌํํ๊ฑฐ๋ ์ธ์ ์คํ ์ด ์์ฒด๋ฅผ ๋ณ๋์ Redis ํด๋ฌ์คํฐ๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํด์ผ ์ธ์ ๋จ์ ์ด์๋ฅผ ๋ง์ ์ ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ์๋ง์ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์ฝํ ํ๊ฒฝ์์๋ ์ ์ ๊ฐ ์๋ฌ๋ฅผ ๊ฒช์์ ๋ ์ด๋ ๊ตฌ๊ฐ์์ ํฐ์ง ๊ฒ์ธ์ง ๋จ์ ๋ก๊ทธ๋ก๋ ์ถ์ ์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ํด๋ผ์ด์ธํธ ์ต์ด ์์ฒญ ์ ๊ณ ์ ํ ํธ๋ ์ด์ค ID๋ฅผ ํค๋์ ๋ถ์ฌ์ ๋ณด๋ด๊ณ BFF๊ฐ ์ด๋ฅผ ๋ก๊ทธ์ ๋จ๊น๊ณผ ๋์์ ๋ฐฑ์๋ API๋ก ์ ๋ฌํ๋ ๋ถ์ฐ ํธ๋ ์ด์ฑ ๋ฆด๋ ์ด ์์คํ ์ ๊ตฌ์ถํด์ผ๋ง ๋ชจ๋ํฐ๋ง ๋๊ตฌ์์ ์ ์ฒด ์์ฒญ์ ํ๋ฆ๊ณผ ๋ณ๋ชฉ ๊ตฌ๊ฐ์ ์๊ฐ์ ์ผ๋ก ํ๋์ ํ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค.์ด๋ฌํ ์ํคํ ์ฒ์ ์ธ ๊ณ ๋ฏผ์ ๋์ฑ ๊น์ด ์๊ฒ ๋ฐ์ ์ํค๊ธฐ ์ํด ์์ผ๋ก ๋ช ๊ฐ์ง ์ปดํจํฐ ๊ณตํ์ ๊ทผ๋ณธ์ ์ธ ์ฃผ์ ๋ค์ ์ถ๊ฐ๋ก ๊ณต๋ถํด๋ณด์๋ ๊ฒ๋ ํฐ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์น ํ๋ ์์ํฌ์ ํ๋ คํ ๊ธฐ๋ฅ ์ด๋ฉด์ ์๋ ์ด์์ฒด์ ์์ค์ ์ค๋ ๋ ๊ด๋ฆฌ๋ ๋คํธ์ํฌ ํ๋กํ ์ฝ์ ๋ณธ์ง์ ํ๊ณ ๋ค๋ฉด ์์ผ๊ฐ ํ์ธต ๋์ด์ง๋๋ค. ์๋ฅผ ๋ค์ด ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ํต์ ์์ REST๋ฅผ ๋์ด์ gRPC์ ์๋ฆฌ๋, ๋ถ์ฐ ํ๊ฒฝ์์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ๋๊ธฐํ ๋ชจ๋ธ์ ํ์ตํ์๋ฉด ์ง๊ธ ์ง๋ฉดํ ๋ฌธ์ ๋ค์ ํจ์ฌ ๋ ๊ตฌ์กฐ์ ์ผ๋ก ํด๊ฒฐํ์ค ์ ์์ต๋๋ค. ๋์๊ฐ ์ต๊ทผ ๊ธ๋ถ์ํ๋ ์ธ๊ณต์ง๋ฅ๊ณผ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ์ ์ด๋ฌํ ์ธํ๋ผ์ ์ด๋ป๊ฒ ์ ๋ชฉํ ์ง ๊ณ ๋ฏผํด๋ณด์๋ ๊ฒ๋ ์ถ์ฒํด ๋๋ฆฝ๋๋ค. ๊ฐ๋ น ํ์ธํ๋๋ ๊ฒฝ๋ ๋ชจ๋ธ์ ํ์ฉํด BFF ๋ ์ด์ด์์ ๋ค์ด์ค๋ ํธ๋ํฝ์ ์๋๋ฅผ ์ง๋ฅ์ ์ผ๋ก ๋ผ์ฐํ ํ๊ฑฐ๋, ๋ชจ๋ธ ์์ธก์ ํตํด ์บ์ ๋ง๋ฃ ์์ ์ ๋์ ์ผ๋ก ์กฐ์ ํ๋ ๋ฑ ์ฐจ์ธ๋ ์์ง๋์ด๋ง์ ์์ฃผ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฅ์ฑ์ ํ๊ตฌํด๋ณด์ค ์ ์์ ๊ฒ์ ๋๋ค.icoon22๋ ์ด์ฒ๋ผ ์ต์ ํ๋ ์์ํฌ์ ํธ๋ฆฌํ ๋ง๋ฒ ๋ค์๋ ํํํ ์ปดํจํฐ ๊ณตํ์ ๊ธฐ์ด๊ฐ ์๋ฆฌ ์ก๊ณ ์์ต๋๋ค. ์ง๊ธ์ฒ๋ผ ๊ทผ๋ณธ์ ์ธ ๋์ ์๋ฆฌ์ ์ํคํ ์ฒ์ ํ๊ณ๋ฅผ ๋ฌป๊ณ ํ๊ตฌํ๋ ํ์ต ํ๋๋ฅผ ์ ์งํ์ ๋ค๋ฉด ์ด๋ค ๋ณต์กํ ๋๊ท๋ชจ ํ๊ฒฝ์์๋ ํ๋ค๋ฆฌ์ง ์๋ ๊ฒฌ๊ณ ํ ํ๋ก๋์ ์์คํ ์ ์ค๊ณํ์ค ์ ์์ ๊ฒ์ ๋๋ค. ํ์ดํ ์ ๋๋ค!
- Likes
- 0
- Comments
- 2
- Viewcount
- 51
Q&A
17๊ฐ zustand store ์๋ฒ์์ ์์ฑ
์๋ ํ์ธ์ byeong๋! ๋ง์ ๋ถ๋ค์ด "์ด์ฐจํผ ์๋ฒ์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ผ๋ฉด TanStack Query๋ง ์ฌ์ฉํ๋ฉด ๋์ง, ์ ๊ตณ์ด Zustand์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ฃผ์ ํ๋ ๋ฒ๊ฑฐ๋ก์ด ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ ๊น?"๋ผ๋ ์๋ฌธ์ ๊ฐ์ง์ญ๋๋ค. ํต์ฌ๋ถํฐ ๋ง์๋๋ฆฌ์๋ฉด, ์๋ฒ ๋ฐ์ดํฐ๋ฅผ '๋จ์ํ ๋ณด์ฌ์ฃผ๊ธฐ๋ง' ํ ๋๋ TanStack Query๊ฐ ์ ๋ต์ ๋๋ค. ํ์ง๋ง ์๋ฒ ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐ '์จ์(Seed)'์ผ๋ก ์ผ์ ํด๋ผ์ด์ธํธ์์ ๋ณต์กํ ์ํธ์์ฉ(์: ํผ ์ ๋ ฅ, ์์ ์ํ ์ ์ฅ ๋ฑ)์ ์ฒ๋ฆฌํด์ผ ํ ๋๋, ์ด ๋ฐ์ดํฐ๋ฅผ Zustand๋ก ๋๊ฒจ๋ฐ์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ํจ์ฌ ์ ๋ฆฌํ๊ณ ์์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ํ์ ์ฑ๊ฒฉ์ด '์๋ฒ์ ์ค๋ ์ท'์์ '์ฌ์ฉ์์ ์ํธ์์ฉ'์ผ๋ก ๋์ด๊ฐ๋ ๊ฒฝ๊ณ์ ์ธ ์ ์ด์ฃ .์ด๋ฅผ ์ค์ ์ฝ๋๋ก ๊ตฌํํ ๋ ๊ฐ์ฅ ๋จผ์ ์ฃผ์ํด์ผ ํ ์ ์ Next.js App Router ํ๊ฒฝ์์์ Zustand ์คํ ์ด ์ค์ฝํ(Scope)์ ๋๋ค. React ๋ ๋๋ง์ด ์ผ์ด๋๋ ์๋ฒ ํ๊ฒฝ(Node.js)์ ์ฌ๋ฌ ์์ฒญ์ด ๋์ผํ ์๋ฒ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ์ ์ธ ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์ฒ๋ผ ์ปดํฌ๋ํธ ์ธ๋ถ์ ์ ์ญ ์คํ ์ด ๋ณ์๋ฅผ ์ ์ธํ๊ฒ ๋๋ฉด, 'A ์ ์ ์ ์ด๊ธฐ๊ฐ์ด B ์ ์ ์ ํ๋ฉด์ ๋ ธ์ถ๋๋' ์น๋ช ์ ์ธ ๋ณด์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํฉ๋๋ค.์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๋ฐ๋์ Context API๋ฅผ ํ์ฉํ์ฌ ๋ ๋๋ง ์ฌ์ดํด(ํน์ ์ฌ์ฉ์ ์์ฒญ)๋ง๋ค ๋ ๋ฆฝ์ ์ธ ์คํ ์ด ์ธ์คํด์ค๋ฅผ ์๋ก ์์ฑํด์ผ ํฉ๋๋ค. ์๋์ ๊ฐ์ด ๋ฐ๋๋ผ Zustand ์คํ ์ด๋ฅผ ์์ฑํ๋ ํฉํ ๋ฆฌ ํจ์์, ์ด๋ฅผ ํ์ ์ปดํฌ๋ํธ์ ๊ณต๊ธํ๋ Provider ํจํด์ ์์ฑํ๋ ๊ฒ์ด ๊ทธ ํ์ค์ ์ธ ํด๊ฒฐ์ฑ ์ ๋๋ค.import { createStore } from 'zustand'; import { createContext, useRef, useContext, ReactNode } from 'react'; import { useStore } from 'zustand'; // 1. ์ํ ํ์ ๋ฐ ์คํ ์ด ์์ฑ ํฉํ ๋ฆฌ ํจ์ ์ ์ (์ ์ญ ์คํ ์ด๊ฐ ์๋์ ์ฃผ์ํฉ๋๋ค) interface ProfileState { name: string; setName: (name: string) => void; } export const createProfileStore = (initialName: string) => { return createStore()((set) => ({ name: initialName, setName: (name) => set({ name }), })); }; export type ProfileStore = ReturnType; // 2. React Context ๋ฐ Provider ์์ฑ export const ProfileContext = createContext(null); export function ProfileProvider({ children, initialName }: { children: ReactNode, initialName: string }) { const storeRef = useRef(null); if (!storeRef.current) { // ์ต์ด ๋ ๋๋ง ์์๋ง ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์ด๊ธฐ๊ฐ์ ์ฃผ์ ํ์ฌ ์คํ ์ด ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. storeRef.current = createProfileStore(initialName); } return ( {children} ); } // 3. ์ปดํฌ๋ํธ์์ ์คํ ์ด๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ์ปค์คํ ํ export function useProfileContext(selector: (state: ProfileState) => T): T { const store = useContext(ProfileContext); if (!store) throw new Error('ProfileProvider๊ฐ ํ์ํฉ๋๋ค.'); return useStore(store, selector); } ์ด๋ ๊ฒ ์์ ํ ์คํ ์ด ๊ณต๊ธ๋ง์ ๊ตฌ์ถํ๋ค๋ฉด, ์ด์ ๋ณต์กํ ๋ค์ค ์คํ ํผ ์๋๋ฆฌ์ค๋ฅผ ์๋ฒ ์ปดํฌ๋ํธ์์ ์์ ํ๊ฒ ์์ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํ๋กํ ์์ ํ์ด์ง์ ์ง์ ํ๋ฉด, ์๋ฒ ์ปดํฌ๋ํธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ธ๋ถ API๋ฅผ ํตํด ์ ์ ์ ๊ธฐ์กด ํ๋กํ ์ ๋ณด๋ฅผ ํ์น(Fetch)ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ฐ์ดํฐ๋ฅผ ์์ ๋ง๋ Provider์ initialName์ผ๋ก ๋ฐ์ด ๋ฃ์ด, ํด๋ผ์ด์ธํธ ์ํ์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ค์ ํ๋ ์ญํ ์ ์ํํฉ๋๋ค.import { ProfileProvider } from '@/components/ProfileProvider'; import ProfileForm from '@/components/ProfileForm'; export default async function ProfilePage() { // ์๋ฒ์์ ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ Fetching ํฉ๋๋ค. // ์ด ๋จ๊ณ์์๋ TanStack Query์ prefetchQuery์ Hydration Boundary๋ฅผ ์กฐํฉํ์ฌ ์บ์๋ฅผ ์ฑ์ธ ์๋ ์์ต๋๋ค. const response = await fetch('https://api.example.com/user/profile'); const initialData = await response.json(); return ( // ์๋ฒ์์ ๊ฐ์ ธ์จ ์ด๊ธฐ๊ฐ์ Provider์ ์ฃผ์ ํ์ฌ ํด๋ผ์ด์ธํธ ์ํ์ '์จ์'์ผ๋ก ์ผ์ต๋๋ค. ); } ๋ง์ง๋ง์ผ๋ก ํด๋ผ์ด์ธํธ, ์ฆ Zustand์ ์ญํ ์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅ์นธ์ ์ฑ์ฐ๊ณ ์ง์ฐ๋ ๋ชจ๋ ๊ณผ์ ์ API ํต์ ์์ด ์ฒ ์ ํ ๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ด์์๋ง ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋๋ค.์ฌ์ฉ์๊ฐ ํ์ดํ์ ํ ๋๋ง๋ค TanStack Query์ ์บ์๋ฅผ ์ต์ง๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ์ '์๋ฒ ์ํ ๋๊ธฐํ'๋ผ๋ ๋ณธ๋ ๋ชฉ์ ๊ณผ ๋ง์ง ์์ผ๋ฉฐ, ๋ถํ์ํ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์๋ ์ฝ๋์ฒ๋ผ Zustand๋ฅผ ํตํด ์ฆ๊ฐ์ ์ธ UI ๋ฐ์์ฑ์ ํ๋ณดํ๊ณ , ๋ชจ๋ ์์ ์ด ๋๋ ํ ์ฌ์ฉ์๊ฐ '์ต์ข ์ ์ฅ' ๋ฒํผ์ ๋๋ฅผ ๋ TanStack Query์ Mutation์ ํตํด ํ ๋ฒ์ ์๋ฒ๋ก ์ ์กํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.'use client'; import { useProfileContext } from '@/components/ProfileProvider'; import { useMutation } from '@tanstack/react-query'; export default function ProfileForm() { // ์๋ฒ์์ ๋๊ธฐํ๋ ๋์ด์ง๊ณ , ์ค์ง ํด๋ผ์ด์ธํธ ๋ฉ๋ชจ๋ฆฌ์์๋ง ์ํ๋ฅผ ์กฐ์ํฉ๋๋ค. const name = useProfileContext(state => state.name); const setName = useProfileContext(state => state.setName); // ์ฌ์ฉ์์ ์ํธ์์ฉ์ด ๋ชจ๋ ๋๋ ํ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ๋ง ์๋ฒ์ ๋๊ธฐํํ๊ธฐ ์ํ Mutation์ ๋๋ค. const updateProfileMutation = useMutation({ mutationFn: (newName: string) => fetch('/api/user/profile', { method: 'POST', body: JSON.stringify({ name: newName }) }) }); return ( { e.preventDefault(); updateProfileMutation.mutate(name); // ํผ์ด ์ ์ถ๋ ๋ ๋น๋ก์ ์๋ฒ์ ๋ค์ ์ํตํฉ๋๋ค. }}> setName(e.target.value)} placeholder="์ด๋ฆ์ ์ ๋ ฅํ์ธ์" /> ์ต์ข ์ ์ฅ ); } ์ด์ฒ๋ผ ์ํ ํํฐ๋ง์ ๊ฐ๊ฒฉ ์ฌ๋ผ์ด๋๋ ์ด๋ฏธ์ง ํฌ๋กญ ํด์ ์บ๋ฒ์ค ์ํ์ฒ๋ผ, ์ด๋น ์์ญ ๋ฒ์ฉ ๋ฐ๋๋ ์์ UI ์ํ๋ Zustand๊ฐ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋๋ก ๋งก๊ฒจ์ผ ํฉ๋๋ค. ํ์ ์์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ค๊ณํ ๋ "์ด ์ํ์ ์ฃผ์ธ์ด ๋๊ตฌ์ธ๊ฐ?"๋ฅผ ์ค์ค๋ก์๊ฒ ์ง๋ฌธํด ๋ณด์ธ์. ๋ด ํ๋ฉด์์ ๋ด๊ฐ ์กฐ์ํ๊ธฐ ์ํ ์์ ์ํ๋ผ๋ฉด, ์ด๊ธฐ ๋ฐ์ดํฐ๋ง ์๋ฒ์์ ๋ฐ๊ณ ํด๋ผ์ด์ธํธ๋ก ๊ทธ ํต์ ๊ถ์ ์์ ํ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋ง์ต๋๋ค.๋ํ, ๋จ์ผ ์ง์ค ๊ณต๊ธ์(Single Source of Truth)์ ํผ์ํ์ง ์๊ธฐ ์ํด Zustand์ ์๋ฒ ์ํ๋ฅผ ๊ณ์ ๋ณต์ฌํ์ฌ ๋ณ๋ ฌ๋ก ์ ์งํ๋ ค๋ ์ํฐ ํจํด(Anti-pattern)์ ํผํด์ผ ํฉ๋๋ค. ์ด๊ธฐ ๋ ๋๋ง ์์ ์ ๋ฑ ํ ๋ฒ๋ง ์ฃผ์ ํ ํ, ํด๋น ๋ฐ์ดํฐ์ ์์ฌ๊ฒฐ์ ๊ถ์ ์์ ํ Zustand๊ฐ ๊ฐ์ง๋๋ก ๋ ๋ฆฝ์ํค๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค.byeong๋, ์ด ๋ต๋ณ์ ํฌํจ๋ ์ํคํ ์ฒ ํจํด์ด ์ค๋ฌด์ ๊ทธ๋ฆผ์ ๋ช ํํ ๊ทธ๋ฆฌ์๋ ๋ฐ ๋์์ด ๋์ จ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ํ ๊ด๋ฆฌ์ ๊ฒฝ๊ณ๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ๋ ์ด ๊ฐ๊ฐ์ ์์ผ๋ก ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฌ๊ณ ํ๊ฒ ์ค๊ณํ์ค ๋ ์์ฃผ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ๊ฐ ๋ ๊ฒ์ ๋๋ค!์ฐธ๊ณ ํด์ฃผ์ธ์!
- Likes
- 1
- Comments
- 1
- Viewcount
- 32
Q&A
๋ฌธ์๊ด๋ จ ๋ฌธ์
์๋ ํ์ธ์, ๋ณดํค๋ฏธ์๋.๋จผ์ ๊ฐ์ ์ด์ฉ์ ๋ถํธ์ ๋๋ ค ๋๋จํ ์ฃ์กํฉ๋๋ค.๋ฌธ์ํด์ฃผ์ 80๊ฐ์ ํ ์คํธ ํํธ๋ ์๊ฐ์๋ถ๋ค์ ๊ฐ๋ณ ์คํ ํ๊ฒฝ์ด๋ ์ํํธ์จ์ด ๋ฒ์ ์ ๋ฐ๋ผ ์ค๋ฅ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ์ง์ ์ด์์ต๋๋ค. ์ด๋ก ์ธํด ํ์ต์ ํ๋ฆ์ด ๋๊ธฐ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ณ ์ ๋ถ๋์ดํ๊ฒ ์ค์ต ํํธ๋ฅผ ์ ์ธํ๋ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ฒ ๋์์ต๋๋ค.์ ๋ํ ํด๋น ๋ถ๋ถ์ด ์ฆ์ ์์ ๋ฐ ์ ๋ฐ์ดํธ๋ ๊ฒ์ผ๋ก ํ์ ํ๊ณ ์์์ผ๋, ์์คํ ์ ๋ฐ์์ด ๋๋ฝ๋์๊ฑฐ๋ ์ง์ฐ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๋ค์ ํ๋ฒ ๊ผผ๊ผผํ๊ฒ ์ฑ๊ธฐ์ง ๋ชปํด ํผ์ ์ ๋๋ฆฐ ์ ์ฌ๊ณผ๋๋ฆฝ๋๋ค.์์คํ ์๊ฐ ๋ด์ด ๋ค์ ํ๋ฒ ๋ฌธ์ ๋ฅผ ์ง์ด์ฃผ์ ์ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ, ์ง์ ํด ์ฃผ์ ๋ถ๋ถ์ ์ง๊ธ ์ฆ์ ํ์ธํ์ฌ ์ค๋ณต ๋ด์ฉ์ ์ ๊ฑฐํ๊ณ ์ฌ๋ฐ๋ฅธ ๋ด์ฉ์ผ๋ก ์์ ์กฐ์นํ๊ฒ ์ต๋๋ค.์ํํ ํ์ต์ ์ํด ์ต์ ์ ๋คํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
- Likes
- 0
- Comments
- 2
- Viewcount
- 38
Q&A
๋ ๋๋ง ์ฐจ๋จ ๋ฆฌ์์ค javascript ์คํ์ ๊ด๋ จํด์ ์ง๋ฌธ ์์ต๋๋ค.
์๋ ํ์ธ์ eddie๋! ์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ง๋ฌธํด์ฃผ์ ๋ฐ๋ ํ๊ทธ ์ตํ๋จ์ ์คํฌ๋ฆฝํธ๊ฐ ์์นํ๊ณ ๊ทธ ๋ด๋ถ์์ DOM์ ๋๋น, ๋์ด, ๋ฐฐ๊ฒฝ์์ ๋ณ๊ฒฝํ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง์ ๋ํด ์์ธํ ์์ ์ฝ๋์ ํจ๊ป ํ์คํ๊ฒ ์ง์ด๋๋ฆฌ๊ฒ ์ต๋๋ค.์ฐ์ ๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ์๋ฉด, eddie๋์ด ์ด ์์ ์ ๋ค์ผ์๊ธฐ ์ ์ ์๊ฐํ์ จ๋ ๊ฒ์ฒ๋ผ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ ๊ณผ์ ์ด ๋ฐ์ํ๋ ๊ฒ์ด ๋ง์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์ ํ์๋ HTML ๋ฌธ์๋ฅผ ์์์ ์๋๋ก ์์ฐจ์ ์ผ๋ก ์ฝ์ด ๋ด๋ ค๊ฐ๋ฉฐ DOM ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํฉ๋๋ค.ํ์๊ฐ ๋ฐ๋ ํ๊ทธ ๊ฐ์ฅ ๋์ ๋๋ฌํ์ฌ ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ๋ง๋๋ฉด, eddie๋์ด ์ดํดํ์ ๋๋ก ๋จ์ HTML ๋ฌธ์์ ํ์ฑ์ ์ ์ ๋ฉ์ถ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด๋ก๋ ๋ฐ ์คํํ๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ์ค์ํ ํฌ์ธํธ๋ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ๊ทธ ์์ ์๋ ์ด๋ฏธ ์คํฌ๋ฆฝํธ ํ๊ทธ ์์ ์์ฑ๋ HTML ์์๋ค์ด ํ์ฑ๋์ด DOM ํธ๋ฆฌ์ ์ถ๊ฐ๋์ด ์๋ค๋ ์ฌ์ค์ ๋๋ค.๋ธ๋ผ์ฐ์ ๋ ์ด๊ธฐ DOM๊ณผ CSSOM์ ๊ฒฐํฉํด ๋ ๋ ํธ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ํ๋ฉด์ ๊ทธ๋ฆด ์ค๋น๋ฅผ ํ๋๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊ฐ์ ํ์ฌ ์ด๋ฏธ ๋ง๋ค์ด์ง DOM ๋ ธ๋์ ์คํ์ผ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ํน์ ๋จ๊ณ๋ฅผ ๋ค์ ์คํํด์ผ๋ง ํฉ๋๋ค. ๊ตฌ์ฒด์ ์ธ ๋์ ์๋ฆฌ๋ฅผ ์๋์ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ ๋๋ง ํ ์คํธ #box { width: 100px; height: 100px; background-color: blue; } ํ ์คํธ ๋ฐ์ค // ํ์๊ฐ ์ฌ๊ธฐ๊น์ง ๋๋ฌํ๋ฉด ํ์ฑ์ ๋ฉ์ถ๊ณ ์๋ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. const boxElement = document.getElementById('box'); // DOM์ ์ ๊ทผํ์ฌ ์์์ ๊ธฐํํ์ ์์ฑ(width, height)์ ๋ณ๊ฒฝํฉ๋๋ค. boxElement.style.width = '200px'; boxElement.style.height = '200px'; // ์์์ ์๊ฐ์ ์์ฑ(background)์ ๋ณ๊ฒฝํฉ๋๋ค. boxElement.style.backgroundColor = 'red'; ์ ์ฝ๋๋ฅผ ์ดํด๋ณด์๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ์์์๋ถํฐ ๋ฌธ์๋ฅผ ์ฝ์ด ๋ด๋ ค์ค๋ฉฐ ์์ด๋๊ฐ box์ธ div ์์๋ฅผ ๋จผ์ DOM ํธ๋ฆฌ์ ๋ฑ๋กํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ฉด์ ํด๋น ์์์ ์์ฑ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋๋น์ ๋์ด ๊ฐ์ ์์์ ๊ธฐํํ์ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ฒฐ์ ํ๋ ์์ฑ์ ๋๋ค.์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด ๊ฐ์ ๋ณ๊ฒฝํ๋ ์๊ฐ, ๋ธ๋ผ์ฐ์ ๋ ์ด ์์๋ฟ๋ง ์๋๋ผ ์ํฅ์ ๋ฐ๋ ์ฃผ๋ณ ์์๋ค์ ์์น์ ํฌ๊ธฐ๋ฅผ ๋ค์ ๊ณ์ฐํด์ผ ํ๋ฉฐ, ์ด ๊ณผ์ ์ด ๋ฐ๋ก ๋ ์ด์์ ๋จ๊ณ์ ์ฌ์คํ, ์ฆ ๋ฆฌํ๋ก์ฐ์ ๋๋ค. ํฌ๊ธฐ์ ์์น ๊ณ์ฐ์ด ๋๋๋ฉด ํ๋ฉด์ ์๋ก์ด ์์์ธ ๋นจ๊ฐ์์ ์ ํ์ผ ํ๋๋ฐ, ๋ฐฐ๊ฒฝ์๊ณผ ๊ฐ์ด ์์์ ๊ธฐํํ์ ๊ตฌ์กฐ์๋ ์ํฅ์ ์ฃผ์ง ์๊ณ ์๊ฐ์ ์ธ ํํ๋ง ๋ฐ๊พธ๋ ์์ฑ์ด ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก ํ์ธํธ ๋จ๊ณ๊ฐ ๋ค์ ์คํ๋๋ ๋ฆฌํ์ธํธ๊ฐ ์ฐ์ด์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.์ฆ, ์คํฌ๋ฆฝํธ๊ฐ HTML ํ์ฑ์ ์ ์ ๋ฉ์ถ๋ ๊ฒ์ ๋ง์ง๋ง, ์ด๋ฏธ ์์ฑ๋ DOM ๊ฐ์ฒด๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์กฐ์ํ๋ ํ์ ์์ฒด๋ ๋ ๋๋ง ์์ง์๊ฒ ๋ ๋ ํธ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ํ๋ฉด์ ๋ค์ ๊ทธ๋ฆฌ๋ผ๋ ๋ช ๋ น์ ๋ด๋ฆฌ๋ ๊ฒ๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ฅผ ํผํ ์ ์๋ ๊ฒ์ ๋๋ค.์ดํด๋ฅผ ์ํด ๋ค์ ํ ๋ฒ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ํต์ฌ ์ฉ์ด ํ๋ํ๋๋ฅผ ์์๋๋ก ์ง์ด๋๋ฆฌ์๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํ ์ ์์ต๋๋ค. ๋จผ์ ํ์ฑ์ ๋ธ๋ผ์ฐ์ ๊ฐ HTML์ด๋ CSS ์ฝ๋๋ฅผ ์ฝ๊ณ ์ดํดํ ์ ์๋ ๊ตฌ์กฐ๋ก ๋ณํํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค. ์ด ๊ณผ์ ์ ํตํด HTML ๋ฌธ์์ ๊ฐ ์์๋ค์ ํธ๋ฆฌ ํํ๋ก ๊ตฌ์ฑํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ ๊ทผํ๊ณ ์กฐ์ํ ์ ์๋๋ก ๋ง๋ ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ์ด ๋ฐ๋ก DOM์ด๋ฉฐ, CSS ์คํ์ผ ์ ๋ณด๋ค์ ๋ชจ์ ํธ๋ฆฌ ํํ๋ก ๊ตฌ์ฑํ ๊ฒ์ด CSSOM์ ๋๋ค.๋ธ๋ผ์ฐ์ ๋ ์ด DOM๊ณผ CSSOM์ ๊ฒฐํฉํ์ฌ ํ๋ฉด์ ์ค์ ๋ก ๊ทธ๋ ค์ง ์์๋ค๋ง ๋ชจ์ ๋ ๋ ํธ๋ฆฌ๋ผ๋ ์ต์ข ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๊ฒ ๋ฉ๋๋ค. ๋ ๋ ํธ๋ฆฌ๊ฐ ์์ฑ๋๋ฉด ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ์์๊ฐ ํ๋ฉด์ ์ด๋ ์์น์ ์ด๋ ์ ๋์ ํฌ๊ธฐ๋ก ๋ฐฐ์น๋ ์ง ๊ธฐํํ์ ์ธ ํํ๋ฅผ ๊ณ์ฐํ๊ฒ ๋๋๋ฐ, ์ด๋ฅผ ๋ ์ด์์ ๋๋ ๋ฆฌํ๋ก์ฐ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.ํฌ๊ธฐ์ ์์น ๊ณ์ฐ์ด ๋๋ ํ์๋ ์ค์ ํฝ์ ์ ์ฑ์ ๋ฃ์ด ์์์ด๋ ์ด๋ฏธ์ง ๊ฐ์ ์๊ฐ์ ์ธ ๋ถ๋ถ๋ค์ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ฒ ๋๋ฉฐ, ์ด ๋จ๊ณ๋ฅผ ํ์ธํธ ๋๋ ๋ฆฌํ์ธํธ๋ผ๊ณ ํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ํ์ธํธ ๋จ๊ณ์์ ๊ทธ๋ ค์ง ์ฌ๋ฌ ๋ ์ด์ด๋ค์ ํ๋๋ก ํฉ์ฑํ์ฌ ์ต์ข ์ ์ผ๋ก ํ๋ฉด์ ํ์ํ๋ ๋จ๊ณ๋ฅผ ์ปดํฌ์งํ ์ด๋ผ๊ณ ํฉ๋๋ค.์ด๋ฌํ ๋ ๋๋ง ๊ณผ์ ์ ์ง์ ๋์ผ๋ก ํ์ธํ๊ณ ์ค์ตํด ๋ณด์๋ ค๋ฉด, ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด๊ณ ์ฑ๋ฅ ํญ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด ๋ณด์๋ ๊ฒ์ ์ถ์ฒํด ๋๋ฆฝ๋๋ค. ์ฑ๋ฅ ํญ์์ ์๋ก๊ณ ์นจ ๋ฒํผ ๋ชจ์์ธ ๊ธฐ๋ก ์์ด์ฝ์ ๋๋ฅด๊ณ ํ์ด์ง๊ฐ ๋ก๋๋๋ ๊ณผ์ ์ ์บก์ฒํด ๋ณด์๋ฉด, ํ๋จ ์ด๋ฒคํธ ๋ก๊ทธ๋ ๋ฉ์ธ ์ค๋ ๋ ์์ ๋ด์ญ์์ ์คํ์ผ ์ฌ๊ณ์ฐ, ๋ฆฌํ๋ก์ฐ, ๋ฆฌํ์ธํธ ์ด๋ฒคํธ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ์งํ์ ์ฐ๋ฌ์ ๋ฐ์ํ๋ ๊ฒ์ ๋ช ํํ๊ฒ ํ์ธํ์ค ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ง์ ์ ๋์ ์ถ๊ฐํ์ ๋์ ์ฑ๋ฅ ๊ธฐ๋ก์ ๋น๊ตํ๋ฉด์ ์ถ์ ํด ๋ณด์๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ฏธ์น๋ ์ํฅ์ ํจ์ฌ ๋ ๊น๊ณ ํ์คํ๊ฒ ์ฒด๋ํ์ค ์ ์์ ๊ฒ์ ๋๋ค.์ฌ๊ธฐ์ ๋ง๋ถ์ฌ, ํ์ ์ค๋ฌด์์ ๋ ๋๋ง ์ฑ๋ฅ์ ๋์ด์ฌ๋ฆฌ๊ธฐ ์ํด ์ด๋ฌํ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ฅผ ์ต์ํํ๋ ๋ช ๊ฐ์ง ์ ์ฉํ ์ต์ ํ ๋ ธํ์ฐ๋ฅผ ๊ฐ์ด๋๋ก ๋๋์ด ๋๋ฆฌ๊ฒ ์ต๋๋ค.์ฒซ ๋ฒ์งธ๋ก ๋ ์กฐ์์ ํ ๋ฒ์ ๋ชจ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์์ ์คํ์ผ์ ์ฌ๋ฌ ๋ฒ ๋๋์ด ๋ณ๊ฒฝํ๋ฉด ๊ทธ ํ์๋งํผ ๋ฆฌํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ๊ฐ๊ธ์ ๋ณ๊ฒฝํ ์คํ์ผ๋ค์ CSS ํด๋์ค๋ก ๋ฏธ๋ฆฌ ์ ์ํด๋๊ณ ํด๋์ค๋ช ํ๋๋ฅผ ์กฐ์ํ์ฌ ์คํ์ผ์ ํ ๋ฒ์ ์ผ๊ด ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ํจ์ฌ ์ ๋ฆฌํฉ๋๋ค.๋ ๋ฒ์งธ๋ก ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ ๋๋ ํธ๋์คํผ๊ณผ ์คํผ์ํฐ ์์ฑ์ ํ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค. ์์์ ํฌ๊ธฐ๋ ์์น๋ฅผ ์ง์ ์กฐ์ํ๋ฉด ๋งค ํ๋ ์๋ง๋ค ๋ฆฌํ๋ก์ฐ๊ฐ ๋ฐ์ํ์ฌ ํ๋ฉด์ด ๋๋ ๋๊ธฐ๋ ํ์์ด ๋ฐ์ํ ์ ์์ง๋ง, ํด๋น ์์ฑ๋ค์ ์ฌ์ฉํ๋ฉด ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ฅผ ๊ฑด๋๋ฐ๊ณ ๋ฐ๋ก ํฉ์ฑ ๋จ๊ณ๋ง ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ๊ทธ๋ํฝ ์นด๋์ ๋์์ ๋ฐ์ ํจ์ฌ ๋ถ๋๋ฌ์ด ๋ ๋๋ง์ด ๊ฐ๋ฅํด์ง๋๋ค.์ธ ๋ฒ์งธ๋ก ๋ณด์ด์ง ์๋ ์ํ์์ ๋์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ํน์ ์ปจํ ์ด๋ ์์ ์์ฃผ ๋ง์ ๋ ์กฐ์์ด ํ์ํ๋ค๋ฉด ๋จผ์ ํด๋น ์์๋ฅผ ํ๋ฉด์์ ์จ๊ฒจ ๋ฆฌํ๋ก์ฐ๋ฅผ ํ ๋ฒ๋ง ๋ฐ์์ํจ ํ, ๊ทธ ์ํ์์ ํ์ํ ๋ชจ๋ ์กฐ์์ ๋ง์น๊ณ ๋ค์ ํ๋ฉด์ ๋ณด์ด๊ฒ ํ์ฌ ์ค๊ฐ ๊ณผ์ ์์์ ๋ถํ์ํ ๋ ๋๋ง์ ๋ง์ ์ ์์ต๋๋ค. ๋ํ ๊ฐ์์ ๋ ๊ณต๊ฐ์ธ ๋ํ๋จผํธ ํ๋๊ทธ๋จผํธ๋ฅผ ํ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ์์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ์์ฑํ ํ ์ค์ ๋์ ๋จ ํ ๋ฒ๋ง ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๋ ์ค๋ฌด์์ ๋งค์ฐ ์์ฃผ ์ฐ์ด๋ ํจํด์ด๋ ๊ผญ ์ฐธ๊ณ ํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.์ด๋ ๊ฒ ์ข์ ์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. eddie๋์ฒ๋ผ ์๋ฆฌ๋ฅผ ํ๊ณ ๋๋ ์ด์ ์ ์ธ ์๊ฐ์๋ถ๋ค์ด ๋จ๊ฒจ์ฃผ์๋ ์๋ฆฌํ ์ง๋ฌธ๋ค์ ์ ๊ฐ ์์ผ๋ก ๋ ๊น์ด ์๋ ๊ฐ์๋ฅผ ์ ์ํ๊ณ ์ปค๋ฆฌํ๋ผ์ ๋ฐ์ ์ํค๋ ๋ฐ ์ ๋ง ํฐ ๋์์ด ๋ฉ๋๋ค. ๊ฐ์ฌ์ ๋ง์์ ๋ด์, ์ ํฌ ์ฐ๋ฆฌ ๋๋ค ์ฝ๋ฉ ์คํ๋์ค์์ ์ ๊ณตํ๋ ๊ฐ์ ์ค ์ถ๊ฐ๋ก ํ์ํ๊ฑฐ๋ ์๊ฐํ๊ณ ์ถ์ผ์ ๊ฐ์๊ฐ ์๋ค๋ฉดjeony0535@naver.com์ผ๋ก ์ธ์ ๋ ์ง ํธํ๊ฒ ์ฐ๋ฝํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ํ์ธ ํ ์ํ์๋ ๊ฐ์์ ์๊ฐ ์ฟ ํฐ์ ๊ธฐ์ ๋ง์์ผ๋ก ์ ๋ฌํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์์ผ๋ก๋ ํ์ตํ์๋ฉด์ ๊ถ๊ธํ ์ ์ด ์๊ธฐ์๋ฉด ์ธ์ ๋ ํธํ๊ฒ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ธ์. eddie๋์ ํ๋ก ํธ์๋ ํ์ต์ ํญ์ ์ง์ฌ์ผ๋ก ์์ํฉ๋๋ค!๊ฐ์ฌํฉ๋๋ค!
- Likes
- 0
- Comments
- 2
- Viewcount
- 46
Q&A
๋ ๋๋ง ์ฐจ๋จ ๋ฆฌ์์ค ๊ด๋ จํด์ CSS ์ง๋ฌธ์ด ์์ต๋๋ค.
์๋ ํ์ธ์ eddie๋! ์์ ๋ด์ฉ ์ค ํ๋ก ํธ์๋ ์ฑ๋ฅ ์ต์ ํ์ ํต์ฌ์ธ ๋ ๋๋ง ์ฐจ๋จ ๋ฆฌ์์ค์ ๋ํด ๊น์ด ๊ณ ๋ฏผํ์๊ณ ์ง๋ฌธ์ ๋จ๊ฒจ์ฃผ์ ์ ์ ๋ง ๋ฐ๊ฐ์ต๋๋ค. ๋ง์ฐํ๋ ๊ฐ๋ ์ ํ์คํ ์ก์๊ฐ๊ณ ๊ณ์ ๊ฒ ๊ฐ์ ํ๋ฅญํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์๋ฆฌ์ ํจ๊ป ์ง๋ฌธํด์ฃผ์ 3๊ฐ์ง ์ต์ ํ ๊ธฐ๋ฒ์ธ media ์์ฑ, loadCSS, ๋์ ๋ถ๋ฆฌ์ ๋ํด ์์ธํ ์์ ์ฝ๋์ ํจ๊ป ํ๋์ฉ ํ์คํ๊ฒ ์ง์ด๋๋ฆฌ๊ฒ ์ต๋๋ค.๋จผ์ CSS๊ฐ ์ ๋ ๋๋ง์ ์ฐจ๋จํ๋์ง ๊ทธ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ HTML์ ์ฝ๋ค๊ฐ ์ธ๋ถ ์คํ์ผ์ํธ๋ฅผ ๋ถ๋ฌ์ค๋ link ํ๊ทธ๋ฅผ ๋ง๋๋ฉด, ์ด CSS๋ฅผ ๋ชจ๋ ๋ค์ด๋ก๋ํ๊ณ ํด์ํ์ฌ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ ๊น์ง๋ ํ๋ฉด์ ์๋ฌด๊ฒ๋ ๊ทธ๋ฆฌ์ง ๋ง์์ผ๊ฒ ๋ค๊ณ ํ๋จํฉ๋๋ค. ์ด๋ ์คํ์ผ์ด ์ ์ฉ๋์ง ์์ ๋ ๊ฒ์ HTML์ด ์ ๊น ๋ณด์๋ค๊ฐ ์คํ์ผ์ด ์ ํ์ง๋ ํ์์ ๋ง๊ธฐ ์ํด์์ ๋๋ค. ํ์ง๋ง ๋น์ฅ ์ฒซ ํ๋ฉด์ ํ์ ์๋ CSS๊น์ง ๋ค์ด๋ก๋ํ๋๋ผ ๋น ํ์ ํ๋ฉด๋ง ์ค๋ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ์ฑ๋ฅ์ ์น๋ช ์ ์ด๋ฏ๋ก, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ง๋ฌธํด์ฃผ์ ๊ธฐ๋ฒ๋ค์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.์ฒซ ๋ฒ์งธ๋ก media ์์ฑ์ ํตํ ๋ ๋๋ง ์ฐจ๋จ ๋ฐฉ์ง ๊ธฐ๋ฒ์ ๋ํด ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. eddie๋์ด ์ง๋ฌธํ์ media ์์ฑ์ด CSS ํ์ผ ๋ด๋ถ์์ ์ฐ๋ media query๋ฅผ ๋ง์ํ์ ๊ฒ์ด ๋ง๋์ง์ ๋ํ ๋๋ต์, ๊ฐ๋ ์ ๊ฐ์ง๋ง ์ ์ฉ ์์น๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ๋๋ค. ํ์ผ ๋ด๋ถ์ ๊ตฌ๋ฌธ์ด ์๋๋ผ HTML์ link ํ๊ทธ ์์ฒด์ media ์์ฑ์ ๋ถ์ฌํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ด ์์ฑ๊ฐ์ ๋ณด๊ณ ํด๋น CSS๊ฐ ์ง๊ธ ๋น์ฅ ๋ ๋๋งํ๋ ๋ฐ ํ์ํ์ง๋ฅผ ํ๋จํ๊ฒ ๋๋๋ฐ, ์๋์ ์ค๋ฌด์ ์ธ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ฝ๋์์ ๋ณด์๋ ๊ฒ์ฒ๋ผ, link ํ๊ทธ์ ๋จ์ํ href๋ก ๋ชจ๋ ์คํ์ผ์ ์ฐ๊ฒฐํด๋๋ฉด ๋ฌด์กฐ๊ฑด ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋ ๋๊น์ง ๋ ๋๋ง์ด ๋ฉ์ถ๋ ์ฐจ๋จ ํ์์ด ๋ฐ์ํฉ๋๋ค. ํ์ง๋ง ํ์ผ ๊ฒฝ๋ก ๋ค์ media ์์ฑ์ผ๋ก ํน์ ์กฐ๊ฑด์ ๋ฌ์์ฃผ๋ฉด, ์กฐ๊ฑด์ ๋ง์ง ์๋ CSS๋ ๋ค์ด๋ก๋๋ ํ๋ ๋ ๋๋ง์ ๊ฐ๋ก๋ง์ง ์๊ฒ ๋ฉ๋๋ค. ์ฆ, ํ์ผ ์์ฒด๋ฅผ ๊ธฐ๊ธฐ๋ ์ํฉ์ ๋ง๊ฒ ์ชผ๊ฐ์ด ์ต์ ํํ๋ ์๋ฆฌ์ ๋๋ค.๋ ๋ฒ์งธ๋ก ๋ง์ํ์ loadCSS์ ๊ด๋ จ๋ ๋น๋๊ธฐ CSS ๋ก๋ฉ ๊ธฐ๋ฒ์ ๋๋ค. loadCSS๋ ์๋ ํน์ ๊ทธ๋ฃน์์ ๋ง๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ์ ๋น๋๊ธฐ CSS ๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฆ์ผ๋ก, ๊ณผ๊ฑฐ์๋ CSS๊ฐ ๋ ๋๋ง์ ์ฐจ๋จํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ์ค๋ฌด์์ ๋ง์ด ์ฌ์ฉํ์ต๋๋ค. ํ์ง๋ง ํ์ฌ ๋ชจ๋ ์น ํ๊ฒฝ์์๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ ๊ฐ์ ธ๋ค ์ฐ๊ธฐ๋ณด๋ค๋ HTML5 ํ์ค์ธ preload ์์ฑ์ ํ์ฉํ ํจํด์ผ๋ก ์งํํ์ผ๋ฉฐ, ์ด ํจํด ์์ฒด๋ฅผ ๊ด์ฉ์ ์ผ๋ก loadCSS ๊ธฐ๋ฒ์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค. ์ด ๊ธฐ๋ฒ์ ํธํฐ ์์ญ์ ์คํ์ผ์ด๋ ๋์ค์ ํด๋ฆญ ์ ์ด๋ฆด ๋ชจ๋ฌ ์ฐฝ ์คํ์ผ์ฒ๋ผ ๋น์ฅ ์ฒซ ํ๋ฉด์ ํ์ ์๋ ๋นํต์ฌ CSS๋ฅผ ํ๋ฉด ๋ ๋๋ง๊ณผ ๋์์ ๋ท๋จ์์ ๋ชฐ๋ ๋ค์ด๋ก๋ํ๋ ์ต์ ํ ๋ฐฉ์์ ๋๋ค. ๋ชจ๋ loadCSS ํจํด์ ์ ์ฉ ์์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฝ๋๋ฅผ ๋ณด์๋ฉด, ์ฒ์์๋ preload ์ค์ ๋๋ถ์ ๋ ๋๋ง์ ์ฐจ๋จํ์ง ์๊ณ ํ์ผ๋ง ๋น ๋ฅด๊ฒ ๋ค์ด๋ก๋ํ๋ฉฐ, ์๋ฃ๋๋ ์๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด ์ค์ ์คํ์ผ์ ํ๋ฉด์ ์ ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์ถ๊ฐ๋ก, ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊บผ์ ธ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ ์์ ์ฅ์น๋ก์ noscript ํ๊ทธ ์์ ๊ธฐ์กด ๋ฐฉ์์ ์ผ๋ฐ์ ์ธ link ํ๊ทธ๋ฅผ ํ๋ ๋ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์๋ฒฝํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.์ธ ๋ฒ์งธ๋ก ์ธ๊ธ๋ ๋์ ์ผ๋ก ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ ์ฒ์๋ถํฐ HTML ๋ฌธ์์ link ํ๊ทธ๋ฅผ ๋ชจ๋ ์ ์ด๋๋ ๊ฒ์ด ์๋๋ผ, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด ํน์ ์ํฉ์ด ๋์์ ๋๋ง ํ์ํ CSS๋ฅผ ๋ฌธ์์ ์ฃผ์ ํ๋ ๋ฐฉ์์ ๋๋ค. React๋ Next.js ๊ฐ์ ๋ชจ๋ ํ๋ ์์ํฌ ํ๊ฒฝ์์ ๊ฐ๋ฐ์ ํ์๋ค ๋ณด๋ฉด ๋ฒ๋ค๋ฌ๊ฐ ์ด ๊ณผ์ ์ ์์์ ์ฒ๋ฆฌํด ์ฃผ๋ ๊ฒ์ ๋ณด์ค ์ ์๋๋ฐ, ์ด๋ฅผ ๋ณดํต ์ฝ๋ ์คํ๋ฆฌํ ์ด๋ผ๊ณ ์นญํฉ๋๋ค. ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ์ฌ ๊ตฌํํ๋ ๊ตฌ์ฒด์ ์ธ ์์ ์ฝ๋๋ฅผ ํตํด ํ๋ฆ์ ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.// ๊ฒฐ์ ํ๊ธฐ ๋ฒํผ ์์๋ฅผ ์ฐพ์ต๋๋ค. const paymentButton = document.querySelector('#pay-btn'); // ๋ฒํผ์ ํด๋ฆญ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฌ์์ค๋๋ค. paymentButton.addEventListener('click', () => { // 1. ๋ฒํผ์ ๋๋ฅด๋ ์๊ฐ ๋์ ์ผ๋ก link ํ๊ทธ ์์๋ฅผ ์์ฑํฉ๋๋ค. const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = '/css/payment-modal.css'; // ๊ฒฐ์ ์ฐฝ ์ ์ฉ CSS ๊ฒฝ๋ก // 2. ๋ฌธ์์ head ํ๊ทธ ์์ ์ฃผ์ ํ์ฌ ๊ทธ์ ์ผ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค์ด๋ก๋ํ๊ณ ๋ ๋๋ง์ ๋ฐ์ํ๊ฒ ํฉ๋๋ค. document.head.appendChild(link); // 3. ์ดํ ๊ฒฐ์ ๋ชจ๋ฌ์ฐฝ์ ๋์ฐ๋ ๋ก์ง์ ์คํํฉ๋๋ค. openPaymentModal(); });์ด ์ฝ๋์ฒ๋ผ ์ฌ์ฉ์๊ฐ ๊ฒฐ์ ํ๊ธฐ ๋ฒํผ์ ๋๋ ์ ๋๋ง ๊ฒฐ์ ๋ชจ๋ฌ์ฐฝ์ CSS๋ฅผ ๋ก๋ํ๋๋ก ๊ตฌํํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ๋๋ฅด๋ ์๊ฐ ๋ด๋ถ ๋ก์ง์์ ๋์ ์ผ๋ก ์๋ก์ด link ํ๊ทธ ์์๋ฅผ ์์ฑํ๊ณ ๋ฌธ์์ ์ฃผ์ ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ๊ตฌํํ๋ฉด ์ด๊ธฐ ๋ก๋ฉ ์ ๋ฌด์กฐ๊ฑด ๋ค์ด๋ก๋ํด์ผ ํ CSS ํ์ผ์ ์ ์ฒด ํฌ๊ธฐ๊ฐ ํ์ฐํ ์ค์ด๋ค๊ธฐ ๋๋ฌธ์, ์ฒซ ํ๋ฉด์ด ๋จ๋ ์๋๊ฐ ๋น์ฝ์ ์ผ๋ก ์์นํ๋ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.์์ฝํ์๋ฉด, ๊ฐ์ฅ ์ฒซ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๋ฐ ํ์์ ์ธ ํต์ฌ CSS ์์๋ค๋ง ํ๊ทธ ๋ด๋ถ์ ์ธ๋ผ์ธ์ผ๋ก ์ฝ์ ํ๊ฑฐ๋ ๊ธฐ๋ณธ ๋ฐฐ์น๋ก ๋๊ณ , ๊ทธ ์ธ์ ๋๋จธ์ง ์คํ์ผ๋ค์ ๊ธฐ๊ธฐ๋ณ๋ก ์ชผ๊ฐ์ด media ์์ฑ์ ํ์ฉํ๊ฑฐ๋, preload๋ฅผ ์ด์ฉํด ๋ท๋จ์์ ๋น๋๊ธฐ๋ก ๋ชฐ๋ ๋ฐ์์ค๊ฑฐ๋, ํน์ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ํ๋ ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ๋์ ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ๊ฐ์ ธ์ค๋๋ก ์ค๊ณํ๋ ๊ฒ์ด ํ๋ก ํธ์๋ ๋ ๋๋ง ์ต์ ํ์ ํต์ฌ ์ ๋ต์ ๋๋ค.์ด๋ฌํ ๊ฐ๋ ๋ค์ ์ง์ ์ค์ตํด ๋ณด์๋ ค๋ฉด, ํ์ฌ ์์ ์ค์ด์ ํ๋ก์ ํธ๋ ๊ฐ๋จํ HTML ํ์ผ์ ์ด๊ณ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ(F12)์ ์๋ '๋คํธ์ํฌ(Network)' ํญ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด ๋ณด์๋ ๊ฒ์ ์ถ์ฒํด ๋๋ฆฝ๋๋ค. ์ฒ์์๋ ๋ชจ๋ CSS๋ฅผ ๊ธฐ๋ณธ link ํ๊ทธ๋ก ๋ถ๋ฌ์ฌ ๋์ ๋ก๋ฉ ์๋์ ์์ ๋ค์ด๋ก๋ ์์๋ฅผ ํ์ธํด ๋ณด์๊ณ , ๊ทธ๋ค์์๋ ์ค๋ ์ค๋ช ํด ๋๋ฆฐ media ์์ฑ์ด๋ preload, ๊ทธ๋ฆฌ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ ๋์ ๋ถ๋ฆฌ ๊ธฐ๋ฒ์ ์ฝ๋์ ํ๋์ฉ ์ ์ฉํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ๋คํธ์ํฌ ํญ์์ ๋ถํ์ํ ์คํ์ผ ์์์ด ์ธ์ ๋ค์ด๋ก๋๋๋์ง, ๊ทธ๋ฆฌ๊ณ ํ๋ฉด์ด ๊ทธ๋ ค์ง๋ ์์ ์ด ์ด๋ป๊ฒ ์๋น๊ฒจ์ง๋์ง ๋์ผ๋ก ์ง์ ๋น๊ตํด ๋ณด์๋ฉด ํจ์ฌ ๋ ๊น๊ณ ํ์คํ๊ฒ ์ฒด๋ํ์ค ์ ์์ ๊ฒ์ ๋๋ค.์ด๋ ๊ฒ ๊น์ด ๊ณ ๋ฏผํ์๊ณ ์ข์ ์ง๋ฌธ์ ๋จ๊ฒจ์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. eddie๋์ฒ๋ผ ์ด์ ์ ์ธ ์๊ฐ์๋ถ๋ค์ด ๋จ๊ฒจ์ฃผ์๋ ์๋ฆฌํ ์ง๋ฌธ๋ค์ ์ ๊ฐ ์์ผ๋ก ๋ ์ข์ ๊ฐ์๋ฅผ ์ ์ํ๊ณ ์ปค๋ฆฌํ๋ผ์ ๋ฐ์ ์ํค๋ ๋ฐ ์ ๋ง ํฐ ๋์์ด ๋ฉ๋๋ค. ๊ฐ์ฌ์ ๋ง์์ ๋ด์, ์ ํฌ ์ฐ๋ฆฌ ๋๋ค ์ฝ๋ฉ ์คํ๋์ค์์ ์ ๊ณตํ๋ ๊ฐ์ ์ค ์ถ๊ฐ๋ก ํ์ํ๊ฑฐ๋ ์๊ฐํ๊ณ ์ถ์ผ์ ๊ฐ์๊ฐ ์๋ค๋ฉด jeony0535@naver.com ์ผ๋ก ์ธ์ ๋ ์ง ํธํ๊ฒ ์ฐ๋ฝํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ํ์ธ ํ ์ํ์๋ ๊ฐ์์ ์๊ฐ ์ฟ ํฐ์ ๊ธฐ์ ๋ง์์ผ๋ก ์ ๋ฌํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์์ผ๋ก๋ ํ์ตํ์๋ฉด์ ๊ถ๊ธํ ์ ์ด ์๊ธฐ์๋ฉด ์ธ์ ๋ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ธ์. eddie๋์ ํ๋ก ํธ์๋ ํ์ต์ ํญ์ ์์ํฉ๋๋ค!
- Likes
- 0
- Comments
- 2
- Viewcount
- 35
Q&A
22๊ฐ ๊ฐ์ ์์ ๋ฌธ์ ๋๋ฆฝ๋๋ค.
์๋ ํ์ธ์, dgh12๋. ๊ฐ์ ์๊ฐ ์ค ๊ณ์ํด์ ๋ถํธ์ ๋๋ ค ์ ๋ง ์ก๊ตฌํ ๋ง์๋ฟ์ ๋๋ค.๋ฌธ์ํ์ '22๊ฐ. [CS ์ํคํ ์ฒ] ๋งคํฌ๋ก ์บ์ฑ(Page)์ ํ๊ณ์ ๋ง์ดํฌ๋ก ์บ์ฑ(Component) ๊ธฐ์ ' ์์์ด ํ์ฌ ๋ ธ์ถ๋์ง ์๋ ์ ํ์ธํ์์ต๋๋ค.์ ๋ณดํด ์ฃผ์ ์งํ ๋ฐ๋ก ์์ธ์ ํ์ ์ค์ด๋ฉฐ, ์ง๊ธ ๋ฐ๋ก ํ๋ซํผ์ ๋ค์ ๋ฐ์ํ์ฌ ์ ์์ ์ผ๋ก ์์ฒญํ์ค ์ ์๋๋ก ์กฐ์นํ๊ฒ ์ต๋๋ค. ํ์ต ํ๋ฆ์ด ๋๊ธฐ๊ฒ ํด๋๋ ค ๊ฐ์ฌ๋ก์ ๋ง์์ด ๋ฌด๊ฒ์ต๋๋ค.dgh12๋๊ป์ ๋จ๊ฒจ์ฃผ์๋ ํผ๋๋ฐฑ ํ๋ํ๋๊ฐ ๊ฐ์์ ์์ฑ๋๋ฅผ ๋์ด๋ ๋ฐ ํฐ ํ์ด ๋๊ณ ์์ต๋๋ค. ์์ ๋ง์๋๋ฆฐ nhcodingstudio ๊ฐ์ ๊ด๋ จ ํ ์ธ ์ฟ ํฐ ํํ์ ์ธ์ ๋ jeony0535@naver.com์ผ๋ก ๋ฉ์ผ ์ฃผ์๋ฉด ๋ฐ๋ก ์ฒ๋ฆฌํด ๋๋ฆด ํ ๋ ๋ถ๋ด ์์ด ๋ง์ํด ์ฃผ์ธ์.์กฐ์น๊ฐ ์๋ฃ๋๋ ๋๋ก ๋ค์ ํ๋ฒ ํ์ธ ๋ถํ๋๋ฆฌ๋ฉฐ, ๋ค์ ํ๋ฒ ์ง์ฌ์ผ๋ก ์ฌ๊ณผ๋๋ฆฝ๋๋ค.๊ฐ์ฌํฉ๋๋ค.
- Likes
- 0
- Comments
- 2
- Viewcount
- 47




