분류 전체보기 48

[MySQL] 검색 조회 쿼리 성능 개선 - 1편

팔구삼 프로젝트 - 구름 프로펙트 검색 조회 쿼리 성능 개선 1편노션에 작성된 내용을 티스토리로 옮기다 보니 문단이 깨지거나 코드 블럭이 깨지는 등의 문제가 생기는 것 같다.노션에 바로 접근할 수 있도록 링크를 첨부한다.노션 링크상황: 어떤 문제가 있었나?구름 프로펙트에서 진행하는 우리 프로젝트에서 검색 쿼리의 성능이 너무 느렸다.개발 초기에는 몰랐지만 JOIN 4번에 ORDER BY 정렬에 GROUP BY 집계가 모두 짬뽕이 되어 있어서 데이터가 많아지면 필연적으로 느려질 수밖에 없었다.데이터가 100개 정도로 적었을 때는 문제가 드러나지 않았다.경매 기록 130만 건, 입찰 기록 1200만 건, 좋아요 기록 2000만 건, 더미 사용자 데이터 1000건, 경매 이미지 URL 데이터 400만 건 정도를..

[AWS] RDS로 데이터 삽입 삽질

RDS로 데이터 삽입하고 스테이징서버 구축하기상황: 어떤 문제가 있었나?부하테스트를 실제 서버와 같은 스펙에서 진행하기 위해 스테이징 서버와 K6서버 그리고 RDS를 구축해야 했다.그 중 RDS에 어떻게 데이터를 삽입했는지에 대한 소개이다.경매 데이터 130만 건을 csv 파일 기반으로 파싱해서 읽고 파이썬 코드가 1300만 건의 입찰과 2000만 건의 스크랩 데이터를 생성해서 삽입한다.접근: 어떤 기술로 어떻게 해결했나? / 사고 과정 설명하기예전 NCP에서는 앞에 퍼블릭 인스턴스를 두고 SSH 점프호스트를 사용해서 프라이빗에 접근했다.지금은 EIC 엔드포인트가 생성되어 있어서 이것을 활용하면 SCP를 통해 데이터를 전송할 수 있지 않을까? 생각했다.첫 번째 시도, scp를 통해서 csv 파일을 전송하..

태도를 반성하게 된 날

저번 주 금요일에 있었던 일이다.돌아오는 월요일, 6/9에 프로펙트 과정 진행상황에 대해 2차 발표가 있다.우리 팀의 프론트 개발 담당자 중 한 분이 취업이 되어 풀스택으로 하던 팀장이 프론트 쪽으로 완전히 전환을 했다.그래서 그 파트에 대한 테스트 코드 작성 및 리팩토링을 내가 맡았다.맡았으면 맡은 바 최선을 다하면 되는데 코드 상태가 좋지 않아 나도 모르게 투덜거렸다.그렇게 23시쯤 교육장 정리를 하고 혼자 나오는데 문득 엘리베이터에서 많은 생각을 하게 되었다.제미니의 개발실무에서 재민님께서 말씀하셨던 내용과 옆 팀의 개발 덕후 동료와 나눴던 대화가 떠올랐다.회사는 개인의 성장을 위해 존재하는 곳이 아니며 개인이 성장할 길은 본인이 생각해야 한다는 것이 전자였다.후자는 통제할 수 없는 내용에 마음쓰지..

도메인이 다른 데이터를 여러 곳에서 사용해도 되는가?

도메인이 다른 데이터를 합쳐서 사용해도 되는가?팀원 중 한 분이 프로젝션 관련해서 Payment(결제 내역 테이블)에 있는 데이터를 활용해서 최근 7일 사이의 가장 큰 낙찰가의 경매를 보여주는 API를 작성하는 데 도움을 달라는 요청이 왔다. 이 때 의문이 좀 들었다.약간의 배경 설명을 먼저 하겠다. 지금 경매 검색은 bid(입찰 테이블), scrap(쉽게 생각해서 즐겨찾기 기능의 테이블), auction_image(경매 이미지 url 저장 테이블)에 대해 조인 연산을 진행한 뒤에 데이터를 찾아온다. 그 이유는 입찰 횟수, 최고 입찰가, 즐겨찾기 횟수, 경매 썸네일을 가져와야 하기 때문이다. 이 때문에 한 번에 이해가 힘든 쿼리가 발생했다. (글의 마지막에 첨부된 SQL문)내가 구현한 경매 검색 쿼리와 ..

잘못된 리팩토링, OOP와 순수 함수

잘못된 리팩토링, OOP와 순수 함수이전에 올렸던 포스트가 잘못된 부분이 있었다.순수 함수를 사용하면서 테스트가 더 쉬워진 것은 분명히 맞는 사실이다.하지만 JPA와 엔티티, 객체지향의 관점에서는 좋은 코드가 아니었다.사진으로 살펴보자.이전 글에서 이런 코드를 보여주며 테스트하기 어려운 코드를 분리하고 순수 함수를 사용하자는 의견을 냈었다.이런 패턴을 가질 때 좋은 점은 비즈니스 레이어의 코드를 쉽게 테스트할 수 있다는 것이다.테스트 코드를 쉽게 작성할 수 있고 스프링부트 테스트 혹은 JPA 테스트처럼 스프링 컨텍스트를 활용하지 않고도 테스트할 수 있어 속도가 매우 빠르다.이제 단점에 대해 살펴보자.순수 함수에서의 객체순수 함수에서는 객체의 값이 변경되면 새로운 객체를 생성해서 반환한다.그래서 나는 주황..

