
💥 기존 : 초기에 개발되어 있던 형태 매칭 로직 동작에 걸렸던 시간 : 513초처음엔 프로젝트 마감 시간에 쫓겨, 평범하고 빠르게 만들었습니다. 만들고 나서 300명을 대상으로 테스트 했더니, 예상보다 성능이 너무 안나왔고 완성된 코드에서도 만족스럽지 않았습니다.저희 앱은 이전 회차의 매칭이 마감되고 다시 신청자들을 매칭 시키는데 2시간이라는 은행 점검시간 개념의 매칭 점검 시간을 갖습니다.팀 내에서는 점검 시간이 있기 때문에 매칭 로직이 조금 느려도 상관없다고 했지만, 저는 이것이 프로젝트의 장기적인 지속을 위해, 더 나은 방법이 있을지 항상 고민했습니다.그래서 조금 더 시간을 내어, 알고리즘의 병목 지점을 식별하고, 데이터 처리 방식을 최적화하여, 제가 할 수 있는 범위 안에서 성능을 향상시킬 ..
개요데이터베이스 시스템에서는 다수의 테이블 간 복잡한 의존성이 존재하며, 이러한 의존성은 데이터 삭제 시 정확한 순서를 요구합니다. 이 문서에서는 Spring Framework와 JPA를 활용하여 데이터베이스의 의존성을 자동으로 관리하고, 일괄적으로 데이터를 삭제하는 방법을 설명하고자합니다.문제 정의프로젝트의 데이터베이스에서 여러 엔티티 간에 복잡한 참조 관계가 존재할 경우, 단순한 순차적 삭제 작업(deleteAll())은 외래 키 제약조건으로 인해 실패한 적이 있었습니다.예를 들어, memberInfoRepository, memberRepository, memberImageRepository, boardRepository와 같이 서로 참조하는 테이블들의 데이터를 삭제할 때, 참조 순서에 맞지 않으면 ..

Spring MVC의 기능을 확장시켜 직접 JWT 검증 방식을 구현하게 된 이유와 결과에 대해 기술합니다. 확장의 이유프로젝트를 개선하고자 구조를 변경하던 중, 팀원에게 서드파티 라이브러리 사용으로 인해 코드 이해 비용이 크다는 피드백을 받았습니다.그럼 어떻게 이해비용이 큰다 말했는지 이유를 살펴보겠습니다. 1. 회원 전용 API 인지 알기 어려워요 @PostMapping("/{memberId}") public ResponseEntity blocking( @PathVariable Long memberId, @RequestBody Map roomId ) throws Exception { blockBusiness.block(..

FriendShip 애플리케이션에서 인증/인가를 어떻게 구현 했는지 방법을 서술합니다. 인증/인가의 경우 구현 방법이 많습니다. 해당 방법이 완벽이 올바른 해답이라고 생각하지 않으며, 보다 나은 방법을 제시해주면 변경하도록 하겠습니다. JWT란? JWT(Jason Web Token)는 웹 표준으로서, 정보를 안전하게 전송하기 위해 JSON 객체를 사용하는 토큰을 정의하는 역할을 합니다. 주로 클라이언트와 서버 간의 정보를 전달하거나, 사용자 인증에 사용됩니다.JWT의 구조JWT는 세 부분으로 이루어져 있습니다Header(헤더): JWT의 헤더는 두 부분으로 이루어져 있습니다. 첫 번째 부분은 토큰의 종류를 지정하는데, 여기서는 "JWT"입니다. 두 번째 부분은 해시 알고리즘(예: HMAC SHA256 또..

일반적으로 서비스가 배포 되기 위한 과정은 크게 다음과 같다.프로젝트 디렉토리에서 ./gradlew build후, .jar파일을 생성.jar 파일을 이미지화 하여 Docker Hub에 pushEC2 인스턴스에 key pair를 이용하여 EC2 인스턴스에 접근EC2 인스턴스에서 Docker Hub에 있는 이미지를 pullEC2 인스턴스에서 Docker 이미지를 컨테이너화 하여 서버를 실행git의 main 브랜치에 있는 최신 변경 사항을 서버에 반영하기 위해서는 매번 위 과정을 수행하여 배포해야 할 것이다.이 과정은 반복적이며 자동화 할 필요가 있다.배포 자동화가 필요한 이유수동 배포는 반복적이고 시간이 많이 소요되는 작업이다. 이 작업을 자동화 하면, 개발자들이 더 중요한 작업에 집중할 수 있어 생산성이 ..

DB 설정 정보jwt secret keyAWS S3 인증 키외부 API 사용을 위한 토큰 정보그 외friendship은 위와 같이 노출되면 안되는 private 한 환경변수는 github에 올리지 않습니다.배포 자동화를 위해 git을 사용합니다.앞서 배포 자동화를 문서로 다뤘습니다. → CI/CD : Github Actions를 이용한 배포 자동화friendship 서비스는 배포 자동화를 위해 git action을 사용합니다. git action은 git에 있는 내용을 그대로 빌드 파일로 만들어 배포합니다.그런데, private 한 환경변수는 git에 올리지 않습니다. 그럼, 어떻게 private 한 환경변수까지 git에서 가져와 배포 자동화에 사용할 수 있는걸까요?git의 Actions secrets ..

이번에는 애플리케이션을 실행시키기 위한 환경변수들을 담은 yml 혹은 properties를 관리하는 방법에 대해 살펴볼 예정입니다. yml 혹은 properties는 무엇일까?application.yml은 Spring legacy에서의 web.xml, root-context.xml, servlet-context.xml의 합본입니다. 즉, application.yml은 이 프로젝트에서 사용하는 설정값들을 관리하는 파일입니다.그럼 왜 해당 파일을 지켜야할까?해당 애플리케이션의 중요한 환경변수로는 Datasouce 라던지 토큰의 비밀번호라던지 다양한 값을 갖고 있습니다.이 값을 무심코 github와 같은 저장소에 노출한다면 서버가 배포되었을 때 의도치 않은 타인으로부터 공격을 받을 수 있습니다.(예시로 DB..

오류배포 자동화를 구현했는데, bulid하는데에 오류가 발생했길래 봤더니spring-rest-docs에서 오류가 발생한것을 발견했습니다.asGemPath()에 문제가 있다면서 갑자기 안되는 문제였습니다.원인gradle 버전이 안맞아서 발생하는 오류라고 합니다.버전을 낮춰보라고 하네요. 그러나, 제 경우에는 버전을 6.5로 낮춰도 같은 문제가 발생했습니다. 해결➡️ 플러그인 및 build.gradle 수정플러그인과 build.gradle의 코드 일부를 수정해서 해결 할 수 있습니다.plugins { id 'java' id 'org.springframework.boot' version '3.2.1' id 'io.spring.dependency-management' version '1.1...