전체 글 203

[프로그래머스] 문자열 나누기 - 파이썬/python

문제https://school.programmers.co.kr/learn/courses/30/lessons/140108 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr문자열이 주어질 때, 아래의 규칙을 따라서 문자열을 분해하고 분해한 문자열의 개수를 구하는 문제다.먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.만약 두 횟수가..

알고리즘 2025.03.14

[Redis] 조회수 관리와 어뷰징 방지를 위한 Redis 활용

게시글 조회수 설계 고민과 이 과정에서 Redis를 선택한 이유와 방식에 대해 작성해두려고 한다. 조회수 설계어뷰징 방지 정책사용자는 게시글당 10분에 1번만 조회수로 집계 / 10분 동안 같은 게시글을 100번 조회해도 조회수는 1번만 증가데이터의 중요도와 일관성 - 조회수는 다른 데이터(댓글 수, 좋아요 수 등)처럼 정확해야 하는 데이터가 아니다. 즉, 약간의 불일치가 발생해도 사용자 경험에 큰 영향을 미치지 않는다.게시글/댓글/좋아요 수 : 원본 데이터를 기반으로 개수가 파생되므로, 불일치가 발생하면 안 된다.조회수 : 사용자가 직접 확인할 수 없으며, 정확한 개수보다 트래픽 분산이 중요하다.데이터 저장 방식 - 조회수는 단순한 카운트 값이므로, 비정규화된 단일 레코드로 저장해도 충분하다.SQL에 ..

프로젝트 2025.03.13

[프로그래머스] 오픈채팅방 - 파이썬/python

문제https://school.programmers.co.kr/learn/courses/30/lessons/42888 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr오픈채팅방에 들어오고 나가거나, 닉네임을 변경한 기록을 담은 문자열 배열이 주어질 때, 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를 반환하는 문제다. 제한사항record는 다음과 같은 문자열이 담긴 배열이며, 길이는 1 이상 100,000 이하이다.다음은 record에 담긴 문자열에 대한 설명이다.모든 유저는 [유저 아이디]로 구분한다.[유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - "Enter [유저 ..

알고리즘 2025.03.05

[DB] 좋아요 수 설계 및 동시성 문제 해결 방법

좋아요 수 설계 고민과 어떤 식으로 진행했는지 해결 방법에 대해 작성해두려고 한다. 좋아요 수 설계좋아요 수는 실시간으로 빠르게 조회되어야 한다.좋아요가 생성/삭제될 때마다 미리 좋아요 수를 갱신하는 방식이 필요하다.좋아요 테이블에서 게시글별 좋아요 수를 미리 비정규화하여 저장하는 방안을 고려한다.게시글 테이블에 좋아요 수 칼럼 추가?장점게시글과 좋아요 수가 1:1 관계이므로, 비정규화가 어색하지 않다.데이터 조회 시 추가적인 조인이 필요 없어 성능적으로 유리할 수 있다.문제점Record Lock 및 분산 트랜잭션 문제좋아요 수가 업데이트될 때마다 게시글 테이블의 동일한 행이 갱신되므로 동시성 제약이 발생할 수 있다.트래픽이 많아지면 Lock 경합이 심해져 성능 저하가 발생할 수 있다.분산 환경에서 트랜..

프로젝트 2025.03.04

[DB] primary key 생성 전략 비교

데이터베이스에서 Primary Key(PK)는 각 레코드를 고유하게 식별하는 중요한 요소이다. 특히 분산 데이터베이스 환경에서는 PK 생성 전략이 데이터 정합성과 성능에 큰 영향을 미친다. 이번 포스팅에서는 다양한 PK 생성 전략을 비교하고, 프로젝트에서 Snowflake 기반의 유니크 정렬 숫자 방식을 선택한 이유에 대해서 알아보자. Primary Key 생성 전략1. DB Auto Increment문제점분산 데이터베이스 환경에서 PK 중복 가능성 - 여러 샤드에서 동일한 PK가 생성될 수 있어 유일성이 보장되지 않음클라이언트에 노출될 경우 공격자가 데이터를 예측할 수 있음예) 방금 가입했더니 user_id가 100이면 100명의 사용자가 있다고 예측 가능함유리한 상황보안적 문제를 크게 고려하지 않는 ..

프로젝트 2025.02.27

[DB] 분산 처리를 위한 샤딩(Sharding)

이전 포스팅에서 대규모 시스템을 보다 효율적으로 운영하기 위해 사용되는 MSA를 선택했다고 설명했다. 대규모 시스템에서는 데이터베이스 관리 또한 중요한 과제로, MSA를 활용하는 시스템에서는 이에 맞춰 확장 가능하도록 설계되어야 한다. 따라서 분산 관계형 데이터베이스 개념과 그중에서도 샤딩 기법에 대해 알아보자. 대규모 데이터베이스에서의 확장성 문제서비스가 활성화됨에 따라 단일 데이터베이스에서 모든 요청을 처리하기에는 부담이 커진다. 확장성을 고려할 때 다음 두 가지 방법이 있다.Scale-Up (수직 확장): 서버의 성능을 높여 더 많은 요청을 처리하도록 하는 방법이다. 하지만 하드웨어적인 한계로 인해 무한정 확장이 어렵고 비용이 많이 든다.Scale-Out (수평 확장): 여러 개의 서버를 사용하여 ..

프로젝트 2025.02.25