[AWS] Windows에서 AWS EC2까지: Docker로 Python 서비스 배포하기
·
AWS
프로젝트를 진행하면서 프론트엔드(React)와 백엔드(Java)는 Docker 없이 직접 빌드하여 배포했다. 하지만 AI 기능을 담당하는 Python 백엔드는 의존성 관리와 배포 환경의 일관성을 위해 Docker를 활용하기로 결정했다. 이번 글에서는 Windows 환경에서 Docker를 설치하고, Python 애플리케이션을 Docker 이미지로 빌드한 후 Amazon EC2에 배포하는 전체 과정을 정리했다. Docker란?Docker는 애플리케이션을 개발, 배포, 실행하기 위한 오픈소스 플랫폼이다. Docker를 사용하면 애플리케이션과 그 의존성을 "컨테이너"라는 표준화된 유닛으로 패키징할 수 있다. 이 컨테이너는 개발 환경, 테스트 환경, 프로덕션 환경 등 어디서든 동일하게 실행될 수 있어 "내 컴퓨터..
[Python] Selenium으로 네이버 플레이스 크롤링: 부산 해운대 맛집 정보 수집하기
·
Python
약 한 달 반 전, 팀 프로젝트에서 가장 먼저 시도했던 네이버 지도 크롤러 개발 과정을 공유하려 한다. 당시 내가 맡은 부분은 맛집 추천 에이전트였다. 한국에서는 네이버 플레이스가 가장 많은 정보를 보유하고 있지만 공식 API가 없었기 때문에, 초기에는 셀레니움을 활용한 동적 크롤링을 시도했다. 솔직히 동적 크롤링은 처음 해보는 거라 신기하고 흥미로웠다. 결과적으로 1박 2일 일정에 하루 3끼, 최소 15개 이상의 식당 데이터가 필요했고 크롤링 속도 문제로 인해 구글 플레이스 API로 방향을 전환했지만, 오늘은 당시 개발했던 크롤러를 다시 살펴보려 한다.개발 목표네이버 지도에서 "부산 해운대 음식점" 검색 결과 수집하기각 음식점의 이름, 카테고리, 평점, 주소 정보 추출하기자동으로 모든 검색 결과를 스크..
[Python] FastAPI JWT 인증 미들웨어 분석 – 어떻게 동작할까?
·
Python
팀원이 개발한 JWT 인증 미들웨어(jwt_auth_middleware)를 분석하면서, 미들웨어가 어떻게 동작하는지, 그리고 어떤 역할을 수행하는지 살펴보겠다.이 미들웨어는 요청과 응답을 사전에 조작 가능하도록 설계되었으며, 보안 강화를 위해 사용되었다.즉, 클라이언트가 서버로 요청을 보낼 때 미들웨어가 이를 가로채어 검증을 수행하고, 응답을 반환하기 전에 필요한 작업을 처리하는 방식으로 구현되었다.  미들웨어(Middleware)란?미들웨어(Middleware)는 요청(Request)과 응답(Response) 사이에서 특정 작업을 수행하는 소프트웨어 계층이다. 클라이언트가 서버에 요청을 보낼 때와 서버가 클라이언트에 응답을 반환할 때, 미들웨어는 중간에서 데이터를 가공하거나 검증하는 역할을 한다.Fas..
[Python] 1:1 문의 답변 이메일 전송하기(smtplib + Gmail)
·
Python
백오피스 기능 중 1:1 문의 관련 기능을 맡게 되었다. 사용자가 문의를 남기면 관리자가 관리자 페이지에서 확인할 수 있고, 답변을 달면 사용자의 이메일로 알림이 전송되도록 구현하는 작업이다. "파이썬으로 이메일 보내기"를 검색해보니 이미 많은 사람들이 관련 글을 작성해둬서 비교적 쉽게 진행할 수 있었다.특히 Gmail을 활용하는 방법이 가장 많이 소개되어 있어, smtplib를 사용해 개발을 진행했다. Gmail을 이용한 SMTP 설정 방법1. Google 계정 보안 설정에서 ‘앱 비밀번호’ 검색 2. 앱 이름을 입력하여 새로운 비밀번호 생성 3. 발급된 비밀번호를 복사하여 SMTP 설정에 사용 완성 코드from sqlmodel.ext.asyncio.session import AsyncSessionfr..
[Python] Redis를 활용한 중복 추천 방지 로직 상세 분석
·
Python
이전 글: [Python] Redis를 활용한 중복 추천 방지 캐싱 서비스 개발이전 포스팅에서는 Redis를 활용한 장소 캐싱 시스템(SpotRedisService)을 설계한 이유와 개요를 설명했다.이번 글에서는 추천 시스템에서 Redis를 활용하는 구체적인 코드를 살펴보겠다.여기서는 create_recommendation_restaurant 함수를 중심으로 Redis와 DB를 활용한 중복 추천 방지 로직을 분석하고, 각 부분별로 어떤 역할을 하는지 설명하겠다. create_recommendation_restaurant 함수 개요이 함수는 에이전트가 사용자에게 추천할 식당 목록을 생성하는 핵심 로직을 담당한다. Redis 조회 흐름도 DB 조회 흐름도 주요 기능사용자 정보 및 기존 추천 데이터 확인..
[Python] Redis를 활용한 중복 추천 방지 캐싱 서비스 개발
·
Python
중복 추천을 해결하기 위해 Redis 기반의 장소 캐싱 기능을 서비스 클래스로 설계하였고, 다른 팀원들도 쉽게 활용할 수 있도록 프로젝트 내에서 재사용할 수 있도록 공유했다. 이번 글에서는 Redis를 활용한 장소 추천 데이터 캐싱 및 중복 추천 방지 방법을 코드와 함께 자세히 설명하려고 한다. SpotRedisService: Redis 기반 장소 관리 서비스SpotRedisService 클래스는 Redis를 활용하여 사용자의 추천 장소 데이터를 관리하는 기능을 제공한다.이 클래스는 장소 데이터를 저장, 조회, 삭제하는 기능을 제공하며, Redis의 Hash 자료구조를 활용하여 효율적으로 데이터를 관리한다. 먼저 완성된 코드는 다음과 같다. 콘솔 로그에 출력되는 정보가 많아 가독성을 높이기 위해 logg..
[AI] CrewAI 에이전트를 활용한 키워드 기반 맛집 검색 개선
·
AI
처음에는 사용자가 원하는 지역을 입력하면 Google Maps API를 통해 주변 맛집을 찾아주고, 필터링을 거쳐 최적의 식당을 추천하면 될 줄 알았다. 하지만 직접 테스트해보니, 생각만큼 좋은 결과가 나오지 않았다. 단순히 지역을 기반으로 검색하는 방식만으로는 사용자의 구체적인 요구사항이 반영되지 않았고, 원하는 스타일의 맛집을 추천하기 어려웠다.  1. 기존 방식의 문제점기존에는 사용자가 입력한 여행 일정에서 지역(location) 정보만 추출하여 맛집을 검색하는 방식이었다. 하지만 이렇게 하면 단순히 지역 내 식당 목록만 가져올 뿐, 사용자가 원하는 조건(가족과 함께 갈 수 있는 곳, 반려견 동반 가능 등)이 반영되지 않는 문제가 발생했다.문제점 정리사용자 요구가 반영되지 않음지역 기반으로만 검색하..
[DB] ORM(Object-Relational Mapping)이란?
·
DB
개발을 하다 보면 데이터베이스와 객체를 매핑하는 작업이 꽤 번거롭다는 걸 느끼게 된다. SQL을 직접 다루면 코드가 복잡해지고 유지보수가 어려워지는 경우가 많다. 그래서 ORM(Object-Relational Mapping)이라는 개념이 등장했다. 쉽게 말하면 객체와 데이터베이스 테이블을 매핑해서 객체 지향적으로 데이터 조작을 가능하게 해주는 기술이다.  Java 데이터베이스 접근 방식: JPA vs MyBatis 비교1. JPA (Java Persistence API, Hibernate)JPA는 자바에서 대표적인 ORM 기술로, SQL을 직접 작성하지 않고도 객체를 통해 데이터베이스 조작이 가능하다.JPA 사용 예제import jakarta.persistence.*;import java.util.Lis..
[AI] 네이버 웹 검색 API × CrewAI 식당 검색, 동기 방식에서 비동기로 업그레이드
·
AI
최근 프로젝트에서 네이버 검색 API를 사용해 식당 정보를 가져오는 작업을 진행했는데, 식당 리스트가 많을 경우 순차적으로 요청을 보내면 응답 대기 시간이 크게 늘어나는 문제가 있었다. 이를 해결하기 위해 비동기(Async) 방식으로 코드를 변경했고, 이 포스팅에서는 동기 코드에서 비동기 코드로 어떻게 전환했는지, 그리고 그 과정에서 어떤 이점이 있었는지 공유하려고 한다.기존 코드: 동기(Sync) 방식우선, 동기 방식(requests 라이브러리 사용)으로 작성된 코드다.간단히 말해, 한 번에 하나의 요청만 보낸다. 응답이 돌아올 때까지 대기하고, 그다음 요청을 보내는 식으로 되어있다.1. Toolclass NaverWebSearchTool(BaseTool): name: str = "NaverWeb..
[Python] 동기 vs 비동기, 언제 그리고 어떻게 사용해야 할까?
·
Python
CrewAI로 에이전트를 만들던 중, 실행 속도가 느려지는 문제가 발생했다. 이에 한 팀원이 실행 성능을 개선하기 위해 각 에이전트의 실행을 비동기 처리하는 방안을 제안했다. 하지만 해당 로직은 본질적으로 비동기 처리로 해결할 수 있는 문제가 아니었고, 오히려 불필요한 구조 변경이 될 가능성이 있었다.그럼에도 불구하고 팀원 간 논의가 이어졌고, 멘토링 시간에 멘토님께서 해당 팀원의 접근 방식에 대해 피드백을 주셨다. 비동기를 모든 경우에 적용할 수 있는 것은 아니며, 상황에 따라 적절한 방식이 필요하다는 점을 강조하셨다. 또한, 우리 팀에게도 비동기의 개념과 적절한 활용법을 명확히 이해하는 것이 중요하다는 조언을 해주셨다. 이번 글에서는 동기와 비동기의 개념, 코드 예제, 실행 흐름, 관련 라이브러리, ..