본문 바로가기

백엔드 개발일지

(12)
[Spring] Redis 캐시를 통해 조회 성능 개선하기 디프만 동아리에서 진행 중인 프로젝트 Bibbi(https://github.com/depromeet/14th-team5-BE)에서는 조회 기능이 많이 사용됩니다. 특히 사용자마다 여러 번 조회하는 API들이 존재하는데 아직은 크게 문제가 없지만 사용자 수가 늘어나 매번 DB까지 도달해 읽어오게 되면 성능적인 이슈가 발생할 수 밖에 없습니다. 저는 이런 기능의 성능을 개선하기 위해 Redis 캐싱 기능을 이용하기로 했습니다. Bibbi에서는 조회는 빈번히 발생하지만 수정은 거의 발생하지 않는 값을 캐시로 적용했습니다. 1. 프로젝트 내에서 Redis 설정하기 본 내용은 Redis가 구축되어 있다는 전제 하에 진행됩니다. (Redis 구축하기) 1) RedisConfig build.gradle depende..
[NCP] NCP Cloud DB for Redis 구축하기 디프만 동아리에서 진행하는 Bibbi 프로젝트에서 백엔드 팀원끼리 각자 도입하고 싶은 기술이 있다면 도입하자라고 의견을 나눴고 저는 다양한 새로운 기술 중 Redis를 도입하기로 결정했습니다. Redis를 도입하고자 한 이유는 여러가지가 있었지만 가장 큰 이유는 역시나 조회 API 성능을 높이고자 하기 때문이었습니다. 감사하게도 NCP에서 디프만 동아리에 무료 크레딧을 후원하기 때문에 NCP에 서버 환경을 구축하고 있는데 이번 레디스 또한 NCP에서 구축하고자 합니다. 1. Cloud DB for Redis (VPC/Simple) 생성하기 NCP에서는 VPC와 Classic 두가지 환경에서 서비스를 제공합니다. Bibbi 서버는 이미 VPC에 구축되어 있기때문에 저도 무난하게 Redis 또한, VPC로 ..
[Spring] 코드 정적 분석을 위한 SonarCloud 도입기 현재 진행 중인 사이드 프로젝트 모카콩(https://github.com/mocacong/Mocacong-Backend)에는 아직 코드 정적 분석을 위한 도구가 따로 없었습니다. 사실상 MVP 기능들은 다 개발이 되었고 현재는 리팩터링 위주로 진행중인데 현재 프로젝트의 테스트 코드가 꼼꼼히 잘 작성되었는지, 코드에 취약점이 있는지 파악하고 싶어 SonarCloud를 도입하게 되었습니다. 1. SonarCloud란 코드 정적분석기로 이미 SonarQube가 유명합니다. SonarQube는 이미 널리 알려진 문제가 발생하는 코드나 일반적으로 사용되는 규칙을 통해 버그나 취약점을 파악할 수 있고 테스트 코드의 커버리지를 파악해주어 개발자가 소스코드의 품질을 유지할 수 있게 돕습니다. 하지만 SonarQube는..
[Spring/AWS] Pre-Signed Url을 이용하여 S3로 파일 업로드하기 (feat. NCP) 디프만 동아리에서 진행 중인 프로젝트 Bibbi(https://github.com/depromeet/14th-team5-BE)에서는 사용자 프로필이미지/피드 이미지를 업로드할 수 있는 수단이 필요했고 저희 프로젝트에서는 Pre-Signed Url 방식을 채택했습니다. NCP에서 지원한 크레딧으로 ObjectStorage를 생성하여 Pre-Signed Url을 구현했지만 로직은 AWS에 생성한 S3 버킷을 이용해 구현하는 방식과 같습니다. 1. Pre-Signed Url이란 1) 정의 AWS의 공식 문서에 의하면 Pre-Sigend Url(미리 서명된 URL)은 다른 사람이 AWS 보안 자격 증명이나 권한이 없어도 Amazon S3 버킷에 객체를 업로드하도록 허용할 수 있도록 하는 URL입니다. 즉 S3의..
[Spring] Redis를 통한 Refresh Token 도입기 (2) 본 글에서는 기본적인 Redis 설정이 되어있다는 전제 하에 코드 위주로 설명합니다. 전체적인 리프레시 토큰 로직에 대해 참고하고 싶다면 이전 글을 확인해주세요. 자세한 코드는 https://github.com/mocacong/Mocacong-Backend/pull/131 에서 확인할 수 있습니다. 1. Token 객체 @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class Token { @Id private Long id; private String refreshToken; private String accessToken; @TimeToLive(unit = TimeUnit.MILLISECONDS) // 디폴트는 TimeUnit.SECO..
[Spring] Redis를 통한 Refresh Token 도입기 (1) 현재 진행 중인 사이드 프로젝트 모카콩(https://github.com/mocacong/Mocacong-Backend)에서는 기존엔 Access Token 하나만 가지고 로그인 처리를 진행했었습니다. 그러나 유효시간이 짧은 Access Token 특성 상, 빈번하게 로그인 요청을 수행해야 했으며 이는 불편함을 초래하였습니다. 이에 따라 보안적인 측면을 고려하며 로그인 유효시간을 늘릴 수 있는 Refresh Token을 도입하기로 결정했습니다. 1. Refresh Token의 필요성 일반적으로 서비스에서 회원 인증을 위해 많이 사용되는 JWT(Json Web Token) 방식을 모카콩 프로젝트에서도 도입했습니다. 하지만 사용자 인증을 위한 Access Token의 유효시간은 약 30분으로 설정되어 있었습..
[Spring] Code Coverage 측정을 위한 JaCoCo 적용하기 1. JaCoCo란 JaCoCo는 Java code coverage를 측정하는 오픈소스 라이브러리입니다. JaCoCo는 Line, Branch Coverage를 제공하며 테스트를 실행한 후, 결과를 html/csv/xml 파일을 통해 보기 좋게 시각화를 해줍니다. Code Coverage 소프트웨어의 테스트를 논할 때 얼마나 테스트가 충분한가를 나타내는 지표 2. JaCoCo 적용하기 * 해당 포스트에 대한 코드 내용은 여기서 확인할 수 있습니다. (https://github.com/depromeet/14th-team5-BE/pull/7) 개발 환경: SpringBoot 3.1.5, Java 17, Gradle server: 루트 프로젝트 ├── config: 프로젝트 설정 관리 │ ├── build │..
[Spring] 멀티 모듈 프로젝트 도입하기 1. 단일 모듈 프로젝트의 문제점 장기 프로젝트의 경우, 시간이 지날수록 기능이 추가되고 무거워집니다. 그러면서 하나로 운영하던 서비스가 클라이언트 서비스와 운영 시스템으로 나뉘는 등의 분리가 일어나는데 여기서 각각의 프로그램에 있는 도메인의 동일성이 깨질수 있다는 문제점이 생깁니다. 예를 들어 하나로 운영하던 프로젝트에서 클라이언트 api와 운영 api 두가지로 나뉘었을 때, 회원에 대한 도메인은 각각의 프로젝트에서 동일해야 합니다. 하지만 두 개의 프로젝트는 별개로 관리가 되고 어느 한 쪽에서 도메인을 수정하면 다른 쪽에서도 도메인을 수정해야 합니다. 이 과정에서 어느 한 쪽에서 수정이 되지 않으면 도메인이 달라지는 경우가 생길 수 있으며 결국 프로젝트가 개발자에 대한 의존성이 높아지게 됩니다. 2...