Kkrap 21

CI/CD 도입 기능 설계 문서

kkrap 프로젝트에서 EC2에 docker-compose와 docker를 사용하여 elasticsearch, postgreSQL, spring boot, redis, kafka, react/vite를 띄우고 있다. 각 프론트엔드 백엔드에서 수동으로 배포를 해서 쓰고 있었는데 자동화를 위해 CI/CD를 도입하는 과정의 문서이다. 개요무엇을 위한 기능인가?Kkrap 프로젝트는 EC2 환경에서 docker-compose를 기반으로 Elasticsearch, PostgreSQL, Spring Boot, Redis, Kafka, React/Vite 등 여러 서비스를 동시에 운영하고 있다. 지금까지는 프론트엔드와 백엔드를 각각 수동으로 빌드 및 배포했기 때문에, 배포 과정에서 많은 시간이 소요되고 환경별 일관성을..

CI/CD란?

CI(Continuous Intergration, 지속적 통합)→ 개발자들이 작성한 코드를 자주(하루에도 여러 번) 중앙 저장소에 통합하고, 자동 빌드/테스트를 거쳐 코드 충돌, 버그를 빠르게 발견하는 과정CD(Continuous Dlivery/Deployment, 지속적 제공/배포)→ CI에서 검증된 코드를 자동으로 스테이징 환경 → 운영 환경에 배포하는 과정Continuous Delivery: 자동 배포 준비까지 하고 실제 배포는 사람이 승인Continuous Deployment: 운영까지 완전 자동 배포 왜 이게 필요한가?빠른 피드백 → 코드 푸시하였을 때 버그나 성능 이슈를 즉시 확인배포 속도 향상 → 사람이 수작업으로 할 때는 실수가 잦지만 CI/CD는 코드 merge만 해도 자동으로 빌드 및 ..

[Spring boot] JWT Accesstoken 및 Refresh 검사 흐름?

Accesstoken 만료검사를 위해 만료된 accesstoken을 서버에 날려서 내가 만든 Error Handler가 잘 동작하는지 보기 위해서 Postman으로 던져보았다.Exception은 다음과 같이 정의했다@Getter@AllArgsConstructorpublic class UnauthorizedException extends RuntimeException { public UnauthorizedException(String message){ super(message); } public static UnauthorizedException of(String message){ return new UnauthorizedException(message); ..

[Spring boot] JWT 관리 코드 분석

build.gradlejjwt-api: JWT 기능을 사용하는 데 필요한 API.jjwt-impl: JWT 서명 및 파싱 등의 구현체.jjwt-jackson: JSON 파싱을 위한 Jackson 연동.implementation("io.jsonwebtoken:jjwt-api:0.11.5")runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5")runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5") JWT밑은 JWT 관리 클래스이다. 한 번 다시 공부해보자import io.jsonwebtoken.*;import io.jsonwebtoken.security.Keys;import org.springframework.beans.factory.anno..

JWT 기반 인증 도입 개선 문서

kkrap 프로젝트에서 카카오 로그인 Oauth 2.0을 사용해서 로그인 하는데 사용자의 인증을 추가적으로 보안적으로 해결해줄 무언가가 필요했다. 이때 JWT를 사용하였는데 어떻게 사용하였는지에 대한 문서이다. JWT에 관한 내용을 알고 싶으면 밑 문서를 보고오길 바란다.https://wo-dbs.tistory.com/245 JWT란?JWT는 다음 3개의 부분으로 구성된다.xxxxx.yyyyy.zzzzz각 부분은 Base64로 인코딩되며, ‘.’ 으로 연결된 문자열이 최종 JWT이다.부분 설명 예시Header토큰 타입과 서명 알고리즘{ "alg": "HS256", "typ": "JWT" }Pwo-dbs.tistory.com 개요우리 프로젝트에서는 사용자가 로그인 방식은 다음과 같다.클라이언트는 전달받은..

JWT란?

JWT는 다음 3개의 부분으로 구성된다.xxxxx.yyyyy.zzzzz각 부분은 Base64로 인코딩되며, ‘.’ 으로 연결된 문자열이 최종 JWT이다.부분 설명 예시Header토큰 타입과 서명 알고리즘{ "alg": "HS256", "typ": "JWT" }Payload토큰에 담을 데이터 (예: userId, email 등){ "sub": "123", "email": "abc@example.com" }Signature위 Header + Payload를 비밀 키로 서명한 값HMACSHA256(base64(header) + "." + base64(payload), secret) JWT는 어떻게 작동하나?사용자가 로그인ex) 소셜 로그인(Kakao, Google) 성공 시서버가 JWT를 발급서버는 사용자 정..