테스트 코드는 왜 작성하기 어려울까?

주제에 대해 학습한 이유구름 단기 KDT, 프로펙트 과정을 참여하며 이제 고도화를 해야 할 기간이 다가왔다.고도화를 위해 자동화 테스트를 이제 도입해야 한다.시작은 물론 단위 테스트(유닛 테스트)이다.단위 테스트(유닛 테스트)를 작성하는 데 있어서 어려움이 있어서 어떻게 해야 좋은 테스트를 작성할 수 있을지, 코드를 어떻게 리팩토링해야 할 지 고민했다.위의 과정을 여러 글과 강의, 책을 통해 조금이나마 배운 것 같다.문제 정의테스트를 어떻게 할 수 있는가?그래서 단위 테스트로 어디까지 검증해야 하나?현재 테스트 코드를 짜기 어려운 이유가 무엇일까?문제 분석 먼저 나에게는 Junit, Mockito, Spring Test 등을 사용해 본 경험이 없다.(하지만 대충 보니 Jest와 크게 차이가 없어 보여서..

검색 구현을 위한 기초 공부

검색과 검색어 자동완성 공부하기주제에 대해 학습한 이유이번에 구름에서 제공하는 단기 KDT, 프로펙트 풀스택 과정에 참여했다.협업 경험이 부족한 것도 있고 개발자로서 성장하는 방법을 네이버 부스트캠프에서 배웠으니,직접 실천하며 내 것으로 만드는 과정이 필요하다 생각되어 지원했다.어찌됐든 구름 프로젝트팀에서 검색과 검색어 자동완성에 대해 기능 구현과 고도화를 맡았다.이전 프로젝트인 데나무에서의 경험으로 대충 풀텍스트 인덱스로 검색을 한다 정도로만 알고 있다. 다행히도 가상 면접 사례로 배우는 대규모 시스템 설계 기초에서 검색 자동 완성편도 있었다.우선은 검색이 어떻게 MySQL에서 이루어질 수 있는지 살펴보고 (학습하기) 자동완성이 어떤 식으로 설계되는지 한 번 읽어보는 방식으로 학습하려고 한다.(설계하기..

[밑바닥부터] 8일차 - 2장 불 연산: ALU 구현 및 테스트

ALU 구현 및 테스트ALU구현6개의 제어 비트를 사용해야 한다. (zx, nx, zy, ny, f, no)책에 나와 있는 힌트로는, 16비트 값을 0으로 만들거나 반전하는 논리 설계를 먼저 하라고 한다. ⇒ zx, zy, nx, ny, no가 우선적으로 설정되어야 한다.zx, zy 등을 만들기 위해서는 고급 프로그래밍 언어의 if와 같이 조건을 설정해야 한다.하드웨어에서 조건을 만들려면 멀티플렉서를 사용한다.예를 들어, zx 비트가 1이면 x입력을 0으로 만들고, 0이면 원래 x값을 사용할 수 있도록 한다.그 다음으로는 f에 따라 + 연산과 And 연산을 선택하도록 하면 된다.이 주요 6기능이 제대로 동작하는지 확인 후 zr과 ng 출력에 필요한 기능을 이어서 구현한다.진리표zxnxzynyfnoout(..

[밑바닥부터] 7일차 - 2장 불 연산: 가산기와 증분기 구현

가산기와 증분기 구현가산기구현코드를 작성해보기 전에 가산기의 동작을 생각해보자.LSB는 반가산기를 통해서 더해주고, 나머지는 carry 비트가 추가적으로 필요하니 전가산기를 써주면 될 것 같다.HDL CHIP Add16 { IN a[16], b[16]; OUT out[16]; PARTS: HalfAdder(a= a[0], b= b[0], sum= out[0], carry= carry0); FullAdder(a= a[1], b= b[1], c= carry0, sum= out[1], carry= carry1); FullAdder(a= a[2], b= b[2], c= carry1, sum= out[2], carry= carry2); FullAdder(a= a[..

[밑바닥부터] 6일차 - 2장 불 연산: 반가산기, 전가산기 구현

반가산기, 전가산기 구현반가산기진리표abcarrysum0000100101011110진리표를 확인했을 때, carry는 and 연산이고 sum은 xor 연산임을 확인할 수 있다.HDL CHIP HalfAdder { IN a, b; // 1-bit inputs OUT sum, // Right bit of a + b carry; // Left bit of a + b PARTS: And(a = a, b = b, out = carry); Xor(a = a, b = b, out = sum); }전가산기진리표abccarrysum0000000101010010111010001101101101011111반가산기를 사용해서 구현해보자. a + b + c의 결..