본문 바로가기

전체 글

(36)
[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 변환된 이미지를 바로 불러오지 못하는 이슈가 있었습니다. 저희 서비스에서 실험자 역할의 회원이 실험 공고를 등록할 때, 이미지도 같이 업로드할 수 있는데 실험 공고 등록 완료 후, 회원이 등록한 실험 공고 상세 페이지로 바로 이동합니다. 이때, 원본 이미지를 업로드하고 이미지 변환 과정을 거치는데 변환 과정에서 시간이 걸려 회원이 공고를 등록하자마자 이동하는 공고 상세 페이지에서 이미지를 제대로 보여주지 못하는 문..
[RealMySQL 8.0] 8. 인덱스 - 기타 인덱스 (멀티 밸류 인덱스, 클러스터링 인덱스, 유니크 인덱스, 외래키) 8.7 멀티 밸류 인덱스전문 검색 인덱스를 제외한 모든 인덱스는 레코드 1건이 1개의 인덱스 키 값을 가진다. 즉, 인덱스 키와 데이터 레코드는 1:1의 관계를 가진다. 하지만 멀티 밸류 인덱스는 하나의 데이터 레코드가 여러 개의 키 값을 가질 수 있는 형태의 인덱스다. 최근 RDBMS들이 JSON 데이터 타입을 지원하기 시작하면서 JSON의 배열 타입의 필드에 저장된 원소들에 대한 인덱스 요건이 발생한 것이다.  다음과 같이 신용 정보 점수를 JSON 타입 칼럼에 저장하는 테이블을 가정해보자.mysql> CREATE TABLE user ( user_id BIGINT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(10), last_name ..
[RealMySQL 8.0] 8. 인덱스 - B-Tree 인덱스 8.3 B-Tree 인덱스B-Tree는 데이터베이스의 인덱싱 알고리즘 가운데 가장 일반적으로 사용되고, 가장 먼저 도입된 알고리즘이다. 하지만 아직도 가장 범용적인 목적으로 사용되는 인덱스 알고리즘이다. B-Tree에는 여러 가지 변형된 형태의 알고리즘이 있는데, DBMS에서는 주로 B+-Tree 또는 B*-Tree가 사용된다. Balanced를 의미하는 B-Tree는 칼럼의 원래 값을 변형시키지 않고 (물론 값의 앞부분만 잘라서 관리하기는 하지만) 인덱스 구조체 내에서는 항상 정렬된 상태로 유지한다. 전문 검색과 같은 특수한 요건이 아닌 경우, 대부분 인덱스는 거의 B-Tree를 사용할 정도로 일반적인 용도에 적합한 알고리즘이다.  8.3.1 구조 및 특성B-Tree는 트리 구조의 최상위에 하나의 "루..
[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 에러가 발생한다는 것이다. 참고:..
[YAPP] YAPP 25기 Server 지원/합격 후기 1. YAPP에 지원한 이유YAPP은 기업형 IT 연합동아리로 14년 동안 운영되고 있는 동아리이다. 다른 분야에 있다가 컴공으로 온 케이스라 개발 동아리는 잘 모르고 있었는데 나중에 얘기 들어보니 꽤 유명한 동아리인 거 같다. 이전에 디프만이라는 동아리에서 서버 직군으로 참여하며 많은 성장을 이뤘다고 생각했다. 디프만 14기를 마친 뒤, 이전 프로젝트들을 돌아보니 그 당시에는 개발적으로 새로운 시도를 많이 하지 못했던 게 아쉬웠다. 마침 새로운 프로젝트를 하고, 새로운 사람들을 만나고 싶던 시기에 YAPP 모집을 알게 되어 지원하게 되었다. 다른 동아리와의 큰 차별점을 찾자면 PM 직군이 존재하다는 점인 거 같다. 지금까지는 협업을 디자이너/프론트 직군과 함께 해왔는데 PM 직군과 함께 협업을 하면 비..