메인페이지 무한 스크롤 기능

kkrap 프로젝트의 메인페이지에서 다른 사람들의 폴더들을 구경할 수 있는 무한 스크롤 기능을 구현하게 되었다 그 과정에 대해 기술한다.기능 개요무엇을 위한 기능인가?사용자가 다른 사용자들의 폴더를 시간순으로 탐색할 수 있도록, Instagram 피드처럼 무한 스크롤 방식으로 폴더 목록을 제공하는 기능사용자에게 어떤 가치를 제공하는가?다양한 사용자들의 관심사를 탐색정보 큐레이션의 범위를 넓혀 콘텐츠 확장성을 높인다팔로우 없이도 콘텐츠 소비가 가능하므로 서비스 체류 시간 증가로 이어진다기능 목적 및 배경왜 이 기능이 필요해졌는가?초기 서비스 구성에서 사용자가 직접 검색하거나 팔로우한 사람들의 폴더만 볼 수 있지만 사용자의 탐색 흐름이 단절 된다는 생각에 이 기능을 추가 또한 로그인 없이 탐색 가능함 공개된..

커서 기반 페이지네이션이란?

우리가 알고 있는 페이지네이션 자체는 리스트 데이터를 잘라서 몇 개씩 보여주는 것이 목적페이지네이션에는 방식 2가지가 있다.offset 기반 페이지네이션 (LIMIT / OFFSET)커서 기반 페이지네이션 (cursor-based)offset 방식 문제점10개씩 자를 때 → 21~30번째데이터SELECT * FROM folders ORDER BY created_at DESC LIMIT 10 OFFSET 20; 문제는데이터가 많아질 수록 offset 건너 뛰는 비용 증가실시간으로 데이터 추가/삭제 되면 페이지 결과가 깨짐 == 데이터 중복/누락 예를 들어사용자가 페이지 2까지 봤는데 그 사이 새로운 폴더가 추가되거나 삭제되면 사용자한테 같은 데이터가 중복 보이거나 빠짐 → 데이터가 변경되는 환경에서 페이지..

폴더 검색 기능 설계 문서(ElasticSearch)

kkrap 프로젝트에서 일주일 내 좋아요, 스크랩순 집계 기능과 특정 폴더를 검색해야하는 기능에 있어서 일반적인 SQL문 보다 좀 더 검색이 빠른 무언가를 해결하기 위한 과정이 필요했다 그 과정에 대해 기술한다.기능 개요우리 서비스에서 다음과 같은 기능을 만들게 되었는데 조회의 속도가 빠른 무언가 도구가 필요했다.폴더명, 설명, 작성자 → 검색어 입력시 검색최신순, 좋아요 순, 스크랩순 → 정렬된 결과 반환한달 내 좋아요 Top 10 → 집계팔로우한 사람들의 폴더만 보여주기 → 조건 검색그래서 이걸 구현하기 위해 검색 엔진이라는 걸 발견하게 되어 도입해보려고 하였다. 기능 목적 및 배경왜 이 기능이 필요해졌는가?기존 RDB 기반 LIKE 검색은 다음과 같은 문제점이 있었습니다:대량 데이터에서 다음과 같은..