728x90
반응형

분류 전체보기 48

[DevOps] GitHub Actions 첫걸음 — 푸시하면 자동으로 테스트 돌리기

지난 글에서 CI/CD가 뭔지 개념을 잡았다. "코드를 푸시하면 자동으로 테스트하고 배포한다"는 그거다. 오늘은 말로만 듣던 그걸 직접 만들어본다. 도구는 입문에 제일 만만한 GitHub Actions다.목표는 소박하다. 코드를 push하면, GitHub이 알아서 테스트를 돌려주는 것. 이 첫 경험만 해보면 CI가 확 와닿는다.GitHub Actions는 왜 쉬운가GitHub Actions의 가장 큰 장점은 GitHub에 이미 내장돼 있다는 거다. 별도 서버도, 설치도, 회원가입도 필요 없다. 내 저장소 안 특정 위치에 설정 파일(YAML) 하나만 넣으면, GitHub이 그걸 읽고 자동으로 실행해준다.그 위치가 정해져 있다. 저장소 루트에 이렇게 만든다.내-저장소/└── .github/ └── wo..

[DevOps] Docker 이미지 최적화 — 멀티스테이지 빌드로 용량 확 줄이기

Docker를 좀 쓰다 보면 이런 걸 발견한다.docker imagesREPOSITORY TAG SIZEmy-app latest 1.2GB ← 엥? 내 앱이 이렇게 크다고?간단한 앱 하나 만들었을 뿐인데 이미지가 1GB를 훌쩍 넘는다. 이게 왜 문제냐면, 이미지가 클수록 빌드도 느리고, 레지스트리에 올리고 내리는 것도 느리고, 배포도 느리다. 컨테이너의 장점인 "가볍고 빠르게"가 무색해진다.오늘은 이 뚱뚱한 이미지를 날씬하게 만드는 법을 다룬다. 핵심은 멀티스테이지 빌드(multi-stage build)다.왜 이미지가 이렇게 커질까?이유는 크게 두 가지다.첫째, 베이스 이미지가 무겁다. FROM node:20처럼 그냥 쓰면, 이 이미지 안에는 앱 실행에 꼭 필요하지 않은 것..

[DevOps] Docker Compose — 여러 컨테이너를 한 번에 관리하기

지난 글에서 Dockerfile로 내 앱을 이미지로 만들었다. 그런데 실무 앱은 혼자 안 돈다. 웹 서버 하나에 데이터베이스가 붙고, 캐시로 Redis가 붙는다. 그럼 컨테이너를 하나씩 이렇게 띄워야 한다.docker run -d --name my-db -e POSTGRES_PASSWORD=... postgres:16docker run -d --name my-redis redis:7docker run -d --name my-app -p 3000:3000 --link my-db ... my-app컨테이너 세 개인데 벌써 명령어가 길고 지저분하다. 순서도 신경 써야 하고, 네트워크로 서로 연결도 해줘야 한다. 컨테이너가 다섯 개, 열 개로 늘면? 손으로 못 한다.이 문제를 해결하는 게 Docker Compo..

[DevOps] Dockerfile 작성법 — 내 앱을 직접 이미지로 만들기

지난 글에서 컨테이너가 뭔지, 이미지가 붕어빵 틀이라는 것까지 잡았다. 그때는 nginx나 hello-world처럼 남이 만들어둔 이미지를 가져다 썼다. 오늘은 한 걸음 더 나간다. 내 앱을 담은 이미지를 직접 만드는 법, 바로 Dockerfile이다.이걸 할 줄 알아야 "내가 만든 프로그램을 어디서든 똑같이 돌린다"는 Docker의 진짜 목적에 도달한다.Dockerfile = 이미지 만드는 레시피Dockerfile은 "이 이미지를 이렇게 만들어라"라고 적어둔 설명서(레시피)다. 붕어빵 틀(이미지)을 찍어내기 위한 설계도라고 보면 된다.베이스 환경은 뭘 쓸지, 내 코드는 어디에 복사할지, 어떤 명령으로 실행할지를 위에서 아래로 순서대로 적는다. 그러면 Docker가 그 순서대로 실행해서 이미지를 만들어준..

[DevOps] Docker 기초 — 컨테이너가 대체 뭔데? "내 컴퓨터에선 되는데요"의 종말

