안녕하세요.
코딩 교육 크리에이터 짐코딩 입니다 🙂
유튜브에서 코딩 교육 "짐코딩 GYM CODING"채널을 운영하고 있으며,
인프런 교육 플랫폼에서 프로그래밍 지식을 공유하고 있습니다.
제 강의의 특징은 이제 막 시작하시는 분들을 위하여
설명하고자 할 때는 최대한 쉽게,
알려드리고자 할 때는 최대한 알차게 설명드립니다.
항상 수강생 입장에서 생각하는 코딩 교육 크리에이터가 되겠습니다.
감사합니다.
📨 이메일 bruce.lean17@gmail.com
🏋️♀️ 헬스타그램 @helinlee.gram
🧑💻 코딩스타그램 @gymcoding
강의
로드맵
전체 4수강평
- Next.js 완벽 마스터 (v15): 노션 기반 개발자 블로그 만들기 (with 커서AI)
- React 완벽 마스터: 기초 개념부터 린캔버스 프로젝트까지
게시글
- 질문&답변 - Notion API-DB 연결이 안돼요 - 안녕하세요 🙂노션 데이터베이스 우측 상단 더보기 버튼 클릭 후 [연결] 메뉴에서 생성하신 API 통합을 설정하셨을까요?많은 분들이 이부분을 실수로 누락하셔서요. - 0
- 2
- 81
 
- 질문&답변 - 필터 watchEffect 질문입니다. - 안녕하세요 🙂실무에서는 입력할 때마다 DB 조회를 하면 확실히 성능 문제가 발생할 수 있기에 Debounce, Throttle 기술을 사용합니다.좋은 질문입니다! 실무에서는 입력할 때마다 DB 조회를 하면 확실히 성능 문제가 발생할 수 있습니다. 일반적으로 다음과 같은 방법들을 사용합니다:1. Debouncing (디바운싱) - 가장 많이 사용사용자가 입력을 멈춘 후 일정 시간(보통 300-500ms)이 지나면 API를 호출합니다.import { ref, watch } from 'vue'; import { debounce } from 'lodash-es'; // 또는 직접 구현 const searchKeyword = ref(''); // lodash 사용 예시 const debouncedSearch = debounce(async (keyword) => { // API 호출 const response = await axios.get('/api/search', { params: { q: keyword } }); }, 300); // 300ms 대기 watch(searchKeyword, (newValue) => { debouncedSearch(newValue); }); 직접 구현 예시:const searchKeyword = ref(''); let timeoutId = null; watch(searchKeyword, (newValue) => { clearTimeout(timeoutId); timeoutId = setTimeout(async () => { // API 호출 await fetchData(newValue); }, 300); }); 2. Throttling (쓰로틀링)일정 시간 간격으로만 API를 호출합니다 (예: 1초에 한 번만).3. 최소 글자 수 제한watch(searchKeyword, (newValue) => { if (newValue.length 4. 클라이언트 사이드 캐싱이미 검색한 키워드는 캐시에 저장하고, 같은 검색어는 재요청하지 않습니다.const cache = new Map(); const searchWithCache = async (keyword) => { if (cache.has(keyword)) { return cache.get(keyword); } const result = await axios.get('/api/search', { params: { q: keyword } }); cache.set(keyword, result.data); return result.data; }; 5. 백엔드에서 처리백엔드에서 Rate Limiting 적용데이터베이스 인덱싱 최적화검색 엔진(Elasticsearch 등) 활용실무에서 가장 많이 사용하는 조합:Debouncing + 최소 글자 수 제한 + 클라이언트 캐싱이렇게 하면 사용자 경험도 좋고, 서버 부하도 크게 줄일 수 있습니다! - 0
- 1
- 19
 
- 질문&답변 - eslint 룰 관련 질문이 있습니다. - 안녕하세요 🙂컨벤션에 대해 말씀드리면주요 ESLint 컨벤션대표적인 컨벤션:Airbnb Style Guide - 가장 인기 있는 JavaScript 컨벤션Standard JS - 세미콜론 없는 스타일Google Style Guide - 구글의 JavaScript 컨벤션Vue 전용:vue/recommended - Vue 공식 권장 규칙설치 예시# Airbnb (가장 많이 사용) npm install --save-dev eslint-config-airbnb-base # Standard npm install --save-dev eslint-config-standard 추천실무에서는 Airbnb 가장 많이 사용하고, Vue 프로젝트면 eslint-plugin-vue 추가하면 됩니다.팀 상황에 맞게 선택하거나 커스터마이징해서 사용하는 걸 권장드립니다.~! - 0
- 2
- 18
 
