본문 바로가기

Backend18

[Python] MySQL 대규모 데이터 삽입 로직 고도화: 비동기, Bulk Insert, 멀티스레드 적용기 프로젝트에서 나스닥에 상장되어있는 약 만개의 종목들에 대해 날짜별로 종가, 시가, 고가, 저가의 최소 40년치의 데이터를 필요로 했다. 대강 계산해봐도 약 10000 * 365 * 40 = 146,000,000 개의 데이터를 삽입해야했고, 매일매일 만개의 레코드씩을 추가로 삽입해야 했다. 그래서 이김에 대규모 데이터 삽입 로직을 좀 열심히 만들어봤다.  먼저 내가 겪었던 로직 고도화 단계는 다음과 같다.*()안에 적힌 값은 한달 단위 데이터들을 넣을때 소요되는 시간이다. 1. 단일 쓰레드, Batch 미사용 (97m)2. INSERT IGNORE 사용하여 중복 데이터 무시 (80~100m)3. 단일 쓰레드 방식 + 비동기처리 통한 동시 작업과 executemany 통한 네트워크 오버헤드 감소 (48~93.. 2025. 1. 25.
[Spring Data Jpa] 3가지 방법으로 N+1 문제 해결해보기 (Fetch Join, Batch Fetching, EntityGraph) JPA N+1 문제란? JPA의 N+1문제는 연관관계가 설정된 엔티티를 조회할 경우에, 조회된 데이터 개수(N)만큼 연관관계의 조회 쿼리가 "추가로" 발생하는 현상이다.  즉, 조회시 쿼리 1개를 생각하고 설계를 했는데, 예상치 못한 쓸모가 없는 N개의 조회 쿼리가 더 발생하는 문제이다. 이렇게 비효율적인 쿼리가 실행되게 되면, 트랜잭션 응답 속도가 느려지고, 데이터베이스 부하가 커지며, 시스템 성능이 급격히 저하 될 수 있어 해결해야 한다.  가장 대표적인 예로는 게시판과 댓글 엔티티가 있고, 1대 n으로 매핑되어 있을때, 게시글을 조회한 후 게시글마다 댓글을 조회하기 위해 추가 쿼리가 발생하는 경우이다. 댓글이 10개 달린 게시글 하나를 조회할 때 총 11개의 쿼리(게시글 조회 1개 + 각 게시글 댓.. 2025. 1. 16.
[Spring] Spring DB 연동: JDBC vs JPA '초보 웹 개발자를 위한 스프링 5 프로그래밍 입문' 챕터 8을 읽고 정리한 내용입니다.  스프링 애플리케이션에서 데이터베이스에 접근하는 방법에는 크게 JDBC와 JPA가 있다.JDBC(Java Database Connectivity)Java 애플리케이션이 데이터베이스와 상호 작용하기 위해 제공되는 표준 API이다. SQL을 직접 작성하고 실행해야 하며, Connection, Statement, ResultSet 등의 객체를 통해 데이터를 처리한다.JPA(Java Persistence API)ORM(Object-Relational Mapping) 기술의 표준 사양이다. 엔티티(Entity) 객체를 중심으로 데이터베이스를 다룰 수 있도록 해주며, SQL 대신 엔티티 중심의 코딩에 집중할 수 있다.일반적으로.. 2024. 12. 14.
[Spring Boot] AOP로 로그 파일 생성 및 S3 업로드하기 AOP가 무엇인지 궁금하다면 아래 포스팅을 참고하자. https://persi0815.tistory.com/117 [Spring] AOP(Aspect-Oriented Programming)란?🌊 AOP란? Aspect-Oriented Programming, 관점 지향 프로그래밍소스 코드의 비즈니스 로직과 부가적인 공통 관심사를 분리하여, 관점을 기준으로 각각 모듈화하여 코드의 모듈성과 가독성을 향상시키는persi0815.tistory.com  Spring Boot에서 AOP를 사용하여 Log를 파일에 찍는 로직을 구현해보고, 트리거를 통해 해당 파일을 S3에 업로드 시켜보자!!* 로그가 발생할 때마다 바로 s3에 올리면 부하가 생길 수 있다고 판단해, 로컬 파일을 만들어서 해당 파일에 저장 후, 특정 .. 2024. 12. 14.