SpringBoot(9)
-
[SpringBoot] 뉴스피드 시스템 아키텍처 디자인하기
이번 포스팅은 뉴스피드 시스템 아키텍처를 설계하기 위한 구현 계획을 작성하고 이를 위한 팔로우 기능을 구현하겠습니다.뉴스피드 시스템 아키텍처란?SNS에서 팔로우중인 다른 유저가 만든 여러 피드들을 발행된 순서대로 볼 수 있는 시스템을 의미합니다.여기서 피드는 다른 유저가 생성한 게시물 뿐 아니라, 광고, 유저 상태 등 넓은 범위의 컨텐츠를 포함할 수 있습니다.필자의 경우엔 기존에 만들던 책 인용구 SNS 서비스를 뉴스피드 시스템으로 디자인하여 유저가 작성한 게시글을 서빙할 예정입니다. Fan-Out Model"내가 생성한 피드를 팔로워에게 보여준다"라는 행위를 구현하기 위해서, "확장한다"라는 의미를 가진 Fan-out 모델을 사용합니다. 즉, 팬아웃(Fan-out)은 어떤 사용자의 새 포스팅을 그 사용..
2025.12.11 -
[SpringBoot] 피드에 좋아요 구현하기
이번 포스팅에서는 SNS 피드에 좋아요를 표시하는 기능을 구현하는 방법을 알아보겠습니다. 문제 상황인상깊은 책의 문장을 기록하고 공유하는 SNS 개인 프로젝트를 개발하고 있습니다.피드에 여러 인용구 게시물이 뜰 때 해당 게시글을 내가 좋아요를 눌렀는지 누르지 않았는지 표시하기 위해 좋아요를 눌렀을 경우 핑크색으로 채워진 하트, 좋아요를 누르지 않았을 경우 빈 하트로 표시하고 싶었습니다. 인용구와 좋아요의 관계는 1(인용구) : N(좋아요)즉, 단방향 관계로 좋아요(like) 측에서 인용구(quote)에 관한 정보를 들고 있습니다. 반대로 인용구(quote)측에서는 좋아요(like)에 관한 정보를 가지고 있지 않습니다. 문제점은 여기서 발생했습니다. 사용자의 피드에 보여질 quote들을 제공하는 "/q..
2025.12.03 -
[SpringBoot] SpringBoot에서 S3로 업로드하는 3가지 방법 비교하기 (Stream, MultipartFile, AWS Mulitpart)
이번 포스팅에서 SpringBoot 프로젝트에서 S3에 업로드하는 세 가지 방법을 비교하고, 각 방법의 장단점을 알아보겠습니다. S3에 파일을 업로드하는 세 가지 방법파일을 S3에 업로드하는 방법은 크게 세 가지가 존재합니다.Stream을 이용한 업로드 방식MultipartFile을 이용한 업로드 방식AWS Multipart을 이용한 업로드 방식설명하기에 앞서 이해하면 좋은 내용들을 짚고 넘어가겠습니다. Stream이란? 스트림이란 데이터의 흐름을 의미합니다.이러한 스트림을 프로그램 입장에서 생각하면 다음 두 가지로 구분할 수 있습니다.데이터가 외부로부터 출발하여 프로그램으로 들어오는 스트림데이터가 프로그램에서 출발하여 프로그램 외부로 빠져나가는 스트림이때 전자를 InputStream, 후자를 Outpu..
2025.05.15 -
[SpringBoot] Bulk insert를 활용한 속도 개선
이번 포스팅에서 Bulk insert를 활용한 insert 속도 최적화 방법에 대해서 알아보겠습니다. Bulk insert란?여러개의 데이터를 데이터베이스에 삽입할 때 다음과 같이 각 데이터 마다 insert 쿼리를 실행할 수 있습니다.INSERT INTO table1 (col1, col2) VALUES (val11, val12);INSERT INTO table1 (col1, col2) VALUES (val21, val22);INSERT INTO table1 (col1, col2) VALUES (val31, val32); 그러나 다음과 같이INSERT INTO table1 (col1, col2) VALUES(val11, val12),(val21, val22),(val31, val32); 삽입할 모든 데이..
2025.05.09 -
[SpringBoot] Facade 패턴을 활용한 동시성 트랜잭션 범위 문제 해결하기
트랜잭션의 전파 속성이 기본(REQUIRES)일 경우, 부모 트랜잭션에 참여하게 되어 실제 데이터베이스에 커밋되는 시점이 부모 트랜잭션의 커밋 시점과 일치하게 됩니다. 이로 인해 자식 트랜잭션에서 수행된 작업들이 즉시 반영되지 않고, 부모 트랜잭션이 모두 완료된 후에야 커밋되기 때문에, 동시성 제어가 의도한 대로 작동하지 않는 문제가 발생했습니다. 이번 포스팅에선 이를 해결하기 위해 복잡한 하위 시스템을 단순화한 인터페이스인 Facade 패턴을 이용하여 동시성 제어가 정상적으로 작동되도록 하는 트러블 슈팅 과정을 기록하겠습니다. 문제상황현재 예매 로직의 트랜잭션 입니다. ShowDate 엔티티는 다음과 같습니다.@Entity@Table(name = "show_dates")@Getter@NoArgsCons..
2025.05.08 -
[SpringBoot] 토스페이먼츠 결제 연동하기
이번 포스팅에선 토스페이먼츠의 결제연동 방법에 대해서 알아보겠습니다. 토스페이먼츠 측에서 제공하고있는 다음 공식문서를 참고하여 구현하였습니다.https://docs.tosspayments.com/guides/v2/payment-widget/integration 연동하기 | 토스페이먼츠 개발자센터토스페이먼츠의 간편한 결제 연동 과정을 한눈에 볼 수 있습니다. 각 단계별 설명과 함께 달라지는 UI와 코드를 확인해보세요.docs.tosspayments.com 결제 과정은 큰 흐름으로 인증과 승인으로 나눌 수 있습니다. PG Server를 가지고 있는 곳이 토스페이먼츠라 생각하시면 됩니다. 구매자가 결제창을 통해 결제 수단방법 선택, 카드사 인증 까지가 결제 인증의 과정이며PG Server를 통해 결제 데이..
2025.04.29