본문 바로가기

전체 글

(198)
[기상청 API] 병렬 수집기 개발 - 멀티스레드 기반 성능 향상 구조 설계 📌 문제의식이전 포스트에서 설명했듯이, 2013~2018년 전체 시간별 데이터를 단일 스레드로 수집하는 방식은 지나치게 느렸다.1년 단위 수집에 수 분 소요6년 전체 수집 시 수 시간 이상 예상작업 중단 시 재시도 비용이 큼👉 “CPU와 네트워크 자원을 좀 더 효율적으로 활용할 수는 없을까?”→ 병렬 수집기 구조를 설계하게 되었다.🧱 구조 개선 핵심 요약✅ 병렬 처리 방식 도입CompletableFuture.supplyAsync() 를 활용한 비동기 수집 처리ThreadPoolExecutor를 사용하여 최대 스레드 수 제한CPU 코어 수, 메모리 상황 등을 고려하여 동시 수집 요청 최적화✅ 데이터 단위 분할 전략HourlyRangeBuilder가 생성한 시간 단위 요청을 연도/월 기준으로 그룹핑각 ..
[기상청 API] 단일 스레드 기반 AWS 시간별 기상 데이터 수집기 개발 📌 프로젝트 배경열수요 예측을 위한 기초 데이터로 기상청의 시간별 기상 관측 데이터를 활용하기로 했다.특히 ‘방재기상 AWS 정시자료(기온, 풍속, 강수량 등)’를 2013년부터 2018년까지 수집하는 것이 목표였다.초기 구현은 간단하게 단일 스레드로 구성했고, 먼저 전체 구조를 짜서 정합성 있게 수집이 가능한지부터 검증하고자 했다. 🏗️ 시스템 구성🔧 기술 스택Java 1.8GradleIntelliJ IDEAMariaDB + HeidiSQLGitLab ⚙️ 구현 방식1. HourlyRangeBuilder→ 특정 연도에 대해 365일 * 24시간 단위로 요청 시간을 생성2. AwsHourlyClient→ 기상청 API 호출 및 XML 데이터 반환→ 인증키, 요청 URL, 응답 로그 처리 포함3. A..
[Java 기초 #1] 객체란 무엇인가? (클래스, 인스턴스의 차이) 자바에서 ‘객체’란 무엇인가? – 객체지향 프로그래밍의 핵심 개념을 이해해보자1. 개요"자바는 객체지향 언어입니다."라는 말을 한 번쯤은 들어보셨을 겁니다.그렇다면 이 ‘객체’란 대체 무엇일까요?처음 자바를 배울 때 가장 많이 듣고, 가장 많이 헷갈리는 단어가 바로 이 '객체'입니다.이번 글에서는 객체지향 프로그래밍(OOP)에서 자바의 객체란 어떤 개념인지, 그리고 왜 중요한지를 실용적인 관점으로 살펴보려 합니다.2. 핵심 개념 설명✅ 객체란 무엇인가?자바에서 객체(Object)란 데이터와 그 데이터를 처리하는 기능이 하나로 묶여 있는 메모리상의 실체입니다.즉, 변수와 함수가 하나의 단위로 결합된 존재라고 볼 수 있습니다.이러한 객체는 클래스(Class)를 바탕으로 생성되며, 클래스는 말 그대로 설계도 ..
GitLab → GitHub로 레포 이사 (잔디 심기) ✅ 목표GitLab → GitHub로 레포 이사커밋 기록(=기여 내역, 잔디) 그대로 유지GitHub 잔디에 심기게 하기✅ 전체 흐름 요약GitLab에서 기존 프로젝트를 전체 cloneGitHub에 새 레포 생성GitLab 레포를 GitHub로 push (이력 포함)커밋에 쓰인 이메일을 GitHub 계정에 등록GitHub에서 잔디 반영 확인🛠️ 1. GitLab 레포 clonebash복사편집git clone --mirror https://gitlab.com/your-name/your-repo.git cd your-repo.git --mirror 옵션은 모든 브랜치, 태그, 히스토리 포함해서 완전 복제합니다.🛠️ 2. GitHub에 새 레포 생성GitHub에서 새로운 repository 생성예: htt..
N+1 문제 해결을 통한 와인 목록 조회 성능 개선 1. 문제 상황 파악하기먼저 기존 코드에서 발생하는 N+1 문제를 정확히 파악했습니다. 로그 분석 결과, 다음과 같은 문제점이 확인되었습니다:와인 목록을 조회하는 초기 쿼리 1회각 와인마다 위시리스트 확인을 위한 쿼리 N회 (existsByUserIdAndWineId)각 와인마다 와인 타입 정보를 가져오기 위한 쿼리 N회 (wine.getWineType())2. 성능 측정을 위한 AOP 설정먼저 성능 측정을 위해 AOP를 설정하여 메서드 실행 시간과 SQL 쿼리 수를 측정했습니다.@Componentpublic class PerformanceAspect { private static final Logger log = LoggerFactory.getLogger(PerformanceAspect.class..
AOP와 Redis 캐싱을 활용한 OpenAI API 호출 성능 측정 및 최적화 사례 Spring AOP(Aspect-Oriented Programming)와 Redis 캐싱을 활용하여 OpenAI API 호출 성능을 측정하고 최적화한 경험을 공유하고자 합니다. 와인 추천 서비스에서 OpenAI API를 사용하여 유사 음식을 찾거나 와인 설명을 생성하는 과정에서 성능을 개선하기 위한 여정을 소개합니다.1. 문제 정의: OpenAI API 호출 시 성능 이슈우리 서비스에서는 사용자에게 맞춤형 와인을 추천하기 위해 다음과 같은 OpenAI API 호출을 사용합니다:유사 음식 검색: 사용자가 입력한 음식과 유사한 음식을 데이터베이스에서 찾기 위해 OpenAI의 텍스트 유사성 분석 사용와인 설명 생성: 추천된 와인에 대한 매력적인 설명문 생성이 과정에서 몇 가지 이슈가 발생했습니다:응답 시간 지..
한 리포지토리에서 Back, Front CI/CD 배포하기 (Feat. Gitlab, Jenkins, Docker, NginX, React, Springboot) 우선 EC2 인스턴스가 생성되있다고 가정을 하고 진행해보겠다. 만약 인스턴스가 없다면 AWS에 가입을 하고 인스턴스를 생성해야되는데 다음 글에 자세히 나와있다. https://velog.io/@kyj311/AWS-EC2-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0 [AWS] EC2 알아보기 + 인스턴스 생성하기AWS EC2 알아보기velog.io  또한 나는 기존에 AWS 해킹이 빈번하게 일어난다는 얘기를 들어서 다음 글을 보고 많이 참고하였다. https://www.lgcns.com/blog/cns-tech/aws-ambassador/56822/ 해킹과 과다 요금 발생을 방지하는 AWS 계정 보안 강화 노하우 - LG CNSIntro 최근 AWS Account 탈취로 인한 AWS ..
[JPA] Entity 설계 시 ID 값을 Integer 대신 Long 타입으로 지정하는 이유 JPA 공부 중 많은 코드들이 Entity 설계 시 ID 값을 Long 타입으로 지정해주는 것을 보았다. NULL값을 처리해주기 위해 원시 타입인  int, long 대신 wrapper 클래스를 사용하는것은 알고 있었지만 Integer 을 써도 될것같은데 굳이 Long을 쓰는 이유를 알아보았다. Long과 Integer의 주요 차이점값의 범위Integer: -2,147,483,648 ~ 2,147,483,647 (약 21억)Long: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (약 922경)ID 값으로 Long을 선호하는 이유:확장성: 데이터가 증가해도 ID 값이 부족할 걸정이 없음안정성: Integer 최대값 도달 시 오버플로우 발생 가능일관성: ..