분류 전체보기 32

2024.10.22 2583. Kth Largest Sum in a Binary Tree (Java)

문제You are given the root of a binary tree and a positive integer k.The level sum in the tree is the sum of the values of the nodes that are on the same level.Return the kth largest level sum in the tree (not necessarily distinct). If there are fewer than k levels in the tree, return -1.Note that two nodes are on the same level if they have the same distance from the root.요약같은 depth에서 총 합의 크기가 k번..

알고리즘 2024.10.22

2024.10.22 LeetCode 1593. Split a String Into the Max Number of Unique Substrings

Given a string `s`, return _the maximum number of unique substrings that the given string can be split into_.You can split string `s` into any list of **non-empty substrings**, where the concatenation of the substrings forms the original string. However, you must split the substrings such that all of them are **unique**.A **substring** is a contiguous sequence of characters within a string.풀이 시간..

알고리즘 2024.10.22

Spring Redisson Lock 구현하기, 근데 AOP를 곁들인

읽기 전에Redis Lock 기본Redisson vs Lettuce서론위 글에서 적은 동시성 이슈를 해결하기 위해 Redisson을 도입한 Redis 락을 구현하게 되었다. 1. User A와 User B가 동시에 방에 참가한다2. User A와 User B가 거의 동시에 방 목록을 가져오게된다3. User A가 먼저 saveRoom을 하여 참가를 하게되고 다른 유저들은 User A가 마지막 참가자로 참가하는 알림을 받게 된다4. User B가 saveRoom을 하며 덮어쓰게되고 다른 유저들은 마지막 참가자가 User B가 되었다는 알림을 다시 받게된다5. User A는 방에서 추방되게 된다.이처럼 유저가 직접적으로 동시성 이슈로 인한 버그를 느낄 수 있기 때문에 Lock의 필요성을 느끼게 되었다.설계L..

개발 2024.10.21

Java로 Redis lock 구현하기

읽기 전에Redis의 락 레디스의 락에 대해서 정리한 글이다Spring의 Redis FrameworkSpring의 레디스 프레임 워크는 크게 3가지가 있다.Jedis , Lettuce, Redisson이렇게 있다. JedisRedis 동기식 Java 클라이언트, 비교적 간단하고 쉽다LettuceRedis 비동기 및 반응형 연결 Java 클라이언트, netty (자바 비동기 이벤트 기반 네트워크 애플리케이션)기반으로 이루어져 있다Reddisonnetty 기반의 고성능 비동기 및 락프리 Java 클라이언트, 락프리란 락을 사용하지 않고도 공유 자원에 대하여 여러 스레드 접근시 데이터의 일관성을 보장하는 프로그래밍 기법JedisRedis 용 비 동기식 Java 클라이언트라고 설명하며 비교적 간단하고 쉽게 사용..

학습 2024.10.21

Redis의 Lock

서론마피아 투게더를 개발하면서 Redis를 도입했다.Redis를 도입한 이유는 다음과 같다JVM 내부 세션 방식으로 관리하는 것보다 분산환경에 더 유연하게 설계 가능RDBMS보다 더 빠른 인메모리 DB하지만 여러가지 문제에 봉착하게 되었다.바로 동시성 문제에 봉착한 것이다.대표적인 예시로동시에 A, B가 마지막 멤버로 들어오면서 A가 사소한 차이로 먼저 들어왔을때A의 입장 요청이 B의 findRoom(참여인원 정보)보다 먼저 들어갈 경우 방의 입장정보를 계속 받고 있던 다른 유저는 마지막 유저가 A -> B로 바뀌는 동시성 이슈를 맛보게 될것이다.또한 DB(Redis)에는 해당 테이블에 먼저 입장한 A가 아닌 B가 최종적으로 저장되게 된다.이러한 문제는 @Transactional로 격리하여 해결할 수 있..

학습 2024.10.19

기술할짝 시리즈 1 - Kotlin

서론이 시리즈는 데브코스 커리어 TALK라는 강연에서 개발바닥 향로님이신 이동욱 CTO 님과 대화를 하다가 깨달은 부분이 있어서 시작하게 되었다.나 : 지원하는 회사들과 언어 스택이 너무 다른것 같아 고민입니다. 따로 Node.js나 Kotlin같은 언어로 프로젝트를 진행하거나 학습을 할 필요가 있을까요?이동욱 CTO님 : 진행하면 물론 좋겠지요. 하지만 개발자로서 요즘 유행하거나 화제가 된 기술 (언어)를 호기심에라도 경험해보거나 학습하지 않는 개발자를 좋은 개발자라고 할 수 있을까요?와 이부분에서 내가 잘못 생각하고 있었구나 라고 느끼게 되었다. 집에 돌아온 나는 우선 경험을 해보는것이 중요하겠다는 생각이 들었다.그 시작은 Kotlin을 선택하게되었다. 그 이유는 Java를 배운 입장에서 익숙하게 느..

