본문 바로가기

전체 글94

[백준/C++] #5021 왕위 계승 (위상 정렬) 문제 이 문제는 가족 관계를 방향 그래프(DAG)로 나타내어, 각 개인이 왕의 혈통을 얼마나 이어받았는지 계산하는 문제이다.부모가 두명으로 이루어져있다는 점에서 좀 난항을 겪었다가, 자식에 대한 부모 정보를 따로 저장하는 map을 만들어 문제를 해결했다. 풀이자식이 부모의 부모가 되는 경우가 없다는 조건이 명시 되어 있으므로 사이클이 없는 방향 그래프(DAG)임을 알 수 있다. 따라서 위상 정렬을 이용하여 부모의 혈통이 먼저 계산된 후 자식에게 전파되도록 구현할 수 있다.!!혈통 계산 방식은 부모로부터 반씩 혈통을 받는 방식이다. 왕의 혈통을 1.0으로 설정한 후, 각 자식의 혈통을 부모들의 혈통의 절반씩 더한 값으로 계산하면 된다. 위상정렬은 사이클이 없는 방향 그래프(DAG, Directed Acyc.. 2025. 1. 30.
[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.
[Network] CH1. 웹 브라우저가 메시지를 만든다 성공과 실패를 결정하는 1%의 네트워크 원리를 읽고 정리한 내용입니다.  목차HTTP 리퀘스트 메시지를 작성한다.웹 서버의 IP 주소를 DNS 서버에 조회한다.전 세계의 DNS 서버가 연대한다.프로토콜 스택에 메시지 송신을 의뢰한다. 1️⃣ HTTP 리퀘스트 메시지를 작성한다.사용자가 브라우저에 URL을 입력하면 브라우저가 URL을 해독한다.브라우저: 웹 서버에 액세스, 파일을 다운로드/업로드, 메일의 클라이언트 등 기능을 가지고 있다.즉, 몇개의 클라이언트 기능을 겸비한 복합적인 클라이언트 소프트웨어이다.→ 어느 것을 사용하여 데이터에 액세스하면 좋은지 판단해야 한다. URL의 맨 앞에는 항상 액세스 대상에 따른 프로토콜을 명시해줘야 한다.프로토콜이란 데이터 출처에 액세스 하는 방법을 의미한다.액세스 .. 2025. 1. 6.
[회고록] 2024년, 대학교 3학년을 마무리하며 2024 목표는 얼마나 달성했나?2024년 목표는 거의 다 이뤘다. 알고리즘 공부를 꾸준히 해서 백준 플래티넘을 달성했고, KAUPC에서도 나름 좋은 성적을 거뒀다. OS, 네트워크, 보안, 데이터베이스 등 CS 전반적인 공부도 열심히 해서 전체 평점 4.25를 기록했다. 프로젝트도 정말 열심히 했지만, 지금 돌아보니 너무 급급하게 개발했던 것 같다. 1년 동안 스프링 프로젝트만 5개(UMC, Reborn, Kopis, Wish, VIS)를 진행했고, 현재는 두 개의 프로젝트를 이어서 하고 있다 보니 조금 과했던 것 같다. 그래도 다양한 기획에 참여하고, 여러 사람들과 소통하며 많은 이슈들을 다뤄본 덕에 값진 경험을 쌓을 수 있었다. 그 과정에서 어려움도 많았지만, 하나씩 해결하며 잘 헤쳐 나왔다. 현재.. 2025. 1. 1.
[Network] VM Network Options 1) NATNAT는 내부 네트워크의 여러 장치가 외부 네트워크와 통신할 때, 하나의 고정된 공용 IP 주소를 공유하여 사용하게 해주는 기술이다.  NAT 모드에서는 VirtualBox가 각 가상 머신(VM)을 위해 가상의 라우터를 생성하고, 이 가상의 라우터는 VM의 내부 IP 주소를 호스트 머신의 IP 주소로 변환하여 VM이 외부로 요청을 보낼 때 이를 처리한다. 즉, VM마다 각각의 가상의 라우터 존재한다.  또한, VM은 호스트의 네트워크로부터 격리되어 있으며, NAT 라우터를 통해 외부 네트워크에 대한 아웃바운드(요청 보내기) 접근만 가능하다. 즉, 인바운드는 불가능하다는 뜻이다. 2) NAT NetworkNAT Network는 VirtualBox에서 여러 VM이 하나의 공유 NAT 네트워크를 통.. 2024. 12. 30.
[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)란? 🌊 AOP란? Aspect-Oriented Programming, 관점 지향 프로그래밍소스 코드의 비즈니스 로직과 부가적인 공통 관심사를 분리하여, 관점을 기준으로 각각 모듈화하여 코드의 모듈성과 가독성을 향상시키는 프로그래밍 패러다임.* ’관점’이라는 말이 너무 어색해서 알아봤더니, ‘초보 웹 개발자를 위한 스프링 5 프로그래밍 입문 158p’에서 ‘관점’이라는 말 대신 ‘기능’ 내지 ‘관심’이라고 표현하는 것이 더 알맞다고 한다.* 모듈화: 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것 즉, 여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 Aspect로 모듈화하여 재사용성을 높여주는 기법이다. 핵심 기능과 공통 기능(흩어진 관심사)의 구현을 분리함으로써 핵심 기능을 구현한 코드의 수정 없.. 2024. 12. 14.
[DB] Index Structures for files (Primary, Clustering, Secondary) Index란? : 파일에 저장된 레코드에 빠르게 접근하기 위해 추가적으로 생성되는 보조적인 접근 구조이다. 특정 검색 조건에 따라 레코드를 효율적으로 검색할 수 있도록 설계되었다.  Indexing Field(or Indexing Attribute)를 기반으로 record에 효율적으로 access할 수 있는 방법을 제공하는데, 이는 검색 시간을 대폭 단축 시킨다. 즉, 전체 파일을 순차적으로 검색해야 하는 비효율성을 줄여준다.  더불어, Secondary Access Path(보조 접근 경로)를 제공하여, 디스크에 저장된 레코드의 물리적 위치와 상관없이 데이터를 빠르게 검색할 수 있게 한다.  Index는 level에 따라 두 종류로 나뉘는데, 이는 다음과 같다. 1. Single-level ordere.. 2024. 12. 14.
[DB] Collision Management in Database Hashing Techniques 해싱(Hashing)이란 무엇일까?해싱은 다양한 분야에서 쓰이는데, 키(Key = Field)를 입력으로 받아, 이를 해시 함수(Hash Function)를 사용하여 데이터가 저장될 위치(주소)를 계산하는 기술이다. 해시 함수의 결과는 보통 고정된 크기의 숫자나 값으로 변환되며, 이를 해시 값(Hash Value)이라고 한다.  Hashing 기법이 DB에서 왜 필요할까? 데이터베이스에서는 방대한 양의 데이터를 다루는 경우가 많아, 특정 검색 조건에서 레코드에 빠르게 접근할 수 있는 효율적인 방법이 필요했다. 단순히 레코드가 정렬된 파일에서는 이진 탐색(Binary Search)을 사용하여 검색하며, 이는 O(log n)의 시간 복잡도를 가진다. 그러나 레코드 수가 크게 증가하면 이 방식의 성능은 점차 .. 2024. 12. 14.
[DB] Searching and Managing Records in Heap and Sorted Files 정렬되지 않은 레코드들로 이루어진 Heap Files과 정렬된 레코드들로 이루어진 Sorted Files에서 각각 어떻게 특정 Record를 Search할까?에 대한 내용을 다루려고 한다.  1. Files of Unordered Records (Heap Files)Heap 혹은 Pile File에서는 Record들이 삽입된 순서로 파일에 저장된다. 그래서 새로운 Record는 File의 끝에 저장되며,  Data Record를 수집하고 저장하는 용도로 사용되기도 한다.  record를 수정하기 위해서는 record가 담긴 block을 찾아 buffer에 기록한 후 수정해야 할 record를 삭제 후, file의 가장 마지막에 재작성한다. record를 삽입하기 위해서는 마지막 block을 buffer에.. 2024. 12. 14.
FCM 프로젝트 만들기 (Firebase 2024 최신버전) https://firebase.google.com/?hl=ko Firebase | Google's Mobile and Web App Development Platform개발자가 사용자가 좋아할 만한 앱과 게임을 빌드하도록 지원하는 Google의 모바일 및 웹 앱 개발 플랫폼인 Firebase에 대해 알아보세요.firebase.google.com시작하기프로젝트 만들기이름 지정default로 지정해줬음.이렇게 프로젝트가 만들어진다!난 안드로이드를 만들고 있으니 안드로이드를 선택앱등록 위해 프론트 패키지 이름 넣고 여기서 주어지는 goggle-service.json 파일은 안드로이드스튜디오에 사진과 같이 넣어줘야 한다! 이렇게 자바나코틀린으로 설정 해주자밖으로 나와서 이제 백엔드가 사용할 json을 다운로드해.. 2024. 11. 26.