[Study] SNS FIFO : MessageGroupId 지정
·
SPRING/TIL
배경기존에 채점 시스템에서 SNS와 SQS를 활용한 팬아웃(Fan-out) 패턴을 통해 채점 요청을 처리하고 있었다. 초기 아키텍처는 효율적인 비용과 처리량에 중심을 둔 Standard 타입의 SNS와 SQS로 구성했다. Standard는 순서를 보장하지 않는 대신, 높은 처리량을 제공하여 만약 채점 요청이 대량으로 들어올 경우 분산 처리하는데 유리했다. 그러나 먼저 제출한 사람의 채점이 먼저 처리되어야 한다는 요구사항이 있었다. 그래서 SNS와 SQS를 모두 FIFO, 선입 선출 구조로 변경했다. 그러나 이렇게 둘 다 FIFO로 구성할 경우 전체 채점 요청이 단 하나의 파이프라인을 통해 직렬로 처리될 수밖에 없었다. 만약 트래픽이 몰린다면 전체 시스템 처리 속도가 급격히 저하되는 성능 병목 지점이 될..
HeadObject로 S3 객체 존재 여부 확인하기 (SDK 2)
·
SPRING/HOW-TO
🍒배경AWS S3는 객체를 고유한 키(Key) 값으로 관리하는 스토리지 서비스입니다. 개발을 하다보면 특정 버킷 안에 지정된 키 값을 가진 객체가 실제로 존재하는지 확인해야 하는 경우가 발생합니다. 예를 들어, 업로드가 정상적으로 완료되었는지 검증하거나 다운로드 전에 객체 존재 여부를 확인하는 경우 등이 있습니다. 이는 HeadObject를 사용하여 쉽게 확인할 수 있습니다. 객체의 실제 데이터를 가져오지 않고 해당 객체의 메타데이터(크기, 수정 시각, ETag 등)만 반환하기 때문에 가볍게 존재 여부를 확인할 수 있습니다. 🍒사전 준비🌱의존성 주입implementation platform("io.awspring.cloud:spring-cloud-aws-dependencies:3.0.1")impl..
[Study] @Modifying: 벌크 연산과 영속성 컨텍스트 관리
·
SPRING/TIL
배경기능 요구사항:제출(Submission) 하나를 대표 코드로 지정(isDefault = true)기존에 대표 코드로 지정되어 있던 것은 자동 해제(isDefault = false) 방법 1가장 나이브한 구현 방식을 생각해보자면, Submission들을 전부 로딩해서 순회하며 isDefault가 true인 것을 false로 업데이트 한 뒤, 대표로 지정하고자하는 제출을 isDefault = true로 설정하는 것이다.`List findByUserAndProblem(...)` 같은 것으로 n건을 SELECT → READ 1서비스에서 순회하며 isDefault가 true인 것만 false로 set대표로 지정할 대상 엔티티도 set(isDefault=true)커밋 시점 플러시에서 변경된 엔티티 수만큼 UPD..
[Troubleshooting] QueryDsl 서브쿼리 limit 1 적용 안 됨
·
SPRING/TIL
문제 상황문제 목록을 조회할 때 각 문제의 Top 유저를 함께 가져와야 했다. QueryDSL로 구현하려면, 기본적으로 문제를 조회하는 메인 쿼리와, 각 문제에 대한 Top 유저를 구하는 서브쿼리가 필요했다. Top 유저를 조회하는 기준 컬럼을 내림차순 정렬한 뒤 상위 1명만 선택한다는 아이디어로 설계했다. 즉, 정렬 후 limit 1을 적용해 한 행만 가져오는 방식을 떠올렸다. 실행을 돌려보니, Scalar subquery contains more than one row; SQL statement: 에러가 떴다. 문제 코드public List findPopularProblem(int limit) { QProblem problem = QProblem.problem; QProble..
Presigned URL로 S3 이미지 업로드 및 삭제 기능 구현하기 (SDK 2)
·
SPRING/HOW-TO
이전 글에서는 Presigned URL을 활용하여 이미지를 조회하는 기능을 구현했습니다. Presigned URL로 S3 프라이빗 버킷 이미지 조회하기 (SDK v2)프로메사 프로젝트를 진행하던 중, 원래 계획에는 없었던 Presigned URL을 도입하게 되었습니다. 이 글에서는 해당 기술을 왜 선택하게 되었는지 먼저 설명하고 이어서 Presigned URL의 개념을 간단히devyeonee911.tistory.com 이번 글에서는 `Presigned URL`을 활용하여 S3에 이미지를 업로드하고, 추가적으로 S3 버킷의 이미지를 삭제하는 기능까지 구현해보겠습니다.직접 구현하는 과정에서는 `Presigned URL`을 사용하기 위한 기본 세팅 (ex. 의존성 주입, S3Config 등)에 대한 내용은 ..
SSH 터널링으로 프라이빗 RDS에 MySQL Workbench 연결하기
·
SPRING/HOW-TO
이번 글에서는 퍼블릭 액세스를 차단한 Private RDS를 MySQL Workbench와 연결하는 방법에 대해 소개하겠습니다. AWS 지식 센터 글을 참고했습니다. 본격적으로 연결 방법을 설명하기 전에, 왜 MySQL Workbench를 사용하게 되었는지, 그리고 RDS는 프라이빗으로 설정한 이유에 대해 먼저 짚고 넘어가고자 합니다. 🍒MySQL Workbench를 사용하는 이유프로젝트의 관계형 데이터 베이스로 MySQL을 사용하고 있으며 AWS의 RDS를 통해 관리하고 있습니다. 데이터 베이스를 시각적으로 확인하고 관리하기 위한 툴을 살펴보던 중 MySQL Workbench를 알게 되었습니다. MySQL Workbench는 데이터베이스 설계자, 개발자, DBA를 위한 통합 비주얼 도구입니다. M..
Presigned URL로 S3 프라이빗 버킷 이미지 조회하기 (SDK v2)
·
SPRING/HOW-TO
프로메사 프로젝트를 진행하던 중, 원래 계획에는 없었던 Presigned URL을 도입하게 되었습니다. 이 글에서는 해당 기술을 왜 선택하게 되었는지 먼저 설명하고 이어서 Presigned URL의 개념을 간단히 소개하겠습니다. 그 다음, 공식 가이드 문서의 코드를 실제 프로젝트에 맞게 어떻게 개선했는지 그 과정을 공유하고, 구현 과정에서 들었던 의문과 이에 대한 답변도 함께 작성해보겠습니다. 마지막으로 이 글을 따라서 적용해보는 분들을 위해 오류 발생 시 점검해보면 좋은 체크리스트를 정리하며 글을 마무리하겠습니다. 🍒코드 개선 필요성기존에는 S3 버킷을 아래 사진처럼 모든 퍼블릭 액세스 차단 설정을 해제해두었습니다. 그래서 누구나 객체 URL을 통해서 이미지에 바로 접근할 수 있었고, 홈 화면에 띄울..