프론트 개발자로 네카라쿠배 중 하나의 IT서비스 기업에 재직하고 있습니다. 😀
🚀 SW마에스트로 Expert 취업 멘토링
🚀 Naver Boostcamp BE 멘토 경험
🚀 FE 7Code 로드맵 강의 제작
講義
受講レビュー
- SupabaseとNextを使ったフルスタック開発入門 (Supabase OAuth、Next.js 14をフィーチャー)
- React + GPT APIでAI回顧録サービス開発(ワンデイクラス)
- 1時間でChat GPTクローンをCursorで作成(ワンデークラス)
投稿
Q&A
DBeaver와 supabase connection
안녕하세요. Session pooler 방식으로 커넥션 해보세요.! (사진) Supabase에서 제공하는 3가지 연결 방식은 데이터베이스 연결을 관리하는 방법과 연결 유지 시간에 따라 주요한 차이점이 있습니다. 연결 방식별 상세 설명 1. Direct Connection (직접 연결) 가장 전통적인 방식입니다. 클라이언트(DBeaver)가 Supabase PostgreSQL 인스턴스에 직접 연결하여 하나의 전용 연결을 오랫동안 사용합니다.장점: 모든 PostgreSQL 기능을 완벽하게 지원하며, 세션 기반 설정(SET 명령어 등)을 유지하는 데 문제가 없습니다. DBeaver에서 데이터베이스를 탐색하고 관리하는 데 가장 익숙하고 안정적인 방식입니다.단점: 데이터베이스가 수용할 수 있는 **최대 연결 수(max_connections)**가 제한적이기 때문에, 많은 수의 동시 사용자 요청이 발생하면 연결 제한에 쉽게 도달할 수 있습니다.참고: Supabase에서 Direct Connection은 기본적으로 IPv6를 권장합니다. 2. Session Pooler (세션 풀러) 연결 풀링(Connection Pooling) 기술을 사용하지만, 동작 방식은 Direct Connection과 유사합니다.클라이언트가 접속하면 풀러가 데이터베이스 연결을 할당하고 클라이언트가 끊을 때까지 유지합니다. 즉, 여러 클라이언트가 직접 연결 수 제한을 초과하지 않도록 큐(Queue)와 연결 공유 기능을 제공하지만, 연결을 '오래' 유지한다는 점은 Direct Connection과 같습니다.장점: Direct Connection의 대안으로 적합하며, 특히 IPv4 환경에서 사용하기 좋습니다. DBeaver와 같이 세션 상태 유지가 필요한 GUI 도구에 매우 적합합니다.단점: Direct Connection처럼 연결을 오래 유지하므로, 서버리스 환경과 같이 연결 생성 및 해제가 잦은 환경에서는 비효율적일 수 있습니다. 3. Transaction Pooler (트랜잭션 풀러) 연결 풀링의 장점을 극대화한 방식으로, 가장 높은 확장성을 제공합니다.클라이언트가 SQL 쿼리를 실행할 때 필요한 트랜잭션이 진행되는 동안에만 데이터베이스 연결을 할당하고, 트랜잭션이 완료되는 즉시 연결을 풀에 반환하여 다른 클라이언트가 즉시 재사용할 수 있도록 합니다.장점: 적은 수의 실제 데이터베이스 연결로 수백 배 이상의 클라이언트 동시 접속을 처리할 수 있어, 서버리스 환경(Edge/Serverless Functions)처럼 짧고 폭발적인 연결이 필요한 경우에 최적입니다.단점: 트랜잭션 단위로 연결이 끊어지고 재사용되므로, **세션 기반 상태(Session-level state)**를 유지할 수 없습니다. 따라서 DBeaver와 같은 GUI 툴에서 사용하기에는 불편할 수 있습니다. (예: PREPARE STATEMENT 사용 불가)
- 0
- 2
- 32
Q&A
가상환경 같은건 없나요?
nvm 같은 도구로 node.js 버전 수준의 관리는 합니다.!
- 0
- 3
- 27
Q&A
가상환경 같은건 없나요?
안녕하세요. node.js 진영에도 가상환경을 구축할 수 있습니다.하지만 보통 파이썬 처럼 가상환경을 두고 사용하지는 않아요. 왜냐하면 로컬 프로젝트의 마다 node_modules 가 하나씩 생겨요. 어떻게 보면 파이썬 가상환경이 만들어 지는 거죠.
- 0
- 3
- 27
Q&A
isLoading 값이 바뀌는 시점(동작 순서)이 궁금합니다.
isLoading이 useState로 선언한 변수가 아닌데도 로딩 컴포넌트에서 버튼으로 다시 그려주나요?https://github.com/dodokyo/yt-music-clone/blob/main/app/playlist/page.tsx로딩 변수가 아닌데 로딩 컴포넌트가 그려지는 경우는 위 page.tsx가 로딩 되는 동안 loading.tsx가 렌더링 되는 경우 입니다.page.tsx 는 await로 중간에 비동기로 처리 되는 부분이 있습니다. " const playlist = await getPlaylistById(Number(props.searchParams.list));" 이 부분이죠.위 비동기 처리가 빠르게 처리되긴 하지만, 그 동안 페이지가 보여주어야 하는 컴포넌트는 loading.tsx라고 약속한것이 next.js 입니다. 내부적인 동작원리는 React suspense 라고 강의에서 전달드린바 있습니다. ~ 답변 드리고 나니 질문의 정확한 의도를 잘 모르겠어서 다시 남겨주시면 더 정확한 답변 가능합니다.
- 0
- 3
- 44
Q&A
4.6강 초기 로딩 속도 케이스 비교
강의 오류 부분 죄송합니다. 결론적으로 아래 케이스 1,2,3 으로 봐주시면 됩니다. 사용자의 입장에서 첫 페이지를 보는데 과연 얼마나 시간이 걸리는지 테스트 해보는 상황입니다.해당 케이스를 나누는데 Root Layout 과 그 외 Page Layout의 로딩 타임을 구분해서 생각 후 첫 페이지가 얼마 후 보여지는지 생각하면 됩니다. Case1 - Root Page Loading 4s + Home Page Loading 2s=> 첫 페이지를 보는데 4초가 걸립니다.Case2 - Root Page Loading 2s + Home Page Loading 4s=> 첫 페이지를 보는데 2초가 걸립니다. 그러나 Home Page는 여전히 로딩 중 입니다. Case3 - Root Page Loading 2s + Home Page Loading 2s=> 첫 페이지를 보는데 2초가 걸립니다. 그 즉시 Home Page 도 바로 보입니다.
- 0
- 2
- 52
Q&A
Sidebar & Header 컴포넌트 등 레이아웃 설정 방식
시멘틱 태그를 적용시키면 아래처럼 작성해도 좋습니다. {children}
- 0
- 3
- 53
Q&A
Sidebar & Header 컴포넌트 등 레이아웃 설정 방식
안녕하세요. ~ 나중에 RootLayout에 Player가 하나 추가 됩니다. {children} 나중에 (Site) 루트 페이지는 다음 모습이구요. import React from "react"; import Category from "./components/Category"; import PagePadding from "@/components/PagePadding"; import PlayListCarousel from "@/components/PlayListCarousel"; import { dummyPlaylistArray, getPlaylistById } from "@/lib/dummyData"; import UserIcon from "@/components/UserIcon"; const page = async () => { const dummyPlaylistArray1 = [...dummyPlaylistArray]; const dummyPlaylistArray2 = [await getPlaylistById(1)]; const dummyPlaylistArray3 = [await getPlaylistById(2)]; const dummyPlaylistArray4 = [await getPlaylistById(3)]; return ( } title="다시 듣기" subTitle="도도" /> ); }; export default page; RootLayout에 아래처럼 해주셔도 상관없습니다.단, 모든 Layout에서 사용하는 Root Layout 이므로 데이터 패칭을 최소화 하여 빠른 로딩을 하도록, 최대한 간결하게 작성하는게 좋습니다. ~ {children}
- 0
- 3
- 53
Q&A
useCallback의 디펜던시 배열에 supabase 넣는 이유?
질문의 의도는 아래처럼 함수 인자로 userId를 전달하는 경우 인가요? 가능 합니다만 supabase auth를 이용하지는 못합니다.const getUserInfo = useCallback(async (userId) => { const result = await supabase.(profile db 등).getUserById(userId); if (result?.data?.user) setUser(result?.data?.user); }, [supabase]);const getUserInfo = useCallback(async () => { const result = await supabase.auth.getUser(); if (result?.data?.user) setUser(result?.data?.user); }, [supabase, userId]);위 처럼 userId가 의존성 배열에 들어가도 의미는 없습니다.질문의 의도를 잘 모르겠네요. ㅠㅠ 의존성 배열은 특정 변수가 바뀌는것을 캐치 하느냐 안하느냐 판단하면 됩니다. 특정 변수가 바뀌는데 이를 캐치했다라면 변경된 최신의 변수와 함께 useCallback, useMemo등이 갱신됩니다. 그렇지 않다라면 예전의 낡은 변수, 인스턴스를 보고 있겠죠?
- 0
- 2
- 56
Q&A
getUser 에 갑자기 serverComponent가 추가된 이유?
사용처가 분명한 함수라면 가능합니다.! 개인적으로는 서버액션은 serverComponent 및 클라이언트 컴포넌트 2곳에 모두 사용가능하도록 만드는게 좋아서 이에 대한 분기 처리 인자를 남겨두었죠. 엄밀히 말하면 SSR 과정에서 해당 함수 호출은 일반 함수 호출 입니다. -> 쿠키 조작 불가능. CSR 과정에서 해당 함수 호출은 서버액션 호출 입니다. -> 쿠키 조작 가능.
- 0
- 2
- 59
Q&A
getUser 에 갑자기 serverComponent가 추가된 이유?
사용처가 분명한 함수라면 가능합니다.! 개인적으로는 서버액션은 serverComponent 및 클라이언트 컴포넌트 2곳에 모두 사용가능하도록 만드는게 좋아서 이에 대한 분기 처리 인자를 남겨두었죠. 엄밀히 말하면 SSR 과정에서 해당 함수 호출은 일반 함수 호출 입니다. -> 쿠키 조작 불가능. CSR 과정에서 해당 함수 호출은 서버액션 호출 입니다. -> 쿠키 조작 가능.
- 0
- 2
- 62






