전체 글 13

[JAVA] 가비지 컬렉터(Garbage Collector)란?

가비지 컬렉터란자바나 파이썬, C# 같은 언어 런타임 환경에서 메모리를 자동으로 관리하는 기능이다. 가비지 컬렉터가 왜 필요할까?C나 C++과 같은 언어에서는 개발자가 malloc()이나 new와 같은 명령어로 메모리를 직접 할당하고, 더 이상 사용하지 않을 때는 free()나 delete를 호출하여 직접 해제해야 한다. 이 과정에서 다음과 같은 문제가 발생할 수 있다.메모리 누수 (Memory Leak): 사용이 끝난 메모리를 해제하는 것을 잊어버리면, 해당 메모리는 프로그램이 끝날 때까지 불필요하게 공간을 차지하게 된다. 이 현상이 누적되면 시스템의 가용 메모리가 부족해져 프로그램 성능이 저하되거나 중단될 수 있다.이중 해제 (Double Free): 이미 해제된 메모리를 또다시 해제하려고 시도하면,..

cs 2025.09.05

[동시성 제어] 좌석 예매 동시성 문제 해결하기

문제상황티켓 예매 특성상 특정시간에 많은 사람들이 한꺼번에 몰려 예매를 시도하게 된다. 이 때 같은 좌석은 여러명이 예매할 수 없도록 해야하는데, 동시성 문제에 대한 처리가 없는 상황에서 여러명이 예매 요청을 할 경우에는 같은 좌석에 여러명의 사람들이 예매가 되는 문제가 발생하게 된다. 그렇다면 이런 상황이 왜 벌어지게 되는 것일까? 동시성 제어를 고려하지 않고 코드를 짰을 경우에서의 문제점을 알아보자. jpa와 트랜잭션만을 사용했을 경우PerformanceSeat ps = performanceSeatRepository.findById(performanceSeatId) .orElseThrow(() -> new IllegalArgumentException("좌석이 존재하지 않습니..

백엔드 2025.08.27

[RabbitMq + Celery] 비동기처리.. 알고 하고있니?

이번 프로젝트에서 RabbitMQ와 Celery로 비동기 분산 처리를 한 경험을 포스팅하려고 한다.이 글은 파이썬 기반 프레임워크인 Django 환경에서 구현한 경험을 바탕으로 작성하였다.문제 인식먼저 우리팀의 주제는 가상피팅 쇼핑몰이다. 사용자의 전신 사진에 맞춰 각 상품들마다 사용자의 사진으로 바꿔주는 기능이다.사용자가 사진 한 장만 올리면, 백엔드에서는제미나이를 통한 체형 분석AI 가상피팅 요청배경 제거/보정이미지 리사이징을 통한 용량 감소AWS S3저장 및 데이터베이스 저장이 과정이 순서대로 진행된다. 문제는 이 과정이 각 상품들마다 진행된다는 점이다. 순차적으로 실행된다면 상품이 많아질수록 기다리는 시간이 늘어날 것이다.이런 상황에서 비동기 병렬 처리는 필수적이기에 우리 프로젝트에 도입하게 되었..

백엔드 2025.08.07

최소 스패닝 트리(MST, Minimun Spanning Tree)

스패닝 트리란?그래프의 모든 정점을 잇지만 사이클이 없는 부분 그래프를 의미한다.한 정점으로 도달하는 경우가 두 개 이상 존재하는 경우, 즉 사이클이 존재하는 경우에는 최소한의 연결이라 말할 수 없기 때문에, 모든 위치 하나에서 다른 곳으로 이동하는 경우는 단 한 가지로 결정되도록 항상 트리의 형태를 나타낸다.최소 비용 신장 트리는 이러한 신장 트리들 중 간선의 가중치 합이 가장 작은 트리이다. 위와 같은 그패프가 있을 때 나올 수 있는 신장트리는 다음과 같을 것이다.모든 정점이 연결되었고 사이클이 존재하지 않는다. 이러한 신장트리의 개수는 이론적으로 n^n-2승까지 나올 수 있다.신장트리의 간선의 개수는 항상 정점의 수-1개이다. 간선이 더 많으면 사이클이 생기고 적으면 연결이 끊기기 때문이다.최소 ..

알고리즘 2025.06.18

[우아한테크코스] 출석부

이번 스터디에서는 우테코 출석부 미션을 진행했다.기능 요구사항은 다음과 같다. 기능 요구 사항을 보았는데 어떻게 설계를 해야할지 감이 안잡혔다..일단 나름대로 기능 목록을 정리해보았다. 기능 요구사항도 많고 다른 고려사항도 많아서 일단 구현만 되게 목표를 잡았다.기존에 하던 mvc방식으로 설계를 하였다.다음과 같이 구조를 잡았다. 이제 구현해보자.중요하지 않은 코드와 이전에 진행했던 과제에서 중복되는 내용들은 생략하도록 하겠다. 전체 코드는 아래의 링크에 첨부되어있다.model 패키지AttendanceStatus클래스enum으로 구현하였다.출석, 지각, 결석 상태를 저장한다. Attendance클래스출석 기록 한 건을 나타내는 도메인 객체이다.생성자를 정적 팩토리 메서드로 구현하였다.날짜를 저장한다.출석..

Java 2025.05.29

유니온 파인드 (Union-Find Algorithm)

유니온 파인드 알고리즘이란?서로소 집합(Disjoint Set)을 효율적으로 관리하는 자료구조이자 알고리즘이다.쉽게 말해 여러 노드가 존재할 때 두 개의 노드를 같은 집합으로 묶고, 두 노드가 같은 집합에 있는지 확인하는 알고리즘이다.왜 이름이 유니온 파인드일까?유니온 파인드 이름 그대로 두 가지 핵심 동작에서 유래한다. 이 연산 과정을 Union, Find라고 부른다.union: 서로 다른 두 집합을 하나로 합치는 연산find: 어떤 원소가 어느 집합에 속하는지 찾는 연산실제로 어떻게 동작하는지 그림으로 알아보자.유니온 파인드의 과정유니온 파인드의 과정에서 노드를 표현하는 방법은 배열을 많이 사용한다.왜 배열을 사용할까?1. 빠르기 (시간 복잡도) 배열을 쓰면 인덱스로 바로 접근할 수 있어서 속도가..

알고리즘 2025.05.23

DFS VS 백트래킹

DFS와 백트래킹의 차이점에 대해 알아보자먼저 브루트포스와 DFS에 대해 간단하게 알아보자.브루트포스란?직역하면 'Brute : 무식한 Force : 힘' 으로 무식한 힘으로 완전탐색하여 답을 도출하는 알고리즘이다. DFS란?DFS는 그래프나 트리 자료구조에서 깊은 경로를 우선적으로 탐색하는 알고리즘이다. 특정 경로를 완전히 탐색한 후 다음 경로로 넘어가는 방식이다. 둘의 차이는 다음과 같다.브루트포스는 문제 공간 전체를 탐색한다. 그래프나 트리 구조가 아닌 단순한 배열이나 숫자 조합에서도 사용된다.DFS는 그래프 또는 트리와 같은 연결된 데이터 구조에서 사용된다.브루트포스는 탐색 도중 가지치기를 하지 않으므로 비효율적이다.DFS는 탐색 경로가 불필요하다고 판단되면 탐색을 중단할 수 있어 더 효율적이다...

알고리즘 2025.05.19

배낭 문제(knapsack algorithm)

배낭 알고리즘이란?조합 최적화 문제의 일종으로간략하게 말하자면, 담을 수 있는 최대 무게가 정해진 배낭과 함께 각각의 무게와 가치가 주어진 아이템의 집합이 주어졌을 때, 배낭에 담은 아이템들의 가치의 합이 최대가 되도록 하는 아이템들의 부분집합을 찾는 문제이다.대표적인 DP(Dynamic Programming) 문제배낭 문제는 대표적인 DP 알고리즘 중 하나로 알려져 있다.DP(Dynamic Programming)란?복잡한 문제를 작은 하위 문제로 나누어 푸는 알고리즘 설계 기법이다. 이미 계산한 하위 문제의 결과를 저장해두고, 같은 하위 문제가 다시 등장할 때 중복 계산을 피하고 저장된 값을 재사용함으로써 전체 계산량을 줄이는 방식이다.왜 DP를 사용할까?브루트포스 알고리즘을 사용하면 가능한 모든 선택..

알고리즘 2025.05.16

에라토스테네스의 체

에라토스테네스의 체란?여러 개의 수가 소수인지 아닌지 판별할 때 사용하는 알고리즘이다.이 알고리즘의 원리는 해당수가 소수라면, 해당수의 배수들은 모두 해당수를 약수로 가지고 있으므로 소수가 되지 못한다. 적용을 해보자에라토스테네스의 체는 먼저 판별할 수 만큼 배열을 할당한다. 배열에서 체크되지 않은 수를 순차적으로 찾는다.해당 수는 소수이다.해당 수의 배수들을 체크한다.그림으로 알아보자.일종의 노가다 방식이라 상당히 무식한 방법이긴 하지만, 특정 범위가 주어지고 그 범위 내의 모든 소수를 찾아야 하는 경우 아직까지 소수들 간의 연관성(=소수를 생성할 수 있는 공식)이 나오지 않았으므로 에라토스테네스의 체보다 빠른 방법이 없다. 다만 에라토스테네스의 체는 '특정 범위 내의 소수'를 판정하는 데에만 효율적..

알고리즘 2025.05.15

[우아한테크코스] 로또

이번 스터디에서는 우테코 로또 미션을 진행했다.자동차 경주 미션보다 기능도 많고 고려할 것들도 많았다. 기능 요구사항은 다음과 같다.이번에는 리드미에 나름대로 구현목록을 작성하고 체크하면서 구현하였다. 자동차 경주 미션과 마찬가지로 객체지향을 지키며 mvc패턴으로 구현해보았다.전체적인 설계는 다음과 같이 잡았다.이제 구현해보자.중요하지 않은 코드는 생략하도록 하겠다. 전체 코드는 아래의 링크에 첨부되어있다.model 패키지패키지 설계 중 모델 패키지에는 도메인의 핵심 모델을 담아야겠다고 생각했다. Lotto 클래스한 장의 로또를 나타내는 클래스 (6개의 숫자 포함)1부터 45중 6개의 숫자를 중복 없이 오름차순으로 멤버변수에 저장Lottos 클래스여러 장의 로또(Lotto)를 하나의 객체로 묶어 다룬다...

Java 2025.05.02