썸네일 데이터 마이그레이션 SQL 쿼리 (3) Grouping Count 및 Unique Count 💾 데이터 마이그레이션 전, 현재 상황 파악하기 (SQL 조회) 데이터베이스에서 중요한 작업을 시작하기 전에는 "지금 상태가 어떤지"를 정확히 확인해야 합니다.이 과정은 이사를 가기 전에 각 방에 짐이 얼마나 있는지 세어보는 것과 같습니다.우리가 사용할 두 가지 SELECT 쿼리는 바로 이 '짐 세기' 작업을 수행하는 도구입니다. 1. 쿼리: 각 프로젝트별 현재 자료 개수 세기이 쿼리는 마이그레이션 대상 그룹 내에서 각각의 시계열 프로젝트가 현재 몇 개의 어노테이션 자료를 가지고 있는지를 확인합니다.📝 쿼리 내용SELECT A.time_project_id, COUNT(*) AS annotation_countFROM database.annotation AWHERE A.time_pr..
썸네일 데이터 마이그레이션 SQL 쿼리 (2) INSERT INTO + NOT EXISTS 💾 데이터베이스와 SQL: 개념 설명1. 데이터베이스 (Database)란 무엇인가요?쉽게 설명: 데이터베이스는 정보를 체계적으로 정리하고 저장해 두는 '전자식 파일 캐비닛' 또는 '초대형 엑셀 파일'이라고 생각할 수 있습니다.역할: 데이터베이스 안에는 고객 목록, 상품 재고, 또는 우리가 다루는 '프로젝트 정보'와 같은 중요한 데이터가 테이블(Table) 형태로 저장되어 있습니다.2. SQL (Structured Query Language)이란 무엇인가요?쉽게 설명: SQL은 이 데이터베이스라는 파일 캐비닛에게 "내가 원하는 정보를 찾아와, 수정해 줘, 또는 새로 넣어 줘" 라고 명령하는 데 사용하는 '언어'입니다.역할: 복잡한 명령어를 사용하지 않고, 정해진 문법대로 요청하면 데이터베이스가 그 요청..
썸네일 데이터 마이그레이션 SQL 쿼리 (1) Self Join 예시 쿼리SELECT T1.id AS source_time_project_id, T2.id AS target_time_project_id, T1.project_id AS master_project_idFROM database.time_project T1JOIN database.time_project T2 ON T1.project_id = T2.project_idWHERE T1.id T2.id AND T1.project_id = 99; 쿼리의 전체 목적목적: 마스터 project_id가 99인 그룹에 속한 모든 Time Project ID(id)들이 서로 데이터를 주고받을 수 있는 관계를 파악하는 것입니다.활용: 이는 실제 데이터 마이그레이션(INSERT 작업)을 수행하..
썸네일 PostgreSQL Primary Key serial4 속성 해제: DROP DEFAULT/DROP SEQUENCE 테이블의 기본 키(Primary Key)로 자주 사용되는 serial4 타입 컬럼을 일반 int4 타입 컬럼으로 되돌리는 작업에 대해 설명하고 정리하려고 합니다.개발 중 실수로 serial4 타입 컬럼을 생성했거나, 기존 테이블의 자동 증가(Auto Increment) 기능을 제거하고 싶을 때가 있습니다.이 포스팅은 PostgreSQL에서 기본 키로 자주 사용되는 serial4 컬럼을 순수한 int4 타입으로 되돌리는 2단계 과정을 자세히 설명합니다. 1. 🔑 serial4 타입, 그 정체를 파헤치다PostgreSQL에서 serial4는 실제 데이터 타입을 넘어서는 편리한 가상 타입입니다. 이 키워드를 사용하면 데이터베이스가 자동으로 다음 세 가지 구성 요소를 한 번에 처리해 줍니다.1. 컬럼 타입: ..
썸네일 [TroubleShooting] S3 업로드 시 한글 파일명 깨짐과 NFC/NFD 정규화 완벽 정리 1. 핵심 요약 (TL;DR)문제: macOS와 Windows/Linux는 한글을 처리하는 유니코드 방식이 다르다. (NFC vs NFD)현상: 로컬(macOS)에서 올린 파일을 Lambda(Linux)에서 찾으려 하면 404 NoSuchKey 에러가 발생한다.해결:S3 조회 시: 방어적 코딩으로 NFC와 NFD 포맷을 모두 조회한다.DB 저장 시: 검색 일관성을 위해 NFD(혹은 NFC)로 포맷을 하나로 통일하여 저장한다.2. 배경 지식: 유니코드 정규화 (Unicode Normalization)문제의 시작한글 "한"이라는 글자는 컴퓨터 입장에서 두 가지 방법으로 표현될 수 있습니다. 사람 눈에는 똑같아 보이지만, 컴퓨터는 이를 완전히 다른 문자열로 인식합니다.구분설명형태바이트 길이(예시)주요 사용 O..
썸네일 [Troubleshooting] S3와 DB 데이터 불일치 해결: Single Source of Truth(SSOT)의 중요성 AWS S3와 DB를 연동할 때 '무엇'을 기준으로 삼아야 할까?삭제 버튼을 눌렀는데 삭제가 안 되는 경우는 무엇일까? S3와 DB 데이터 불일치하여 생기는 Troubleshooting 문제를 해결하기 위한 Single Source of Truth(SSOT) 개념을 정리하려고 한다. 0. 들어가며: 데이터의 기준은 어디인가?최근 프로젝트에서 AWS S3(파일 저장소)와 RDS(메타데이터 저장소)를 함께 사용하는 기능을 개발하면서 겪은 문제와 해결 과정을 공유하려 합니다.UI에는 분명히 데이터가 존재해서 '삭제'를 눌렀는데, "파일을 찾을 수 없습니다"라는 에러와 함께 삭제가 되지 않는 현상이 발생했습니다. 이 문제를 해결하며 배운 Single Source of Truth(단일 진실 공급원)의 개념과 적..
썸네일 [AWS/GitHub Actions] 배포 실패! "name unknown: The repository with name..." 에러 해결 및 ECR 개념 정리 AWS Lambda를 Docker 이미지 기반으로 배포하기 위해 GitHub Actions를 돌리던 중, 빌드 파이프라인이 실패하는 상황을 마주했습니다.CI/CD 구축 중 흔히 겪을 수 있는 ECR 리포지토리 누락 문제와 이를 해결하기 위한 핵심 개념들을 정리해 봅니다. 🚨 발생한 오류 상황GitHub Actions 워크플로우 실행 중 docker push 단계에서 다음과 같은 에러가 발생하며 프로세스가 종료되었습니다. name unknown: The repository with name 'data-processor' does not exist in the registry with id '***'Error: Process completed with exit code 1.해석하자면 "네가 이미지를 밀어 ..
썸네일 [Git] Merge/Pull이 안 될 때? Stash로 작업 내용 임시 저장하기 📦 [Git] Merge/Pull이 안 될 때? Stash로 작업 내용 임시 저장하기 📦개발을 하다 보면 아직 작업이 끝나지 않았는데 급하게 다른 브랜치로 넘어가거나, git pull / git merge를 해야 하는 상황이 생깁니다.이때 그냥 진행하면 Git은 "커밋하지 않은 변경사항이 있어 덮어씌워질 수 있다" 며 에러를 뱉습니다.error: Your local changes to the following files would be overwritten by merge:...Please commit your changes or stash them before you merge.이때 유용한 기능이 바로 Git Stash입니다. 1. Git Stash란? 🤔작업 중인 코드(변경된 파일)를 잠시 "서랍(S..
썸네일 JSON과 Python 딕셔너리 이해하기 안녕하세요! 백엔드 개발, 특히 API를 만들다 보면 프론트엔드와 데이터를 주고받을 일이 정말 많은데, 이때 'JSON'과 '파이썬 딕셔너리(dict)'의 용어가 미묘하게 달라 헷갈리거나 커뮤니케이션에 혼동을 겪는 경우가 종종 있습니다.이 둘은 매우 비슷하게 생겼지만, 그 본질과 사용되는 시점이 다릅니다.핵심을 먼저 말씀드리면, "JSON은 데이터를 교환하기 위한 '문자열(text) 형식'"이고, "파이썬 딕셔너리는 메모리상에 존재하는 '데이터 구조'"입니다.오늘은 이 두 가지 개념을 명확히 비교하고, 파이썬에서 어떻게 변환해서 사용하는지 확실하게 정리해 보겠습니다.1. 🔀 JSON과 Python 용어 비교 (치트 시트)프론트엔드 개발자와 소통하거나 API 문서를 볼 때, 머릿속에서 아래 표와 같이 변..
썸네일 [1탄] 백엔드 기초 개념 핵심 정리 1강: 백엔드란 무엇인가? (핵심 개념과 역할)1.1. 프론트엔드(Frontend) vs. 백엔드(Backend)웹 서비스는 사용자와 직접 만나는 부분과 보이지 않는 뒷부분으로 나뉩니다.• 프론트엔드 (Frontend): 사용자가 직접 보고 상호작용하는 영역입니다. (예: 웹 페이지 디자인, 버튼, 앱 화면). 주로 HTML, CSS, JavaScript 등의 기술이 사용됩니다.• 백엔드 (Backend): 사용자에게 보이지 않는 서버 측 영역입니다. 데이터 저장 및 관리, 핵심 기능(비즈니스 로직) 처리, 보안 등을 담당합니다. Java, Python, Node.js, 데이터베이스 등 다양한 기술이 사용됩니다.이 둘을 분리하는 이유는 전문성 강화, 효율적인 협업, 쉬운 유지보수를 위해서입니다.1.2. ..
썸네일 DB 데이터와 S3 파일 불일치 문제 해결하기 (트랜잭션 순서) 🐛 발생한 에러 분석개발 과정에서 발생한 에러와 코드 리팩토링을 기록합니다. 1️⃣ 첫 번째 에러: 500 Internal Server Error증상:HTTP 500 Internal Server Error 원인:# 서버 로그 (CloudWatch 등)[ERROR] column "user_name" does not exist 문제 코드:sql = f""" DELETE FROM {db.USERS_TABLE} WHERE user_id = '{user_id}' AND user_name = '{username}' # ❌ 잘못된 컬럼명""" 실제 DB 테이블 구조:-- app.users 테이블┌─────────────┬──────────┬─────────┐│ Column Name │ Type ..
썸네일 파이썬 함수 사용을 위한 객체 지향 프로그래밍(OOP) 관련 개념 이 개념들은 객체 지향 프로그래밍(OOP)을 더 깊게 활용하고, 함수의 기능을 확장하며, 복잡한 프로그램의 흐름을 제어하는 데 필수적입니다.📚 목차__init__: 객체의 탄생을 알리는 생성자__call__: 객체를 함수처럼 부르는 마법데코레이터 (Decorator): 코드를 감싸는 우아한 포장지제너레이터 (Generator): 메모리를 아끼는 현명한 데이터 생산자traceback: 오류의 뿌리를 찾는 탐정async/await: 기다림의 미학, 비동기 프로그래밍 1. __init__: 객체의 탄생을 알리는 생성자__init__은 "initialize" (초기화하다)의 약자입니다. 이름 그대로, 클래스(설계도)에서 객체(제품)를 처음 만들 때 자동으로 호출되는 특별한 메소드(함수)입니다. 역할: 객체가 ..