반응형

전체 글 22

룰렛 서비스에서 Redisson 분산 락 적용기

최근 진행한 프로젝트에서 룰렛 이벤트의 백엔드 개발을 담당했다. 이 중 제한된 수량의 상품 당첨 시 재고를 정확히 감소시키는 로직이 핵심 과제였다.동시다발적인 요청에서도 데이터 무결성을 유지하기 위해 Redisson을 활용한 분산 락을 적용했으며, 이를 통해 재고 감소 처리 과정에서 발생할 수 있는 경합 및 동시성 이슈를 효과적으로 해결했다.Lettuce 또한 Redis와의 통신 및 분산 환경에서 유용한 기능을 제공하지만, 프로젝트 요구사항 및 실제 운영 환경에서의 적합성을 고려해 Redisson을 선택했다. Redisson을 사용한 이유백엔드 서버가 14대 운영 중이므로 분산 환경에서 동시성 제어가 필요함RDB는 1대만 운영 중으로 락으로 인한 부하를 줄일 필요가 있음이미 Redis 서버가 구축이 되어..

Database 2025.03.12

[Java] Stream partitioningBy

partitioningBy?partitioningBy 메서드는 자바 8부터 도입된 스트림(Stream) API의 기능 중 하나로, 요소들을 지정한 조건에 따라 두 그룹으로 분할합니다. 조건에 맞는 요소들과 그렇지 않은 요소들을 각각 리스트로 반환하여 처리할 수 있습니다장점partitioningBy 메서드를 사용하면 데이터를 두 그룹으로 쉽게 분할할 수 있어 다양한 상황에서 유용합니다. 예를 들어, 참/거짓 또는 짝수/홀수와 같이 두 가지로 분류할 때 매우 편리하게 사용할 수 있습니다.코드 예제```@Getter@AllArgsConstructorpublic static class MemberResponse {private String name;private Integer no;}@Testvoid parti..

Java 2024.02.13

[Programmers] Lv.1 최소 직사각형

[문제설명] 명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다. 아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다. 명함 번호 가로 길이 세로 길이 1 60 50 2 30 70 3 60 30 4 80 40 가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이..

코딩테스트 2024.01.22

[Programmers] Lv.1 카드뭉치

[문제설명] 코니는 영어 단어가 적힌 카드 뭉치 두 개를 선물로 받았습니다. 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶습니다. 원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다. 한 번 사용한 카드는 다시 사용할 수 없습니다. 카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다. 기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다. 예를 들어 첫 번째 카드 뭉치에 순서대로 ["i", "drink", "water"], 두 번째 카드 뭉치에 순서대로 ["want", "to"]가 적혀있을 때 ["i", "want", "to", "drink", "water"] 순서의 단어 배열을 만들려고 한다면 첫 번째 카드 뭉치에서 "i"를 사용..

코딩테스트 2024.01.22

[Programmers] Lv.1 추억점수

[문제설명] 사진들을 보며 추억에 젖어 있던 루는 사진별로 추억 점수를 매길려고 합니다. 사진 속에 나오는 인물의 그리움 점수를 모두 합산한 값이 해당 사진의 추억 점수가 됩니다. 예를 들어 사진 속 인물의 이름이 ["may", "kein", "kain"]이고 각 인물의 그리움 점수가 [5점, 10점, 1점]일 때 해당 사진의 추억 점수는 16(5 + 10 + 1)점이 됩니다. 다른 사진 속 인물의 이름이 ["kali", "mari", "don", "tony"]이고 ["kali", "mari", "don"]의 그리움 점수가 각각 [11점, 1점, 55점]]이고, "tony"는 그리움 점수가 없을 때, 이 사진의 추억 점수는 3명의 그리움 점수를 합한 67(11 + 1 + 55)점입니다. 그리워하는 사람의..

코딩테스트 2024.01.22

[Programmers] Lv.1 달리기경주

[문제설명] 얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다. 선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요. [제한사항] ..

코딩테스트 2024.01.22

[Java] Optional<T> isPresent(), ifPresent() 사용하기

Optional을 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있다. 즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 된다. 1. isPresent() 메소드 - Boolean 타입 - Optional 객체가 값을 가지고 있다면 true, 값이 없다면 false 리턴 > 예시 코드 user 이메일을 조회 후 user.isPresent() 메소드 사용 값을 가지고 있으면 true "이미 존재하는 이메일" 출력 값이 없으면 false "사용 가능한 이메일" 출력 2. ifPresent() 메소드 - Void 타입 - ifPresent()는 Optional 객체가 값을 가지고 있으면 실행 값이 없으면 넘어감 > 예시..

Java 2022.04.21

[Error] Web server failed to start. Port 8080 was already in use

프로젝트를 실행하는 과정에서 갑자기 [Error] Web server failed to start. Port 8080 was already in use 와 같은 오류가 떠 당황한 적이 있다. 포트가 이미 실행 중일 때 스프링을 Run 하면 실행되는 에러이다. 해결방법은 간단하다. 명령 프롬프트를 실행시킨 후 아래 명령어를 입력하여 현재 실행중인 포트의 PID번호를 확인한다. netstat -ano | findstr '사용중인 포트번호' netstat -ano | findstr 8000 그리고 아래 명령어를 입력하여 해당 포트를 종료시킨다. taskkill /f /pid 'pid 번호' taskkill /f /pid 12692

오류해결 2022.02.03

클라우드 서비스

클라우드 컴퓨팅? 인터넷이라는 통신 서비스를 활용한 컴퓨팅 서비스 종류의 하나로 개인용 컴퓨터가 아닌, 인터넷을 통해 연결된 원격 컴퓨터를 활용하는 기술 (쉬운설명) 개인용 컴퓨터보다 성능이 뛰어난 컴퓨터나 저장장치 등의 컴퓨터 자원을 다른 곳에 빌려 사용할 수 있도록 처리해주는 기술 클라우스 컴퓨팅 서비스는 이용 방식에 따라 크게 세가지로 분류할 수 있다. IaaS (Infrastructure-as-a-service) Paas (Platform-as-a-service) SaaS (Software-as-a-Service) IaaS (Infrastructure-as-a-service) 물리적 서버(CPU, Memory 및 OS), 네트워크, 스토리지를 가상화하여 다수의 고객을 대상으르 유연하게 제공하는 인..

개발지식 2021.12.28

[Java] Stream 사용하기

Stream 이란? Java8부터 Stream 사용이 가능해졌다. 컬렉션, 배열등의 저장 요소를 하나씩 참조하여 함수형 인터페이스(람다식)를 적용해 반복적으로 원소를 가공할 수 있도록 해주는 기능 Stream 사용 이유? 배열, 컬렉션을 다룰때 for, foreach 반복문으로 원소를 하나씩 꺼내 가공하던걸 Stream을 이용하면 람다식으로 간결하게 처리가 가능하다. 간결한 만큼 코드의 가독성이 좋아진다! Stream의 가장 기초적인 기능 3가지 1. Filtering (특정 값 찾기) 2. Mapping (특정 값 변환) 3. Sorting (정렬) Filtering Filter는 Stream 원소들을 하나씩 체크해 원하는 값을 찾을 수 있다. 🔻 filter를 이용해 결과값 count 🔻 filter..

Java 2021.12.24
반응형