Latest

S3 업로드 비동기 처리✊ : 반환이 있는 @Async를 사용할 때 주의할 것들....

이 글은 Secondhand 프로젝트를 하며 트러블 슈팅하고 학습한 내용을 정리한 글입니다. 시작하며 Secondhand에 글을 작성할 때는 최대 10장의 이미지를 업로드할 수 있습니다. 이 기능을 구현하고 나서 가장 마음에 걸렸던 부분이 있는데요, 바로 이 10장의 이미지가 하나의 스레드에서 동기적으로 처리된다는 것입니다. 꽤 고화질인 이미지를 10장 한번에 처리를 하면 3초정도 소요되기도 합니다
saehim lee

🔐 비밀번호 암호화해보자 (Feat: Spring)

해당 글에서 구현 언급한 코드는 practice-member-api 에서 확인 가능합니다. 시작하며 초반 연습용 프로젝트에서 회원가입을 구현하며 그냥 일반 텍스트로 회원 비밀번호를 관리해왔습니다. 하지만 보안상 비밀번호를 이렇게 평문으로 저장하는 일은 반드시 지양되어야 합니다. 마침 회원가입과 Jwt 토큰을 사용하는 인증/인가는 매우 자주 쓰는 로직이라 나만의 라이브러리를 만들고 싶었는데요. 원티드 프리온보딩 백엔드 사전
saehim lee

안 읽은 채팅 구현기 💥

이 글은 당근마켓을 모티브로 한 프로젝트 Secondhand 구현시 이슈 사항을 정리한 글입니다. 들어가며 Secondhand 프로젝트를 진행할 때 가장 마지막에 구현했던 기능인 ‘아직 안 읽은 채팅’에 대해 백엔드 개발자 2명이 한 고민과 구현 과정을 정리해보았습니다. 채팅 시스템은 처음 이 프로젝트를 시작할 당시에 BE는 물론 FE, iOS에게도 굉장히 큰 과제였습니다. 유저간
saehim lee

PostgreSQL에서 Full text search 사용하고 싶다면 : pg_bigm 모듈 사용하기

연관글 MySQL 검색 기능 개선하기 : Full-text search 들어가며 최근 영상에 데이터 라벨링을 하기 위한 REST API와 WAS를 구축하고 있습니다. 이전에 여러번 진행했던 토이 프로젝트들과는 다르게 서비스를 구축하다보니 기술 스택 설정부터 모호한 서비스 요구사항 등등.. 이런저런 새로운 도전들을 하게되었습니다. 가장 새로운 도전 중 하나는 그동안 제 2의 고향과 같았던 🥹 MySQL을 떠나
saehim lee

API 성능개선 : Redis Cache를 적용하여 Read API 기능을 개선해보자

이 글은 당근마켓을 모티브로 한 프로젝트 Secondhand 구현시 이슈 사항을 정리한 글입니다. 사실 처음 시작은 조회수 구현을 어떻게 효율적으로 할 수 있을까에서 출발하였습니다. [조회수 관련해서 참고한 블로그 글] 세션별로 중복되지 않게 일정 시간동안 1회씩 카운팅하고 싶은 욕심이었습니다. 그런데 학습을 하다보니 레디스 Cache를 읽기 API에서도 사용해보고 싶더라고요🔥 API 성능을 개선해본 뒤
saehim lee

API 성능개선 : 페이지네이션 cursor 방식으로 개선해보자

이 글은 당근마켓을 모티브로 한 프로젝트 Secondhand 구현시 이슈 사항을 정리한 글입니다. API 기본 기능을 모두 구현하고 본격적으로 쿼리 튜닝과 성능 개선을 하기 위해 쿼리를 분석하고 개선해보도록 하겠습니다. * M1 16GB 메모리 환경에서 테스트되었습니다. 200만건의 데이터를 넣어보자 Dummy data를 넣는 다양한 방식이 있습니다. 하지만 저는 item 테이블을 vertical partitioning 한 상태여서
saehim lee