- 질문&답변 - private folders 와 전역 폴더 - 안녕하세요 🙂좋은 질문입니다! src/components와 src/app/_components의 차이와 사용 이유를 설명해드리겠습니다.주요 차이점src/components (전역 폴더)프로젝트 전체에서 재사용되는 컴포넌트여러 페이지/라우트에서 공통으로 사용예: Header, Footer, Button, Modal 등src/app/_components (Private 폴더)언더스코어(_)로 시작하는 폴더는 Next.js 라우팅에서 제외됨해당 라우트 세그먼트 내부에서만 사용하는 컴포넌트페이지 URL에 영향을 주지 않음분리하는 이유1. 명확한 스코프 관리src/ ├── components/ # 전역 재사용 컴포넌트 │ ├── Header.tsx │ └── Button.tsx └── app/ ├── blog/ │ ├── _components/ # blog 페이지에서만 사용 │ │ └── BlogCard.tsx │ └── page.tsx └── about/ ├── _components/ # about 페이지에서만 사용 │ └── TeamMember.tsx └── page.tsx 2. 코드 조직화와 유지보수컴포넌트가 어디서 사용되는지 명확히 알 수 있음특정 페이지 수정 시 해당 _components만 확인하면 됨3. 의존성 관리전역 컴포넌트 수정 시 영향 범위가 넓음Private 컴포넌트는 영향 범위가 제한적사용 가이드라인하나만 사용해도 되는 경우:작은 프로젝트재사용 컴포넌트가 많지 않을 때팀 규모가 작을 때분리가 권장되는 경우:대규모 프로젝트여러 개발자가 협업할 때페이지별로 독립적인 컴포넌트가 많을 때결론반드시 분리할 필요는 없습니다. 프로젝트 규모와 팀의 선호도에 따라 선택하면 됩니다.간단한 프로젝트: src/components만 사용복잡한 프로젝트: 두 가지 모두 활용하여 명확한 구분제 개인적인 추천은 처음에는 src/components만 사용하다가, 특정 페이지 전용 컴포넌트가 많아지면 그때 _components를 도입하는 것입니다. - 0
- 2
- 21
 
- 질문&답변 - AI와 CSS 라이브러리의 궁합 - 안녕하세요 🙂Tailwind CSSCursor AI는 Tailwind의 유틸리티 클래스 패턴을 매우 잘 이해하고 있습니다. flex items-center gap-4 같은 클래스만 봐도 정확히 어떤 레이아웃인지 파악할 수 있어서, 자동완성과 코드 제안이 놀라울 정도로 정확합니다. Tailwind는 AI의 학습 데이터에 가장 많이 포함된 CSS 프레임워크이기 때문에, Cursor가 거의 완벽하게 코드를 생성해줍니다. 클래스 이름만으로 스타일이 명확하게 표현되어 AI가 의도를 쉽게 파악할 수 있습니다.shadcn/uiTailwindCSS 기반 컴포넌트 프레임워크입니다!! 컴포넌트 코드가 프로젝트에 직접 복사되기 때문에 AI가 내부 구조를 완전히 파악하고 자유롭게 수정할 수 있습니다. npm 패키지로 설치되는 다른 UI 라이브러리들과 달리, Cursor가 컴포넌트를 열어보고 원하는 대로 커스터마이징할 수 있다는 점이 큰 장점입니다. 또한 문서화가 매우 잘 되어 있어 AI가 정확한 사용법을 알고 있습니다.최적의 조합: Tailwind CSS + shadcn/ui두 라이브러리를 함께 사용하면 시너지 효과가 극대화됩니다. shadcn/ui가 Tailwind 기반으로 만들어졌기 때문에, Cursor는 컴포넌트의 스타일을 Tailwind 클래스로 쉽게 수정할 수 있습니다. "Create a login form with shadcn Button" 같은 간단한 프롬프트만 줘도 완성도 높은 컴포넌트를 즉시 생성해주며, 이후 세부 스타일 조정도 매우 쉽습니다. AI와 함께 작업할 때 가장 높은 생산성을 보장하는 조합입니다. - 0
- 1
- 35
 
- 질문&답변 - 퀴즈 질문 풀이 오류 - 안녕하세요 🙂맞습니다. AI퀴즈가 잘못되었습니다.AI퀴즈는 인프런에서 자동으로 생성된 퀴즈로 수정 요청할게요~! - 0
- 2
- 36
 
