함수형 프로그래밍을 적용한 분산락 성능 개선 (2)
·
Project
이전 글과 이어지는 게시글입니다 1. 개요이전글에서는 분산락에 개선점을 언급하였고, 이를 해결하기 위해 함수형 프로그래밍을 도입한 과정을 소개하려고 한다. 분산락에 개선점적용 여부 확인의 어려움락 장시간 점유로 인한 성능 저하 이를 개선하기 위해선 먼저 key 관리 방법을 바꾸고, 락이 필요한 영역에만 락을 적용해야 한다.기존 코드를 함수형 프로그래밍으로 개선하여 해결할 수 있다.함수형 프로그래밍은 간단히 파라미터로 함수를 넘기는 것을 말한다.  2. 구현LockManager@Slf4j@RequiredArgsConstructor@Componentpublic class LockManager { private final RedissonClient redissonClient; private fina..
낙관적 락 vs 비관적 락 vs 분산락 (with Redisson)
·
Project
1. 개요공유 자원에 대한 동시성 이슈를 해결하기 위한 방법은 다양하다. 그 중에서 낙관적 락, 비관적 락, 분산락에 대해 알아보고 직접 적용해보며 성능 차이를 확인해보려 한다 2. 낙관적 락 (Optimistic Lock)특징충돌이 발생하지 않는다고 가정DB가 제공하는 락 기능이 아닌, 애플리케이션에서 제공하는 버전 관리 기능Version이라고 하는 구분 컬럼을 활용트랜잭션 커밋 시점에 충돌을 파악레코드를 업데이트 하는 과정에서만 락을 점유하기 때문에 성능이 좋음 동작공유 자원을 포함하는 ROW에 업데이트 할 때 Version을 증가ROW 업데이트 시점에 해당 ROW를 읽었을 때 Version과, 업데이트 시점에 Version이 다르면 예외를 발생같은 경우에만 업데이트 실행 3. 비관적 락 (Pessi..
Lambda + CDN을 통한 스트리밍 영상 제공
·
Project
1. 개요현재 진행하고 있는 프로젝트에서 주 도메인이 영상과 이미지이다.따라서 효율적인 콘텐츠 제공을 위해 영상은 트랜스코딩을 통하여 스트리밍 파일로 저장하고, 이와 함께 이미지도 CDN을 통해 배포하였고 이 과정을 정리해보려 한다. HLS(HTTP Live Streaming)내가 적용한 스트리밍은 HLS로 적응형 스트리밍(Adaptive HTTP Streaming) 또는 적응형 비트레이트 스트리밍(ABR, Adaptive Bitrate Streaming)의 일종이다.이를 통해 유저의 네트워크 환경에 따라 최적화된 다양한 영상 품질(해상도)를 제공할 수 있다. 후보군으로 MPEG-DASH를 생각했지만, 다음과 같은 이유로 HLS를 선택하였다구현 난이도자료DASH는 국제 표준이고 HLS는 Apple에서 개..
Remote host terminated the handshake, SSL peer shut down incorrectly
·
Error Solution
상황JDK 17, Spring Boot 3.3 환경에서 일환율 조회 API 를 실행하는 과정 중 SSL 에러를 마주하였다.Open API를 적지 않게 사용해 봤지만 SSL 에러는 생소했다.특별한 것 없이 Open API를 적용하였고 아래와 같은 에러 로그를 확인할 수 있었다.// 일부 생략됨org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://www.koreaexim.go.kr/site/program/financial/exchangeJSON": Remote host terminated the handshake at org.springframework.web.client.RestTemplate..
GitHub Actions + ECR + ECS + ALB를 통한 CICD
·
Project
1. 설계CI내가 정의한 CI의 역할은 pr로 올라온 코드가 정상적으로 빌드되고 단위 테스트가 성공적으로 마무리 됐는지를 확인하기 위함이다.따라서 GitHub Actions만을 가지고 간단하게 마무리 할 수 있었다. CI.ymlname: CIon: pull_request_target: types: [opened, synchronize, closed] branches: [dev] paths: - '**'permissions: contents: readjobs: CI: runs-on: ubuntu-latest steps: - name: 1. checkout uses: actions/checkout@v4 - name: 2. Set up JDK 21 ..
Spring + Elasticsearch 전문 검색 인덱스 적용 - 구현 (2)
·
Project/Elasticsearch의 전문 검색 인덱스 성능 비교
5. Spring + Elasticsearch 구현이제 앞서 살펴본 Elasticsearch 문법들을 그대로 Spring에서 구현하는 것이 이 포스팅의 목표이다ㅓ먼저 Spring에서 Elasticsearch 데이터를 관리&처리하기 위해 Spring Data Elasticsearch를 사용하였다자세한 내용은 Spring Data Elasticsearch docs를 참고할 수 있다. build.gradledependencies { // elasticsearch implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'} 사실 Elasticsearch 포트 번호를 변경하거나, 인증을 적용한 게 아니라면 config..
Spring + Elasticsearch 전문 검색 인덱스 적용 - Elasticsearch 익히기 (1)
·
Project/Elasticsearch의 전문 검색 인덱스 성능 비교
GitHub - lsh2613/Elasticserach: Spring + Elasticserach를 적용한 전문 검색 인덱스 성능 비교Spring + Elasticserach를 적용한 전문 검색 인덱스 성능 비교. Contribute to lsh2613/Elasticserach development by creating an account on GitHub.github.com 1. Elasticsearch란?ELK, Elastic Stack이라 불리는 Elasticsearch, Logstash, Kibana 중 ELK의 심장이라 불리는 Elasticsearch는 뛰어난 검색 능력과 대규모 분산 시스템을 구축할 수 있는 다양한 기능을 제공한다.DBMS에서 사용하는 용어와 혼동되기 쉬워 아래 표를 참고하도록..
Spring + MySQL Spatial Index (공간 인덱스) 적용
·
Project/MySQL Spatial Index를 적용한 성능 비교
GitHub - lsh2613/spring-spatial-idx: spirng + mysql의 spatial 인덱스 적용spirng + mysql의 spatial 인덱스 적용. Contribute to lsh2613/spring-spatial-idx development by creating an account on GitHub.github.com 1. Spatial Index (공간 인덱스 )공간 데이터(예: 점, 선, 폴리곤 등)와 관련된 효율적인 검색 및 처리를 위해 데이터베이스에서 제공하는 특수한 인덱스.공간 데이터를 처리하기 위해 설계된 구조로 지도상의 특정 위치를 나타내기 위해 사용되며 위도, 경도와 같은 좌표계를 활용한다. 1.1. MBRR-Tree는 공간 도형을 MBR(Minimum Bou..
Spring + RabbitMQ를 통한 1:1 채팅방 구현 - 인증 적용 (4)
·
Project/RabbitMQ(STOMP)를 적용한 1:1 채팅
GitHub - lsh2613/spring-rabbitmq: Spring + RabbitMQ를 활용한 1:1 채팅방 구현Spring + RabbitMQ를 활용한 1:1 채팅방 구현. Contribute to lsh2613/spring-rabbitmq development by creating an account on GitHub.github.com 1. 인증 방법이 프로젝트에서는 JWT + Session을 적용하였다.정확히 인증은 JWT를 활용한다 2. JWT는 Session 대신 사용하는 건데 왜 굳이 둘 다 사용할까?먼저 JWT의 인증 방식에 대해 알아 보자프로젝트마다 약간 다르겠지만 본인이 구현하는 방식은 아래와 같다HTTP 요청 -> JwtAuthenticationFilter -> header..
Spring + RabbitMQ를 통한 1:1 채팅방 구현 - 읽음/안읽음 적용 (3)
·
Project/RabbitMQ(STOMP)를 적용한 1:1 채팅
GitHub - lsh2613/spring-rabbitmq: Spring + RabbitMQ를 활용한 1:1 채팅방 구현Spring + RabbitMQ를 활용한 1:1 채팅방 구현. Contribute to lsh2613/spring-rabbitmq development by creating an account on GitHub.github.com 1. 읽음/안 읽음개발자마다 부르는 말이 다른 것 같다. 하지만 둘 다 구현하고자 하는 바는 메시지에 대해 읽었는지, 안 읽었는지를 알 수 있게 해주는 지표를 구현하고자 하는 것이다. 크게 다음과 같은 기능을 의미한다1. 나의 채팅방에서 읽지 않은 메시지의 개수 표시2. 채팅방 내에서 메시지가 다른 참가자들에 의해 얼마나 읽혔는지(혹은 안 읽혔는지)를 표시 2..