TE__HO

  • 강렬한 이미지 뒤에 숨겨진 스윗한(?) 책 "죽음의 스프링 배치 6" 후기

    "스케줄러랑 스프링 배치랑 도대체 뭐가 다른 거지?"개발 공부를 하면서, 취준생일 때 실무를 하면서도 그냥 스케줄러에서 @Scheduled 하나 붙이고 로직 직접 짜서 돌리면 되는 거 아닌가? 굳이 배치를 따로 배워야 하나 싶었다.결론부터 말하자면 스케쥴러는 스프링 배치를 실행시키는 트리거 중 하나일 뿐이었고, 아예 다른 개념이었다.강렬한(?) 표지에 살짝 겁먹었지만일단 제목부터 범상치 않다. "죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다."표지도 그렇고 이전에 인프런에서 강의를 봤을 때도, 처음엔 "이게 뭐지" 싶었다 ㅋㅋ 근데 막상 책을 펼쳐보니 정반대였다. 표지의 살벌함과는 다르게, 안에 든 설명은 너무나 친절하고 물 흐르듯 자연스러웠다. (킬구형이 너무 친절하고 뛰어난 ..

  • 감히 적어보는 대 AI 시대 9개월차 주니어 개발자의 생각

    감히 적어보는 대 AI 시대 9개월차 주니어 개발자의 생각

    2026년 5월 지금은 누가 뭐래도 혼돈의 대 AI 시대이다. 하루마다 아니 분 단위로 AI 활용법, 경험담이 올라오고 심지어 Anthropic, Open AI의 새로운 기능들도 거의 주마다 업데이트가 되는 것 같다. 이 험난한 시기에 앞으로의 방향성을 잡아가기 위해 많은 생각을 하고 있다. 그러다 문뜩 나 같은 갓 태어난 주니어의 글은 본 적이 없는 것 같아서 써보고 싶기도 했고, 지금의 내 생각을 기록하고 나중에 돌아보고싶어서 감히 글을 써보기로 마음을 먹었다(이 속도면 몇 주만 지나도 생각이 바뀔 것 같기도 하다..)P.S) 회사, 업종 등등 다양한 변수가 있기 때문에 정답이라고 주장하는 것이 아닌,방구석 주니어의 개인적인 의견입니다 :]주니어의 분석취업을 준비하고 1인 백엔드 개발자로 일하고 있는..

  • 전략 패턴 사용하여 푸시 알림 시스템 구축하기 (Feat. ZSET, 가변 polling, BLPOP)

    전략 패턴 사용하여 푸시 알림 시스템 구축하기 (Feat. ZSET, 가변 polling, BLPOP)

    앱 푸시 시스템 구축하기우리 플랫폼에 앱 푸시 기능을 처음 도입하게 됐다. 0부터 만드는 거라 자유도는 높았지만, 막상 요구사항을 받아보니 머리가 살짝 아팠다.(자유도가 높다는 건 잘 만들어야 한다는 압박이기도 하다는 걸 그때 알았다..)장바구니 리마인더, 포인트 적립, 강사 배정 알림, 체험단 모집 마감.. 캠페인 종류만 40개가 넘었고 각각 발송 조건도, 발송 시점도, 템플릿도 다 달랐다. 즉시 보내기, 이벤트 발생 후 3시간 뒤, 다음날 20시 고정 등등,,, 각 캠페인마다 발송 조건이 다르고, 수신 대상, 발송 시점도 다르다. 거기다 발송 직전에 한 번 더 검증해야 하는 것도 있다. 예약하고 시간이 흐르는 동안 장바구니 아이템이 삭제됐을 수도 있으니까.if/else로 꾸덕꾸덕처음엔 그냥 익숙하게 ..

  • Dev 환경 DB의 Too many connections 문제 해결하기 (Feat. DB 계정 분리의 필요성)

    Dev 환경 DB의 Too many connections 문제 해결하기 (Feat. DB 계정 분리의 필요성)

    사건 발생역시나 평화롭게 출근해서 업무를 보던 중 개발용 DB에서 데이터를 확인하기 위해 Datagrip에서 테이블을 조회를 했는데 생각하지도 못한 상황이 발생했다.(사실 대부분의 문제는 예상 범위 밖의 상황에서 발생하긴 했지만..)사용자가 폭주할 타이밍은 절대 아니었고 애초에 개발용 환경이었기 때문에 트래픽이 원인일 가능성은 0에 수렴한다고 판단했다. 우선 나의 로컬에서 Docker 컨테이너에 올라가 있던 Spring 서버를 중단시킨 후에 SHOW PROCESSLIST 명령어를 사용해 현재 connections을 확인했다.해당 결과를 처음 봤을 때 원인을 특정할 수 없어서 현재 발생하는 증상을 정리하고 그동안 어렴풋 알고 있었던 DB Connections에 대해 간단하고 빠르게 학습을 진행하였다.현재 ..

  • [회고록] GoodBye 2025~!

    [회고록] GoodBye 2025~!

    2년 만의 회고역시나 이번에도 다사다난했던 2025를 마무리하고 새로운 한 해를 시작하기 앞서 작년의 나를 되돌아보려 한다.사실 2년 전에 개발자들이 많이 하는 것 같아서, 멋있어 보여서 회고록을 처음 작성해 보았고 지금도 여전히 같은 생각을 하고 있지만 더불어 스스로 작년을 되돌아보며 혼낼 것은 혼내고, 잘하고 있다고 스스로 위로도 하며 더 강해져 있을 내년의 나를 생각하며 계획도 차분히 정리할 수 있어서 나만의 루틴으로 계속 이어가 보려 한다.2024년 회고록을 의도치 않게 쓰지 못했는데 이유가 조금 웃기기도 하고 슬프기도 하다. 대학교 4학년 2학기, 24년 9월부터 취업 준비를 시작하면서 시작이 나름 좋았기 때문에 "금방 취업하겠는데? 입사하고 멋있게 회고까지 써야지~" 라는 겁 없는(?) 다짐을..

  • 운영중인 서비스 DB Table에 새로운 컬럼 추가하기 (feat. 무중단 서비스  테이블 컬럼 추가)

    운영중인 서비스 DB Table에 새로운 컬럼 추가하기 (feat. 무중단 서비스 테이블 컬럼 추가)

    글을 쓰기 앞서 스타트업에 취업을 하게 되었다. 🎉 자세한 내용은 연말에 회고록에서 회포를 풀어보려 한다. O2O 체험학습 이커머스의 백엔드 개발자(신입이자.. 유일한 담당자..)로서 해결하고 겪을 일을 이 카테고리에서 정리하려 한다.컬럼 추가 별거 없지 ㅋㅋ약 5만 개의 데이터가 있는 기존 테이블에 새로운 컬럼을 추가가 필요했다. 신나게 재택 근무를 하고 있던 3주 차 주니어 개발자인 나는 고민 없이 간단한 쿼리를 날렸다.ALTER TABLE 테이블 이름 ADD COLUMN 컬럼명,,,;그런데 쿼리 실행이 5초가 넘어가길래 갑자기든 불안감에 확인해보니 플랫폼이 멈춰 있어서 급하게 쿼리를 중단시켰다. (신입인데 유일한 백엔드 담당자가 되면서 내가 누른 엔터 한 번에 불러올 파급력이 너무 무서워서 수시로..

  • CQRS와 함께한 고군분투(Feat. 개발자스럽게(?) 생각하려 노력하기)

    CQRS와 함께한 고군분투(Feat. 개발자스럽게(?) 생각하려 노력하기)

    2025.07.02 - [My project/High Traffic Lab] - MySQL Index 사용 시, 쓰기 성능이 정말 저하되나?? (Feat. CSV로 빠르게 데이터 넣기) MySQL Index 사용 시, 쓰기 성능이 정말 저하되나?? (Feat. CSV로 빠르게 데이터 넣기)2025.03.19 - [My project/High Traffic Lab] - 6000만개 데이터 갖고 조회하며 충격받기 6000만개 데이터 갖고 조회하며 충격받기데이터. 몇개까지 INSERT 해봤나요? (Feat. 대용량 데이터, 데이터 6000만개 INSERT 해te-ho.tistory.com지금까지 실무에서 발생할 수 있는 상황을 가정하고(많은 데이터와 트래픽) 성능을 순차적으로 개선해 왔고 이전 글에서 Inde..

  • MySQL Index 사용 시, 쓰기 성능이 정말 저하되나?? (Feat. CSV로 빠르게 데이터 넣기)

    MySQL Index 사용 시, 쓰기 성능이 정말 저하되나?? (Feat. CSV로 빠르게 데이터 넣기)

    2025.03.19 - [My project/High Traffic Lab] - 6000만개 데이터 갖고 조회하며 충격받기 6000만개 데이터 갖고 조회하며 충격받기데이터. 몇개까지 INSERT 해봤나요? (Feat. 대용량 데이터, 데이터 6000만개 INSERT 해보기, Bulk INSERT, Mul대규모 트래픽, 대용량 데이터 처리에 대한 경험을 쌓기 위해 진행한 개인 프로젝트의 시작은 우te-ho.tistory.com지난 글에서 대량의 데이터를 갖고 조회를 하는 경우 조회가 현저히 느려지는 것을 경험하고 Index를 사용해서 속도를 개선했다. 이 프로젝트의 최종 모델은 CQRS를 적용했다. 이유는 많은 트래픽, 데이터가 발생하고 존재하는 상황을 가정했기 때문에 어느 시점부터는 Index가 있을 경..

  • 6000만개 데이터 갖고 조회하며 충격받기

    6000만개 데이터 갖고 조회하며 충격받기

    데이터. 몇개까지 INSERT 해봤나요? (Feat. 대용량 데이터, 데이터 6000만개 INSERT 해보기, Bulk INSERT, Mul대규모 트래픽, 대용량 데이터 처리에 대한 경험을 쌓기 위해 진행한 개인 프로젝트의 시작은 우선 많은 데이터를 생성하는 것이었다. 시작부터 고민이 많았는데 "몇 개부터가 대용량이지?", "이te-ho.tistory.com저번 글에서 6000만개의 데이터를 INSERT 했으니 이번에는 이를 활용해서 조회를 해보자! 이 과정에서 깨달은 점이 많았다. 이래서 실무에서 많은 데이터/트래픽을 처리한 경험을 요구하는구나... 지금까지 내가 했던 것은 천국에서 모든 것이 가능한 환경에서 개발을 했던 것이었구나 싶었다..! 무슨 일이 있었는지 한번 되돌아보려 한다.ERD 간략도Us..

  • 데이터. 몇개까지 INSERT 해봤나요? (Feat. 대용량 데이터, 데이터 6000만개 INSERT 해보기, Bulk INSERT, Multi-Value Insert)

    데이터. 몇개까지 INSERT 해봤나요? (Feat. 대용량 데이터, 데이터 6000만개 INSERT 해보기, Bulk INSERT, Multi-Value Insert)

    대규모 트래픽, 대용량 데이터 처리에 대한 경험을 쌓기 위해 진행한 개인 프로젝트의 시작은 우선 많은 데이터를 생성하는 것이었다. 시작부터 고민이 많았는데 "몇 개부터가 대용량이지?", "이전 프로젝트에서 약 1000개의 데이터를 다뤘는데 이것도 많은 거 아닌가??" 이에 대해 조언을 구하고 많은 고민을 통해 결론을 다음과 같이 정하고 계획을 세웠다.(해당 글은 기술에 대한 자세한 설명보다 해결 과정에 대한 서술에 집중되어 있습니다!)현재 시스템 구조에서 처리가 버거우면(?) 대용량 데이터다.데이터의 양을 점차 증가시켜 조회 성능을 비교해 가며 적절한 양을 찾는다.이를 토대로 6개의 테이블을 만들고 하나의 테이블 당 1000개부터 시작해서 1000만 개로 크기를 늘려가며 데이터를 INSERT 해보았다. ..

  • 주니어 개발자가 대규모 트래픽, 대용량 데이터 경험하는 방법(Feat. 뇌피셜)

    주니어 개발자가 대규모 트래픽, 대용량 데이터 경험하는 방법(Feat. 뇌피셜)

    이 블로그 카테고리에서는 개인 프로젝트에 대한 글을 남길 것이고 그전에 진행한 이유와 과정들을 우선 서술해보려 합니다.저와 비슷한 상황의 대학생, 주니어, 신입, 취준생 백엔드 개발자분들에게 조금의 도움이라도 될까 싶어 적는 개인적/주관적인 생각이 많이 담긴 글입니다.우선 이 해결 방법으로 취업에 성공한 것은 아니고 반영하여 얼마 전에 이력서, 포폴을 마무리하여 지원을 하고 있는 중이지만프로젝트 진행 전, 중, 후 계속하여 나름 이름 있는 회사의 개발자분들께 직접 커피챗을 요청해 피드백을 받으며 진행하였기 때문에 조금은 도움 되는 부분이 있을 것이라 생각합니다! :]지금까지 프로젝트를 진행하면서 문제를 찾아 해결하고 왜? 문제가 발생했고, 왜? 이 방법으로 해결했는지를 기록하며 취업을 준비했다. 하지만 ..

  • Slack으로 서버 로그 모니터링하기 (Feat. Spring AOP, Logback)

    Slack으로 서버 로그 모니터링하기 (Feat. Spring AOP, Logback)

    프로젝트를 진행하면서 로그는 정말 중요한 요소라는 것을 깨닫고 있다. 예상치 못한 request 형태가 오거나, 서버 내부적으로 오류가 발생하면 로그를 읽고 해결을 계속하고 있기 때문이다. 하지만 ssh로 Ec2에 직접 접속해 로그 파일을 확인하는 것은 여러 불편함이 있어 이를 해결하기 위해 모니터링 툴을 만들어보기로 했다! 과정부터 결과까지 시간의 흐름 순으로 출발~기존 로그의 문제점사진 자체만으로도 문제이다. 일단 ui가 불편하고 음... 그냥 불편하다. 다른 문제점을 정리해 보자면 아래와 같다.에러 로그가 발생해도 실시간으로 확인할 수가 없다. -> 지금은 운영 전 개발용이어서 괜찮지만 실제 운영을 하게 된다면 에러가 발생하면 즉시 해결해야 하는데 위의 사진을 계속 켜놓고 확인하고 있지 않는 이상 ..

  • 이미지 조회 속도 개선 (Feat. CDN, AWS CloudFront, S3만 사용하다가 cloudfront 적용하려면?)

    이미지 조회 속도 개선 (Feat. CDN, AWS CloudFront, S3만 사용하다가 cloudfront 적용하려면?)

    유저 테스트를 끝내고 정식 출시 전에 서버 최적화 및 성능 개선을 하고 있다. 더 할 수 있는 게 뭐가 있을까 생각하던 중 문득 얼마 전에 "가상 면접사례로 배우는 대규모 시스템 설계 기초" 에서 읽은 CDN이 생각나서 사용해 보기로 했다. 마침 우리 어플에서 사진이 늦게 업로드되는 상황이 있어서 아주 적절한 해결책이라 생각했다.CDNCDN은 Content Delivery Network의 약자이며 위에 언급한 책에서 "정적 콘텐츠를 전송하는 데 쓰이는, 지리적으로 분산된 서버의 네트워크이다. 이미지, 비디오, CSS, JavaScript 파일 등을 캐시할 수 있다."라는 설명을 제공한다. 한마디로 정적 컨텐츠에 대한 캐싱을 담당해 준다고 생각할 수 있다. "지리적으로 분산된"이 나타내는 것은 아래의 예시..

  • 프로젝트 진행 시 엑셀에 작성한 데이터, DB에 저장하는 방법

    프로젝트 진행 시 엑셀에 작성한 데이터, DB에 저장하는 방법

    이 글은 프로젝트를 진행하면서 고민했던 부분부터 해결 과정까지가 나름 유의미하다고 생각해서 글로 남겨보려 한다.데이터 가공, 나열 -> 엑셀우리 프로젝트에서는 필요한 데이터를 크롤링하여 엑셀화를 진행한다. 그 이후 기획자분들께서 데이터를 가공하는 과정, 번역하는 과정(4개 국어를 지원하는 서비스이기 때문,,,)을 거쳐서 최종 엑셀 파일이 완성된다.지인 찬스로 외국인 분들께서 번역을 직접 검수해 주시지만 가끔 돌발 상황에서 엑셀 번역기능을 사용할 수도 있었고, 데이터를 정리하는데 엑셀이라는 플랫폼을 선택한다는 것은 고민할 필요가 없었다.이걸 어떻게 데이터 베이스에 저장하지?엑셀에 있는 데이터를 DB에 저장하는 방법을 정하는데 프로젝트 초창기인 3월쯤에 백엔드 팀원분과 많은 토론이 있었다. 여러 가지 방법들..

  • [CS] 대칭키 & 비대칭키 / HTTPS 통신 방법

    [CS] 대칭키 & 비대칭키 / HTTPS 통신 방법

    대칭키와 비대칭키는 데이터 보안 및 통신에서 중요한 역할을 하며, 정보를 안전하게 보호하고 전달하기 위해 사용되는 암호화 기법이다.자세한 내용들보다는 내가 기억하기 쉽게 이해한 과정을 서술해보려 한다. 앞으로 나올 "자물쇠를 잠구는 행위"는 암호화, "자물쇠를 여는 행위"는 복호화를 뜻한다.대칭키암호화하는 키와, 복호화하는 키가 같다고 하여 대칭키라고 불린다. 대칭키 기법을 이해하기 쉽게 한줄로 표현해 보면 아래와 같다.열쇠1로 자물쇠를 잠그고, 받을 사람에게 열쇠1과 자물쇠를 보내준다.대칭키 방식은 간단한 연산을 사용해 암호화를 진행한다. XOR 연산, 치환, 전치 등 단순한 연산으로 암호화를 진행해 빠른 연산이 가능하다. 하지만 암호화, 복호화 시 같은 키를 사용하기 때문에 안전하게 키를 전달하는 부..

  • 서버 재실행 후 첫 Response가 늦게 오는 이유 - JIT Compiler, Class Loader, JVM Warm Up

    서버 재실행 후 첫 Response가 늦게 오는 이유 - JIT Compiler, Class Loader, JVM Warm Up

    스프링 검색어 자동완성 비동기 처리 (Feat. 1만번의 부하테스트 결론은 Over Engineering 이었다고 한검색어 자동완성 구현하기 with Redis (Feat. Elasticsearch)기획 측 요구사항 지난주 스프린트에 검색어 자동 완성 기능이 있었다. 리뷰를 작성하기 위해 장소를 검색하는 부분인데 사용자가 검색어를te-ho.tistory.com Jmeter를 사용한 테스트 도중 특이한 점을 발견했다. 서버를 재실행한 후 API요청을 날리면 Response가 유독 늦게 도착한다는 점이었다. Redis, 비동기 처리를 한 후 진행했던 것이어서 "로직을 잘못 짰나?", "Redis 동작 방식에 문제가 있나?" 하는 생각으로 코드를 계속 고쳐보았지만 결과는 똑같았다. 그 후 구글링, GPT와 심..

  • 스프링 검색어 자동완성 비동기 처리 (Feat. 1만번의 부하테스트 결론은 Over Engineering 이었다고 한다..)

    스프링 검색어 자동완성 비동기 처리 (Feat. 1만번의 부하테스트 결론은 Over Engineering 이었다고 한다..)

    검색어 자동완성 구현하기 with Redis (Feat. Elasticsearch)기획 측 요구사항 지난주 스프린트에 검색어 자동 완성 기능이 있었다. 리뷰를 작성하기 위해 장소를 검색하는 부분인데 사용자가 검색어를 입력하면 해당 검색어가 제목에 포함되어 있는 게시te-ho.tistory.com 저번 포스트에서 redis를 활용해 검색어 자동 완성 기능을 구현하였다. 이미 redis를 사용해 DataBase의 부하는 줄였지만 신경 쓰이는 부분이 있어서 추가적으로 성능 개선을 해보려 했다.신경 쓰였던 기존 로직 사용자가 "티 스 토리" 라는 입력을 했을 경우 로직에 따라 원본, 공백 제거, 공백 기준으로 분리하여 키워드를 가공한다."티 스 토리""티스토리""티", "스", "토리" 이 후 미리 redis에..

  • 멀티스레드? 비동기? (동기, 비동기, 싱글 스레드, 멀티 스레드)

    멀티스레드? 비동기? (동기, 비동기, 싱글 스레드, 멀티 스레드)

    진행하고 있는 프로젝트에서 @Async를 통해 비동기 처리를 하여 성능 개선을 계획 중이다. 관련 공부를 하던 와중에 멀티스레드, 비동기의 차이가 뭐지?라는 질문에 대답을 못하였고 이번 기회에 제대로 알고 가기 위해서 정리해 본다. 우선 결론은 멀티스레드 ≠ 비동기동기, 비동기 VS 단일스레드, 멀티스레드 동기, 비동기 -> 작업(Task)에 관한 것 / 단일스레드, 멀티스레드 -> 작업자(Thread)에 관한 것 이 기본 개념이다. 이해를 돕기 위해 라면을 끓여 보겠다(?) (이해를 돕기 위함이므로 맛은 중요하지 않다. 처리 속도, 효율성을 생각해 보자~) Task -> 물 끓이기, 스프 넣기, 면 넣기 / Thread -> teho, 백종원님(이하 백선생) 동기 : 물이 다 끓으면 -> 스프를 다 ..

  • 검색어 자동완성 구현하기 with Redis (Feat. Elasticsearch)

    검색어 자동완성 구현하기 with Redis (Feat. Elasticsearch)

    기획 측 요구사항 지난주 스프린트에 검색어 자동 완성 기능이 있었다. 리뷰를 작성하기 위해 장소를 검색하는 부분인데 사용자가 검색어를 입력하면 해당 검색어가 제목에 포함되어 있는 게시글을 제목, 썸네일 사진 등과 함께 모두 보여줘야 했다. 자세한 내용은 아래와 같다.사용자가 검색 창에 타이핑을 하다가 0.6초 이상 액션이 없으면 지금까지 입력된 검색어를 제목에 포함한 게시물을 요청한다. (이 부분은 프론트 분들이 하실 거라서 딱히 생각할 필요 없다. )예를 들어 "태호 티스토리"를 입력하면 "태호 티스토리" / "태호" / "티스토리"를 제목에 포함한 모든 게시물을 사전 순으로 정렬 ("태호 티스토리"에 대한 검색 결과 사전 순 + "태호"에 대한 검색 결과 사전 순 + "티스토리"에 대한 검색 결과 사..

  • Stream API 사용 중 .toList()에서 UnsupportedOperationException 발생한 썰

    Stream API 사용 중 .toList()에서 UnsupportedOperationException 발생한 썰

    문제상황 검색어 자동 완성을 구현하는 과정에서 keyword를 여러 값으로 나눈 후 (ex: 사용자의 입력이 "teho tistory" 일 경우 {"teho tistory", "tehotistory", "teho", "tistory"} 4개로 키워드를 만들어서 검색어에 맞는 게시물로 자동 완성을 해준다.) redis에서 추천 게시물을 갖고온 후 모든 값을 하나의 리스트에 합치는 과정에서 UnsupportedOperationException이 발생했다. "사용할 수 없는 동작이야" 라는 오류인데 도대체 왜..? 어디서 발생하는 에러인지 한눈에 알 수 없어서 천천히 뜯어보았다. 원인 파악 전체적인 흐름은 메서드(searchByKeyword, searchBykeywordList)에서 keywrod를 포함하는 ..