실시간 통신 리펙토링 SSE 교체

서론기존 마피아 투게더 게임은 실시간 통신을 Polling을 통해 구현해 두었다그 이유는 러닝 커브, 구현 속도가 다른 기술에 비해 빠르게 때문에 선정하게 되었다.Polling의 시나리오는 이렇다 매 0.5초 마다 방의 상태를 물어봄방의 기록된 현재 상태의 기한 (endtime)과 현 시간을 비교하고 지났을 경우 상태를 변경하여 방 상태를 응답 그렇지 않을 경우 지금 방 상태 반환 이 경우 총 유저의 수만큼 초당 2번씩 요청이 오게 된다이렇게 될경우 유저가 많아질 수 록 서버의 부담이 높아질 것으로 예상된다따라서 Polling의 실시간 통신 부분을 교체하기로 하였다기술 선정실시간 기술에는 여러 종류가 있다Polling, Long Polling, SSE, Web Socket, Web RTC 등등각각을 보자..

개발 2024.10.14

[면접복기] 쓰레드와 프로세스의 차이는 무엇인가요?

서론쓰레드와 프로세스의 차이에 대한 면접 질문을 받았었다CS 스터디할때 분명 한 기억은 있는데 너무 횡설수설 대답한 것 같았다 쓰레드운영체제에서의 작은 실행의 최소 단위 하나의 프로세스에서는 여러개의 스레드가 메모리를 공유하여 사용할 수 있다생성 속도가 빠르고 작은 메모리를 소모하며 정보 교환이 쉽고 컨텍스트 스위치가 빠르다자원 선점과 동기화 문제가 있다 프로세스프로세스또한 실행의 단위중 하나이다쓰레드보다는 큰 개념이라고 생각하면 좋다 차이가 있다면 프로세스는 독립적인 단위이다각각의 프로세스가 메모리를 공유하지 않고 각자의 데이터와 스택을 가지고, 보호받는다.쓰레드와 다르게 생성시 운영체제에게 PCB (Proccess Control Block)과 메모리 영역을 할당받고 초기화를 해야한다 또한 ..

학습 2024.09.17

[면접 복기] HTTP와 TCP 의 차이

서론하반기 첫 면접에서 좀 심하게 넘어지면서 여태까지 한 내용들을 정리할 필요를 느끼게 되었다그때 가장 잘못 대답한 부분이 바로 TCP 와 HTTP 에 대해서 말을 잘 못한것 같다때문에 이 부분을 더 정리해서 말해야 할 것 같았다우선적으로 제일 기본이 되는 통신에 대해서 정리해 보자우리가 흔히 통신에 대해서 얘기할때 2가지의 기술에 대해서 얘기를 한다TCP/IP 통신, UDP, 그리고 HTTP 통신오늘은 이것들에 대해서 정리해보도록 한다TCP == HTTP?TCP 프로토콜과 HTTP는 같은것인가?이 질문에 대한 대답은다른 것이다. 하지만 더 정확히는 HTTP 프로토콜은 TCP에 의존하여 통신을 한다. 라고 하면된다그럼 이 질문에 대해 더 자세히 알기 위해 각각이 무엇인지 알아보자TCPTCP는 애플리케이션..

학습 2024.09.15

Spring Redis 도입에 대한 고찰

서론마피아 투게더에서 Redis를 도입하였다. 도입 이유는 여기에 기록해 두었다. 이때 2가지를 고려하게 되었다.동시성조회 쿼리문제점1. 동시성기존 vote의 객체는 다음과 같이 구현되어 있다public class Vote { private final Map playerVote; private Player votedPlayer;}이러한 구조라면 동시성 문제가 발생할 것이라고 생각했다.Redis는 SingleThread의 구조이다.또한 Redis는 key-value의 구조이다. 이 상태에서 vote를@RedisHash("vote")public class Vote { @Id private String code; // 방 코드 private final Map playerVote; ..

개발 2024.07.22