전체 글
[SpringBoot] 스크롤 API (Offset vs Keyset-Filtering)
실무에서는 대량의 데이터를 조회한 뒤 수정하는 일이 종종 발생합니다. 예를 들어, 브랜드명이 매일우유에서 매일유업으로 바뀐다면 판매상품 내 brandName 필드값이 매일우유인 엔티티를 모두 찾아 브랜드명을 매일유업으로 바꿔주어야 합니다. 이때 변경해야할 엔티티가 수만건이라면 페이징 처리를 안할 시 Out-of-Memory가 발생할 수 있습니다. 따라서, 우리가 흔히 부르는 스크롤 방식으로 100건씩 끊어서 조회한 뒤 update를 하는 방법을 취하게 됩니다. SpringBoot 3.1 버전부터는 스크롤 API를 공식적으로 지원합니다. Spring Data JPA 3.1 버전을 추가함으로써 우리는 스크롤 방식의 페이징 처리를 간단하게 구현할 수 있습니다. 이번 글에서는 Offset 방식과 Keyset-F..
온디맨드 리사이징 구현기(feat. CloudFront, Lambda@Edge)
상황 데이원 프로젝트는 매일 운동 인증샷을 남기고 캘린더로 확인할 수 있는 애플리케이션입니다. 이때 사용자가 원본이미지를 업로드하면, 캘린더에서 보여줄 썸네일 이미지(39px*39px)와 개별 이미지(390px*390px) 이미지가 필요했습니다. 처음에는 단순히 원본, 썸네일, 개별 이미지를 모두 S3 버킷에 저장하려고 했습니다. 그러나 만약 이미지 정책이 바뀌어 썸네일 이미지가 39px*39px이 아닌 50px*50px로 바뀐다면, S3 버킷에 저장된 썸네일 이미지는 모두 바뀐 정책에 따라 마이그레이션해야 합니다. 이미지 정책은 언제든 변할 수 있기에 우리는 업로드 시 필요한 이미지를 모두 저장하는 것이 아닌, 사용자 요청이 들어올 때마다 리사이징해서 내려주는 방법을 선택했습니다. 사용자 요청이 들어올..
[SpringBoot] Logback 파일과 Docker 볼륨 연동하기
스프링부트 서버를 띄울 때 로컬에선 콘솔로 에러 로그를 확인하면 되지만, 원격 EC2에 서버를 띄우면 에러 로그 확인이 어려워집니다. 장애 대응 시 에러 로그를 바로 확인하는 것이 중요하기에, 이번 글에서는 에러 로그를 어떻게 하면 바로 확인할 수 있는지 알아보고자 합니다. 모든 설명은 EC2에 도커 컨테이너 기반으로 서버를 띄우고, 로깅 프레임워크로 Logback을 사용한다는 가정하에 진행하겠습니다. Logback 적용 전 아직 Logback을 적용하지 않았다면 스프링부트 서버의 로그는 파일 형태가 아닌 표준 출력을 따를 것입니다. 따라서 docker logs 명령어를 통해 로그를 확인할 수 있습니다. docker logs 명령어는 컨테이너 내부에서 출력을 보여주는 명령어입니다. docker logs ..
[PostgreSQL] json, jsonb 타입과 연산자
데이터베이스 테이블 내 하나의 컬럼에 JSON 데이터를 저장하는 경우가 있습니다. 보통 외부에서 제공된 데이터를 별도의 처리 없이 그대로 저장할 때 JSON 타입으로 저장하게 됩니다. PostgreSQL은 JSON 데이터를 저장하기 위한 2가지 타입인 json과 jsonb 타입을 제공합니다. 1. json vs jsonb 타입 그렇다면 json과 jsonb 타입의 차이점은 무엇일까요? json 타입은 입력된 텍스트 원본을 저장하고, jsonb 타입은 decopmose된 바이너리 형식으로 저장한다는 차이가 있습니다. json 타입은 입력된 텍스트에 대한 정확한 복사본을 저장하기 때문에, 처리할 때마다 매번 파싱을 다시 해야만 합니다. jsonb 타입에 비해 처리 속도가 느리나, 원본 그대로를 저장할 수 있..
💻2023년 회고록
입사 1년차 작년 말 개발자로 취업한 후로 곧 만 1년이 다 되어간다. 남들이 보기엔 1년을 채운다는 게 큰 의미가 아닐 수 있으나, 나는 꼭 1년을 채우고 싶었다. 열심히 공부해 놓고 1년도 안 돼 그만뒀다는 이야기를 듣고 싶지 않았기 때문이다. 정성환, “23만 코딩 수강생은 다 어디로 갔나”, 한겨레, 2023. 4. 18, https://h21.hani.co.kr/arti/society/society/53606.html 23만 코딩 수강생은 어디로 갔나 undefined h21.hani.co.kr 4월쯤 한 기사를 봤다. 20~21년도 개발자 광풍 이후 그 많은 코딩 수강생이 지금은 어떻게 되었는지 취재한 기사였다. 기사에는 지난 2년간 늘어난 개발자 중 비전공자의 비율은 3%라고 나와 있었다. ..
코틀린 Backing Field와 Backing Properties
"TDD, 클린 코드 with Kotlin 7기" 블랙잭 미션을 진행하다가 MutableList를 사용한 프로퍼티에서 backing-properties를 사용해 보라는 피드백을 받았다. 이번 기회에 코틀린에서 생소했던 개념인 Backing fields, Backing properties에 대해 알아보려고 한다. field vs property 필드와 프로퍼티의 차이점은 무엇일까? 공식 문서에 따르면 필드란 프로퍼티의 일부로서 단지 메모리에 값을 저장하기 위한 용도로만 사용하는 것을 말한다. In Kotlin, a field is only used as a part of a property to hold its value in memory. 자바에선 상태를 저장하기 위한 기본 개념이 필드이지만, 코틀린에서..
Transactional Outbox 패턴을 이용한 메시지 발행의 신뢰성 보장
부제: 메시지 발행의 신뢰성을 보장하기 위해선 어떻게 해야할까? Transactional Outbox 패턴이란 비즈니스 엔터티를 업데이트하는 행위와 메시지를 발행하는 행위 사이에 메시지를 저장하는 로직을 추가한 방법입니다. Transactional Outbox 패턴을 구현하는 방법은 다음과 같습니다. 메시지를 저장하는 Outbox 테이블을 만든다. 비즈니스 엔터티를 업데이트하는 로직과 메시지를 저장하는 로직을 하나의 트랜잭션으로 묶는다. Outbox 테이블을 풀링하는 별도의 프로세스를 통해 메시지를 발행한다. Transactional Outbox 패턴을 통해 트랜잭션이 커밋될 때만 메시지를 전송하도록 보장할 수 있습니다. 또한. 메시지를 발행하는 로직을 트랜잭션에서 완전히 분리하여 외부 메시지 브로커에 ..
글또 8기를 마치며
약 6개월 간의 글또도 이제 막바지이다. 처음 글또를 시작했던 마음과는 다르게 돌아보니 글을 많이 쓰지는 못했다. 글또를 하면서 어떤 점이 좋았고, 어떤 점이 부족했는지 글로 적어보려 한다. 좋았던 점 배운 지식을 글로 남긴다는 점 이번 1월에 신입 백엔드 개발자로 커리어를 시작했다. 레디스, 카프카를 포함해 쿠버네티스까지 많은 양의 지식을 지난 6개월 동안 학습했다. 작년에는 오롯이 학습에만 집중할 수 있었지만, 올해는 일과 학습을 병행하면서 지식을 내것으로 만드는 것이 얼마나 중요한지 새삼 깨달았다. 특히 개인적인 호기심으로 시작했던 쿠버네티스는 단지 빠르게 학습하는 것에 초점을 맞춰서 온전히 내 것으로 만들지 못했던 것 같다. 많은 양의 인풋 때문에 일종의 주화입마에 빠졌던 것 때문인지는 몰라도, ..