본문 바로가기

Backend18

[Python] MySQL 대규모 데이터 삽입 로직 고도화: 비동기, Bulk Insert, 멀티스레드 적용기 프로젝트에서 나스닥에 상장되어있는 약 만개의 종목들에 대해 날짜별로 종가, 시가, 고가, 저가의 최소 60년치의 데이터를 필요로 했다. API가 주지 않는 일부분의 데이터를 감안하고 생각해봤을 때 약 1억 4천개의 데이터를 삽입해야했고, 매일매일 만개의 레코드씩을 추가로 삽입해야 했다. 그래서 이김에 대규모 데이터 삽입 로직을 좀 열심히 만들어봤다.  먼저 내가 겪었던 로직 고도화 단계는 다음과 같다.*()안에 적힌 값은 한달 단위 데이터들을 넣을때 소요되는 시간이다. 1. 단일 쓰레드, Batch 미사용 (97m)2. INSERT IGNORE 사용하여 중복 데이터 무시 (80~100m)3. 비동기처리 통한 동시 작업과 executemany 통한 네트워크 오버헤드 감소 (50m)4. Bulk Insert.. 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.
[Spring] AOP(Aspect-Oriented Programming)란? '초보 웹 개발자를 위한 스프링 5 프로그래밍 입문' 챕터 7을 읽고 정리한 내용입니다.  🌊 AOP란? Aspect-Oriented Programming, 관점 지향 프로그래밍소스 코드의 비즈니스 로직과 부가적인 공통 관심사를 분리하여, 관점을 기준으로 각각 모듈화하여 코드의 모듈성과 가독성을 향상시키는 프로그래밍 패러다임.* ’관점’이라는 말이 너무 어색해서 알아봤더니, ‘초보 웹 개발자를 위한 스프링 5 프로그래밍 입문 158p’에서 ‘관점’이라는 말 대신 ‘기능’ 내지 ‘관심’이라고 표현하는 것이 더 알맞다고 한다.* 모듈화: 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것 즉, 여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 Aspect로 모듈화하여 재사용성을 높여주는 기법이다. 핵심.. 2024. 12. 14.
[Spring] 빈 라이프 사이클과 범위 '초보 웹 개발자를 위한 스프링 5 프로그래밍 입문' 챕터 5를 읽고 정리한 내용입니다.  Spring에서는 스프링 컨테이너가 빈(Bean)의 생성부터 소멸까지의 전 과정을 관리한다. 빈(Bean)은 스프링 컨테이너의 라이프사이클을 따르며, 객체가 생성된 후 초기화되고, 컨테이너가 종료되면 소멸된다. 또한, 스프링 빈의 범위(Scope) 에 따라 동일한 객체를 공유할 수도 있고, 새로운 객체를 매번 생성할 수도 있다. 이 글에서는 스프링 빈의 라이프사이클과 범위에 대해 자세히 알아본다. 1. 스프링 컨테이너와 빈의 라이프사이클스프링 컨테이너의 역할스프링 컨테이너는 설정 클래스를 읽어 빈 객체를 생성하고, 각 빈을 연결(의존 주입)하며, 전체 라이프사이클을 관리한다.즉, 스프링 컨테이너의 라이프사이클에 따.. 2024. 12. 10.