개발하다 보면 한 번쯤 이 말을 하거나 듣게 된다."어? 제 컴퓨터에선 되는데요...?"내 노트북에선 멀쩡히 돌아가던 코드가, 동료 컴퓨터나 서버에만 올리면 안 된다. 자바 버전이 달라서, 라이브러리가 없어서, OS가 달라서, 환경변수가 안 잡혀서... 이유는 매번 다르다. 이 지긋지긋한 문제를 뿌리부터 없애주는 게 바로 Docker다.오늘은 Docker의 첫걸음으로, 컨테이너가 대체 뭔지 개념부터 잡아본다. 명령어 암기는 그 다음이다. 왜 필요한지를 알면 명령어는 자연스럽게 따라온다.문제의 뿌리: "환경이 다르다"방금 그 "내 컴퓨터에선 되는데요" 문제의 핵심은 하나다. 실행 환경이 다르기 때문이다.내 프로그램 하나가 제대로 돌려면 사실 엄청나게 많은 게 맞아떨어져야 한다.특정 언어 런타임 (Node ..

[AI/LLM] RAG 검색 정확도 올리기 — 청킹 전략과 검색 품질

RAG 시리즈 세 번째 글이다. 개념편에서 RAG가 뭔지 잡았고, 실습편에서 Chroma랑 pgvector로 직접 만들어봤다. 그런데 막상 실습한 RAG를 좀 굴려보면 이런 일이 생긴다."분명히 문서에 답이 있는데, 왜 엉뚱한 걸 찾아오지?"RAG의 답변 품질은 결국 "검색이 관련 문서를 제대로 찾아왔는가"에 달려 있다. 아무리 좋은 LLM을 써도, 검색이 엉뚱한 문서를 가져오면 답도 엉뚱해진다. 오늘은 검색 정확도를 좌우하는 가장 중요한 요소, 청킹(chunking)을 중심으로 RAG 품질을 올리는 법을 다룬다.청킹이 뭔데? 왜 문서를 쪼개야 하지?실습편에서는 짧은 문장들을 그대로 넣었다. 근데 실무 문서는 다르다. 수십 페이지짜리 PDF, 긴 위키 문서, 몇천 줄짜리 매뉴얼이다.이런 긴 문서를 통째로..

[AI/LLM] 직접 만들어보는 RAG — Chroma와 pgvector 실습편

지난 글에서 RAG, 임베딩, 벡터DB가 뭔지 개념을 잡았다. 이제 손으로 직접 만들어볼 차례다. 오늘은 아주 작은 RAG를 파이썬으로 처음부터 끝까지 만들어본다. 벡터DB는 두 가지, Chroma와 pgvector로 각각 구현해본다.Chroma: 설치가 간단하고 파이썬만으로 바로 돌아간다. 입문/프로토타이핑에 좋다.pgvector: 이미 쓰던 PostgreSQL에 얹는 방식이다. 실무에서 기존 DB랑 같이 쓰기 좋다.같은 걸 두 방식으로 만들어보면 "벡터DB가 바뀌어도 RAG 흐름은 똑같다"는 걸 몸으로 알게 된다.준비물임베딩과 답변 생성에는 OpenAI API를 쓴다. (다른 임베딩 모델을 써도 흐름은 같다.) 먼저 공통 패키지부터 깔자.pip install openai그리고 API 키를 환경변수로 ..

[AI/LLM] RAG가 뭔데? 임베딩과 벡터DB까지 한 번에 이해하기

ChatGPT한테 "우리 회사 작년 사내 규정 알려줘" 하면 절대 모른다. 학습한 적이 없으니까. 그런데 요즘 "사내 문서 물어보면 답해주는 챗봇"은 어떻게 만드는 걸까? 그 비밀이 바로 RAG다.오늘은 RAG가 뭔지, 그리고 RAG를 이해하려면 꼭 알아야 하는 임베딩과 벡터DB까지 한 번에 정리해본다. 이 세 개는 따로 노는 개념이 아니라 하나의 흐름으로 엮여 있어서, 같이 보면 이해가 훨씬 빠르다.먼저 문제부터: LLM은 모르는 게 많다GPT 같은 LLM은 똑똑하지만 두 가지 한계가 있다.학습 시점 이후의 일을 모른다. 작년 데이터까지만 배웠으면 올해 일은 모른다.내 개인/회사 데이터를 모른다. 우리 회사 위키, 내 노션, 사내 규정 같은 건 학습한 적이 없다.그래서 LLM한테 모르는 걸 물으면 그냥..

[JAVA] 파일 다운로드 시 한글 파일명 깨짐 문제 해결 — Content-Disposition 인코딩

분명히 "보고서.pdf"로 올렸는데, 다운로드하면 왜 깨질까?지난 글에서 이미지 업로드의 EXIF 회전 문제를 다뤘는데, 파일을 다룰 때 EXIF 못지않게 사람을 괴롭히는 게 또 하나 있다. 바로 파일 다운로드 시 한글 파일명이 깨지는 문제다.분명히 서버에 결산보고서_2026.xlsx로 저장했는데, 사용자가 다운로드하면 ê²°ì‚°ë³´ê³ ì„œ.xlsx 같은 외계어가 나온다. 이 글을 클릭한 사람이라면 아마 이 외계어를 직접 마주하고 들어왔을 거다. 오늘은 이 문제가 왜 생기는지, 그리고 어떻게 깔끔하게 해결하는지 처음부터 끝까지 정리해보겠다.먼저 현상을 정확히 파악해보자상황은 보통 이렇다.사용자가 매출현황.xlsx 파일을 업로드한다.서버는 잘 저장한다. (여기까지는 멀쩡하다.)다른 사용자가 그 파일..

[JAVA] 이미지 업로드 회전 문제 해결 -- EXIF Orientation

📸 서버에 올리면 사진이 옆으로 눕는다? Java 이미지 업로드의 숨겨진 함정"분명히 세로로 찍었는데, 서버에 올리면 왜 가로로 눕지?"이 글을 클릭한 당신, 아마 이 문장에 공감해서 들어왔을 겁니다. 저도 처음 이 문제를 만났을 때 꽤 오래 머리를 싸맸거든요. 오늘은 이 황당하고 은근히 까다로운 문제의 원인부터 해결책까지, 누구나 이해할 수 있도록 싹 정리해드리겠습니다.🤔 먼저 현상을 정확히 파악해보자시나리오는 이렇습니다.사용자가 스마트폰으로 세로 방향으로 사진을 찍습니다.그 사진을 웹사이트에 업로드합니다.갤러리에서는 분명히 세로로 잘 보입니다.그런데 서버를 통해 처리된 이미지는 가로로 90도 누워버립니다.처음엔 "내가 뭘 잘못 코딩한 건가?" 싶지만, 사실 이건 여러분의 실수가 아닙니다. Java..

728x90
반응형