전체 글(114)
-
TDD 스터디에서 배운 점: 가독성 높은 테스트 코드 작성법과 코드 리뷰의 중요성
안녕하세요, 저는 현재 TDD 스터디를 진행하고 있는 코랩입니다.이번 주 TDD 스터디를 하면서 배운 내용들을 여러분과 공유하고자 합니다.이번 주 작업 내용저희 팀은 이번 주에 6, 7장 강의를 수강하고,controller 테스트 코드를 작성하며, 서로의 코드를 리뷰하는 시간을 가졌습니다.이번 주에는 강의와 코드 리뷰를 통해 많은 것을 배울 수 있었습니다.강의에서 배운 내용1. 각 테스트 별 given, fixture를 @BeforeEach로 빼지 말자!각 테스트는 독립적으로 실행되어야 하므로, given과 fixture를 @BeforeEach로 분리하는 것은 좋지 않습니다.테스트 코드를 작성할 때, 특히 학습용으로 할 때는 비즈니스를 간단하게 가져가다 보니, given 절에서 반복이 자주 일어납니다. ..
2024.05.12 -
TDD 스터디 회고: 에러 핸들링의 책임과 TDD의 본질
안녕하세요, 저는 현재 TDD 스터디를 진행하고 있는 개발자입니다. 오늘은 이번 주 스터디를 하면서 고민했던 내용들을 여러분과 공유하고자 합니다.1. 에러 핸들링도 하나의 '책임' 이다이번 주에 저번처럼 기획을 기능 명세서로 만든 후,기능 명세서에서 명시한 Exception을 어느 계층에서 던져야 할지 고민이 되더라고요.이전까지는 Controller에서 DTO를 바인딩할 때 @Valid로 모든 검증을 처리했었거든요.필드가 유효하지 않은 값이 있다면, 서비스 로직까지 아얘 오면 안된다고 생각했기 때문입니다.서비스 계층은 비즈니스 로직을 책임지는 계층이지, 값의 유효성에 대한 검증의 책임은 컨트롤러에 있다고 생각하기 때문입니다.그래서 위 카테고리 수정 명세서를 예시로 들어보자면,'name'으로 빈 값이 들어..
2024.05.05 -
TDD 스터디 주간 회고 (4/22 ~ 4/28)
저희 팀은 이미 한 번 리뷰를 해본 적이 있지만,제대로 된 주간 리뷰는 이번이 처음이라 이렇게 글을 남기게 되었어요.스터디 진행 방식저희 팀의 스터디 진행 방식은 다음과 같습니다.1. 박우빈 님의 강의를 정해진 주차까지 듣습니다.2. 팀원들과 회의를 통해 기획명세서를 도출합니다. 이때 GPT에게 회사에서 주는 것처럼 해달라고 요청합니다.3. 기획명세서를 토대로 TDD를 진행합니다. 예전에 TDD를 할 때는 Red, Blue, Green 만 지키다 보니, 본질적인 것은 이게 아니라는 생각이 들었습니다.그래서 저희 팀은 스터디 내용 중에 명세서를 열어보는 것을 가장 중요하게 여기고 있습니다.TDD의 핵심은 명세서를 열어보고 해체하는 과정이라고 생각했어요.4. 서로의 코드와 테스트 코드를 화면에서 보고 리뷰합..
2024.05.01 -
손흥민 결승골 후 데이터 폭증: 해축갤에서의 3가지 인덱스 전략
배경 최근 이런 시나리오를 생각해봤습니다. 월드컵 결승에서 손흥민 선수의 골로 인해 극적인 승리를 한다면 해축갤에 무슨 일이 일어날까? (제발 이런 일이 일어났으면) 생각만 해도 달달하다. 이런 경우 아마 해축갤에 흥민찬양에 대한 주제로 글이 미어터질 것입니다. 이렇게 생성된 글들이 쌓이면, 이는 결국 대규모 데이터라고 불릴 만큼 늘어날 것입니다. 그리고 저는 늘어난 글의 갯수를 대략 1억개로 잡아봤습니다. 그래서 최근 데이터를 200만 개에서 1억 개로 늘리고 난 뒤 기존 API의 성능이 얼마나 나오는지 궁금해 쿼리를 한번 테스트해 봤습니다. 정신 나갔다,,, 쿼리 응답시간 4분 20초…? 해축갤은 제 자식과 같은 프로젝트이지만, 저라도 이 서비스는 사용하지 않을 거 같습니다 ㅠ 상황 현재 해축갤의 E..
2024.03.26 -
MySQL 인덱스 크기와 디스크 I/O 최적화: 데이터베이스 성능 향상 가이드
배경 해축갤 프로젝트를 하며 데이터가 200만개에서 1억개로 늘어났을 때 게시물 조회 성능이 급격히 안 좋아져 쿼리 개선, title, content 기준 인덱스를 이것저것 넣어보며 실험을 하고 있었습니다. 인덱스중 title, content 2개를 가지고 B-Tree 인덱스를 생성하려 했다가 문제가 발생했습니다. 구체적인 상황 (like DB, 코드 구조) 해축갤의 게시글 테이블의 구조는 다음과 같습니다. 주의해서 봐야 하는 부분은 content 가 varchar(1000) 라는 겁니다. 제가 사용하는 MySQL 버전은 8.0.36 이고 입력한 명령어는 다음과 같습니다. CREATE INDEX idx_title_content ON post (title(100), content(100)); 문제 위 쿼리..
2024.03.25 -
실시간 MySQL 데이터 복구: Master-Slave 구성과 MHA로 완성하는 고가용성 백업 전략
예전에 1. DB가 부러졌고 2. 부러진지도 몰랐고 3. 알고난 이후에는 복구하려고 갖은 방법을 써봤지만 결국에는 복구를 하지 못하고 지우고 새롭게 설치를 했었습니다. 백업 및 복구 실패 글 링크 : https://xpmxf4.tistory.com/93 MySQL 데이터베이스 복구 실패: 실험에서 배운 교훈과 데이터베이스 관리 전략 ? DB 가 죽어버렸다. 껐다 켜면 되겠지라는 생각으로 다음 명령어를 쳤는데 brew services restart mysql 여전히 안된다. 원인 분석 그래서 로그를 확인하기 위해 ‘/usr/local/mysql/data/mysqld.local.err’ 을 까 xpmxf4.tistory.com 그래서 미리미리 백업을 해야한다는 것과, 복구 시스템을 갖춰야 함을 뼈저리게 느껴..
2024.03.04