/BackEnd

🖼 일상의 예술을 공유하는 SNS

Primary LanguageJava

🖼 Overview

❓ 같은 취미를 가지고 있는 사람들끼리 만나면 얘기할 수 있는게 많아지고, 더 깊은 이야기를 나눌 수 있지 않을까?

💡 특정 테마를 주제로 SNS를 만들어보자! → 그림 SNS

[ArtBubble]

예술을 의미하는 단어 Art와 SNS 알고리즘에 의해 묶인 사람들을 뜻하는 은어 Bubble의 합성어

[로고]

공유의 의미를 가지는 아이콘 형태에 새로움을 상징하는 초록, 자유로움을 상징하는 파랑, 창의성을 상징하는 보라를 통해 우리 서비스의 성격을 나타냅니다. 또한 보라색에서 새롭게 나오고 있는 방울은 또 다른 가능성을 의미합니다.

📖 Introduction

🛠️ Backend Tech Stack

  • Framework: SpringBoot, SpringSecurity, SpringDataJPA
  • Language: JAVA 8
  • Database: AWS RDS(MySQL), AWS Elasticache(Redis), AWS S3
  • Login: JWT, OAuth 2.0
  • HTTPS: AWS Load Balancer, AWS Certificate Manager
  • Stress Test: nGrinder
  • Code Test: Junit5 & Mockito
  • Deploy: AWS EC2
  • CI/CD: Github Actions, AWS CodeDeploy
  • API doc: Swagger
  • Communication Tools : Notion, Discord, Slack

💻 주요 기능

🔑 계정

회원가입 - 이메일 인증/카카오를 통해 회원가입을 할 수 있습니다.
로그인- 이메일 및 소셜 로그인(카카오)을 할 수 있습니다.
로그아웃 - 로그아웃을 할 수 있습니다.
비밀번호 재설정 - 비밀번호를 변경하거나 잊어버린 경우 재설정할 수 있습니다.
회원탈퇴 - 탈퇴가 가능하고, 탈퇴한 유저는 재가입이 가능합니다.
프로필 - 유저의 정보(프로필 이미지, 이름, 닉네임, 자기소개)를 등록/수정할 수 있습니다.

👤 프로필

유저 정보 - 프로필 이미지, 이름, 닉네임, 자기소개, 게시글 개수, 팔로잉/팔로워 수를 볼 수 있습니다.
게시글 - 유저가 작성한 게시글 목록을 볼 수 있습니다.
팔로잉/팔로워 리스트 - 유저가 팔로우하거나 나를 팔로우하는 사람의 목록을 볼 수 있습니다.
저장된 목록 - 내 프로필인 경우 내가 북마크한 게시글 목록을 볼 수 있습니다.

📌 게시글

게시글 - 게시글을 작성하거나 수정/삭제할 수 있습니다.
댓글 - 게시글에 댓글/대댓글을 작성하거나 수정/삭제할 수 있습니다.
좋아요 - 게시글에 좋아요를 하거나 취소할 수 있습니다.
좋아요 개수 - 특정 게시물에 좋아요한 사람들을 볼 수 있습니다.
북마크 - 특정 게시물을 북마크에 등록하거나 삭제할 수 있습니다.
공유하기 - 특정 게시물을 URL을 통해 공유할 수 있습니다.

🤝 팔로우

유저를 팔로우하거나 팔로우 취소할 수 있습니다.

알림

좋아요/팔로우 요청/댓글/대댓글에 대한 알림을 받을 수 있습니다.

🔍 검색

유저 검색 - 검색한 이름이나 닉네임과 일치하는 유저를 조회할 수 있습니다.
해시태그 검색 - 검색한 해시태그가 있는 게시물들을 조회할 수 있습니다.

👍 추천

팔로우 추천 - 최근 1시간 이내에 많은 팔로우를 받은 유저들을 보여줍니다.
피드 추천 - 팔로우한 사람이 있다면, 팔로우한 사람의 최신 글을 보여줍니다. 없다면, 최근 1시간 이내에 많은 좋아요를 받은 글을 보여줍니다.

🔫 Trouble Shooting

🍪 쿠키

문제 상황 JWT토큰을 클라이언트에 쿠키로 설정(Set-Cookie)할 수 없음
원인 HTTP 전송을 하면 쿠키의 Secure 옵션을 false, SameSite 옵션을 none 이 아닌 strict나 Lax로 설정해야 하는데, 이 경우 다른 도메인간 쿠키를 전송해야 하는 상황에서 에러 발생
해결 쿠키의 Secure 옵션을 true, SameSite 옵션을 none 으로 설정하고, HTTPS 전송 방식을 도입함으로써 쿠키를 정상 전송

📈 N + 1 문제 대응 & nGrinder로 부하 테스트

문제 상황 게시글을 읽어서 1 : N 매핑된 다른 엔티티를 참조할 때 N + 1 문제 발생
원인 FE 리턴용 DTO를 만들 때 엔티티 내부의 다른 엔티티를 참조할 때마가 추가 쿼리가 발생
해결 DTO에 필요한 정보를 JPQL JOIN 쿼리로 한 번에 가져와서 추가적인 엔티티 참조를 차단
  • 성능 테스트 결과

    nGrinder로 리스트 획득 API를 테스트 했을 때 6 ~ 18 TPS의 성능 향상을 확인함.

    (TPS: Transaction Per Second, 초당 트랜잭션 처리량)

    게시물 리스트 읽기 API 52.7 TPS -> 59.0 TPS (+6.3)

    게시물 1개 읽기 API 49.5 TPS -> 67.1 TPS (+17.6)

    피드 구성 API 43.3 TPS -> 56.7 TPS (+13.4)

    댓글 리스트 읽기 API 60.8 TPS -> 70 TPS (+9.2)

    대댓글 리스트 읽기 API 51.6 TPS -> 64.7 TPS (+13.1)

⚡ 리소스 부족 대응

문제 상황 EC2 서버(t2.micro)에 쓰레드 부족 에러가 발생하면서 서버가 다운됨
원인 스케줄링용 스레드는 2개를 만들었는데, 스프링부트 앱에서 4개의 스케쥴러가 동작
해결 소스코드 내 스레드를 다수 사용하는 메소드를 조절. 스레드 개수를 4개에서 2개로 줄임으로써 개수를 맞춰줌.

⚠️ 카카오 소셜 로그인

문제 상황 카카오 로그인한 유저를 이메일로 식별 불가능
원인 카카오 서버에서 사용자의 이메일을 선택적으로 받을 수 있는 상황
해결 Unique Key에 null이 허용됨을 확인한 후 카카오 로그인 유저의 email은 null로 처리한 다음 사용자는kakaoUserId로 식별
문제 상황 카카오 로그인 유저에 대해 401 UnAuthorized 발생
원인 카카오 로그인 유저에 비밀번호를 설정하지않아 생성된 JWT 토큰이 유효하지 않았음
해결 임의의 비밀번호를 사용자에게 설정해서 유효한 JWT 토큰 생성

👋 Team

📜 API doc & Conventions

API doc
Code
Commit Convention
Issue
PR
Git Branch

Members


강지승(FE)


곽재하(BE)


김경현(FE)


김예진(BE)


박동빈(BE)