본문 바로가기

전체 글

(197)
NamedParameterJdbcTemplate을 활용해 SaveAll 반복 쿼리를 최적화해보자 안녕하세요 브로콜리입니다. 오늘은 saveAll의 반복 쿼리 호출에 대한 고민과, NamedParameterJdbcTemplate을 통해 해결한 과정을 소개하고자 합니다.  Situation : saveAll의 쿼리 반복 호출 프로그라피 사전과제에서는 상황에 맞게 유저 수를 세팅하기 위해 외부 API로부터 유저정보를 받아 유저를 저장하는 초기화 API를 개발해야 했습니다. 명세를 보면 seed와 초기화할 유저량 quantity를 넣어주면 유저를 초기화하는 모습을 볼 수 있습니다.[구현 요구사항]1. 기존에 있던 데이터를 모두 삭제한다2. 외부 API에게 seed와 quantity를 넘겨 유저정보를 받는다3. 유저를 애플리케이션 DB에 저장한다.  문제 : API 응답속도가 너무 느리다 그러나, 구현을 완..
중앙대 UMC X GDG 연합 해커톤(청룡톤) 대상 수상 및 후기 안녕하세요 브로콜리입니다. 지난 2월 9-10일 간 중대 지부 UMC와 GDG가 연합하여 해커톤을 진행하였습니다. 저는 두 곳 모두 속해있지 않은 회원이었지만 다음과 같은 것들을 경험하고 싶어 백엔드로 지원하게 되었습니다.  0. 지원 동기- 1. 괜찮은 프론트엔드 크루가 있다면 디베이트 타이머 팀에 영입제안을 하고 싶다.- 2. 대학생들로 이루어진 동아리(ex) 멋사) 부원과 소통하며 내가 성장할 수 있는 환경인지 판단하고 싶다.- 3. 짧은 시간 내에 크레이티브를 최대한 폭발시키는 과정을 경험하고 싶다.  특히 해커톤은 제 버킷리스트 중 하나로 적혀있을 만큼 개발을 공부하기 시작한 순간부터 어느정도의 로망이 있었습니다. 처음 지원하게 되는 해커톤에 마음이 설레기도 하였습니다.1. 대회 일정과 팀 빌딩..
[디베이트 타이머 - 5차 스프린트] 2차 유저 테스트와 디자이너 합류 안녕하세요 브로콜리입니다. 디베이트 타이머 팀은 현재 Phase 1 - 의회식 타이머 기능 개발을 모두 마치고 현재 Phase 2 로 접어들고 있습니다.디자이너 분의 합류로 뷰 개선과 더불어 시간총량제 타이머 개발, 그리고 실 유저 모집을 위한 콜메일이 주요 태스크가 될 것 같습니다. 오늘은 2차 유저 테스트에서 나온 의견을 정리해보려 합니다. 1. 테스트 대상토론 강의를 진행하셨던 분을 대상으로 테스트를 진행하였습니다.: 약 1년 반 이상의 토론 강의 경험 보유: 토론 교육기관에서 학생들을 대상으로 토론 강의 및 자료 제작 경험2. 테스트 방식 테스트 방식은 지난 1차 UT와 동일한 방법으로 대상자가 토론 사회자가 되어 토론을 진행하는 방식을 유지했습니다. 다만 이번에는 키보드 조작 및 테이블 수정하기..
[디베이트 타이머 - 3차 스프린트] 1차 유저 테스트 안녕하세요 브로콜리입니다. 오늘은 프로젝트, 디베이트 타이머의 1차 User Test 에 대해 포스팅해볼까 합니다.지난 1월 25일을 기점으로 디베이트 타이머의 데모 버전이 완성되었습니다.  이에 따라 토론 강의 경험이 있는 강사 한분을 모시고 프로그램의 사용성 테스트를 진행하였습니다.  UT의 목적UT의 목적은 다음과 같은 포인트를 캐치하는 것이었습니다.- 프로그램이 실제로 토론 강의나 교육을 할 때 도움이 될 것 같은가?- 유저가 화면 구성 상 빠르게 사용법을 습득할 수 있는가?- 프로그램에 대한 전반적인 피드백(아쉬운 점이나 더 발전시킬만한 부분은 없는지) 수렴  UT 설계팀원들과 함께 8차 정기회의(1월 21일)에 미션을 설계하였고, 사용 유저가 사회자가 되어 타이머 프로그램을 활용해 토론을 진행..
[학습 테스트] 스레드풀 포화 정책(Saturation Policy) 알아보기 최근 알림 로직 비동기화를 진행하면서 스레드풀을 커스터마이즈하여 빈으로 등록할 일이 있었습니다. 이를 위해 스레드풀에 대해 학습하다 "코어 스레드풀과 대기 큐가 다 차면 요청을 어떻게 처리해야 할까?" 라는 의문이 든 적이 있습니다. 놀랍게도 ThreadPoolExecutor를 다음과 같은 포화상태에서 대처안을 선택할 수 있도록 4가지 정책을 제안하고 있습니다. 오늘은 학습테스트 작성을 통해 스레드풀의 4가지 포화정책을 눈으로 보며 이해해보고자 합니다.1. 스레드풀 기본 개념스레드풀이란 말 그대로 스레드를 풀링해놓는 것입니다. 풀링은 주로 생성 비용이 큰 자원을 미리 만들어놓음으로써 사용 시 반복적인 셋업 코스트를 줄이기 위해 사용됩니다. 이를 기반으로 해석해보면 매번 반복적으로 할당하는 스레드의 생성비..
[디베이트 타이머 - 3차 스프린트] Backend 기초 인프라 세팅하기 디베이트 타이머 3차 스프린트의 막바지에는 인프라 세팅 과정이 필요했습니다. 기존에 습득했던 인프라 관련 지식들을 복습할 겸, VPC를 세팅하는 처음부터 EC2 + RDS + https 세팅까지 작업해주었는데요. 오늘은 그 세팅과정에 대해 차근차근 소개해보고자 합니다. 목표 인프라세팅하고자 하는 인프라 환경은 다음과 같습니다. 가장 간소화한 인프라 환경 입니다. 그럼 디베이트 타이머 인프라 세팅의  A-Z까지의 과정을 소개해보겠습니다. 목차1. VPC - Subnet 설정하기    1-1) VPC 생성하기    1-2) Subnet 생성하기    1-3) 인터넷 게이트웨이 생성하기    1-4) 라우팅 테이블 연결하기 2. EC2 생성 및 EIP 설정    2-1) EC2 생성하기    2-2) EIP ..
[핵심 정리] 대규모 트래픽 처리를 위한 부하테스트 입문/실전 해당 내용은 인프런 강의 [대규모 트래픽 처리를 위한 부하테스트 입문/실전]을 듣고 개인적인 공부 목적으로 핵심적인 내용을 정리한 요약본입니다. 자세한 원리 혹은 개념 설명이 궁금하시다면 강의를 참고하시는 것을 권장드립니다.  부하테스트란?: 시스템의 트래픽 수용량을 테스트하는 것주요 측정량 1) 처리량(Throughput) : 1초당 처리할 수 있는 트래픽 양: 단위 TPS(Transaction Per Seconds) : 1초당 처리한 트랙잭션의 수 2) 지연 시간(Latency): 요청에 대한 응답 시간ex) latency가 2.5초이다. == 하나의 API에 요청을 보내고 응답을 받기까지 2.5초가 걸렸다병목지점전체 시스템에서 특정 서버자원(CPU, Memory 등)이 한계에 도달해 전체 성능이 저..
deleteAll vs deleteAllInBatch : 성능차이 + 영속성 컨텍스트 반영여부 SimpleJpaRepository에 구현된 deleteAll을 보면 내부적으로 엔티티를 하나씩 순차적으로 돌면서 delete() 메서드를 호출하고 있습니다. 이말은 즉슨 엔티티의 개수만큼 delete 쿼리가 나가게된다는 것을 의미합니다.문제 상황 : deleteAllInBatch를 사용한 메서드 테스트 오류 디베이트 타이머 1차 스프린트의 주요 내용은 디베이트 시간표와 시간표를 구성하는 타임박스들의 CRUD를 구현하는 것이었습니다. 그중 의회식 토론 테이블의 삭제 로직을 구현하는 과정에서 더 나은 성능을 위해 deleteInBatch 메서드를 사용했습니다.  @Transactional public void deleteTable(Long tableId, Member member) { ..