Tiny Star

전체 글 74

[뉴스 요약] 프론트 (Vite + React)

계획사용자가 뉴스 URL을 입력입력된 URL을 백엔드로 POST 요청결과 받아서 요약 결과 보여줌비로그인 상태에서 일 5회 요청 제한 Vite + React 선택Vite + React는 빠른 개발, 직관적인 설정, 좋은 확장성 때문에개인 프로젝트나 MVP 개발에 현 시점에서 가장 합리적인 프론트엔드 구조라고 한다.💡 React 프로젝트에서 MVP라면?View: React 컴포넌트Model: API, 상태관리Presenter: 컴포넌트 외부 로직 (예: useCase, service 함수) 역할 설명 Model데이터와 비즈니스 로직 (API 호출, DB 등)ViewUI (사용자에게 보여지는 화면)PresenterView와 Model을 연결하고 비즈니스 로직을 수행하는 중간 계층MVP는 생소해서 찾아..

[뉴스 요약] 백엔드 (Jsoup 파싱 + ChatGPT AI 연결)

Jsoup(JAVA HTML parser)jsoup 는 실제 HTML 및 XML 작업을 간소화하는 Java 라이브러리입니다. DOM API 메서드, CSS 및 xpath 선택자를 사용하여 URL 가져오기, 데이터 파싱, 추출 및 조작을 위한 사용하기 쉬운 API를 제공합니다. [링크] public NewsResponse parse(String url) { try { if (!url.startsWith("https://n.news.naver.com/")) throw new RuntimeException("네이버 뉴스가 아닙니다."); Document doc = Jsoup.connect(toPrintUrl(url)).get(); String title = doc.s..

[뉴스 요약] AI API를 이용한 뉴스 요약 프로젝트 기획

📄 뉴스 요약 및 분석 서비스사용자 입력 URL 기반 GPT 요약/분석 자동화 시스템Frontend: React + Vite / Backend: Java + Spring Boot 1. 목표사용자가 입력한 뉴스 URL을 기반으로 본문 크롤링OpenAI GPT API를 통해 기사 요약, 주제 분류, 키워드 추출프론트엔드에 요약 결과를 시각화하여 출력 2. 전체 시스템 아키텍처 3. 기능 명세✅ 프론트엔드 (React)기능 상세 내용URL 입력창사용자 입력 받기 (뉴스 기사 URL)로딩 상태 표시분석 요청 중 상태 표시결과 표시요약, 주제, 키워드 뱃지 형태로 시각화에러 처리잘못된 URL/서버 오류 메시지 표시✅ 백엔드 (Spring Boot)기능상세 내용/analyze-url APIPOST 요청 → UR..

[대용량 이관] DB 성능 튜닝 (InnoDB Buffer Pool)

300만 데이터가 있는 테이블의 count만 했을 뿐인데 20초 이상 소요되는 문제가 발생했다.[MariaDB 최신 버전으로 컨테이너 생성]만 하고 그 외 설정을 하지 않았기 때문에 설정을 추가해보려고 한다. .cnf 설정# InnoDB 설정innodb_buffer_pool_size = 2Ginnodb_log_file_size = 512Minnodb_log_buffer_size = 64Minnodb_flush_log_at_trx_commit = 2innodb_flush_method = O_DIRECTinnodb_io_capacity = 2000innodb_file_per_table = 1 항목설명 innodb_buffer_pool_size테이블, 인덱스, row 데이터를 메모리에 캐싱데이터를 디스크에서..

[대용량 이관] bookRatingStep 개선

[bookRatingStep]을 만들었다. 300만 데이터 넣는데에 211초가 걸렸고, 문득 성능 테스트하는데 노트북 사양을 full 로 쓰면 조금 아이러니한 느낌이 들어서 메모리를 제한해보고 테스트해보기로 했다. 수정사항1. 메모리 설정-Xms512m -Xmx1g -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log옵션설명-Xms512mJVM의 초기 힙 메모리 크기를 512MB로 설정-Xmx1gJVM의 최대 힙 메모리 크기를 1GB로 제한-XX:+PrintGCDetailsGC가 발생할 때 어떤 세대에서 얼마나 수집되었는지 상세하게 로그 출력-XX:+PrintGCDateStampsGC 로그에 날짜와 시간 정보 포함-Xloggc:gc.logGC 로그를 ..

[대용량 이관] Book Job/Step 구성

20만건 정도의 book 데이터를 이관하는 것부터 시작했다. 구성보다는 에러를 해결한 내용이 위주이다...ㅎ Book Job, Step 구성@RequiredArgsConstructor@Configurationpublic class BatchConfiguration { private final Step stepBook; @Bean public Job bookJob(JobRepository jobRepository) { return new JobBuilder("bookJob", jobRepository) .start(stepBook) .build(); }}@Configurationpublic class BookStep ..

[대용량 이관] ItemWriter 선택 (JPA vs JDBC vs MyBatis)

파일 형식에 따라 Reader가 달라지기 때문에 이건 차치하고, 어떤 Writer를 써야할지 고민했다.MyBatisBatchItemWriter만 사용해봤는데, 실무에서 이걸 사용했던 이유는 테이블명이 기간에 따라 변경되기도 하고, if 문을 활용한 분기처리를 위한 동적매핑이 필요했기 때문이다.현재는 동적 매핑이 필요하지 않고 단순 Insert 처리만 하면 되기 때문에 굳이 이걸로 구현해야할까?란 생각이 들었기에 JdbcBatchItemWriter를 고려하게 됐다. JpaItemWriter는 [Spring Batch ItemWriter 성능 비교]를 보고 속도상 제외했다. 하지만!실제로 속도차이가 많이 나는지 궁금해서 테스트해보기로 했다. 구성공통 설정 (Entity)// BookRating.java@N..

[대용량 이관] 데이터 찾기 (Kaggle)

대용량 데이터 이관을 진행하기에 앞서, 어떤 데이터를 이관하면 좋을지 찾아봤다.이관량 자체가 목적이라면 랜덤 데이터 생성해서 넣을 수도 있으나, 추후 파일(CSV, JSON 등)을 활용한 배치작업이 필요할 수도 있기 때문에 구조까지 고려해서 작업해보려고 한다. (이미지 클릭 시 Kaggle 페이지로 연결됩니다.) Yelp Dataset이 데이터 세트는 Yelp의 사업체, 리뷰 및 사용자 데이터의 일부입니다. 원래는 학생들이 Yelp 데이터를 조사하거나 분석하고 그 결과를 공유할 수 있는 기회인 Yelp 데이터 세트 챌린지를 위해 마련되었습니다. 최신 데이터 세트에는 미국과 캐나다 8개 대도시 지역의 사업체 정보가 포함되어 있습니다. 용량 기준으로 데이터를 찾고 있었는데 대부분 용량이 큰 데이터는 '리..

[데이터] Kaggle (캐글)

프로젝트에 활용할 데이터셋을 찾다가 Kaggle(캐글) 이라는 사이트를 알게되었다. Kaggle데이터 과학자와 머신러닝 엔지니어들이 모여 서로 문제를 풀고, 데이터를 분석하고, 학습하는 플랫폼Kaggle은 수십만 개의 데이터를 자유롭게 검색하고 활용할 수 있는 데이터 저장소 제공CSV부터 이미지, JSON까지 다양한 형식의 데이터셋이 있고, 무료로 이용 가능 데이터셋 예시 주제 예시 데이터셋 건강/의료코로나 확진자 현황, 의학 이미지스포츠월드컵 경기 결과, NBA 선수 스탯경제/금융주식 시장, 암호화폐 가격게임포켓몬 정보, 롤 챔피언 통계일상/기타넷플릭스 영화 목록, 음식 영양 정보 ⭐ 실제 업무용 데이터뿐만 아니라, 흥미로운 주제의 캐주얼한 데이터도 많아서 초보자도 쉽게 접근 가능 사용하는 법 ..

IT 2025.05.05

[쿠폰] 성능 테스트 및 개선 (JDBC Bulk Insert)

k6 - DB Worker delay1. 100count / 5s k6는 테스트를 진행해서 끝났는데, insert는 계속되는 문제가 발생했다.현재 로직은 5초마다 최대 100개의 메세지를 처리하도록 되어있는데 이 수치를 조정해서 보완해보려고 한다. 2. 10,000count / 5s '20분 -> 1분'으로 많이 줄었지만, 그래도 1분 이상 차이가 난다.아무래도 한번 메세지를 받을 때마다 5초의 딜레이가 있다보니 거기서 나오는 문제로 예상된다.1초로 바꿔보자. 3. 10,000count / 1s이제 1분 안으로 들어왔다.다만 1초로 줄였음에도 30초가 넘는 차이가 나는게 이상한데, 아무래도 saveAll()이 하나씩 insert 하다보니까 생기는 문제가 아닐까 생각해봤다. Bulk insert가 가..

프로젝트/쿠폰 2025.04.30
top