nhcodingstudio
@nhcodingstudio
Students
663
Reviews
44
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
jeony05354605
ยท
Mastering HTML + CSS: A Complete Guide from Beginner to Advanced Part 2 - [Intermediate]Mastering HTML + CSS: A Complete Guide from Beginner to Advanced Part 2 - [Intermediate]jeony05354605
ยท
Learning Express.js Properly: Part2 Engine Internal Working Principles and Clone ProjectLearning Express.js Properly: Part2 Engine Internal Working Principles and Clone Projectfined0006806
ยท
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 Missions- Learning Express.js Properly: Part 1, From Basics to Advanced [Basics]
qkekxovnd5742
ยท
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 Missions
Posts
Q&A
๋ฏธ์ 18
์๋ ํ์ธ์ ์ํ๋!์ฐ์ ํ์ต์ ๋ถํธ์ ๋๋ ค ์ ๋ง ์ฃ์กํฉ๋๋ค.๋ง์ํด ์ฃผ์ ๋ฏธ์ 18์ ๋๋ฝ๋ ๋ด์ฉ๊ณผ 43๊ฐ ์ฒซ ํ์ด์ง์ ์คํ๋ฅผ ๋ชจ๋ ํ์ธํ์ฌ ํ์ฌ ์์ ์ ์๋ฃํ์ต๋๋ค. ๊ผผ๊ผผํ๊ฒ ํ์ธํด ์ฃผ์๊ณ ์์คํ ํผ๋๋ฐฑ์ ์ฃผ์ ๋๋ถ์ ๊ฐ์๋ฅผ ๋ ์๋ฒฝํ๊ฒ ๋ณด์ํ ์ ์์์ต๋๋ค. ์ ๋ณดํด ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌํฉ๋๋ค.์์ ๋ ๋ด์ฉ์ผ๋ก ํ์ต์ ์ด์ด๊ฐ์๋ ๋ฐ ์ด๋ ค์์ด ์์ผ์๊ธธ ๋ฐ๋ผ๋ฉฐ, ์์ผ๋ก๋ ํ์ต ์ค ๊ถ๊ธํ ์ ์ด๋ ๋ถํธํ ์ฌํญ์ด ์๊ธฐ๋ฉด ์ธ์ ๋ ํธํ๊ฒ ๋ง์ํด ์ฃผ์ธ์.๋ ์ข์ ๊ฐ์๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 21
Q&A
๋ฏธ์ 18
์๋ ํ์ธ์ ์ํ ๋, ๋ถํธ์ ๋๋ ค ์ฃ์กํฉ๋๋ค.๋ง์ํ์ ๋ถ๋ถ์ ๊ธ์ผ 12์ ๋ด๋ก ์กฐ์ํ ์์ ํด ๋๊ฒ ์ต๋๋ค.๊ผผ๊ผผํ ์ฒดํฌํ์ง ๋ชปํ ์ ์ฌ๊ณผ๋๋ฆฌ๋ฉฐ, ์์ผ๋ก ๋์ฑ ์ ์ํ๊ฒ ์ต๋๋ค.
- 0
- 2
- 21
Q&A
readFileSync
์๋ ํ์ธ์ ์ฝ๋ฉ๋!ํ์ต์ ๋ํ ์ด์ ์ด ๋๊ปด์ง๋ ์ง๋ฌธ์ ์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ์ง๋ฌธํ์ ๋ด์ฉ์ Node.js์ ํต์ฌ ์ฒ ํ์ธ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์์ฃผ ์ ํํ๊ฒ ๊ดํตํ๊ณ ์์ผ๋ฉฐ, ๊ฐ์์ ๊ตฌ์ฑ ์๋์ ๋ํ ๋ถ์ ๋ํ ๋งค์ฐ ํ๋นํฉ๋๋ค.์ง๋ฌธํ์ ๋ด์ฉ์ ๋ฉด๋ฐํ ์ดํด๋ณด๋ฉด readFileSync ๋ฉ์๋์ ๋ํ ์ฐ๋ ค๋ ๊ธฐ์ ์ ์ผ๋ก ๋งค์ฐ ์ ํํ ์ง์ ์ ๋๋ค. ์ด ๋ฉ์๋๋ ์ด๋ฆ ๊ทธ๋๋ก ํ์ผ์ ์ฝ์ด์ค๋ ์์ ์ ์ํํ๋ ๋์ ๋ค์ ์ฝ๋๋ก ๋์ด๊ฐ์ง ์๊ณ ์ ์ฒด ์คํ ํ๋ฆ์ ๋ฉ์ถฐ ์ธ์ฐ๋ ๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. Node.js๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ฒ๋ฆฌํ ์ ์๋ ์ฑ๊ธ ์ค๋ ๋ ๊ธฐ๋ฐ์ ์ด๋ฒคํธ ๋ฃจํ ๋ชจ๋ธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์ด ๋ฃจํ๊ฐ ๋ฉ์ถ๋ค๋ ๊ฒ์ ๋ค๋ฅธ ์ฌ์ฉ์์ ์ ์์ด๋ ๋ฐ์ดํฐ ์์ฒญ์ ์ ํ ์ฒ๋ฆฌํ ์ ์๋ ์ํ๊ฐ ๋จ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๋ง์น ์ข์ ๋จ์ ๋๋ก์์ ์์ฐจ๊ฐ ํต๊ณผํ๊ธฐ ์ ๊น์ง ๋ค์ ์๋ ์๋ง์ ์ฐจ๊ฐ ํ์ผ์์ด ๊ธฐ๋ค๋ ค์ผ ํ๋ ์ํฉ๊ณผ ๊ฐ์์, ์ค์ ์๋น์ค ํ๊ฒฝ์ ๋น์ฆ๋์ค ๋ก์ง์์๋ ๋งค์ฐ ์น๋ช ์ ์ธ ์ฝ๋๊ฐ ๋ ์ ์์ต๋๋ค.์ด๋ฌํ ๋งฅ๋ฝ์์ ํํธ 1 ๊ณผ์ ์ ๋ง์ํ์ ๋๋ก ์ค๋ฌด ์ ์ฒด๋ฅผ ๋๋ณํ๊ธฐ๋ณด๋ค๋ Express ํ๋ ์์ํฌ์ ์๋ฒ์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ก๋ ๋จ๊ณ๋ก ์ดํดํ์๋ฉด ์ข์ต๋๋ค. ์ด ๋จ๊ณ์์ readFileSync๋ฅผ ํ์ฉํ๋ ์ด์ ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ผ๋ ๋ค์ ๋ณต์กํ ๊ฐ๋ ์ ๋ฐฐ์ฐ๊ธฐ ์ ์ ์๋ฒ๊ฐ ์ด๋ป๊ฒ ์์ฒญ์ ๋ฐ๊ณ ์๋ต์ ๋ณด๋ด๋์ง ๊ทธ ์ง๊ด์ ์ธ ํ๋ฆ์ ๋จผ์ ์ตํ๊ธฐ ์ํด์์ ๋๋ค. ์ด๊ฒ์ ๋ง์น ์ด์ ์ ์ฒ์ ๋ฐฐ์ธ ๋ ์์ง์ ๋ด๋ถ ๋ณต์กํ ์๋ ์๋ฆฌ๋ณด๋ค๋ ํธ๋ค์ ์กฐ์ํ๊ณ ๋ธ๋ ์ดํฌ๋ฅผ ๋ฐ๋ ๋ฒ๋ถํฐ ์ตํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. ๋ฐ๋ผ์ ํ์ต์๊ฐ ์๋ฒ์ ์ ์ฒด์ ์ธ ๊ณจ๊ฒฉ์ ํ์ ํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋์ง ์๋๋ก ์๋์ ์ผ๋ก ๋จ์ํ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ณผ์ ์ด๋ผ ๋ณผ ์ ์์ต๋๋ค.๋ณธ๊ฒฉ์ ์ธ ์ค๋ฌด ๊ด์ ์ ์ต์ ํ์ ๊น์ด ์๋ ๋ด์ฉ์ ํํธ 2์์ ์ค์ ์ ์ผ๋ก ๋ค๋ค์ง๊ฒ ๋ฉ๋๋ค. ํํธ 2์์๋ ๋จ์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ ๋์ด Express์ ๋ด๋ถ ์์ง์ด ์ค์ ๋ก ์ด๋ป๊ฒ ๋ฏธ๋ค์จ์ด๋ฅผ ์คํํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํ๋์ง ๊ทธ ๋ด๋ถ๋ฅผ ๊น์์ด ๋ค์ฌ๋ค๋ด ๋๋ค. ํนํ ๋๊ท๋ชจ ํธ๋ํฝ์ ๊ฒฌ๋๊ธฐ ์ํ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฒ์ ๋ฐฐ์ฐ๋ฉด์, ์ ์ค๋ฌด์์๋ ๋น๋๊ธฐ ๋ฐฉ์์ธ readFile์ด๋ async/await๋ฅผ ํ์ฉํด ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๋ฐฉํดํ์ง ์์์ผ ํ๋์ง๋ฅผ ์ค๋ฌด์ ์ธ ์ฝ๋๋ก ํ์ธํ๊ฒ ๋ฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ํํธ 2๊น์ง ๋ชจ๋ ๊ฒฝํํ์ ์ผ ๋น๋ก์ ์ค์ ์๋น์ค์ ์ ์ฉ ๊ฐ๋ฅํ ์์ค์ ๊น์ด ์๋ ๊ฐ๋ฐ ์ญ๋์ ๊ฐ์ถ์ค ์ ์์ต๋๋ค.๊ทธ๋ ๋ค๋ฉด ์ค๋ฌด์์๋ ์ด ๋๊ธฐ ๋ฉ์๋๋ฅผ ์์ ๋ฐฐ์ ํ๋ ๊ฒ์ผ๊น์? ์ฌ์ค ์ค๋ฌด์์๋ ์ด ๋ฐฉ์์ด ์ ๋ต์ด ๋๋ ์๊ฐ์ด ์๋๋ฐ, ๋ฐ๋ก ์๋ฒ๊ฐ ๊ฐ๋๋๊ธฐ ์ง์ ์ ์ด๊ธฐ ์ค์ ๋จ๊ณ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์๋ฒ ์ด์์ ๋ฐ๋์ ํ์ํ ๋ณด์ ์ธ์ฆ์๋ ํ๊ฒฝ ์ค์ ํ์ผ์ ๋ถ๋ฌ์ค๋ ์์ ์ ์๋ฒ๊ฐ ์๋์ ์์ฒญ์ ๋ฐ๊ธฐ ์์ํ๊ธฐ ์ ์ ๋ฑ ํ ๋ฒ๋ง ์ํ๋ฉ๋๋ค. ์ด๋ ์๋น์ด ๋ฌธ์ ์ด๊ธฐ ์ ์ฃผ๋ฐฉ์ ์ธํ ํ๋ ์๊ฐ์๋ ์ ์ ์์ ์ด ๋ฉ์ถฐ๋ ์๋์๊ฒ ์ง์ฅ์ ์ฃผ์ง ์๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์คํ๋ ค ์ด๋ฐ ์ด๊ธฐํ ๋จ๊ณ์์๋ ์คํ ์์๋ฅผ ํ์คํ ๋ณด์ฅํ๋ฉด์๋ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ ๋๊ธฐ ๋ฐฉ์์ด ๋ ์์ ํ๊ณ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.๊ฒฐ๋ก ์ ์ผ๋ก ํํธ 1์ ์๋ฒ์ ๊ธฐ์ด ์ฒด๋ ฅ์ ๊ธฐ๋ฅด๋ ๊ณผ์ ์ด๋ฉฐ, ํํธ 2๋ ๊ทธ ์ฒด๋ ฅ์ ๋ฐํ์ผ๋ก ์ค์ ์๋น์ค์์ ์ต์ ์ ์ฑ๋ฅ์ ๋์ด๋ด๋ ๋ฒ์ ๋ฐฐ์ฐ๋ ๊ณผ์ ์ ๋๋ค. ์ง๊ธ์ฒ๋ผ ์ฝ๋ ํ ์ค์ด ์ค๋ฌด์์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ง ๊ณ ๋ฏผํ๋ฉฐ ํ์ตํ์ ๋ค๋ฉด ํํธ 2์์ ๋ค๋ฃฐ ์ฌํ ๊ฐ๋ ๋ค๋ ์์ฃผ ๋น ๋ฅด๊ฒ ๋ณธ์ธ์ ๊ฒ์ผ๋ก ๋ง๋์ค ์ ์์ ๊ฒ์ ๋๋ค.์ฐธ๊ณ ํด์ฃผ์ธ์!
- 0
- 1
- 45
Q&A
11๊ฐ ๋ด์ฉ๊ณผ 12๊ฐ ๋ด์ฉ์ด ์ถฉ๋ํ๋ ๊ฒ ๊ฐ์์.
์๋ ํ์ธ์ hans๋!๋จผ์ ์ค์ํ ๋ถ๋ถ์ ๊น์ด ์๊ฒ ํ์ธํด์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌ๋๋ฆฝ๋๋ค. 11๊ฐ๊ณผ 12๊ฐ์ ์ฐ๋ฌ์ ๋ณด์ จ๋ค๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์๊ธธ ์ ์๋ ๊ถ๊ธํจ์ด๊ณ , ์ผํ ๋ณด๋ฉด ๋ ์ค๋ช ์ด ์๋ก ๋ค๋ฅธ ๋ฐฉํฅ์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค. ํ์ง๋ง ์ค์ ๋ก ๋ ๊ฐ์๋ ์๋ก ์ถฉ๋ํ์ง ์์ผ๋ฉฐ, ๊ฐ๊ฐ ์ ํ ๋ค๋ฅธ ์ํฉ์ ์ค๋ช ํ ๊ฒ์ด๊ณ , ์ด ์ฐจ์ด๋ฅผ ์ดํดํ๋ฉด ์ ์ฒด ํ๋ฆ์ด ํ ๋ฐฉํฅ์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ์ด์ด์ง๋๋ค.12๊ฐ์ ํดํ ์์ ๋ฅผ ๋ณด๋ฉด ๊ตฌ์กฐ๊ฐ ๋งค์ฐ ๋จ์ํฉ๋๋ค. ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ํดํ ์์๊ฐ ์ ์ ์์ฑ๋๊ณ , ๋ง์ฐ์ค๋ฅผ ๋ผ๋ ์๊ฐ ๋ฐ๋ก DOM์์ ์ ๊ฑฐ๋๋ฉฐ, ์ฝ๋ ์ด๋์์๋ ์ด ์์๋ ์ฝ๋ฐฑ์ ๋ณ์๋ก ์ ์ฅํ๊ฑฐ๋ ๋ค์ ์ฐธ์กฐํ์ง ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ โ์ด DOM ์์๋ ๋ค์ ์ฌ์ฉํ ์ผ์ด ์๊ฒ ๊ตฌ๋โ๋ผ๊ณ ํ๋จํ๊ณ , ํด๋น ์์์ ๊ทธ์ ์ฐ๊ฒฐ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊น์ง ํจ๊ป ๋ฉ๋ชจ๋ฆฌ์์ ์ ๋ฆฌํ ์ ์์ต๋๋ค. ๊ทธ๋์ 12๊ฐ์์๋ โ์์๋ฅผ ์ ๊ฑฐํ๋ ํ๋ฆ๋ง์ผ๋ก๋ ์ธํฐ๋์ ์ด ์ ๋ฆฌ๋๋คโ๋ผ๊ณ ์ค๋ช ๋๋ฆด ์ ์์์ต๋๋ค.ํ์ง๋ง ์ด ์ค๋ช ์ด โ๋ชจ๋ ์ํฉ์์ ์์๋ง ์ง์ฐ๋ฉด ๋ฆฌ์ค๋๋ ์๋์ผ๋ก ์ ๊ฑฐ๋๋คโ๋ ๋ป์ ์ ๋ ์๋๋๋ค. ์ค์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์ด์ ๋ค๋ฅธ, ๋ ๋ณต์กํ ์ํฉ๋ค์ด ํจ์ฌ ์์ฃผ ๋ฐ์ํฉ๋๋ค. ์ฝ๋ฐฑ ํจ์๊ฐ ์ธ๋ถ ๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ์์ด์ ๋ธ๋ผ์ฐ์ ๊ฐ ํด๋น ํจ์๋ฅผ ์ฝ๊ฒ ์ ๋ฆฌํ์ง ๋ชปํ๊ฑฐ๋, DOM ์์๊ฐ ๋์์์๋ ์ฌ๋ผ์ก์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์๋ ๋ฐฐ์ด ์์ ์ฌ์ ํ ์ฐธ์กฐ๊ฐ ๋จ์ ์๊ฑฐ๋, SPA์ฒ๋ผ ๊ฐ์ ํ๋ฉด ๊ตฌ์ฑ ์์๊ฐ ๋ฐ๋ณตํด์ ์์ฑ๋๊ณ ์ ๊ฑฐ๋๋ฉด์ ๋์ผํ ์ด๋ฒคํธ๊ฐ ์ค์ฒฉ์ผ๋ก ๋ฑ๋ก๋๋ ์ผ์ด ์์ฐ์ค๋ฝ๊ฒ ์ผ์ด๋ฉ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ DOM ์์๊ฐ ์ฌ๋ผ์ ธ๋ ๋ธ๋ผ์ฐ์ ๋ โ์ด ํจ์๋ ์์๊ฐ ์์ง ํ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋คโ๊ณ ํ๋จํ์ฌ ๋ฆฌ์ค๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ง์ฐ์ง ์์ต๋๋ค. ์ด๋ฐ ๋์ ์ ์๊ฐ์ด ์ง๋ ์๋ก ๋ฉ๋ชจ๋ฆฌ ๋์, ์ฑ๋ฅ ์ ํ, ์ด๋ฒคํธ ์ค๋ณต ์คํ ๊ฐ์ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.์ด ์ฐจ์ด๋ฅผ ์กฐ๊ธ ๋ ์ง๊ด์ ์ผ๋ก ๋น์ ํด์ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๋น์ทํฉ๋๋ค. ํดํ์ฒ๋ผ ์ ๊น ์ฐ๊ณ ๋ฐ๋ก ๋ฒ๋ฆฌ๋ ์ผํ์ฉ ์ข ์ด์ปต์ ๋ฒ๋ฆฌ๋ฉด ๊ทธ๋๋ก ์ฌ๋ผ์ง์ง๋ง, ๋ง์ฝ ์ด๋ค ๊ฐ๋ฐฉ ์์ ๋ฌผ๊ฑด์ด ๋ค์ด ์๋ค๋ฉด ์ฑ ์ ์์์๋ ๋ณด์ด์ง ์๋๋ผ๋ ๊ทธ ๋ฌผ๊ฑด์ ์ฝ๊ฒ ๋ฒ๋ฆด ์ ์์ต๋๋ค. ์ฝ๋์์๋ ์์๊ฐ ํ๋ฉด์์ ์ฌ๋ผ์ก๋ค๊ณ ํด์, ์ด๋๊ฐ์์ ๊ทธ ์์๋ ๋ฆฌ์ค๋๋ฅผ ์ก๊ณ ์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋ง์๋๋ก ๋ฒ๋ฆฌ์ง ๋ชปํฉ๋๋ค. ์ด ๋น์ ๊ฐ ๋ฐ๋ก ์๋ ์ ๋ฆฌ์ ๋ฏธ์ ๋ฆฌ์ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ฃผ๋ ํต์ฌ ์๋ฆฌ์ ๋๋ค.๋ ํ ๊ฐ์ง, ์๋ ์ ๋ฆฌ๊ฐ ์ผ์ด๋๋ค ํ๋๋ผ๋ ๊ทธ ์์ ์ด๋ ํ๋จ ๊ธฐ์ค์ ๋ธ๋ผ์ฐ์ ์์ง๋ง๋ค ์กฐ๊ธ์ฉ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์์ ๊ฐ๋ฐ์๊ฐ ์ง์ ํต์ ํ ์ ์๋ ๊ฒ์ด ์๋๋ผ, ๋ธ๋ผ์ฐ์ ๊ฐ ๋ด๋ถ์ ์ผ๋ก ์์ ํ๋ค๊ณ ํ๋จํ ๋ ์ด๋ฃจ์ด์ง๋ ์์ ์ด๊ธฐ ๋๋ฌธ์, โ์ธ์ ์๋์ผ๋ก ์ ๋ฆฌ๊ฐ ๋ ์งโ๋ฅผ ๊ฐ์ ํด์ ์ฝ๋๋ฅผ ์ค๊ณํ๋ ๊ฒ์ ์์ธกํ๊ธฐ ์ด๋ ต๊ณ ์ฅ๊ธฐ์ ์ผ๋ก ์์ ์ฑ์ด ๋จ์ด์ง๋ ๋ฐฉ์์ ๋๋ค.์ด ๋๋ฌธ์ 11๊ฐ์์๋ removeEventListener๋ฅผ ๋ช ์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ํ๋ค๊ณ ๊ฐ์กฐ๋๋ ธ์ต๋๋ค. ์ค๋ฌด์์๋ UI ๊ตฌ์กฐ๊ฐ ์กฐ๊ธ๋ง ๋ณต์กํด์ ธ๋ ์๋ ์ ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง์ง ์๋ ์ํฉ์ด ์์ฐ์ค๋ฝ๊ฒ ๋ฑ์ฅํ๊ณ , ํนํ SPA์ฒ๋ผ ํ๋ฉด์ด ์์ฃผ ์ ํ๋๊ฑฐ๋ ์ฌ๋ฌ ์ํ๊ฐ ์ฝํ๋ ํ๊ฒฝ์์๋ ์ด๋ฒคํธ ์ค๋ณต ๋ฑ๋ก๊ณผ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด โ์ ๋ฆฌ ๋ฃจํดโ์ ๋ฐ๋์ ๋ช ์์ ์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ด ์ ๊ณ ํ์ค์ ๋๋ค. ์ด๋ React, Vue ๊ฐ์ ํ๋ ์์ํฌ์์๋ ๋์ผํ๊ฒ ์ ์ฉ๋๋ ๊ฐ๋ ์ผ๋ก, useEffect์ cleanup ํจ์๋ beforeUnmount ๊ฐ์ ์ ๋ฆฌ ๋ฉ์ปค๋์ฆ์ด ์กด์ฌํ๋ ์ด์ ๋ ๋ฐ๋ก ์ด ๋๋ฌธ์ ๋๋ค. ํ๋ ์์ํฌ๊ฐ ์๋์ผ๋ก ์ ๋ฆฌํด์ค ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ ๊ฐ๋ฐ์๊ฐ ์ ๋ฆฌ ์ฝ๋๋ฅผ ์ง์ ์์ฑํด์ผ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋ ๊ตฌ์กฐ์ ๋๋ค.์ ๋ฆฌํ์๋ฉด, 12๊ฐ์ ๋จ๋ฐ์ฑ์ผ๋ก ์์ฑ๋์๋ค ๋ฐ๋ก ์ฌ๋ผ์ง๋ ๋จ์ํ UI์์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์์ ๋ฆฌ์ค๋๋ฅผ ํจ๊ป ์ ๋ฆฌํ ์ ์๋ค๋ ํ๋ฆ์ ๋ณด์ฌ์ค ๊ฒ์ด๊ณ , 11๊ฐ์ ์ค์ ํ๋ก์ ํธ ๊ท๋ชจ์์๋ ์๋ ์ ๋ฆฌ๋ฅผ ๊ธฐ๋ํ ์ ์๋ ์ํฉ์ด ํจ์ฌ ๋ ๋ง๊ธฐ ๋๋ฌธ์ ๋ช ์์ ์ธ ์ด๋ฒคํธ ํด์ ๊ฐ ํ์ํ๋ค๋ ์ค๋ฌด ๊ด์ ์ ์ค๋ช ํ ๊ฒ์ ๋๋ค. ๋ ๊ฐ์๊ฐ ์๋ก ๋ค๋ฅธ ์์น์ ๋งํ ๊ฒ์ด ์๋๋ผ, ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ณต์ก๋์ ์ํฉ์์ ๋ฐ์ํ๋ ๋์์ ์ค๋ช ํ ๊ฒ์ด๋ผ๊ณ ์ดํดํ์๋ฉด ์ ์ฒด ๊ทธ๋ฆผ์ด ๋งค๋๋ฝ๊ฒ ์ฐ๊ฒฐ๋ฉ๋๋ค.๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ๊ฐ์ฅ ์ค์ํ ๊ฒฐ๋ก ์ ๋ง์๋๋ฆฌ๋ฉด, ์ค์ ๊ฐ๋ฐ์์๋ ์๋ ์ ๋ฆฌ์ ์์กดํ๊ธฐ๋ณด๋ค๋ ๊ฐ๋ฅํ๋ฉด removeEventListener๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํ๋ ๋ฐฉ์์ ๊ธฐ๋ณธ ์์น์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ด ๊ฐ์ฅ ์์ ํ๊ณ ์ผ๊ด๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์๋ ์ ๋ฆฌ๋ ๋ง ๊ทธ๋๋ก โ์ํฉ์ด ์์ฃผ ๋จ์ํ ๋๋ง ์ฐ์ฐํ ์๋ํ๋ ๋ณด์กฐ ์ฅ์นโ์ ๊ฐ๊น๊ณ , ์ค๋ฌด์์๋ ์์ ์ธ์ ์ฐธ์กฐ๋ ์ํธ์์ฉ์ด ๋งค์ฐ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์, ๋ฆฌ์ค๋ ์ ๋ฆฌ๋ฅผ ์ง์ ์ ์ดํ๋ ๋ฐฉ์์ด ์ฅ๊ธฐ์ ์ผ๋ก ์์ ์ ์ด๊ณ ์ฑ๋ฅ ๋ฉด์์๋ ์ ๋ขฐํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ค๋๋ค.์ด๋ฒ ์ง๋ฌธ ๋๋ถ์ ๋ ๊ฐ์ ์ฌ์ด์์ ํผ๋๋ ์ ์๋ ๋ถ๋ถ์ ๋ ๋ช ํํ๊ฒ ์ ๋ฆฌํ ์ ์์๊ณ , ์์ผ๋ก ๊ฐ์์์๋ ๋์ฑ ๋งค๋๋ฝ๊ฒ ์ฐ๊ฒฐํด ์ค๋ช ๋๋ฆด ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ข์ ์ง๋ฌธ ์ ๋ง ๊ฐ์ฌ๋๋ฆฌ๊ณ , ์ธ์ ๋ ์ง ๋ ๊ถ๊ธํ ์ ์์ผ์๋ฉด ํธํ๊ฒ ๋ง์ํด์ฃผ์ธ์.๊ฐ์ฌํฉ๋๋ค๐
- 0
- 2
- 50
Q&A
ํด๋์ค vs ์ธ๋ผ์ธ ์คํ์ผ ์ฑ๋ฅ ์ง๋ฌธ
์๋ ํ์ธ์ hans๋! ๋จผ์ ์ ํํ ์ง์ ์ ์ง์ด์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ์ด ์ฃผ์ ๋ ๊ฒ๋ณด๊ธฐ์๋ โ์ธ๋ผ์ธ ์คํ์ผ vs classListโ ์ ๋๋ก ๋จ์ํด ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ ๋ธ๋ผ์ฐ์ ๋ด๋ถ ๊ตฌ์กฐ, ๋ ๋๋ง ํ์ด๋ฐ, ๊ทธ๋ฆฌ๊ณ ๋๊ท๋ชจ UI์์์ ์ฝ๋ ์กฐ์ง ๋ฐฉ์๊น์ง ๋ชจ๋ ์ฐ๊ฒฐ๋ ์ด์ผ๊ธฐ๋ผ ์กฐ๊ธ ๋ ์ค๋ช ์ด ๊ธธ์ด์ง ์๋ฐ์ ์์ต๋๋ค.์ฐ์ hans๋์ด ์ง๋ฌธ์์ ์ดํดํ์ ๋ด์ฉ์ ์ ํํฉ๋๋ค. ๋จ์ํ ์ธ๋ผ์ธ ์คํ์ผ์ ๋ฃจํ ์์์ ๋ ๋ฒ ์ ๋ ๋ฐ๊พธ๋ ์ ๋๋ผ๋ฉด, ๊ทธ ์๊ฐ๋ง๋ค ๋ฆฌํ๋ก์ฐ๋ ๋ฆฌํ์ธํธ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ๋์ ์คํ์ผ์ด ๋ฐ๋์ด๋ ๊ณง๋ฐ๋ก ๋ ์ด์์์ ๋ค์ ์ก์ง ์๊ณ , ๋ณดํต์ ์๋ฐ์คํฌ๋ฆฝํธ ์คํ์ด ๋๋๋ ํ์ด๋ฐ์ด๋ ๋ค์ ํ๋ ์์ ๊ทธ๋ฆด ๋ ์คํ์ผ ๊ณ์ฐ โ ๋ ์ด์์ โ ํ์ธํธ๋ฅผ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๋์ ์ด๋ฐ ๊ฐ๋จํ ์์์์๋ ์ธ๋ผ์ธ ์คํ์ผ์ ์ฐ๋ classList๋ฅผ ์ฐ๋ ๋ ๋๋ง ๋น์ฉ ์์ฒด๋ ๊ฑฐ์ ๋น์ทํ๋ค๋ ์ ์ด ๋ง์์.๋ค๋ง ์ ๊ฐ ๊ฐ์์์ ์ด ๋ถ๋ถ์ ์กฐ๊ธ ๋ ๊ฐ์กฐํ๋ ์ด์ ๋, ์ฝ๋๊ฐ ์ค์ ์๋น์ค ์์ค์ผ๋ก ์ปค์ก์ ๋ ์ธ๋ผ์ธ ์คํ์ผ์ด ์ฑ๋ฅ๊ณผ ์ ์ง๋ณด์ ์์ชฝ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ์ํ์ฑ์ ์์ ์ฝ๋ ๊ฐ์ ๋จ์ํ ์ํฉ์์๋ ์ ๋ ๋๋ฌ๋์ง ์๊ณ , ์ธํฐ๋์ ์ด ๋ง์์ง๊ณ ํ๋ฉด ์์๊ฐ ๋ง์์ง์๋ก ์์ํ ๋์ ๋๋ค๊ฐ ์ด๋ ์๊ฐ ์ฒด๊ฐ๋ ์ ๋๋ก ํฐ ๋ฌธ์ ๋ก ํฐ์ง๋ ํธ์ ๋๋ค.์กฐ๊ธ ๋ ํ์ค์ ์ธ ์๋ฅผ ํ๋ ๋ค์ด๋ณผ๊ฒ์. ์ผํ๋ชฐ ๋ฉ์ธ ํ์ด์ง์ฒ๋ผ ์๋ฐฑ ๊ฐ์ ์ํ ์นด๋๊ฐ ํ๋ฅด๋ UI๋ฅผ ๋ ์ฌ๋ ค ๋ณด๋ฉด, ํ๋ฉด ์๋์ชฝ์ ์๋ ์ด๋ฏธ์ง๋ ์์ง ๋ณด์ด์ง ์์ง๋ง ์คํฌ๋กค์ด ๋ด๋ ค์ค๋ฉด ๋ณด์ฌ์ผ ํ์ฃ . ์ด๋ฐ ์ํฉ์์ ํํ ์ฌ์ฉํ๋ ๊ฒ์ด โlazy loadingโ์ ๋๋ค. lazy loading์ ํ๋ฉด์ ๋ณด์ด์ง ์๋ ์ด๋ฏธ์ง๋ ๋ฏธ๋ฆฌ ๋ก๋ฉํ์ง ์์๋ค๊ฐ, ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํด์ ํด๋น ์ด๋ฏธ์ง๊ฐ ํ๋ฉด ๊ทผ์ฒ์ ์์ ๋ ๋ก๋ฉ์ ์์ํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ์ด๊ฑธ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๋ ค๊ณ ์ต๊ทผ์๋ Intersection Observer๋ผ๋ ๊ธฐ๋ฅ์ ์์ฃผ ์๋๋ค. ์ด ๊ธฐ๋ฅ์ โ์ด๋ค ์์๊ฐ ํ๋ฉด ์์ ๋ค์ด์๋์ง, ํน์ ํ๋ฉด์ ์ด๋ ์ ๋ ๊ฒน์ณ์ก๋์งโ๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ค์ฃผ๋ API์ธ๋ฐ, ์ด API๋ฅผ ์ด์ฉํด์ ์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ์ง์ ์ฒ๋ฆฌํ์ง ์๊ณ ๋ ํ์ํ ํ์ด๋ฐ์๋ง ์ด๋ฏธ์ง ๋ก๋ฉ์ ์์ํ ์ ์์ต๋๋ค.๋ฌธ์ ๋ ์ด๋ฐ ํ๊ฒฝ์์ ์ธ๋ผ์ธ ์คํ์ผ์ด ๊ณผ๋ํ๊ฒ ๋ค์ด๊ฐ๊ธฐ ์์ํ๋ฉด, ๋์ ๋ณด์ด์ง ์๋ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋งค์ฐ ์์ฐ์ค๋ฝ๊ฒ ๋๋ฌ๋๊ธฐ ์์ํ๋ค๋ ์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์นด๋ ์์๋ง๋ค style.backgroundColor, style.boxShadow, style.opacity ๊ฐ์ ์คํ์ผ์ ์ง์ ๋ฃ๊ธฐ ์์ํ๋ฉด, ํ๋ฉด์ ๋ฑ์ฅํ๋ ์นด๋๋ง๋ค ์กฐ๊ธ์ฉ ๋ค๋ฅธ ์คํ์ผ์ด ์ธ๋ผ์ธ์ผ๋ก ํฉ์ด์ง๊ฒ ๋ฉ๋๋ค. ์๊ฐ์ด ์ง๋ ๋์์ด๋์ ์๊ตฌ๊ฐ ๋ ๋์ด๋๋ฉด, ํ ์ธ ์ํ์๋ ํ ๋๋ฆฌ ๊ตต๊ธฐ ๋ณํ, ํน์ ์นดํ ๊ณ ๋ฆฌ์๋ hover ์ ๋๋ฉ์ด์ , ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธด ์ํ์๋ ๋ฐฐ์ง๊ฐ ๋ถ๋ ๋ฑ ์กฐ๊ฑด์ด ๋ ๋ค์ํด์ง์ฃ . ์ด๋ฐ ์ํ ์กฐํฉ์ด ๋ชจ๋ ์ธ๋ผ์ธ ์คํ์ผ๋ก ์์ฌ ์์ผ๋ฉด, ์ฝ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ โ์ด ์นด๋๊ฐ ์ด๋ค ์ํ์ผ ๋ ์ด๋ค ์คํ์ผ์ด ์ ์ฉ๋ผ์ผ ํ๋์งโ๋ฅผ ์ถ์ ํ๋ ์ผ์ด ์ ์ ๋ ์ด๋ ค์์ง๋๋ค.์ด ์ํฉ์์ ์คํฌ๋กค ์์น ๊ณ์ฐ์ ์ํด getBoundingClientRect() ๊ฐ์ ๋ ์ด์์ ๊ฐ์ ์ฝ๋ ์ฝ๋๊ฐ ๋ค์ด์ค๋ฉด ๋ฌธ์ ๊ฐ ํ์ธต ๋ ๋ณต์กํด์ง๋๋ค. ์ด API๋ ํ๋ฉด์ ๊ทธ๋ ค์ง ์ต์ ์์น ์ ๋ณด๋ฅผ ๋ฐํํด์ผ ํ๋ฏ๋ก, ๊ทธ ์ง์ ๊น์ง ์์ฌ ์๋ ์ธ๋ผ์ธ ์คํ์ผ ๋ณ๊ฒฝ์ ๋ชจ๋ ๋ฐ์ํ ๋ค์์ผ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค. ์ฆ ๋ธ๋ผ์ฐ์ ๋ ๊ทธ ์์ ์์ ๊ฐ์ ๋ก ๋ ์ด์์์ ๋ค์ ๊ณ์ฐํด์ผ ํ๊ณ , ์คํฌ๋กค ์ค์๋ ์ด ์์ ์ด ๊ฑฐ์ ๋งค ํ๋ ์ ๋ฐ๋ณต๋ฉ๋๋ค. ์ด๋ ๊ฒ โ์คํ์ผ ๋ฐ๊ฟ โ ์ต์ ์์น ์ฝ์ โ ๋ ์คํ์ผ ๋ฐ๊ฟ โ ๋ค์ ์์น ์ฝ์โ์ด ๋ฐ๋ณต๋๋ฉด ํ๋ฉด์ด ๋๋ ๋๊ธฐ๊ธฐ ์์ํ๋๋ฐ, ์ด๋ฐ ์ํฉ์ ๋ณต์กํ ์ฉ์ด๋ก๋ layout thrashing์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ๊ทธ๋ฅ ์ฝ๊ฒ ๋งํ๋ฉด โ๋ธ๋ผ์ฐ์ ๊ฐ ์จ ๋๋ฆด ํ๋ ์์ด ๊ณ์ ์๋ก ๋ ์ด์์์ ์ก๋๋ผ ๋ฐ๋น ์ ๋ฒ๋ฒ ์ด๋ ์ํฉโ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.์ฌ๊ธฐ์ ์ธ๋ผ์ธ ์คํ์ผ์ด ํฉ์ด์ ธ ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ปค์ง๋๋ค. ์ด๋ค ์กฐ๊ฑด์์ ์ด๋ค ์คํ์ผ์ด ์ ์ฉ๋๋์ง ํ ๊ณณ์์ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง๊ณ , ์ด๋ค ๋ณํ๊ฐ ๋ ์ด์์์ ๋ค์ ๊ณ์ฐํ๊ฒ ๋ง๋๋์ง ์ถ์ ํ๊ธฐ๊ฐ ๋งค์ฐ ํ๋ค์ด์ง๋๋ค. ํฌ๋กฌ DevTools๋ก ์ฑ๋ฅ ํ๋กํ์ผ๋ง์ ํด๋, ์คํ์ผ์ด ์ฌ๊ธฐ์ ๊ธฐ ํฉ์ด์ ธ ์์ผ๋ฉด ์์ธ์ด ๋ถ๋ช ํ๊ฒ ๋๋ฌ๋์ง ์๊ธฐ๋ ํฉ๋๋ค.๋ฐ๋๋ก ํด๋์ค ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด .card--discount, .card--loading, .card--hovered ๊ฐ์ ์ํ ํด๋์ค๋ฅผ ๋ช ํํ๊ฒ ๋ง๋ค๊ณ , ์คํ์ผ์ CSS์์ ํ ๋ฒ๋ง ์ ์ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋จ์ง โ์ง๊ธ ์ด ์นด๋๊ฐ ์ด๋ค ์ํ์ธ์งโ๋ง ํด๋์ค๋ก ํ์ํด์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์, UI ์ํ์ ์คํ์ผ์ด ๊น๋ํ๊ฒ ๋ถ๋ฆฌ๋ฉ๋๋ค. ์ด๋ฐ ๊ตฌ์กฐ๋ ๊ธฐ๋ฅ์ด ๋ง์์ง์๋ก ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๊ณ , ๋์ค์ ๋ ์ด์์ ๊ด๋ จ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์๊ฒจ๋ ์ด๋๋ฅผ ๋จผ์ ์ดํด๋ด์ผ ํ๋์ง ํจ์ฌ ๋ช ํํด์ง๋๋ค.๋ฐ๋ผ์ ์ง๋ฌธ์์ ์ฃผ์ ์ฝ๋ ์์ค์์๋ hans๋ ๋ง์์ด ์ ํํ๊ณ , ์ธ๋ผ์ธ ์คํ์ผ ๋๋ฌธ์ ๋ฆฌํ๋ก์ฐ, ๋ฆฌํ์ธํธ๊ฐ ๊ฐ์๊ธฐ ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค. ๋ค๋ง ์ค์๋น์ค ๊ท๋ชจ์์๋ ์ธ๋ผ์ธ ์คํ์ผ์ด ๊ตฌ์กฐ์ ์ธ ํผ๋์ ๋ง๋ค๊ธฐ ์ฝ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ก ์คํฌ๋กค, ์ ๋๋ฉ์ด์ , ๋ฐ์ํ ์ปดํฌ๋ํธ ๋ฑ์ด ์์ธ ์ํฉ์์ ์ฑ๋ฅ ๋ณ๋ชฉ์ผ๋ก ์ด์ด์ง๊ธฐ ์ฌ์ด ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์, ํ์ต ์ด๊ธฐ๋ถํฐ ํด๋์ค๋ฅผ ์ค์ฌ์ผ๋ก ์คํ์ผ์ ๊ด๋ฆฌํ๋ ์ต๊ด์ ๋ค์ด์ จ์ผ๋ฉด ํ๋ ์๋๋ก ์ค๋ช ์ ๋๋ ธ๋ ๊ฒ์ ๋๋ค.์ด๋ฐ ์ง๋ฌธ ๋๋ถ์ ๊ฐ์์์๋ ์์ผ๋ก ๋ ์ง๊ด์ ์ผ๋ก ์ดํดํ ์ ์๋ ์ฌ๋ก์ ์ค์ ํ์ ์์ ๋ง์ฃผ์น๋ ์ํฉ์ ๋ ๋ง์ด ํฌํจํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ ํ๊ฒ ๋์์ต๋๋ค. ๊ฐ์๋ฅผ ๋ ํ๋ถํ๊ณ ์ค์ฉ์ ์ผ๋ก ๋ง๋๋ ๋ฐ ํฐ ๋์์ด ๋์์ต๋๋ค.๊ถ๊ธํ ์ ์ด ์์ผ์๋ฉด ์ธ์ ๋ ํธํ๊ฒ ๋ง์ ๋ถํ๋๋ฆฝ๋๋ค.๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ๋ก, ํ์ฌ ์ ๋ก๋๋ ๋ค์ ๊ฐ์๋ค์์๋ ์ด๋ฒ ์ง๋ฌธ๊ณผ ์ด์ด์ง๋ ํ๋ฆ์ ๋ ๊น๊ฒ ๋ค๋ฃจ๊ณ ์์ผ๋ ์ฐธ๊ณ ํด์ฃผ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฒคํธ๋ถํฐ SPA๊น์ง, ์ํธ์์ฉ ์น์ ํ์ ์์ง์ ๋ค๋ฃฌ [DOM ์์ ์ ๋ณต Part 2], ๊ทธ๋ฆฌ๊ณ DOM์์ ์ค์ ํฝ์ ๋ก ์ด์ด์ง๋ ๋ ๋๋ง ์ฌ์ ์ ๊น๊ฒ ํํค์น [DOM ์์ ์ ๋ณต Part 3]๊น์ง ๋ง์ ๊ด์ฌ ๋ถํ๋๋ฆฝ๋๋ค!๊ฐ์ฌํฉ๋๋ค!
- 0
- 2
- 41
Q&A
์ง๊ธ ์ด ํ๋ฉด์์ ๋ญ๋ก fps๋ฅผ ์ ์ ์๋์?
์๋ ํ์ธ์ ah young kim๋๐์ง๊ธ ๋ณด์ Performance ํจ๋ ํ๋ฉด์์ FPS, ์ฆ ์ด๋น ํ๋ ์ ์๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์๋จ์ โFramesโ ๊ตฌ๊ฐ์ ๋ณด๋ฉด ๋ฉ๋๋ค. ์ด ์์ญ์ ๋ น์ ๋ฐ ํ๋ํ๋๊ฐ ๋ธ๋ผ์ฐ์ ๊ฐ ํ ํ๋ ์์ ๊ทธ๋ฆฐ ์๊ฐ์ ์๋ฏธํ๋ฉฐ, ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด โ33.3 ms Frameโ๊ณผ ๊ฐ์ ํ์๊ฐ ๋ํ๋ฉ๋๋ค. ์ด ๊ฐ์ด ๋ฐ๋ก ํ ํ๋ ์์ ๊ทธ๋ฆฌ๋ ๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ, ์ฆ frame time์ด๋ฉฐ, FPS๋ ์ด ๊ฐ์ ์ด์ฉํด ๊ณ์ฐํ ์ ์์ต๋๋ค. ๊ณ์ฐ์์ FPS = 1000 รท frame time(ms) ์ ๋๋ค. ์๋ฅผ ๋ค์ด ํ ํ๋ ์์ด 33.3ms ๊ฑธ๋ฆฐ๋ค๋ฉด 1000 รท 33.3 = ์ฝ 30fps๊ฐ ๋๊ณ , 16.6ms์ผ ๊ฒฝ์ฐ 1000 รท 16.6 = ์ฝ 60fps๋ก ๊ณ์ฐ๋ฉ๋๋ค. ์ง๊ธ ํ๋ฉด์์๋ ๊ฐ ํ๋ ์์ ์๊ฐ์ด ์ฝ 33ms ์ ๋๋ก ์ธก์ ๋์ด ๋๋ต 30fps ์์ค์ผ๋ก ๋ณผ ์ ์์ต๋๋ค. ์ด ๋ง์ hover์ ๊ฐ์ ์ฌ์ฉ์ ์ธํฐ๋์ ์ด ๋ฐ์ํ์ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํ ํ๋ ์์ ๊ทธ๋ฆฌ๋ ๋ฐ ๋ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ณ ์์์ ์๋ฏธํฉ๋๋ค. FPS๊ฐ ๋ฎ์์ง์๋ก ์ด๋น ๊ทธ๋ฆด ์ ์๋ ํ๋ ์ ์๊ฐ ์ค์ด๋ค์ด ํ๋ฉด์ด ๋๊ธฐ๊ฑฐ๋ ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๋ ํ์์ด ๋ํ๋ฉ๋๋ค. ๋ฐ๋๋ก frame time์ด ์งง์์ง๊ณ FPS๊ฐ ๋์์ง์๋ก ๋ธ๋ผ์ฐ์ ๋ ๋ ๋ง์ ํ๋ ์์ ๋งค๋๋ฝ๊ฒ ์ฒ๋ฆฌํ๊ฒ ๋์ด ์ ๋๋ฉ์ด์ ๊ณผ ์ ํ์ด ๋ถ๋๋ฝ๊ฒ ๋๊ปด์ง๋๋ค.๋ณดํต ์ด๋ ์ ๋ FPS๊ฐ ์ข์๊ฐ๋ฅผ ํ๋จํ ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ค์ ์ฐธ๊ณ ํฉ๋๋ค. 60fps ์ด์์ด๋ฉด ์ด์์ ์ธ ์ํ๋ก, ๋๋ถ๋ถ์ ๊ณ ๊ธ ์ ๋๋ฉ์ด์ ์ด๋ ๊ฒ์์ด ์ด ์์ค์ ๋ชฉํ๋ก ํฉ๋๋ค. 50fps ๊ทผ์ฒ์์๋ ์ฒด๊ฐ์ ์ถฉ๋ถํ ๋ถ๋๋ฝ๊ณ ์์ ์ ์ธ ์์ง์์ ๋ณด์ด๋ฉฐ, ๋๋ถ๋ถ์ ์น ์ธํฐํ์ด์ค์์ ์ด ์ ๋๋ฉด ๋ง์กฑ์ค๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ 30fps ์ดํ๋ก ๋จ์ด์ง๋ฉด hover๋ scroll ์ ๋์ ๋๋ ๋ฒ๋ฒ ์์ด ์๊ธฐ๋ฉฐ, UI ์ ํ์ด ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ํ์ง ์๋ ๋๋์ ์ฃผ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ๊ฐ์ ์ด ํ์ํ๋ค๊ณ ํ๋จํ ์ ์์ต๋๋ค.FPS ์์น๋ง ๋ณด๋ ๊ฒ๋ณด๋ค ์ค์ํ ๊ฒ์ ๊ฐ ํ๋ ์์ ์๊ฐ๊ณผ ํจ๊ป ์ด๋ค ๋ ๋๋ง ๋จ๊ณ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์ผ์ด๋๊ณ ์๋์ง๋ฅผ ํจ๊ป ์ดํด๋ณด๋ ๊ฒ์ ๋๋ค. Performance ํจ๋์ ์๋์ชฝ์๋ Rendering, Painting, Composite ๋จ๊ณ๊ฐ ์๊น๋ณ๋ก ํ์๋๋๋ฐ, ์ด๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ค ์์์ ๋ ๋ง์ด ์ฌ์ฉํ๊ณ ์๋์ง ํ์ ํ ์ ์์ต๋๋ค. Paint ๋จ๊ณ๊ฐ ์์ฃผ ๋ฐ์ํ๋ค๋ฉด CPU๊ฐ ๋งค๋ฒ ํฝ์ ์ ๋ค์ ๊ณ์ฐํ๊ณ ๊ทธ๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฒ๋ฆฌ ์๊ฐ์ด ๊ธธ์ด์ง๊ณ FPS๊ฐ ๋จ์ด์ง ์ ์์ต๋๋ค. ๋ฐ๋๋ก Composite ๋จ๊ณ์์ ๋๋ถ๋ถ์ ์์ ์ด ์ฒ๋ฆฌ๋๋ค๋ฉด GPU๊ฐ ๋ ์ด์ด ํฉ์ฑ์ ๋ด๋นํ๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๊ฐ๋ณ๊ณ ํจ์จ์ ์ธ ๋ ๋๋ง์ด ์ด๋ฃจ์ด์ง๋๋ค. ๋ฐ๋ผ์ Paint ๋ธ๋ก์ ๋น๋๋ฅผ ์ค์ด๊ณ Composite ์์ฃผ๋ก ์ต์ ํํ๋ ๊ฒ์ด FPS ์์ ์ฑ๊ณผ ๋ ๋๋ง ํจ์จ์ ๋์์ ๋์ด๋ ํต์ฌ์ ๋๋ค.์ค๋ฌด์์๋ ๋จ์ํ ์ฝ๋ ์ต์ ํ๋ฟ ์๋๋ผ, CSS, HTML, JS ๋ชจ๋๊ฐ ๋ ๋๋ง ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. CSS ์ธก๋ฉด์์๋ transform, opacity ๋ฑ GPU ๊ฐ์์ด ๊ฐ๋ฅํ ์์ฑ์ ํ์ฉํ๊ณ , top, left์ฒ๋ผ layout์ด๋ paint๋ฅผ ์ ๋ฐํ๋ ์์ฑ์ ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. box-shadow, filter, border-radius์ ๊ฐ์ ์๊ฐ ํจ๊ณผ๋ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด Paint ๋น์ฉ์ด ์ปค์ง๋ฏ๋ก ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. HTML ๊ตฌ์กฐ์์๋ ๋ถํ์ํ๊ฒ ์ค์ฒฉ๋ ์๋ฆฌ๋จผํธ๋ฅผ ์ค์ด๊ณ , display ๋ณ๊ฒฝ์ด ์ฆ์ ์์๋ฅผ ๋ณ๋์ ๋ ์ด์ด๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋์์ด ๋ฉ๋๋ค. JavaScript์์๋ ์ฐ์ฐ์ด ๋ฌด๊ฑฐ์ด ๋ฃจํ๋ ๋๊ธฐ ์ฒ๋ฆฌ ๋ก์ง์ ์ต์ํํ๊ณ , requestAnimationFrame์ ์ด์ฉํด ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ํ์ด๋ฐ์ ๋ง์ถฐ ์ ๋๋ฉ์ด์ ์ ์ํํ๋ฉด ํจ์ฌ ์์ฐ์ค๋ฝ๊ณ ํจ์จ์ ์ธ ํ๋ ์ ํ์ด๋ฐ์ ์ ์งํ ์ ์์ต๋๋ค.๊ฒฐ๊ตญ FPS๋ฅผ ์ ๋๋ก ๋ถ์ํ๋ ค๋ฉด Performance ํจ๋์ Frames ์์ญ์์ frame time์ ํ์ธํ๊ณ , FPS = 1000 รท frame time(ms) ๊ณต์์ ํตํด ์ด๋น ํ๋ ์ ์๋ฅผ ๊ณ์ฐํ๋ฉฐ, Paint์ Composite ๋จ๊ณ์ ๋ถํฌ๋ฅผ ํจ๊ป ๋ณด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. 16.6ms ๊ทผ์ฒ์ frame time, ์ฆ 60fps์ ๊ฐ๊น์ด ์ํ๊ฐ ๊ฐ์ฅ ์ด์์ ์ด๊ณ , 50fps๊น์ง๋ ์ถฉ๋ถํ ๋ถ๋๋ฝ๋ค๊ณ ํ๊ฐํ ์ ์์ผ๋ฉฐ, 30fps ์ดํ์์๋ ์ฌ์ฉ์ ๊ฒฝํ์ด ๊ธ๊ฒฉํ ๋จ์ด์ง๋๋ค. ์ด๋ ๋ ๋๋ง ๋จ๊ณ๋ณ ๋ถ๋ด์ ์ค์ด๊ณ CSSยทHTMLยทJS ์ฝ๋๋ฅผ GPU ์นํ์ ์ผ๋ก ๊ตฌ์ฑํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ๋ ๊ฐ๋ณ๊ณ ํจ์จ์ ์ผ๋ก ๋์ํ๋ฉฐ ํ๋ฉด ์ ํ์ด ๋์ ๋๊ฒ ๋งค๋๋ฌ์์ง๋๋ค. ์ด๋ฐ ์ ์ ํจ๊ป ๊ณ ๋ คํ๋ฉด ๋จ์ํ FPS ์์น๋ฅผ ๋์ด๋ ๊ฒ์ ๋์ด, ์ค๋ฌด ํ๊ฒฝ์์๋ ์์ ์ ์ด๊ณ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ค๊ณํ ์ ์์ต๋๋ค.
- 0
- 2
- 68
Q&A
๋ง์ฝ ๋ฌธ์ ์๊ฐ ๋งค์ฐ ๋ง์์ง๋ค๋ฉด ์ฑ๋ฅ ์ด์๋ ์์๊น์?
์๋ ํ์ธ์ ์๋ฐฅ๋ ๐์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.์ด ๋ด์ฉ์์ ๋ค๋ฃจ๋ ์ต์ ํ ๋ฐฉ๋ฒ์ ์์ ํ ์ดํดํ๋ ค๋ฉด ์ฝ๊ฐ์ ์ปดํจํฐ ๊ณผํ์ ๋ฐฐ๊ฒฝ ์ง์์ด ํ์ํฉ๋๋ค.ํนํ ๋ค์ ์ธ ๊ฐ์ง ๊ฐ๋ ์ ์๊ณ ์์ผ๋ฉด ํจ์ฌ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.์ฒซ์งธ๋ ์๊ฐ ๋ณต์ก๋(Time Complexity) ๊ฐ๋ ์ผ๋ก, ์ด๋ค ์ฝ๋๊ฐ ๋ฐ์ดํฐ์ ์์ด ๋์ด๋ ์๋ก ์ผ๋ง๋ ๋๋ ค์ง๋์ง๋ฅผ ๋ํ๋ด๋ ์งํ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐฐ์ด์ ์ฒ์๋ถํฐ ๋๊น์ง ๋ชจ๋ ํ๋ ์ฝ๋๋ O(n), ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ์ด ์๋ ์ฝ๋๋ O(nยฒ)์ฒ๋ผ ํํํฉ๋๋ค.๋์งธ๋ ์๋ฃ๊ตฌ์กฐ(Data Structure) ์ค ๋ฐฐ์ด(Array)๊ณผ ๋งต(Map, ํด์๋งต HashMap)์ ๋๋ค. ๋ฐฐ์ด์ ์์๋๋ก ์ ์ฅํ๋ ๊ตฌ์กฐ์ด์ง๋ง ๊ฒ์ํ ๋๋ ์ฒ์๋ถํฐ ๋๊น์ง ์ฐพ์์ผ ํ๊ณ , ๋งต์ ํค(key)๋ฅผ ์ด์ฉํด ๊ฐ์ ๊ฑฐ์ ์ฆ์ ์ฐพ์ ์ ์๋ ๊ตฌ์กฐ์ ๋๋ค.์ ์งธ๋ ์ธ๋ฑ์ค(Index) ๊ฐ๋ ์ผ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ฒ์ ์์คํ ์์ โํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๋ ์ฐธ์กฐ์ฉ ์ง๋โ๋ฅผ ๋งํฉ๋๋ค.์ด ์ธ ๊ฐ์ง ๊ฐ๋ ์ด ์ด ๊ธ์ ๋ชจ๋ ์ต์ ํ ๋ ผ๋ฆฌ์ ํ ๋๊ฐ ๋ฉ๋๋ค.์ง๊ธ์ ๊ตฌ์กฐ๋ state.docs ๋ฐฐ์ด ์ ์ฒด๋ฅผ ๋งค๋ฒ find()๋ filter()๋ก ํ์ด๋ณด๋ ๋ฐฉ์์ด๋ผ, ๋ฌธ์๊ฐ ์๋ฐฑ ๊ฐ๋ ์์ฒ ๊ฐ๋ก ๋์ด๋๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ฑ๋ฅ ์ ํ๊ฐ ์๊น๋๋ค. ์ด๋ฐ์๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์์ด ๋ณด์ฌ๋, ํธ๋ฆฌ ๋ ๋๋ง์ด ์ผ์ด๋ ๋ ๊ฐ ๋ ธ๋๋ง๋ค childrenOf()๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถ๋๊ณ , ๊ฑฐ๊ธฐ์ ๋ฌธ์ ์ด๋, ์ ๋ชฉ ์์ , ์ฆ๊ฒจ์ฐพ๊ธฐ ํ ๊ธ ๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋์์ ์ผ์ด๋๋ฉด ํ ํ๋ ์ ์์์ ์ ํ ํ์์ด ์ฌ๋ฌ ๋ฒ ๊ฒน์น๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ฒด๊ฐ์ O(nยฒ) ํํ๋ก ๋๋ ค์ ธ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ์ ๋ฉ์ถ๋ ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.์ด ๋ฌธ์ ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํ๋ ค๋ฉด ์ธ ๊ฐ์ง๊ฐ ํจ๊ป ๊ณ ๋ ค๋์ด์ผ ํฉ๋๋ค. ์ฒซ์งธ, ์กฐํ๋ฅผ ๊ฑฐ์ ์ฆ์ ๋๋ผ ์ ์๊ฒ ๋ง๋๋ ์ธ๋ฑ์ค ๊ตฌ์กฐ ์ค๊ณ. ๋์งธ, DOM ๊ฐฑ์ ์์ฒด๋ฅผ ์ต์ํํ๋ ๋ ๋๋ง ๋ฐฉ์. ์ ์งธ, ์ ์ฅ๊ณผ ๋ ๋ ํธ์ถ ๋น๋๋ฅผ ์กฐ์ ํด ๋ฉ์ธ ์ค๋ ๋๊ฐ ๊ฐ์๊ธฐ ๊ณผ๋ถํ๋์ง ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.์ด ์๋ฆฌ๋ฅผ ์กฐ๊ธ ๋ ์ฝ๊ฒ ์ค๋ช ํ๋ฉด โ์์ฃผ ์ผ์ด๋๋ ์ผ์ ์ต๋ํ ๋น ๋ฅด๊ฒ, ๋๋ฌผ๊ฒ ์ผ์ด๋๋ ์ผ์ ์กฐ๊ธ ๋๋ ค๋ ๊ด์ฐฎ๊ฒ ๋ง๋ ๋คโ๋ ๊ฐ๋ ์ ๋๋ค. ๋ฌธ์ ํ์์ ๋งค์ฐ ์์ฃผ ์ผ์ด๋๋ ์์ ์ด๋ฏ๋ก ๋ฐ๋์ ๋น ๋ฅด๊ฒ ๋ง๋ค์ด์ผ ํ๊ณ , ๋ฐ๋ฉด ๋ฌธ์๋ฅผ ์๋ก ๋ง๋ค๊ฑฐ๋ ์ด๋ํ๊ฑฐ๋ ์ญ์ ํ๋ ์ผ์ ์๋์ ์ผ๋ก ๋ ์์ฃผ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ง ์ฝ๊ฐ์ ์ถ๊ฐ ๋น์ฉ์ ๋ด๋ ์ ์ฒด ์ฑ์ ์ฒด๊ฐ ์๋๋ ํจ์ฌ ๋นจ๋ผ์ง๋๋ค.์ด ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ ๋๊ตฌ๊ฐ ๋ฐ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ Map์ ๋๋ค.Map์ ์ผ๋ฐ ๊ฐ์ฒด(Object)์ ๋น์ทํ๊ฒ ํค(key)์ ๊ฐ(value)์ ์ง์ง์ด ์ ์ฅํ๋ ์๋ฃ ๊ตฌ์กฐ์ด์ง๋ง, ๋ช ๊ฐ์ง ์ค์ํ ์ฐจ์ด๊ฐ ์์ต๋๋ค.์ฒซ์งธ, Map์ ์ด๋ค ํ์ ์ด๋ ํค๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ซ์, ๋ฌธ์์ด๋ฟ ์๋๋ผ ๊ฐ์ฒด๋ ์ฌ๋ณผ๋ ๊ฐ๋ฅํฉ๋๋ค.๋์งธ, get, set, has, delete, size ๊ฐ์ ์ ์ฉ ๋ฉ์๋๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ฝ๊ณ ์ธ ์ ์์ต๋๋ค.์ ์งธ, Map์ ๋ด๋ถ์ ์ผ๋ก ํด์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ๊ท ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ฑฐ๋ ๋ฃ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ๊ฑฐ์ ์ผ์ ํฉ๋๋ค. ์ฆ, ๋ฐ์ดํฐ๊ฐ ์๋ฌด๋ฆฌ ๋ง์์ ธ๋ ์กฐํ ์๋๊ฐ ๊ฑฐ์ ๋ณํ์ง ์์ต๋๋ค.์ด๊ฑธ ์ ํ๋ฒํธ๋ถ๋ก ๋น์ ํด ๋ณด๋ฉด ํจ์ฌ ์ง๊ด์ ์ ๋๋ค.์ผ๋ฐ ๋ฐฐ์ด์ ํ์ํ๋ ๊ฒ์ ๋ง์น โ์ ํ๋ฒํธ๋ถ๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ํ ์ค์ฉ ๋๊ธฐ๋ฉฐ ์ด๋ฆ์ ์ฐพ๋ ๋ฐฉ์โ์ด๋ผ๋ฉด, Map์ โ์ด๋ฆ์ ์ ๋ ฅํ์๋ง์ ๋ฐ๋ก ๋ฒํธ๊ฐ ๋จ๋ ์ค๋งํธํฐ ์ฐ๋ฝ์ฒ ๊ฒ์โ์ ๊ฐ๊น์ต๋๋ค.์ด์ฒ๋ผ Map์ ์ด์ฉํ๋ฉด id๋ก ๋ฌธ์๋ฅผ ์ฆ์ ์ฐพ๊ฑฐ๋ ํน์ ๋ถ๋ชจ ID์ ์ํ ์์ ๋ฌธ์๋ค์ ํ ๋ฒ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.์ด ์๋ฆฌ๋ฅผ ํ์ฌ ์ฝ๋์ ์ ์ฉํ๋ ค๋ฉด ๋ ๊ฐ์ง ๊ด์ ์์ ์ธ๋ฑ์ค๋ฅผ ์ค๊ณํ๋ฉด ๋ฉ๋๋ค.ํ๋๋ id โ ๋ฌธ์ ๊ฐ์ฒด ํํ์ ์ธ๋ฑ์ค์ด๊ณ ,๋ค๋ฅธ ํ๋๋ parentId โ [์์ ๋ฌธ์๋ค] ํํ์ ์ธ๋ฑ์ค์ ๋๋ค.์ฑ์ด ์ฒ์ ์คํ๋ ๋ ํ ๋ฒ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ํ์ด์ ์ด ๋ ์ธ๋ฑ์ค๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ณ , ์ดํ์๋ ๋ฌธ์๊ฐ ์๋ก ๋ง๋ค์ด์ง๊ฑฐ๋ ์์ ๋๊ฑฐ๋ ์ด๋๋๊ฑฐ๋ ์ญ์ ๋ ๋๋ง๋ค ์ธ๋ฑ์ค๋ฅผ ์ฆ์ ๊ฐฑ์ ํ๋๋ก ์ ์งํ๋ฉด ๋ฉ๋๋ค.์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์๋ฅผ ์ฐพ์ ๋ ์ ์ฒด ๋ฐฐ์ด์ ํ์ ํ์๊ฐ ์๊ณ , ํ์ํ ์ ๋ณด๋ง ์ฆ์ ๊บผ๋ด์ฌ ์ ์์ต๋๋ค. ๋ํ ๋ณ๊ฒฝ ์์๋ ๊ทธ ๋ถ๋ชจ์ ํด๋นํ๋ ์์ ๊ทธ๋ฃน๋ง ๋ค์ ์ ๋ ฌํ๋ฉด ๋๋ฏ๋ก ์ ์ฒด๋ฅผ ๋ค์ ๊ณ์ฐํ ํ์๊ฐ ์์ต๋๋ค.์ ๋ ฌ ๊ธฐ์ค์ ๊ธฐ์กด๊ณผ ๋์ผํ๊ฒ order๋ฅผ ์ฐ์ ์ผ๋ก ํ๊ณ , ๊ฐ์ด ๊ฐ์ ๋๋ง title์ ๋น๊ตํ๋ ๊ฒ์ด ์ข์ต๋๋ค. localeCompare๋ CPU ๋น์ฉ์ด ์๋์ ์ผ๋ก ํฌ๊ธฐ ๋๋ฌธ์ ๋ณด์กฐ ๋น๊ต๋ก๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์ ๋๋ค.์๋ ์ฝ๋๋ ์ด๋ฐ ์ธ๋ฑ์ค๋ฅผ ์ค์ ๋ก ๊ตฌํํ๋ ์ต์ํ์ ์์์ ๋๋ค. ํธ์ถ๋ถ๋ ๊ทธ๋๋ก ๋๊ณ , ๋ด๋ถ ๋์๋ง ๊ต์ฒดํ๋ ๋ฐฉ์์ด๋ผ ์ ์ฒด ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ์ง ์์๋ ์์ ํ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.// ์ธ๋ฑ์ค const index = { byId: new Map(), byParent: new Map() }; const byOrder = (a,b)=> (a.order - b.order) || a.title.localeCompare(b.title); function ensureBucket(pid){ const key = pid ?? null; if (!index.byParent.has(key)) index.byParent.set(key, []); return index.byParent.get(key); } function buildIndexes(){ index.byId.clear(); index.byParent.clear(); for (const d of state.docs){ index.byId.set(d.id, d); ensureBucket(d.parentId).push(d); } for (const arr of index.byParent.values()) arr.sort(byOrder); } // ์กฐํ ํฌํผ ๋ด๋ถ ๊ตฌํ๋ง ๊ต์ฒด function findDoc(id){ return index.byId.get(id) || null; } function childrenOf(pid){ const bucket = index.byParent.get(pid ?? null) || []; return bucket.slice(); // ์ธ๋ถ ๋ณํ ๋ฐฉ์ง } ์ฌ๊ธฐ์ ๋์ค๋ โ๋ฒํท(bucket)โ์ด๋ผ๋ ๋จ์ด๋, ๊ฐ์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง ๋ฌธ์๋ค์ ํ๋์ ๋ฌถ์ ๋จ์๋ก ์ ์ฅํด ๋ ๋ฐฐ์ด์ ๋ปํฉ๋๋ค.์ฆ, index.byParent๋ผ๋ Map ์์ ๋ถ๋ชจ ID โ [ํด๋น ๋ถ๋ชจ์ ์์ ๋ฌธ์ ๋ชฉ๋ก]์ด ์ ์ฅ๋๋๋ฐ, ์ด ์์ ๋ฌธ์ ๋ฐฐ์ด ํ๋ํ๋๊ฐ ๋ฐ๋ก โ๋ฒํทโ์ ๋๋ค.์ฝ๊ฒ ๋งํด, โํ ๋ถ๋ชจ ๋ฐ์ ์๋ ์์ด๋ค ํด๋๋ฅผ ํ ๋ฐ๊ตฌ๋(bucket)์ ๋ด์๋๊ณ , ๋ถ๋ชจ๋ณ๋ก ๋ฐ๊ตฌ๋๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ๋ ๊ตฌ์กฐโ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.์ด ๋๋ถ์ ํน์ ๋ถ๋ชจ ๋ฐ์ ์์ ๋ฌธ์๋ค๋ง ๋น ๋ฅด๊ฒ ์ฐพ๊ฑฐ๋ ์ ๋ ฌํ ์ ์์ต๋๋ค.์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ โํญ์ ์ต์ ์ํ๋ฅผ ์ ์งํ๋ ๊ฒโ์ ๋๋ค.Map ๊ตฌ์กฐ๋ ๋น ๋ฅด์ง๋ง, ํ ๊ณณ์ด๋ผ๋ ๊ฐฑ์ ์ ๋์น๋ฉด ์ค์ ๋ฐ์ดํฐ(state.docs)์ ์ธ๋ฑ์ค(Map) ์ฌ์ด์ ๋ถ์ผ์น๊ฐ ์๊น๋๋ค.๋ฐ๋ผ์ createDoc, updateDoc, moveDoc, archiveDoc, restoreDoc, removeDoc ๋ฑ ๋ชจ๋ ๋ณ๊ฒฝ ํจ์๊ฐ ๋ฐ๋์ ์ธ๋ฑ์ค๋ฅผ ํจ๊ป ๊ฐฑ์ ํด์ผ ํฉ๋๋ค.์ด๊ฑธ ๋ณด์ฅํ๊ธฐ ์ํด ๊ธฐ์กด ํจ์๋ฅผ ์๊ฒ ๊ฐ์ธ์ โ์ํ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋๋ง๋ค ์ธ๋ฑ์ค๋ ํจ๊ป ๊ฐฑ์ ๋๋๋กโ ๋ง๋๋ ๊ฒ์ด ์์ ํ ๋ฐฉ์์ ๋๋ค.๊ทธ ์๋ฆฌ๋ ๊ฐ๋จํฉ๋๋ค.๋ฌธ์๋ฅผ ์๋ก ๋ง๋ค๋ฉด byId์ ๋ฑ๋กํ๊ณ , ํด๋น ๋ถ๋ชจ์ ๋ฒํท(์ฆ, ์์ ๋ฌธ์ ๋ฐฐ์ด)์ ์ ๋ฌธ์๋ฅผ ์ ๋ ฌ๋ ์์น์ ๋ผ์ ๋ฃ์ต๋๋ค.์ ๋ชฉ์ด๋ ์์๋ฅผ ๋ฐ๊พธ๋ฉด ๊ฐ์ ๋ถ๋ชจ ๋ฒํท ์์์ ํ ๋ฒ ๋นผ๊ณ ์ ๋ ฌ ๊ธฐ์ค์ ๋ง๊ฒ ๋ค์ ๋ฃ์ต๋๋ค.๋ฌธ์๋ฅผ ๋ค๋ฅธ ๋ถ๋ชจ๋ก ์ฎ๊ธธ ๋๋ ์ด์ ๋ถ๋ชจ์ ๋ฒํท์์ ์ ๊ฑฐํ๊ณ ์ ๋ถ๋ชจ์ ๋ฒํท์ ์ถ๊ฐํฉ๋๋ค.์์นด์ด๋ธ๋ ์์ ๊ณผ ์์๋ค์ ์ธ๋ฑ์ค์์ ์ ๊ฑฐํ๊ณ , ๋ณต์์ ๋ฐ๋๋ก ๋ค์ ์ฝ์ ํฉ๋๋ค.ํนํ ์ด๋์ด๋ ์์ ๊ฐ์ ๊ฒฝ์ฐ๋ โ์ด์ ๋ถ๋ชจโ์ โ์ ๋ถ๋ชจโ๋ฅผ ๊ตฌ๋ถํด์ ๋ ๋ค ์ ๋ฐ์ดํธํด์ผ ๋ฒํท์ด ๊ผฌ์ด์ง ์์ต๋๋ค.// createDoc ๋ํ ์๋ฆฌ: ์ํ ๋ฐ์ โ byId ๋ฑ๋ก โ ๋ถ๋ชจ ๋ฒํท์ ์ ๋ ฌ ์ฝ์ const _createDoc = createDoc; createDoc = function(payload){ const id = _createDoc(payload); const d = state.docs.find(x => x.id === id); index.byId.set(id, d); // ์ ๋ ฌ ๋น์ฉ ์ต์ํ๋ฅผ ์ํด '์ด์ง ์ฝ์ ' ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ค์ด๊ฐ ์์น๋ง ์ฐพ์ ๋ฃ๋ ๊ฒ์ด ์ ๋ฆฌ const arr = ensureBucket(d.parentId); let lo=0, hi=arr.length; while(lo>1; (byOrder(arr[mid], d)๋ ๋๋ง๊ณผ ๊ด๋ จ๋ ๋ณ๋ชฉ์ ์กฐํ์๋ ๋ณ๋์ ๋ฌธ์ ์ ๋๋ค.์๋ฅผ ๋ค์ด childrenOf()๋ฅผ ํ ํจ์ ์์์ ์ฌ๋ฌ ๋ฒ ๋ถ๋ฅด๋ฉด ๋งค๋ฒ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๊ฒ ๋๋ฏ๋ก ๋ถํ์ํ ์ฐ์ฐ์ด ์์ด๊ฒ ๋ฉ๋๋ค.์ด๋ด ๋๋ ํ ๋ฒ๋ง ํธ์ถํด ๋ณ์์ ์ ์ฅํด ๋๊ณ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ํจ์จ์ ์ ๋๋ค.๋ํ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋ถ๋ชจ ์น์ ๋ง ๋ถ๋ถ์ ์ผ๋ก ๋ค์ ๊ทธ๋ฆฌ๋๋ก ๋ถ๊ธฐํ๋ฉด ์ฒด๊ฐ ์๋๊ฐ ๋์ ๋๊ฒ ์ข์์ง๋๋ค.๋ง์ฝ ํ ํ๋ฉด์ ์์ฒ ๊ฐ์ ๋ฌธ์๋ฅผ ํผ์ณ์ ๋ณด์ฌ์ค์ผ ํ๋ ์ํฉ์ด๋ผ๋ฉด, ํ๋ฉด์ ์ค์ ๋ก ๋ณด์ด๋ ๋ถ๋ถ๋ง ๋ ๋๋งํ๋ โ๊ฐ์ ์คํฌ๋กค(virtual scroll)โ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ๋ ์ข์ ์ ํ์ ๋๋ค.๊ทธ๋ฆฌ๊ณ normalizeOrders(pid) ํจ์๋ ์ด๋ฏธ byParent ๋ฒํท์ด ์ ๋ ฌ๋์ด ์์ผ๋, ๊ตณ์ด ๋ค์ ์ ๋ ฌ์ ๋ฐ๋ณตํ์ง ๋ง๊ณ ๊ทธ ์์๋๋ก 0๋ถํฐ ์์ ๋ฒํธ๋ฅผ ๋ค์ ๋งค๊ธฐ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.์ ๋ชฉ ๊ฒ์์ด๋ ์ ๋ ฌ์ด ์์ฃผ ๋ฐ์ํ๋ค๋ฉด, titleLower ์์ฑ์ ๋ฌธ์์ ์ถ๊ฐํด๋์ด ๋ฏธ๋ฆฌ ์๋ฌธ์๋ก ์ ์ฅํด๋๋ ๊ฒ๋ ์ข์ต๋๋ค.์ด๋ ๊ฒ ํ๋ฉด ๋งค๋ฒ toLowerCase()๋ฅผ ํธ์ถํ์ง ์์ CPU ์ฌ์ฉ๋์ ์ค์ผ ์ ์์ต๋๋ค.// renderNode ์์์ ์ค๋ณต ํธ์ถ์ ์์ ๋ ๊ฐ๋จํ ํํ const kids = childrenOf(doc.id); const hasChildren = kids.length > 0; // hasChildren ์ฌ์ฉ ๋ฐ kids ์ฌ์ฌ์ฉ โฆ ์ ์ฅ๊ณผ ๋ ๋ ํธ์ถ์ ์ฌ์ฉ์์ ์กฐ์์ด ๋น ๋ฅด๊ฒ ์ด์ด์ง ๋ ์งง์ ์๊ฐ ์์ ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ ์ ์์ต๋๋ค.์ด๋ด ๋ localStorage ์ ์ฅ์ด ๋๋ฌด ์์ฃผ ์ผ์ด๋๋ฉด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ ์ ๋ฉ์ถ๊ฒ ๋ง๋ค์ด ๋ธ๋ผ์ฐ์ ๊ฐ ๋๊ธฐ๋ ๋๋์ ์ค ์ ์์ต๋๋ค.๋ฐ๋ผ์ ์ ์ฅ ํจ์๋ฅผ ๋ฐ๋ก ์คํํ์ง ์๊ณ , ์ฝ๊ฐ์ ์ง์ฐ์ ๋ฌ์ ์ผ์ ์๊ฐ ๋์ ์์ฒญ์ด ์ฌ๋ฌ ๋ฒ ๋ค์ด์ค๋ฉด ํ ๋ฒ๋ง ์คํ๋๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฅผ โ์ฐ๋กํ(throttle)โ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.์ฐ๋กํ์ ์ถ๊ฐํ๋ฉด ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์๋ ํ๋ฉด์ด ํจ์ฌ ๋ถ๋๋ฌ์์ง๋๋ค.let saveQueued = false; function saveThrottled(){ if (saveQueued) return; saveQueued = true; setTimeout(()=>{ save(); saveQueued = false; }, 250); } ์ด ๊ตฌ์กฐ๋ฅผ ์ ์ฉํ ๋ ๋ฐ๋์ ์ง์ผ์ผ ํ ์ ์ด ์์ต๋๋ค.์ฒซ์งธ, load()๊ฐ ์คํ๋ ์งํ ๋จ ํ ๋ฒ buildIndexes()๋ฅผ ํธ์ถํด ์ด๊ธฐ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๋์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.๋์งธ, ๋ฌธ์๋ฅผ ์์ฑํ๊ฑฐ๋ ์์ ํ๊ฑฐ๋ ์ด๋ํ๋ ๋ฑ ๋ชจ๋ ๋ณ๊ฒฝ ํจ์๊ฐ ๋ฐ๋์ ์ธ๋ฑ์ค์ ๋๊ธฐํ๋์ด์ผ ํฉ๋๋ค.์ ์งธ, findDoc()๊ณผ childrenOf()์ ์ด๋ฆ๊ณผ ์ธ์ ๊ตฌ์กฐ๋ ๊ทธ๋๋ก ์ ์งํด์ผ ๊ธฐ์กด ์ฝ๋๋ค์ด ๋ชจ๋ ์ ์์ ์ผ๋ก ๋์ํฉ๋๋ค.์ด๋ ๊ฒ ํ๋ฉด ์กฐํ๋ ํญ์ ๋น ๋ฅด๊ฒ ์ ์ง๋๊ณ , ๋ ๋๋ง์ ํ์ํ ๋ถ๋ถ๋ง ๋ค์ ๊ทธ๋ฆฌ๊ฒ ๋๋ฉฐ, ์ ์ฅ์ ์ฐ๋กํ ๋๋ถ์ ๋ถ๋๋ฝ๊ฒ ์ด๋ฃจ์ด์ง๋๋ค.์ด ๋ฐฉ๋ฒ์ ๋ฌธ์๊ฐ ์๋ฐฑ ๊ฐ ์ ๋๋ฐ์ ๋์ง ์์๋ ํธ๋ฆฌ ์ ์ฒด๋ฅผ ์์ฃผ ๋ ๋๋งํ๊ฑฐ๋ ๋ฌธ์ ์ด๋์ด ์ฆ์ ์ํฉ์์ ํฐ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.Map ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ๋๋ฐ๋ ์ฌ์ ํ ํ๋ ์ ๋๋์ด ๋๊ปด์ง๋ค๋ฉด, ๋จผ์ childrenOf()์ ์ค๋ณต ํธ์ถ์ ์์ ๊ณ , ์ ์ฒด๋ฅผ ์๋ก ๊ทธ๋ฆฌ๋ ๋์ ํ์ํ ๋ถ๋ถ๋ง ๋ค์ ๊ทธ๋ฆฌ๋๋ก ๋ฐ๊พธ๋ ๊ฒ์ด ๋น์ฉ ๋๋น ํจ๊ณผ๊ฐ ๊ฐ์ฅ ํฝ๋๋ค.๋ฐ์ดํฐ๊ฐ ์์ฒ ๊ฐ๋ก ๋์ด๋๊ฑฐ๋ ํ ํ๋ฉด์์ ์๋ง์ ๋ ธ๋๋ฅผ ๋์์ ํผ์ณ์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ ์คํฌ๋กค์ ํจ๊ป ๋์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.์ ์ฅ ์ฐ๋กํ์ ์ด๋ค ๊ท๋ชจ์์๋ ์ ์ฉํ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํํด ๋๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.๊ฒฐ๊ตญ ํต์ฌ์ ๋จ์ํฉ๋๋ค.Map ์ธ๋ฑ์ค ๋ ๊ฐ(byId, byParent)๋ฅผ ๋ง๋ค์ด ๋ฌธ์๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ๊ณ , ์ค๋ณต ํธ์ถ์ ์ ๊ฑฐํด DOM ์ฐ์ฐ๋์ ์ค์ด๋ฉฐ, ์ ์ฅ๊ณผ ๋ ๋๋ง์ ์ฐ๋กํ๋ก ์ ์ดํด ๋ฉ์ธ ์ค๋ ๋๊ฐ ๋ฒ๋ฒ ์ด์ง ์๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค.์ด ์ธ ๋จ๊ณ๋ฅผ ํจ๊ป ์ ์ฉํ๋ฉด, ๋ฌธ์ ์๊ฐ ์์ฒ ๊ฐ๋ก ๋์ด๋๋๋ผ๋ ํ์ฌ ์ฝ๋ ๊ธฐ๋ฐ์์ ๋ถ๋๋ฝ๊ณ ์์ ์ ์ธ ์ฑ๋ฅ์ ์ ์งํ ์ ์์ต๋๋ค.๋ ํ ๊ฐ์ง ๋ง๋ถ์ด์๋ฉด, ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฅ๊ธฐ๊ฐ ๋ณด๊ดํ๊ฑฐ๋ ํญ ๊ฐ ๋๊ธฐํ๊ฐ ํ์ํ ์ํฉ์ด๋ผ๋ฉด, ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ Map ์ธ๋ฑ์ค๋ง์ผ๋ก๋ ๋ถ์กฑํ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ IndexedDB ๊ฐ์ ๋ธ๋ผ์ฐ์ ๋ด์ฅ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํจ๊ป ํ์ฉํด ์ธ๋ฑ์ค๋ฅผ ๋์คํฌ์ ์บ์ ํํ๋ก ์ ์ฅํด ๋๋ฉด, ์๋ก๊ณ ์นจ ํ์๋ ๋น ๋ฅธ ์ด๊ธฐ ์กฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ๋์คํฌ ์์ชฝ์์ ๊ท ํ ์กํ ๊ตฌ์กฐ๋ก ๋ ์์ ์ ์ธ ์ฑ๋ฅ์ ์ป์ ์ ์์ต๋๋ค.๊ฐ์ฌํฉ๋๋ค!
- 0
- 2
- 65
Q&A
CSS๊น์ง๋ง ์ง์ฐ์ ์ํฅ์ ์ฃผ๋๊ฑด๊ฐ์?
์๋ ํ์ธ์, ์ ์์ง๋ ๐DOM๊ณผ CSSOM์ด ๊ฒฐํฉ๋์ด ๋ ๋ ํธ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง ๋ค์์์ผ ์ค์ ํ๋ฉด์ด ๊ทธ๋ ค์ง๋ค๋ ์๋ฆฌ๋ฅผ ์ ํํ ์ดํดํ๊ณ ๊ณ์๋ค์. ์ด ๊ฐ๋ ์์ script ํ๊ทธ์ ๋์ ๋ฐฉ์์ ๋ ๊น์ด ์ดํดํ๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ป๊ฒ ๋ ๋๋ง์ ๋ฉ์ถ๊ฑฐ๋ ์ด์ด๊ฐ๋ฉฐ, async์ defer ์์ฑ์ด ์ค์ ๋ก CRP(Critical Rendering Path, ์ค์ ๋ ๋๋ง ๊ฒฝ๋ก) ์ ์ด๋ค ์ํฅ์ ์ฃผ๋์ง๋ฅผ ์์ ํ ์ฒด๊ฐํ์ค ์ ์์ต๋๋ค.๋ธ๋ผ์ฐ์ ๋ HTML ๋ฌธ์๋ฅผ ์์์ ์๋๋ก ์ฝ์ด๊ฐ๋ฉฐ DOM(Document Object Model) ์ ์์ฑํ๊ณ , ๋์์ ์ธ๋ถ CSS ํ์ผ์ ์์ฒญํด CSSOM(CSS Object Model) ์ ๋ง๋ญ๋๋ค.์ด ๋ ๊ตฌ์กฐ๊ฐ ๋ชจ๋ ์ค๋น๋์ด์ผ ๋ธ๋ผ์ฐ์ ๋ Render Tree๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.Render Tree๊ฐ ์์ฑ๋๋ฉด ๊ทธ๋์์ผ Layout(์์์ ์์น ๊ณ์ฐ)๊ณผ Paint(ํฝ์ ๊ทธ๋ฆฌ๊ธฐ) ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ํ๋ฉด์ ํ์ํ๊ฒ ๋ฉ๋๋ค.์ด ์ผ๋ จ์ ๊ณผ์ ์ ์ฒด๋ฅผ Critical Rendering Path๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.์ฌ๊ธฐ์ โHTML์ ์ฝ๋๋คโ๋ ๊ฒ์ ์ฌ๋์ ๋์ผ๋ก ์ฝ๋ ๊ฒ์ด ์๋๋ผ,๋ธ๋ผ์ฐ์ ๊ฐ , ๊ฐ์ ํ๊ทธ๋ฅผ ํ๋์ฉ ํด์ํด์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์๋ ๊ณผ์ ์ ์๋ฏธํฉ๋๋ค.๊ทธ๋ฆฌ๊ณ CSS ํ์ผ์ ์ด ํธ๋ฆฌ ์์ โ์, ํฌ๊ธฐ, ์์นโ ์ ๋ณด๋ฅผ ์ ํ๋ ์ค๊ณ๋๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.์ฌ๊ธฐ์ ํ ๊ฐ์ง ์ค์ํ ์ฌ์ค์ด ์์ต๋๋ค.CSS ํ์ผ ๋ํ ๋ ๋๋ง ๊ฒฝ๋ก๋ฅผ ์ฐจ๋จ(blocking) ํ ์ ์์ต๋๋ค.๋ธ๋ผ์ฐ์ ๋ ๋ฅผ ๋ง๋๋ฉด CSS ํ์ผ์ ๋ค์ด๋ก๋ํ๋ฉด์, JS ์คํ์ ์ ์ ๋ฉ์ถฅ๋๋ค. ์๋ํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ getComputedStyle()์ด๋ DOM ๋ณ๊ฒฝ์ ํตํด ์คํ์ผ์ ์ํฅ์ ์ค ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฆ, CSS๊ฐ ์์ ํ ๋ก๋๋๊ณ CSSOM์ด ๋ง๋ค์ด์ง ๋๊น์ง๋ JS ์คํ์ด ์ฐ๊ธฐ๋ ์ ์์ต๋๋ค.์ฌ๊ธฐ์ โ์ฐจ๋จ(blocking)โ์ด๋, ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค๋ฅธ ์ผ์ ์ ์ ๋ฉ์ถ๊ณ โ์ด๊ฑฐ ๋จผ์ ๋๋ด์ผ์ง!โ ํ๊ณ ์ฐ์ ์์๋ฅผ ์ฃผ๋ ์ํ๋ฅผ ๋งํฉ๋๋ค.์๋ฅผ ๋ค์ด, ์๋ฆฌ๋ฅผ ํ๋ค ๋ง๊ณ ๊ฐ์๊ธฐ ๋ฌผ์ ๋์ฌ์ผ ํด์ ๋ชจ๋ ์ผ์ ๋ฉ์ถ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค.CSS ํ์ผ์ ๋ค ๋ถ๋ฌ์์ผ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค์ HTML์ ๊ณ์ ์ฝ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.(์ ํํ๋, CSS๋ ๋ ๋๋ง์ ์ฐจ๋จํ๊ณ , ๋๊ธฐ ์คํ์ ์ง์ฐ์ํต๋๋ค.HTML ํ์ฑ ์์ฒด๋ฅผ ์ฆ์ ๋ฉ์ถ๋ ๊ฒ์ ์๋์ง๋ง,๊ณง๋ฐ๋ก ์ด์ด์ง๋ ์คํฌ๋ฆฝํธ ๋๋ฌธ์ ์ค์ ๋ก๋ ํ์ฑ์ด ์ ์ ๋ฉ์ถ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.)์ด๋ HTML ์์ ํ๊ทธ๊ฐ ๋ฑ์ฅํ๋ฉด,๋ธ๋ผ์ฐ์ ๋ โ์ฌ๊ธฐ์ JavaScript๋ฅผ ์คํํด์ผ ํ๋คโ๊ณ ์ธ์ํฉ๋๋ค.๋ฌธ์ ๋ ์ด ์คํฌ๋ฆฝํธ๊ฐ ํ์-๋ธ๋กํน(parser-blocking) ์ด๋ผ๋ ์ ์ ๋๋ค.์ฆ, ๋ธ๋ผ์ฐ์ ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์คํํ๋ ๋์ HTML ํ์ฑ์ ๋ฉ์ถฅ๋๋ค.์ฌ๊ธฐ์ โํ์ฑ์ ๋ฉ์ถ๋คโ๋ ๊ฑด, ๋ธ๋ผ์ฐ์ ๊ฐ HTML ๋ฌธ์๋ฅผ ๋ ์ด์ ์๋๋ก ๋ด๋ ค๊ฐ์ง ์๊ณ โ์ด ์คํฌ๋ฆฝํธ๋ฅผ ๋จผ์ ์คํํ ๊ฒ์โ ํ๊ณ ์ผ์ ์ ์งํ๋ ์ํ์ ๋๋ค.๊ทธ๋์ JS๊ฐ ์ค๋ ๊ฑธ๋ฆฌ๋ฉด, HTML์ ๋๋จธ์ง ๋ถ๋ถ(์: )์ด ๋ฆ๊ฒ ๊ทธ๋ ค์ง๋ ๊ฒ๋๋ค.์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ํด๋ณด๊ฒ ์ต๋๋ค. Hello, world! This text might not appear immediately. ์ด ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ main.js๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์คํํ ๋๊น์ง HTML ํ์ฑ์ ์ค๋จํฉ๋๋ค.main.js๊ฐ ๋คํธ์ํฌ์์ ๋ด๋ ค๋ฐ๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ฉด, ๊ณผ ๋ ๊ทธ๋์ ํ๋ฉด์ ๊ทธ๋ ค์ง์ง ์์ต๋๋ค.์ฆ, ์คํฌ๋ฆฝํธ์ ์คํ ์์๋ฟ ์๋๋ผ CRP ์์ฒด๊ฐ ์ง์ฐ๋๋ ๊ฒ์ด์ฃ .โ๋คํธ์ํฌ์์ ๋ด๋ ค๋ฐ๋๋คโ๋ ๊ฒ์, ๋ธ๋ผ์ฐ์ ๊ฐ ์ธํฐ๋ท์ ํตํด main.js ํ์ผ์ ์๋ฒ์์ ์์ฒญํด์ ๋ฐ์์ค๋ ๊ณผ์ ์ ๋๋ค.๋ง์ฝ ์ธํฐ๋ท ์๋๊ฐ ๋๋ฆฌ๋ฉด, ํ๋ฉด์ด ํ์๊ฒ ๋ฉ์ถฐ ์๋ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ต๋๋ค.์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ์์ฑ์ด async์ defer์ ๋๋ค.async๋ฅผ ๋ถ์ด๋ฉด ๋ธ๋ผ์ฐ์ ๋ HTML์ ํ์ฑํ๋ฉด์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณ๋ ฌ๋ก ๋ค์ด๋ก๋ํฉ๋๋ค.์ฌ๊ธฐ์ โ๋ณ๋ ฌโ์ด๋ ๋์์ ์ฌ๋ฌ ์ผ์ ํ๋ ๊ฒ์ ๋๋ค.์ฆ, HTML์ ๊ณ์ ์ฝ์ผ๋ฉด์ ๋ฐฑ๊ทธ๋ผ์ด๋์์๋ JS ํ์ผ๋ ๋ด๋ ค๋ฐ์ต๋๋ค.ํ์ง๋ง ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋๋ ์๊ฐ, ํ์ฑ์ ์ ์ ๋ฉ์ถ๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ์ฆ์ ์คํํฉ๋๋ค.์ฆ, ๋ค์ด๋ก๋๋ ๋น๋๊ธฐ(=๋ฐ๋ก๋ฐ๋ก ๋์์)์ง๋ง ์คํ์ ์ฆ์ ์ผ์ด๋๋ฏ๋ก,์คํ ์์ ๋ง๋ค ํ์๊ฐ ์ ๊น์ฉ ์ค๋จ๋ ์ ์์ต๋๋ค.๋ํ ์ฌ๋ฌ ๊ฐ์ async ์คํฌ๋ฆฝํธ๊ฐ ์์ ๊ฒฝ์ฐ,๋์ฐฉํ ์์๋๋ก ์คํ๋๋ฏ๋ก ์คํ ์์๊ฐ ๋ณด์ฅ๋์ง ์์ต๋๋ค.์ด ๋ง์, ๋จผ์ ๋ด๋ ค๋ฐ์ ํ์ผ์ด ๋จผ์ ์คํ๋๋ค๋ ๋ป์ผ๋ก,์ฝ๋ ์ฌ์ด์ ์์กด ๊ด๊ณ๊ฐ ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค.๋ฐ๋ฉด defer๋ ๋ค์ด๋ก๋๋ ๋น๋๊ธฐ์ด์ง๋ง ์คํ์ HTML ํ์ฑ์ด ๋๋ ์งํ์ ์ด๋ฃจ์ด์ง๋๋ค.์ฆ, ๋ชจ๋ DOM ํ์ฑ์ด ์๋ฃ๋ ๋ค์, ๋ฌธ์์ ์์๋๋ก ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ฉ๋๋ค.์ด๋ ๊ฒ ๋๋ฉด HTML ํ์ฑ์ ๋ง์ง ์๊ธฐ ๋๋ฌธ์, ์ด๊ธฐ ๋ ๋๋ง ์๋์ ๊ฑฐ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.์ฝ๊ฒ ๋งํด async๋ โ๋จผ์ ๋์ฐฉํ๋ฉด ๋ฐ๋ก ์คํโ,defer๋ โHTML ๋ค ์ฝ๊ณ ๋์ ํ๊บผ๋ฒ์ ์คํโ์ด๋ผ๊ณ ๊ธฐ์ตํ์๋ฉด ๋ฉ๋๋ค.๋ ๋ค HTML๊ณผ JS๋ฅผ ๊ฐ์ด ๋ค์ด๋ก๋ํ์ง๋ง, ์คํ ์์ ์ด ๋ค๋ฆ ๋๋ค.ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ type="module" ์์ฑ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.๋ชจ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก defer์ ๊ฐ์ ๋์ ๋ฐฉ์์ ์ทจํ๋ฏ๋ก,ํ์ฑ์ ๋ฐฉํดํ์ง ์๊ณ HTML์ด ๋ชจ๋ ์ฝํ ๋ค์ ์คํ๋ฉ๋๋ค.๋จ, ๋ชจ๋ ๊ฐ์ ์์กด ๊ด๊ณ์ ๋ฐ๋ผ ์ฌ๋ฌ ํ์ผ์ด ๋ณ๋ ฌ๋ก ๋ค์ด๋ก๋๋๋ฉฐ,์คํ์ import ์์๋ฅผ ๋ฐ๋ฆ ๋๋ค.์ด ๊ฒฝ์ฐ defer ์์ฑ์ ํจ๊ป ๋ถ์ด๋๋ผ๋ ๋ฌด์๋ฉ๋๋ค.(์์ธ์ ์ผ๋ก, ๋ชจ๋ ์คํฌ๋ฆฝํธ์ async ์์ฑ์ ํจ๊ป ๋ถ์ด๋ฉด,๋ค์ด๋ก๋๊ฐ ๋๋๋ ์ฆ์ ์คํ๋์ด defer์ ๋ฌ๋ฆฌ ํ์ฑ ์๋ฃ ์ ์ ์คํ๋ ์๋ ์์ต๋๋ค.)์ถ๊ฐ๋ก import() ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ์์ ํ ๋น๋๊ธฐ์ ์คํ์ด ๊ฐ๋ฅํ๋ฉฐ,์ด๋ ํ์๋ ๋ ๋๋ง์ ์ ํ ๋ธ๋กํนํ์ง ์์ต๋๋ค.์ฆ, HTML๊ณผ ์๊ด์์ด ๋์ค์ โํ์ํ ๋๋งโ JS๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ ๋๋ค.์ฆ, async์ defer๋ ๋จ์ํ ์คํฌ๋ฆฝํธ์ โ์คํ ์์โ๋ง ๋ฐ๊พธ๋ ์์ฑ์ด ์๋๋ผ,HTML ํ์ฑ๊ณผ ๋ ๋๋ง์ ํ์ด๋ฐ ์์ฒด๋ฅผ ๋ฐ๊พธ๋ ์ฑ๋ฅ ์กฐ์ ๋๊ตฌ์ ๋๋ค.์ค๋ฌด์์ ์์ฃผ ์ฐ์ด๋ ์๋๋ฆฌ์ค๋ฅผ ํ๋ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.์์ ์ํฉ:์ ์์๊ฑฐ๋ ํ์ด์ง๋ฅผ ์๋ก ๋ค์ด๋ณด์ฃ .์ฌ์ฉ์๊ฐ index.html์ ์ฒ์ ๋ฐฉ๋ฌธํ ๋, ๋ฉ์ธ ์ด๋ฏธ์ง๊ฐ ๋น ๋ฅด๊ฒ ๋ณด์ฌ์ผ ์ ํ์จ์ด ๋์ต๋๋ค.ํ์ง๋ง ๊ฐ๋ฐ์๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. My Shop (์ฌ์ง) Buy Now ์ด ์ฝ๋๋ analytics.js์ main.js๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์คํํ๋ฏ๋ก,์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์ด๋ฉด ๋ฉ์ธ ์ด๋ฏธ์ง๊ฐ ํ์ฐธ ๋์ ๋ณด์ด์ง ์์ต๋๋ค.โ์์ฐจ์ ์คํโ์ด๋, ์ฒซ ๋ฒ์งธ ์คํฌ๋ฆฝํธ๋ฅผ ์์ ํ ๋๋ด์ผ ๋ ๋ฒ์งธ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ค๋ ๋ป์ ๋๋ค.์ฆ, ํ ๋ฒ์ ํ ์ผ๋ง ํ๋ ๊ฑฐ์ฃ .๊ทธ๋์ JS๊ฐ ๊ธธ๊ฑฐ๋ ๋คํธ์ํฌ๊ฐ ๋๋ฆฌ๋ฉด, ์ด๋ฏธ์ง์กฐ์ฐจ ๋ฆ๊ฒ ๋ณด์ด๊ฒ ๋ฉ๋๋ค.์ด๋ฅผ ์์ ํ๋ฉด ์ด๋ ๊ฒ ๋ฉ๋๋ค. My Shop (์ฌ์ง) Buy Now ์ด์ ๋ ์คํฌ๋ฆฝํธ๊ฐ CRP์ ๋ฏธ์น๋ ์ํฅ์ ์์ ํ ๋ฌ๋ผ์ง๋๋ค.๋ธ๋ผ์ฐ์ ๊ฐ HTML์ ์ฝ์ผ๋ฉด์ ๋์์ CSS์ ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณ๋ ฌ๋ก ๋ค์ด๋ก๋ํฉ๋๋ค.(์ฆ, ์ธ ๊ฐ์ง ์ผ์ด ๋์์ ์ผ์ด๋ฉ๋๋ค: HTML ์ฝ๊ธฐ, CSS ๋ฐ๊ธฐ, JS ๋ฐ๊ธฐ)analytics.js๋ async์ด๋ฏ๋ก ๋์ฐฉ ์ฆ์ ์คํ๋์ง๋ง,DOM์ ์์กดํ์ง ์๋ ๋ถ์ ์ฝ๋๋ผ ํ์ด์ง ๊ตฌ์กฐ์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.main.js๋ defer์ด๋ฏ๋ก, HTML ํ์ฑ์ด ๋ชจ๋ ๋๋ ํ์ ์คํ๋ฉ๋๋ค.DOM์ด ์์ ํ ์ค๋น๋ ๋ค ์คํ๋๋ฏ๋ก ์์ ํ๋ฉฐ, ์ฒซ ํ์ธํธ์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.๊ทธ ๊ฒฐ๊ณผ, ์ฌ์ฉ์๋ ๋ฉ์ธ ์ด๋ฏธ์ง์ ๋ฒํผ์ ์ฆ์ ๋ณผ ์ ์๊ณ ,๋์์ ๋ฐฑ๊ทธ๋ผ์ด๋์์๋ ์คํฌ๋ฆฝํธ ๋ก๋ฉ์ด ๋ณ๋ ฌ๋ก ์งํ๋ฉ๋๋ค.์ด๋ฐ ๋ณํ ํ๋๋ก ์ฒซ ํ์ธํธ(First Paint) ์ DOMContentLoaded ์ด๋ฒคํธ ์์ ์ด ํจ์ฌ ๋นจ๋ผ์ง๋๋ค.์ฐธ๊ณ ๋ก, defer ์คํฌ๋ฆฝํธ๋ DOM ํ์ฑ์ด ๋๋ ์งํ ์คํ๋๊ณ ๋์DOMContentLoaded ์ด๋ฒคํธ๊ฐ ๋ฐ์ํฉ๋๋ค.๋ฐ๋ฉด async ์คํฌ๋ฆฝํธ๋ ๋ค์ด๋ก๋ ์๋ฃ ์์ ์ ์ฆ์ ์คํ๋๋ฏ๋ก,์ด๋ค ๊ฒ์ DOMContentLoaded๋ณด๋ค ๋จผ์ , ์ด๋ค ๊ฒ์ ๋์ค์ ์คํ๋ ์๋ ์์ต๋๋ค.๋ฐ๋ผ์ DOMContentLoaded ์ ํ ์คํ ํ์ด๋ฐ์ด ์ค์ํ ๋ก์ง์ด๋ผ๋ฉด defer๊ฐ ํจ์ฌ ์์ ์ ์ ๋๋ค.๋ค์์ ์ดํด๋ฅผ ๋๊ธฐ ์ํ ๊ฐ๋จํ ๋น๊ต ์์ฝ์ ๋๋ค.๊ธฐ๋ณธ ๋๊ธฐ์ ์คํ ๋ฐฉ์์ผ๋ก, ํ์ผ์ ๋ฐ๋ก ์คํํ๋ฉฐ ์์๋ฅผ ๋ณด์ฅํ์ง๋ง HTML ํ์ฑ์ ์์ ํ ๋ฉ์ถฅ๋๋ค. ๊ฐ์ฅ ๋๋ฆฐ ๋ฐฉ์์ ๋๋ค.async๋น๋๊ธฐ ๋ค์ด๋ก๋ ๋ฐฉ์์ผ๋ก, HTML์ ์ฝ๋ ๋์ค JS๋ฅผ ๋์์ ๋ด๋ ค๋ฐ๊ณ , ๋ค์ด๋ก๋๊ฐ ๋๋๋ ์ฆ์ ์คํํฉ๋๋ค. ์คํ ์์๋ ๋ณด์ฅ๋์ง ์์ผ๋ฉฐ, HTML ํ์ฑ์ด ์ ๊น์ฉ ๋ฉ์ถ ์ ์์ต๋๋ค. ๊ด๊ณ ๋ ํต๊ณ ์ฝ๋์ฒ๋ผ ๋ ๋ฆฝ์ ์ธ ์ฝ๋์ ์ ํฉํฉ๋๋ค.defer๋น๋๊ธฐ ๋ค์ด๋ก๋ ๋ฐฉ์์ด์ง๋ง, HTML์ด ์ ๋ถ ํ์ฑ๋ ์ดํ์ ๋ฌธ์ ์์๋๋ก ์คํ๋ฉ๋๋ค. HTML ํ์ฑ์ ๋ฉ์ถ์ง ์๊ธฐ ๋๋ฌธ์ ๋ ๋๋ง ์๋์ ๊ฑฐ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค. ๋ฉ์ธ ์ฝ๋์ ์ ํฉํฉ๋๋ค.type="module"๋ชจ๋ ์์คํ ์ ์ฌ์ฉํ๋ ์ต์ ๋ฐฉ์์ผ๋ก, ์๋์ผ๋ก defer์ฒ๋ผ ๋์ํ๋ฉฐ ์ฌ๋ฌ ํ์ผ์ ๋์์ ๋ค์ด๋ก๋ํฉ๋๋ค. importํ ์์๋๋ก ์คํ๋ฉ๋๋ค. ๋จ, async ์์ฑ์ ํจ๊ป ์ฃผ๋ฉด ๋์ฐฉ ์ฆ์ ์คํ๋ ์๋ ์์ต๋๋ค.์์ฝํ์๋ฉด, ๊ธฐ๋ณธ ์คํฌ๋ฆฝํธ๋ ์ฐจ๋จ์ด ์ฌํ๊ณ ๋๋ฆฌ๊ณ ,async๋ ๋น ๋ฅด์ง๋ง ์์๊ฐ ๋ถ์์ ํ๋ฉฐ,defer์ type="module"์ ์์ ์ ์ด๋ฉด์ ๋ ๋๋ง์ ๋ฐฉํดํ์ง ์์ต๋๋ค.ํ์์ ๋์๋ โ๋๊ธฐโ๋ ํ ๋ฒ์ ํ ๊ฐ์ง ์ผ๋ง ํ๋ ๊ฒ์ด๊ณ ,โ๋น๋๊ธฐโ๋ ์ฌ๋ฌ ๊ฐ์ง ์ผ์ ๋์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.โ์ฐจ๋จ ์์โ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฉ์ถ์ง ์๊ณ ๊ณ์ HTML์ ์ฝ์ ์ ์๋ค๋ ๋ป์ ๋๋ค.์ ๋ฆฌํ์๋ฉด, async์ defer๋ ๋จ์ํ ์์ ์ต์ ์ด ์๋๋ผ,๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ๊ฒฝ๋ก๋ฅผ ์ต์ ํํ๋ ์์ฑ์ ๋๋ค.async๋ ๋ค๋ฅธ ์ฝ๋์ ์์กด์ฑ์ด ์๋ ์ธ๋ถ ์คํฌ๋ฆฝํธ(์: ๊ด๊ณ , ๋ถ์, ์ฑํ ์์ ฏ ๋ฑ)์ ์ ํฉํ๊ณ ,defer๋ type="module"์ ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ์ ํฉํฉ๋๋ค.์ด ์๋ฆฌ๋ฅผ ์ดํดํ๋ฉด,โ์ด๋ค ์คํฌ๋ฆฝํธ๋ฅผ ์ธ์ ์คํํด์ผ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์ฌ์ฉ์์๊ฒ ์ฒซ ํ๋ฉด์ ๋ณด์ฌ์ค ์ ์์๊น?โ๋ผ๋ ์ง๋ฌธ์ ์ง์ ๋ต์ ๋ผ ์ ์๊ฒ ๋ฉ๋๋ค.๋ง์ง๋ง์ผ๋ก, Chrome DevTools์ Network ํญ์์์ค์ async/defer ์คํฌ๋ฆฝํธ์ ๋ค์ด๋ก๋ ํ์ด๋ฐ๊ณผ ์คํ ์์ ์ ๊ด์ฐฐํ ์ ์์ต๋๋ค.async ์คํฌ๋ฆฝํธ๋ โReceivedโ ์์ ์ ์ฆ์ ์คํ๋๋ฉฐ,defer ์คํฌ๋ฆฝํธ๋ DOMContentLoaded ์ง์ ์ ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.๋ง์ฝ ์ ์์ง๋๊ป์ ์ค์ ๋ก ์์ฑ ์ค์ธ ํ์ด์ง์ ๊ตฌ์กฐ๋ฅผ ๋ณด์ฌ์ฃผ์ ๋ค๋ฉด,์ด๋์ ์ด๋ค ์์ฑ์ ์ ์ฉํ๋ฉด ์ต์ ์ ์ฑ๋ฅ์ด ๋์ฌ์ง๊ตฌ์ฒด์ ์ธ ๋ฆฌํฉํฐ๋ง ์์๊น์ง ํจ๊ป ๋์๋๋ฆด ์ ์์ต๋๋ค.๊ฐ์ฌํฉ๋๋ค๐๐
- 0
- 2
- 41
Q&A
json ๋์ ๋ก๊ทธ์ธ, ํ์๊ฐ์ ์ผ๋ db ์ฐ๊ฒฐ ๋ฐ data ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒ ํ๋์?
์๋ ํ์ธ์ eju๋ ๐JSON ํ์ผ ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB)๋ฅผ ์ฌ์ฉํด ๋ก๊ทธ์ธ๊ณผ ํ์๊ฐ์ ๊ธฐ๋ฅ์ ๋ง๋ค๊ณ ์ถ์ผ์๋ค๋ฉด, ์ ์ฒด์ ์ธ ๊ทธ๋ฆผ์ ์ด๋ ๊ฒ ์ดํดํ์๋ฉด ๋ฉ๋๋ค.์ฐ์ JSON ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ โ๊ทธ๋๊ทธ๋ ํ์ผ๋ก ์ง์ ์ ์ฅํ๋ ๋ฐฉ์โ์ด์์. ๊ฐ๋จํด์ ๋ฐฐ์ฐ๊ธฐ์๋ ์ข์ง๋ง, ์ฌ์ฉ์๊ฐ ๋ง์์ง๊ฑฐ๋ ์ฌ๋ฌ ์์ฒญ์ด ๋์์ ๋ค์ด์ค๋ฉด ๊ธ๋ฐฉ ํ๊ณ๊ฐ ์๊น๋๋ค. ๋ฐ๋ฉด DB(๋ฐ์ดํฐ๋ฒ ์ด์ค)๋ ์๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ณ ์์ ์ ์ผ๋ก ๋ณด๊ดํ๊ณ ๊บผ๋ด ์ธ ์ ์๋ ์ ์ฉ ์ ์ฅ์์์. ์ฝ๊ฒ ๋งํด, โ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํด์ฃผ๋ ๋๋ํ ๊ธ๊ณ โ๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.Node.js์ Express ํ๊ฒฝ์์ ์์ฃผ ์ฐ๋ DB์๋ ์ธ ๊ฐ์ง ๋ํ์ ์ธ ์ข ๋ฅ๊ฐ ์์ต๋๋ค.๋จผ์ MySQL๊ณผ PostgreSQL์ ํ(ํ ์ด๋ธ) ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค. ํ์ ์ ๋ณด, ๊ฒฐ์ ๋ด์ญ, ์ฃผ๋ฌธ ๊ธฐ๋ก์ฒ๋ผ ๊ตฌ์กฐ๊ฐ ์ ํด์ง ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ๊ฐ๋ ฅํ๊ณ ์์ ์ ์ด์์.๋ฐ๋ฉด MongoDB๋ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก, JSON์ฒ๋ผ ์๊ธด ๋ฌธ์(document) ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ตฌ์กฐ๊ฐ ์์ ๋กญ๊ณ ๋ณ๊ฒฝ์ด ์ฆ์ ์๋น์ค, ์๋ฅผ ๋ค์ด SNS, ๊ฒ์ํ, ๋ก๊ทธ ๊ธฐ๋ก ์์ ํนํ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. ์ค๋ฌด์์๋ ์ฌ์ ํ PostgreSQL์ด๋ MySQL์ด ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๊ณ , ๋น ๋ฅด๊ฒ ๊ธฐ๋ฅ์ ๋ง๋ค์ด์ผ ํ๋ ์คํํธ์ ์ด๋ ํ์ต์ฉ ํ๋ก์ ํธ์์๋ MongoDB๋ ์ธ๊ธฐ๊ฐ ๋ง์ต๋๋ค.Node.js + Express์์๋ ์ด๋ฐ DB์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ค๊ฐ ๋๊ตฌ(๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ฅผ ์ฌ์ฉํฉ๋๋ค.PostgreSQL์ด๋ MySQL์ Prisma๋ Sequelize, MongoDB๋ Mongoose๋ฅผ ๊ฐ์ฅ ๋ง์ด ์จ์.์ด ๋๊ตฌ๋ค์ด โDB์ ๋ฐ์ดํฐ ๋ฃ๊ธฐ / ๊บผ๋ด๊ธฐโ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ช ์ค๋ก ๊ฐ๋จํ๊ฒ ๋ฐ๊ฟ ์ค๋๋ค.๊ฐ๋จํ ํ์๊ฐ์ ์ ์๋ก ๋ค๋ฉด, ์ฌ์ฉ์๊ฐ ์ด๋ฆยท์ด๋ฉ์ผยท๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ์ ๋ ์๋ฒ๋ ๋ค์ ์์๋ก ๋์ํฉ๋๋ค.์ ๋ ฅ๊ฐ์ด ๋น์ด ์์ง ์์์ง, ์ด๋ฉ์ผ ํ์์ด ๋ง๋์ง ๊ฒ์ฌํฉ๋๋ค.๋น๋ฐ๋ฒํธ๋ฅผ bcrypt ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ํธํ(ํด์)ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ค์ ๋น๋ฐ๋ฒํธ๊ฐ ๋ ธ์ถ๋์ง ์๊ณ ๋ ๋ก๊ทธ์ธ ๊ฒ์ฆ์ด ๊ฐ๋ฅํฉ๋๋ค.์ํธํ๋ ๋น๋ฐ๋ฒํธ์ ํจ๊ป DB์ ์์ ํ๊ฒ ์ ์ฅํฉ๋๋ค.๋ก๊ทธ์ธ ๊ณผ์ ์ ๋ฐ๋๋ก,์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ด๋ฉ์ผ์ DB์์ ์ฐพ์๋ณด๊ณ ,์ ์ฅ๋ ์ํธํ๋ ๋น๋ฐ๋ฒํธ์ ์ ๋ ฅ๋ ๋น๋ฐ๋ฒํธ๋ฅผ bcrypt.compare()๋ก ๋น๊ตํฉ๋๋ค.๋ ๊ฐ์ด ์ผ์นํ๋ฉด ๋ก๊ทธ์ธ ์ฑ๊ณต์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.๋ก๊ทธ์ธ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๋ ์ธ์ /์ฟ ํค ๋ฐฉ์์ด๋ JWT ํ ํฐ์ ์ฌ์ฉํด ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์งํฉ๋๋ค. ์ธ์ ์ โ์๋ฒ๊ฐ ๋ก๊ทธ์ธํ๋ฅผ ๋ค๊ณ ์๋ ๋ฐฉ์โ์ด๊ณ , JWT๋ โ์๋ฒ๊ฐ ์๋ช ๋ ์ถ์ ์ฆ์ ๋ง๋ค์ด ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ๋ค๊ณ ์๋ ๋ฐฉ์โ์ด์์.๋ณด์์ ์ฌ๊ธฐ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.1. ๋น๋ฐ๋ฒํธ๋ ์ ๋๋ก ์๋ฌธ ๊ทธ๋๋ก ์ ์ฅํ์ง ์๊ณ ๋ฐ๋์ ํด์ ํํ๋ก ์ ์ฅํด์ผ ํฉ๋๋ค.2. DB ์ฃผ์์ ๊ณ์ ์ ๋ณด๋ ์ฝ๋์ ์ง์ ์ฐ์ง ๋ง๊ณ .env ํ์ผ์ ๋ฐ๋ก ์จ๊ฒจ์ผ ํฉ๋๋ค.3. ์ ๋ ฅ๊ฐ์ ๊ผผ๊ผผํ ๊ฒ์ฌํด์ ๋น์ ์์ ์ธ ๋ฐ์ดํฐ(๋น์นธ, ์ด์ํ ํ์ ๋ฑ)๋ ๋ฐ๋ก ๊ฑฐ์ ํด์ผ ํฉ๋๋ค.์ด ์ธ ๊ฐ์ง๋ง ์ง์ผ๋, JSON ํ์ผ ๋์ DB๋ฅผ ์ฌ์ฉํด๋ ํจ์ฌ ์์ ํ๊ณ , ์ค์ ์๋น์ค์ ๊ฐ๊น์ด ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.๋ง์ง๋ง์ผ๋ก, ์ค๋ฌด์์๋ PostgreSQL์ด๋ MySQL์ด ํ์ค์ผ๋ก ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๊ณ ,MongoDB๋ ๋น ๋ฅด๊ฒ ๋ฐ๋๋ ๋ฐ์ดํฐ๋ JSON ๊ตฌ์กฐ์ ์๋น์ค์ ์ ๋ฆฌํฉ๋๋ค.์ฒ์ ๊ณต๋ถํ์ค ๋๋ MongoDB๊ฐ ์ดํดํ๊ธฐ ์ฌ์์ ์ ๋ฌธ์ฉ์ผ๋ก ์ข๊ณ ,๋์ค์ ํ์ฌ๋ ํ๋ก์ ํธ ๋จ์๋ก๋ PostgreSQL์ ์ฐ์ตํด๋์๋ฉด ์ค๋ฌด์ ํจ์ฌ ๋์์ด ๋ฉ๋๋ค.์ด ๋ถ๋ถ์ ์์ผ๋ก ์ ๊ฐ ์ค๋น ์ค์ธ Node.js + Express ์ค์ ๊ฐ์์์ ๋ค๋ฃฐ ์์ ์ ๋๋ค.JSON ์ ์ฅ์์ DB ์ฐ๊ฒฐ๋ก ๋์ด๊ฐ๋ ๊ณผ์ , PrismaยทMongoose ์ฌ์ฉ๋ฒ, ๋น๋ฐ๋ฒํธ ์ํธํ์ ๋ก๊ทธ์ธ ์ธ์ ๊ด๋ฆฌ๊น์ง ์ ๋ถ ํ๋์ฉ ๋ณด์ฌ๋๋ฆด ๊ณํ์ด์์. ํ์ฌ ๊ต์ฌ์ ํจ๊ป ์ค์ต ์ค์ฌ ๊ฐ์๋ก ์ค๋น ์ค์ด๋ฉฐ, ๊ฐ๋ฅํ ํ ๋น ๋ฅธ ์์ผ ๋ด์ ์ถ์ํ๊ฒ ์ต๋๋ค.๊ฐ์ฌํฉ๋๋ค.
- 0
- 1
- 42
Q&A
๋ณด์์ ์ทจ์ฝ ํ๊ฐ์?
์๋ ํ์ธ์ eju๋ ๐,์ด๋ค ์ํฉ์์์ ๋ณด์์ ๋ง์ํ์๋์ง, ๊ทธ๋ฆฌ๊ณ ์๋ฒ ๋ณด์, ๋ฐ์ดํฐ ์ ์ก ๋ณด์, ์ฌ์ฉ์ ์ธ์ฆ ๋ณด์ ๋ฑ ์ด๋ค ์ข ๋ฅ์ ๋ณด์์ ์๋ฏธํ์๋์ง ๊ตฌ์ฒด์ ์ผ๋ก ์๋ ค์ฃผ์๋ฉด ๋ณด๋ค ์ ํํ๊ฒ ์๋ด๋๋ฆด ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
- 0
- 1
- 36