Spring Event를 사용하여 도메인 의존성 낮추기

이 글은 당근마켓을 모티브로 한 프로젝트 Secondhand 구현시 이슈 사항을 정리한 글입니다. 발단 Secondhand 에는 실시간 채팅 어플리케이션이 있습니다. 웹소켓 통신을 기반으로 하며 STOMP와 Redis pub/sub 으로 구현하였는데요. 이 채팅에 대한 요구사항 중에 다른 도메인의 서비스를 참조하는 경우가 많아져 Facade가 비대해지고 각 도메인의 서비스 로직이 복잡하게 구성이 되며 의존성이
saehim lee

해시테이블(Hash Table) 자바코드로 구현하기

해시테이블이란? HashMap이라고도 알려진 해시 테이블(HashTable)은 키(Key)를 값(Value)로 매핑하는 추상 데이터 유형입니다. 내부적으로 연관 배열(associative array)나 딕셔너리(dictionary)을 사용하여 데이터를 저장합니다. 각 키Key에 해시 함수를 사용하여 해시코드라고도 하는 인덱스(index)를 생성하고 이 index 위치에 값(Value)가 저장됩니다. colors = { "Red" : "#FF0000"
saehim lee

MySQL 검색 기능 개선하기 : Full-text search

이 글은 당근마켓을 모티브로 한 프로젝트 Secondhand 구현시 이슈 사항을 정리한 글입니다. 발단 : 왜 이것이 필요했나? Secondhand는 동네를 검색할 수 있는 기능이 있습니다. 예를 들어 이런거요. [이미지 출처 : https://kikimong.com/7179] 먼저 데이터는 이런식으로 들어가 있습니다. 법정동 코드를 pk 로 하였습니다. 행정동 코드보다 법정동 코드를 선택한 이유는 변동이 더
saehim lee

2022년 회고 (3) 백엔드 개발자가 되겠어 ✊

난생처음 CS스터디 우아한테크코스 프리코스 3기, 코드스쿼드 프리코스 후기 * 케케묵은 지난글 👇 * 2022년 회고 (1) 커뮤니티 기획자가 개발자를 꿈꾸게된 이야기 * 2022년 회고 (2) 풀스택 국비교육 수강기 아직도 2022년 이라니 질릴만도 합니다만... 살면서 가장 바빴던 시기이자 가장 열정적인 시기를 보내고 있는만큼 좀 더 잘 기록하고 싶은 욕심에 글이 길어지고 있습니다. 1년을 3년처럼 살았으니
saehim lee

2022년 회고 (2) 풀스택 국비교육 수강기

* 케케묵은 지난글 👇 * 2023.02.01 - [💬/회고] - 2022년 회고 (1) 커뮤니티 기획자가 개발자를 꿈꾸게된 이야기 국비 교육 과정을 듣기로 한다. 2022년 6월~10월 : 국비교육 수강 사실 지금 생각해보면 한없이 가벼운 선택이었다. 어차피 1년정도 쉬기로 한거, 돈도 더 들지 않겠다 주말에는 지인의 카페에서 계속 알바를 하고 평일에는 9시부터 6시까지 풀스택
saehim lee

2022년 회고 (1) 커뮤니티 기획자가 개발자를 꿈꾸게된 이야기

개요 엄청 늦었지만 2022년 회고. 1편은 사회과학계열 전공 기획자가 개발자로 이직을 결심한 이야기. 주의, 철저히 나의 얘기 기록하는 거라 딱히 도움은 안될 것 같습니다.. 굳이 따지자면 정보 10, 사담 90의 글이 될 예정입니다. 기획자의 기쁨과 슬픔 2022년 이전 : 커뮤니티 기획자로서의 일! 2022년 1~2월 : 퇴사 여행, 사람만나기 직업을 묻는 질문을
saehim lee