본문 바로가기

백엔드 개발일지

(18)
[Spring] SpringBoot에서 AOP와 MDC를 활용한 로깅 시스템 구축하기 (feat. 민감 정보 마스킹) 1. 개요YAPP에서 진행 중인 ‘그라밋’ 프로젝트에서는 개발 및 운영 환경에서 발생하는 로그를 AWS CloudWatch에 기록하고 있습니다. 지금까지는 스케줄링 작업이나 예외 로그만 수집해왔지만, 서비스 고도화 과정에서 요청과 응답도 로깅할 필요성이 커졌습니다. @RestController@RequestMapping("/api")class ExampleController { private val log: Logger = LoggerFactory.getLogger(this::class.java) @GetMapping("/example") fun getExample(@RequestParam name: String): ResponseEntity { log.info("[Reque..
[Architecture] 그라밋 프로젝트, 클린 아키텍처 입히기 1. 개요YAPP에서 진행 중인 ‘그라밋’ 프로젝트에 클린 아키텍처를 도입하기로 결정했습니다. 이전 프로젝트 ‘삐삐’에서는 멀티 모듈 구조를 적용해 도메인 간의 의존성을 분리하면서, 특정 도메인의 변경이 다른 도메인에 영향을 주지 않도록 설계했습니다. 덕분에 유지보수성이 크게 향상되는 걸 경험했습니다.하지만 프로젝트가 커지고 기능이 추가될수록, 서비스 계층이 점점 비대해지는 문제를 겪었습니다. 모듈을 나누긴 했지만, 여전히 외부 의존성(ex. DB, Framework 등)에 깊게 묶여 있다는 점도 고민이었습니다. 이런 문제를 해결할 방법을 찾던 중, 비즈니스 로직이 특정 계층에 몰리지 않으면서도 외부 변경에 유연하게 대응할 수 있는 구조인 클린 아키텍처를 알게 되었습니다.   2. 클린 아키텍처1) 클린..
[AWS] 이미지 WebP 변환 Lambda 실행 속도 개선 일지 1. 개요최근 진행하는 그라밋 프로젝트에서 이미지 로딩 시간을 개선하기 위해 AWS Lambda를 통해 이미지를 WebP로 변환하는 작업을 했습니다.  S3 버킷에 올라가는 이미지라면 자동으로 WebP 변환이 되어 이미지 용량을 크게 개선해주어 문제가 없는 줄 알았으나... 프론트에서 WebP 변환된 이미지를 바로 불러오지 못하는 이슈가 있었습니다. 저희 서비스에서 실험자 역할의 회원이 실험 공고를 등록할 때, 이미지도 같이 업로드할 수 있는데 실험 공고 등록 완료 후, 회원이 등록한 실험 공고 상세 페이지로 바로 이동합니다. 이때, 원본 이미지를 업로드하고 이미지 변환 과정을 거치는데 변환 과정에서 시간이 걸려 회원이 공고를 등록하자마자 이동하는 공고 상세 페이지에서 이미지를 제대로 보여주지 못하는 문..
[AWS] AWS Lambda를 이용해 이미지 리사이징 & WebP 변환 이번 Yapp에서 진행하는 ‘그라밋’ 서비스는 대학원생들이 실험 공고를 올리고, 이를 피험자와 매칭해주는 플랫폼입니다. 이 서비스에서는 실험 공고에 이미지도 함께 첨부할 수 있는 기능을 제공하고 있습니다. 이미지 저장소로는 AWS S3를 사용하여 이미지 등록 및 조회 기능을 구현하고 있습니다. 하지만 이전 프로젝트를 진행하면서 알게 된 점은, 원본 이미지를 그대로 조회하면 서비스에서 이미지가 로딩되는 속도가 느려지는 문제가 발생합니다. 실제로 ‘삐삐’ 운영 중에도 이미지 조회 속도가 느리다는 피드백이 많았기 때문에, 이번 ‘그라밋’ 서비스에서도 이미지 조회 속도를 개선할 필요가 있다고 판단했습니다.  1. WebPWebP는 구글에서 개발한 이미지 포맷으로, 손실 압축과 무손실 압축을 모두 지원하는 효율적..
[Spring] FeignClient로 POST 요청 시 발생하는 Length Required(411) 에러 해결 방법 최근, Yapp에서 진행하는 프로젝트 '그라밋'에서는 Google OAuth 로그인을 제공한다. 백엔드에서 OAuth 통신 로직을 구현할 때, oauth2-client 라이브러리를 많이 사용하겠지만 개인적으로 인터페이스 기반으로 API 호출을 추상화하는 FeignClient를 선호한다. 1. 문제 상황 이번 프로젝트에서도 FeignClient를 이용해 Google OAuth 로그인 로직을 구현했는데... Length Required(411)에러가 나타났다.이전 프로젝트에서는 이런 에러를 마주친 적이 없어서 당황했는데 구글링을 해보니 디폴트로 제공되는 FeignClient에서 Content-Length 헤더가 기본으로 설정되지 않아서 `@Post` 요청을 보낼 시, 411 에러가 발생한다는 것이다. 참고:..
쉽게 알아보는 클린 아키텍처 (Clean Architecture) 지금까지의 프로젝트에서는 전통적인 MVC 패턴을 사용했다. 구조가 간단해 러닝 커브도 없고 신경 써야 할 부분이 상대적으로 적다는 장점 때문에 MVC 패턴을 선호해왔지만, 삐삐 서비스를 1년간 운영하면서 MVC 패턴의 단점을 점차 느끼고 있다. 그 중 가장 큰 문제는 기능이 추가되면서 Controller가 비대해진다는 점이다. 한 도메인에 대한 API 요청/응답 처리가 컨트롤러에 몰려 있어 코드를 파악하기 어렵고 유지보수성과 확장성이 떨어진다는 단점이 있다. 이것이 바로 MVC 패턴의 한계이다. 우리는 이러한 MVC 패턴의 한계를 인식하고, 현재 천천히 Clean Architecture로 리팩토링을 진행하고 있다. 이 글에서는 클린 아키텍처의 목적과 장점을 설명하고자 한다. 1. 아키텍처란아키텍처란 앱..
[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로 ..