[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..
[PROJECT] 프로메사(PROMESA) 개발 후기
·
REVIEW
프로젝트 소개♥️랜딩페이지🌱깃허브 링크📍프로젝트 인원 : 8명, 기획/디자인/프론트/백엔드 각 부서 2명씩📍프로젝트 기간 : 5월 14일(첫 커밋) ~ 8월 8일(데모데이)팀 프로메사는 아직 주목받지 못한 신예 작가들을 발굴하고플랫폼을 통해 작품의 전시와 거래를 돕습니다.도예 작가의 작품을 큐레이션하여 전시 및 판매하는 플랫폼 - 프로메사(PROMESA) 프로메사는 커머스 사이트로서, 개발 관점에서 바라보면 전형적인 쇼핑몰과 거의 동일한 기능 요구사항을 가지고 있었다. 로그인과 회원가입 기능을 비롯해서 상품을 둘러보고 마음에 드는 작품에 하트를 눌러 찜할 수 있는 기능, 그리고 실제 구매까지 이어지는 흐름이 일반적인 커머스 사이트의 요구사항과 크게 다르지 않아 기획을 이해하기에는 전혀 무리가 없었..
[CONFERENCE] AUSGCON 2025 후기
·
REVIEW
몇 주 전부터 예매해둔 AUSGCON 2025이 드디어 다가왔다. 평소 AUSG 인스타를 팔로우 해두고 염탐하는 편인데, 이번에 AUSGCON이 열린다는 소식을 보고 혼자 가는 것보다 다른 사람들과 함께 가면 더 좋을 것 같아 CEOS 21기 운영진 언니들이랑 같이 다녀왔다.AUSGCON을 알게 된 경로AUSG 인스타를 팔로우 해두고 있어서 소식을 빠르게 접할 수 있었다. 그렇다면 AUSG은 어떻게 알게 되었나? 놀랍게도 이번 컨퍼런스의 첫번째 세션과도 관련이 있다! 작년, 광고/마케팅 동아리 포스트유니브를 수료한 뒤 이제는 방황을 끝내고 다시 IT업계로 돌아가자는 마음으로 여러 IT 개발 동아리를 찾아봤다. 그러던 어느 날, CEOS 홈페이지를 샅샅이 조사하고 있었는데 유독 눈에 띄는 프로젝트가 있었다..
[ORGANIZATION] CEOS 21기 백엔드 활동 후기
·
REVIEW
CEOS 21기 활동이 끝난 지 벌써 한 달 가까이 지났다. 후기글을 쓰기에는 조금 늦지 않았나 싶다가도 지금이라도 쓰는게 가장 빠른 시기임을 깨닫고... 간단하게 써보겠습니다! CEOS는 활동하기 전부터 그 위상을 알고 있었다. 현재 대학생 IT 개발 동아리는 꽤 많다. 그리고 각 동아리별로 분위기가 확실히 존재하는 느낌이다. 입문자를 위한 곳인지, 어느정도의 실력자가 가는 동아리인지 사람들의 인식도 대부분 비슷하고는 하다. CEOS는 뭐랄까... 완전히 노베이스라기보다는 어느 정도의 실력과 경험을 갖춘 사람들이 활동한다는 인식을 가지고 있었다. 그래서 그런지 1학년 때는 CEOS에 들어가는게 정말 큰 꿈이라고 생각했을 때도 있다. 결론적으로 말하자면, CEOS는 실력보다는 열정을 가진 사람을 뽑는 ..
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을 통해서 이미지에 바로 접근할 수 있었고, 홈 화면에 띄울..