- 질문&답변 - onClick 이벤트에 함수 넘길 때 - 안녕하세요! 이 두 방법의 차이점을 명확하게 설명해드리겠습니다.1. onClick={() => onDeleteTodo(item.id)}화살표 함수로 감싸서 전달하는 경우:// 매개변수가 필요한 경우 onDeleteTodo(item.id)}> 삭제 언제 사용하나요?함수에 특정 매개변수를 전달해야 할 때 (예: item.id) 2. onClick={onDeleteTodo}함수를 직접 전달하는 경우:// 매개변수가 불필요하거나 event 객체만 필요한 경우 삭제 언제 사용하나요?매개변수가 필요 없을 때이벤트 객체(event)만 사용하면 될 때성능을 최적화하고 싶을 때성능 고려사항// ❌ 매번 새로운 함수 생성 (렌더링할 때마다) onDeleteTodo(item.id)}>삭제 // ✅ 동일한 함수 참조 유지 삭제 결론 및 권장사항매개변수가 필요하다면: onClick={() => func(param)} 사용매개변수가 불필요하다면: onClick={func} 사용 강의에서 onClick={() => onDeleteTodo(item.id)}를 사용한 이유는 각각의 todo 항목의 고유한 id를 삭제 함수에 전달해야 하기 때문입니다!추가 궁금한 점이 있으시면 언제든 질문해주세요! 🙂 - 0
- 1
- 29
 
- 질문&답변 - tailwindcss 4.1 docs에서는 container가 목록에서 안보이네요 - container 유틸리티 클래스는 여전히 존재하고 사용 가능합니다! 다만 문서에서의 위치와 구성 방식이 변경되었습니다.v4에서는 container가 별도의 독립적인 문서 페이지가 아닌, "Max Width" 섹션 내에 통합되어 있습니다현재 max-width 문서 페이지에서 "Using breakpoints (container)" 섹션으로 찾을 수 있습니다https://tailwindcss.com/docs/max-width - 0
- 2
- 31
 
- 질문&답변 - button 질문 - 과 의 차이점이 두 가지 방법으로 버튼을 만들 수 있는데, 각각 다른 특징이 있습니다:1. 특징:단일 태그 (self-closing)텍스트만 표시 가능 (value 속성 사용)이미지나 다른 HTML 요소 포함 불가간단한 버튼에 적합2. 클릭하세요 특징:여는 태그와 닫는 태그 쌍으로 구성태그 안에 다양한 HTML 요소 포함 가능텍스트, 이미지, 아이콘 등을 자유롭게 배치더 유연한 디자인 가능실제 예시 비교 (사진) 이미지가 있는 버튼 언제 무엇을 사용할까?: 단순한 텍스트 버튼: 디자인이 필요하거나 복잡한 내용이 들어갈 버튼권장사항: 현재는 태그를 더 많이 사용합니다. 더 유연하고 접근성도 좋기 때문입니다! 🎯 - 0
- 2
- 25
 
- 질문&답변 - Streaming 관련해서 문의드립니다. - 안녕하세요 🙂네, 맞습니다! 서버-클라이언트 경계와 스트리밍 동작 방식을 설명드리겠습니다.스트리밍 동작 원리1. 서버 컴포넌트에서:// 서버 컴포넌트 export default function Page() { // await 하지 않고 Promise 자체를 생성 const postsPromise = getPosts(); const tagsPromise = getTags(); return ( }> ); } 2. 클라이언트 컴포넌트에서:// 클라이언트 컴포넌트 'use client' import { use } from 'react'; export default function BlogList({ posts, tags }) { // 여기서 Promise가 resolve됨 const resolvedPosts = use(posts); const resolvedTags = use(tags); return {/* 렌더링 */}; } 핵심 포인트Promise 전달: 서버에서 데이터가 아닌 Promise 객체 자체를 클라이언트로 전달비동기 해결: 실제 Promise resolve는 클라이언트에서 발생스트리밍 효과: 초기 HTML은 빠르게 전송되고, 데이터는 준비되는 대로 점진적으로 스트리밍장점초기 페이지 로딩이 빨라짐여러 데이터 요청을 병렬로 처리 가능사용자는 즉시 UI 골격을 볼 수 있음이 방식으로 서버의 계산 능력과 클라이언트의 반응성을 모두 활용할 수 있습니다 💪 - 0
- 2
- 35
 





![[짐코딩] 웹 개발 입문부터 최신 Vue 3 프론트엔드 실전까지 풀코스!](https://cdn.inflearn.com/public/roadmaps/781/cover/540b0cf3-d3ab-45ab-b45b-56a871bbb72f/도라 로드맵 모음.png?w=260)
![[짐코딩] Vue 실무자를 위한 최신 Vue 3 & Nuxt 3 Mastery Class](https://cdn.inflearn.com/public/roadmaps/768/cover/11c7e9b6-18d0-4f2c-bc58-fba723e95d88/2.png?w=260)
![[짐코딩] Vue 3 완벽 마스터 : 기초부터 실전까지 (기본편 + 실전편)](https://cdn.inflearn.com/public/roadmaps/766/cover/950e1dba-d066-4a67-90d3-5ed483e60bf1/3.png?w=260)

