최근의 기록
전체 글
자바, 파이썬, SQL 등 개발 관련
Suno로 한국어 노래 만들기, 가사와 스타일 프롬프트 작성법
AI 음악을 처음 만들 때는 “좋은 노래 만들어 줘”보다 어떤 가사를 어떤 분위기로 부를지 나눠 생각하면 시작하기 쉽습니다. Suno의 Custom 모드에 넣을 짧은 한국어 가사와 스타일 예시를 준비했습니다. 아래 가사는 이 글을 위해 만든 연습용 창작 예시이며, 완성 음원을 생성해 평가한 후기는 아닙니다.이 글에서 얻는 것: 가사와 음악 스타일을 나누기부터 실제로 적용할 수 있는 예시와 확인 방법까지 정리했습니다.1. 가사와 음악 스타일을 나누기Suno 공식 안내에 따르면 Create 화면의 Custom 모드에서는 직접 작성한 가사를 입력할 수 있습니다. 가사는 노랫말을, 스타일은 장르·악기·분위기 같은 음악 방향을 설명하는 데 사용합니다. 화면 배치와 이용 가능한 옵션은 계정·버전에 따라 달라질 수 ..
Next.js window is not defined 오류 해결 방법
Next.js에서 window is not defined가 나오면 브라우저 전용 코드를 서버에서 실행하고 있는지 확인해야 합니다. use client를 붙였는데도 계속 실패할 수 있습니다. window를 읽는 위치가 렌더 중인지, 파일 최상위인지, 외부 라이브러리 내부인지에 따라 수정 방법이 달라집니다.적용 범위: Next.js App Router · TypeScript 예제. 2026년 9월 공식 문서 확인 기준이며, 프로젝트 버전과 렌더링 설정에 따라 오류 문구는 달라질 수 있습니다.1. use client를 붙여도 발생하는 이유Client Component도 최초 접속 화면을 만들 때 서버에서 미리 렌더링될 수 있습니다. 따라서 함수 본문에서 window.innerWidth를 바로 읽거나 파일 최상..
ChatGPT·Claude·Gemini 비교, 한국어 글쓰기에 맞는 AI 고르는 법
ChatGPT, Claude, Gemini 중 무엇을 써야 할지 검색하면 서로 다른 추천을 보게 됩니다. 글쓰기에서는 긴 답변이 나오는지보다 내가 수정해야 하는 부분이 얼마나 남는지가 더 실용적인 기준이 될 수 있습니다. 같은 원문과 요청으로 비교하는 방법을 정리합니다.이 글에서 얻는 것: 서비스 이름과 모델 이름 구분하기부터 실제로 적용할 수 있는 예시와 확인 방법까지 정리했습니다.1. 서비스 이름과 모델 이름 구분하기Claude는 서비스·모델 제품군의 이름이고, Opus는 그 안의 모델 계열입니다. “Claude와 Opus 중 무엇이 좋을까?”라는 질문은 비교 단위부터 맞춰야 합니다. 비교할 때는 서비스, 화면에 표시된 모델, 요금제, 실험 날짜를 함께 기록하세요.이 글은 세 서비스를 실행해 순위를 ..
챗GPT 블로그 글쓰기, AI 티 줄이는 프롬프트와 수정 전후 예시
챗GPT로 초안을 만들면 문장은 매끄러운데 내 글 같지 않을 때가 있습니다. “현대 사회에서”, “매우 중요합니다” 같은 문장이 반복되고, 정작 독자가 궁금한 해결 방법은 뒤로 밀리기도 하죠. 이런 경우에는 자연스럽게 써 달라는 말만 반복하기보다 독자·사실·말투·수정 범위를 구체적으로 알려주는 편이 좋습니다.이 글에서 얻는 것: 자연스러운 글을 만드는 재료부터 실제로 적용할 수 있는 예시와 확인 방법까지 정리했습니다.1. 자연스러운 글을 만드는 재료글을 맡기기 전에 세 가지를 적어 보세요. 누가 읽는지, 무엇을 해결해 주는지, 직접 확인한 사실은 무엇인지입니다. “개발 블로그 글 작성”보다 “처음 배포하는 사람이 환경변수 위치를 확인하도록 돕는 글”이 편집 기준을 잡기 쉽습니다.OpenAI의 공식 프롬프..
Next.js Hydration failed 오류 원인과 해결 방법
Hydration failed 오류는 서버가 만든 HTML과 브라우저의 첫 렌더 결과가 맞지 않을 때 발생합니다. 무조건 useEffect를 추가하기보다 어떤 값이나 HTML 구조가 달라졌는지 찾는 것이 먼저입니다. 새로고침할 때만 나타나는 오류도 이 관점으로 점검할 수 있습니다.적용 범위: Next.js App Router · TypeScript 예제. 2026년 9월 공식 문서 확인 기준이며, 프로젝트 버전과 렌더링 설정에 따라 오류 문구는 달라질 수 있습니다.1. 비교 대상은 브라우저의 첫 렌더서버가 만든 초기 화면에 React가 이벤트와 상태를 연결하는 과정이 hydration입니다. 서버에서 “기본 테마”를 만들었는데 브라우저 첫 렌더에서 localStorage를 읽어 “다크 테마”를 출력하면 ..
Next.js NEXT_PUBLIC_ 환경변수 차이 정리
NEXT_PUBLIC_은 환경변수를 어디서 읽을 수 있는지 결정하는 중요한 표시입니다. API 주소가 안 읽힌다는 이유로 모든 변수에 붙이면 비밀키까지 브라우저로 전달할 수 있습니다. 공개 여부와 값이 결정되는 시점을 함께 이해해야 합니다.적용 범위: Next.js App Router · TypeScript 예제. 2026년 9월 공식 문서 확인 기준이며, 프로젝트 버전과 렌더링 설정에 따라 오류 문구는 달라질 수 있습니다.1. 일반 환경변수와 공개 환경변수일반 환경변수는 서버에서 사용하고, NEXT_PUBLIC_이 붙은 변수는 브라우저 코드에서도 참조할 수 있습니다. 공개 API 주소나 분석용 공개 ID는 후보가 되지만, 데이터베이스 비밀번호·결제 서비스 비밀키·관리자 인증 토큰은 공개 변수로 만들면 ..
Next.js .env.local 적용 안 될 때 확인할 것
Next.js에서 .env.local을 만들었는데 값이 undefined라면 파일을 다시 만들기 전에 읽는 위치부터 확인하세요. 서버에서 읽는 값인지, 브라우저에서 읽는 값인지에 따라 원인이 달라집니다. 이 글은 환경변수가 아예 없거나 예전 값으로 나오는 상황을 순서대로 점검하는 가이드입니다.적용 범위: Next.js App Router · TypeScript 예제. 2026년 9월 공식 문서 확인 기준이며, 프로젝트 버전과 렌더링 설정에 따라 오류 문구는 달라질 수 있습니다.1. 파일 위치와 이름부터 확인하기.env.local은 Next.js 앱의 루트, 일반적으로 package.json 옆에 둡니다. src를 쓰더라도 src 안으로 옮기지 않습니다. 모노레포에서는 저장소 전체의 루트와 실제 Next...
Next.js useSearchParams() Suspense 오류 해결 방법
개발 서버에서는 잘 열리던 페이지가 배포 빌드에서 useSearchParams() should be wrapped in a suspense boundary 오류로 멈출 때가 있습니다. 정적 페이지에서 쿼리스트링을 읽는 컴포넌트를 분리하고, 그 컴포넌트 바깥에 Suspense를 두는 방법부터 확인하면 됩니다.적용 범위: Next.js App Router · TypeScript 예제. 2026년 9월 공식 문서 확인 기준이며, 프로젝트 버전과 렌더링 설정에 따라 오류 문구는 달라질 수 있습니다.1. 개발할 때는 되는데 빌드에서 실패하는 이유예를 들어 /search?q=react의 q를 읽는 검색창을 생각해 보겠습니다. 빌드 시점에는 방문자가 입력할 쿼리를 알 수 없습니다. 정적 렌더링에서는 해당 훅을 사용하..
Next.js use client는 언제 붙여야 할까
Next.js App Router에서 useState나 onClick을 추가하자 오류가 생겼다면 use client 경계를 확인해 보세요. 페이지 전체에 습관적으로 붙이기보다, 실제로 상호작용이 필요한 컴포넌트를 작게 분리하면 구조를 이해하고 유지하기 쉬워집니다.적용 범위: Next.js App Router · TypeScript 예제. 2026년 9월 공식 문서 확인 기준이며, 프로젝트 버전과 렌더링 설정에 따라 오류 문구는 달라질 수 있습니다.1. use client는 클라이언트 진입점 선언App Router의 page와 layout은 기본적으로 Server Component입니다. 상태, 이벤트, effect가 필요한 UI를 Client Component로 만들 때 파일의 import보다 위에 us..
TXT 파일 한글이 깨질 때 해결하는 방법 — UTF-8과 CP949 차이
TXT 파일을 열었는데 한글이 이상한 기호로 보인다면, 바로 저장하지 마세요. 파일이 망가진 것이 아니라 프로그램이 글자를 읽는 방식, 즉 인코딩을 잘못 선택했을 수 있습니다.먼저 원본을 복사해 두고, 작업용 사본을 올바른 인코딩으로 다시 열어 보세요. 정상 문장을 확인한 뒤 UTF-8로 저장하는 순서가 중요합니다.1. TXT 한글이 깨지는 이유텍스트 파일에는 글자 자체가 아니라 글자를 표현하는 바이트가 저장됩니다. 파일을 만든 쪽의 저장 방식과 여는 프로그램의 해석 방식이 다르면 같은 파일도 깨져 보일 수 있습니다.UTF-8은 한글을 포함한 다양한 언어를 표현하는 유니코드 인코딩입니다. CP949는 한국어 Windows 환경에서 사용해 온 인코딩으로, EUC-KR의 한글 표현 범위를 확장한 방식입니다...
아이폰에서 TXT·EPUB 파일 읽는 방법 — 쿠피리더 사용 가이드
아이폰에 저장해 둔 소설이나 글을 조금 더 편하게 읽고 싶을 때가 있습니다. 파일을 열어 보는 것에서 한 걸음 더 나아가, 글자 크기를 조절하고 읽던 곳을 기억해 주는 서재가 있으면 좋겠다고 생각했어요.그래서 만든 앱이 쿠피리더입니다. 직접 개발한 앱을 소개하며, 이번 글에서는 iPhone에서 TXT·EPUB 파일을 가져와 읽는 방법을 안내합니다.예시 도서를 사용한 소개 이미지입니다. 앱 버전과 기기에 따라 화면 구성이 조금 다를 수 있습니다.1. 쿠피리더 설치하기쿠피리더는 iPhone과 iPad에서 사용할 수 있는 텍스트·전자책 뷰어입니다. 별도 회원가입 없이 시작할 수 있으며, 앱 다운로드는 무료이고 배너·선택형 리워드 광고가 포함됩니다.쿠피리더 App Store 다운로드 →2. TXT·EPUB 파일..
구글 플레이스토어 비공개 테스트(14일) 진행 방법 총정리 [Google Groups 활용]
구글 플레이스토어 비공개 테스트(14일) 쉽게 진행하는 방법구글 플레이스토어에 앱을 출시하려고 하면신규 개발자 계정의 경우 비공개 테스트(Closed Testing)를 일정 기간 유지해야 합니다.특히 최근에는 구글 플레이 20명 테스트, Play Console 비공개 테스트, Google Groups 연동 과정에서 어려움을 겪는 분들이 많습니다.특히 많은 분들이 헷갈려 하는 부분이 바로Google Groups 연결 및 테스터 참여 방식인데요.이번 글에서는 실제로 제가 진행한 방법 기준으로Google Groups 생성부터 Play Console 연결, 그리고 테스터 참여 방법까지 순서대로 정리해보겠습니다.저도 처음에는 테스트 참여 버튼이 보이지 않거나 앱 설치가 되지 않는 문제를 여러 번 겪었는데, 대부분..