분류 전체보기(109)
-
손흥민 결승골 후 데이터 폭증: 해축갤에서의 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 -
Java 이해도 미쳤ㄴ,,,? 면접관님 이거 한번 보세요 (Java 계산기)
프로젝트의 시작 어느 날 익명의 기업으로부터 흥미로운 과제를 받았습니다. 과제의 내용은 다음과 같았습니다. 💡 회사는 스프린트 단위로 프로젝트를 진행합니다. 이번 스프린트에서는 사칙연산, 다음 스프린트에서는 삼각함수를 구현할 예정입니다. 추후에는 로그, 미적분이 예정되어 있습니다. 확장에 유리한 설계를 해주세요. v1. 설계의 시작과 문제점 인식 초기에 저는 사칙연산을 처리할 수 있는 간단하고 직관적인 설계를 구상했습니다. 이를 위해, 사용자의 입력을 분석하고 연산을 수행하는 Calculator 클래스와 연산을 추상화하는 Operation 인터페이스를 도입했습니다. 또한, 연산 종류에 따라 적절한 연산 객체를 생성하는 OperationFactory 클래스도 만들었습니다. 하지만 이 설계는 곧 두 가지 큰..
2024.03.01 -
정적 유틸리티 클래스 -> 인터페이스 기반 설계로: java에서 OCP 원칙을 적용
자바 개발자라면 누구나 효율적인 코드 구조와 객체지향적 설계의 중요성을 인식합니다. 특히, 게시물 추적 기능과 같이 데이터를 처리하고 분석해야 하는 경우, 코드의 재사용성과 확장성은 더욱 중요해집니다. 이 글에서는 DateBasedPostTracker 클래스를 예로 들어 정적 유틸리티 클래스와 인터페이스 기반 설계의 각각의 장단점을 탐구하고, 어떤 방법이 객체지향적인 설계 원칙, 특히 개방/폐쇄 원칙(OCP)을 더 잘 따르는지 논의해 보겠습니다. DateBasedPostTracker 클래스 소개 DateBasedPostTracker는 특정 날짜에 게시된 해축겔 게시판의 정보를 가져오는 기능을 제공하는 클래스입니다. 이 클래스는 세 가지 주요 기능을 포함합니다. 1. findFirstPage(String ..
2024.02.05 -
카타르 아시안컵 16강날 해축갤 트래픽 분석 : 인기 게시물의 파워
예전에 쿼리 튜닝을 한 상황의 가정은 다음과 같았습니다. 손흥민이 월드컵에서 골을 넣으면 해축갤에 미친 듯한 드립(게시물)이 올라오고 퍼갈 것이다. 이때 '%흥민%' 이라는 키워드로 검색이 많이 일어날 것이다. 그래서 게시물에 약 1억 건의 데이터를 넣고 느려진 게시물 조회 쿼리를 개선을 했었습니다. (4분20초 -> 0.0019초) 2024.01.29 - [Project 해축갤/데이터베이스] - 1억 데이터 쿼리 최적화: 풀텍스트 인덱스의 한계와 LIKE 절의 귀환 1억 데이터 쿼리 최적화: 풀텍스트 인덱스의 한계와 LIKE 절의 귀환 배경 최근 데이터를 200만 개에서 1억 개로 늘리고 난 뒤 기존 API의 성능이 얼마나 나오는지 궁금해 쿼리를 한번 테스트해 봤습니다. 정신 나갔다,,, 쿼리 응답시간..
2024.02.01 -
우아한남형제들의 주간 스프린트 회고: 1월 22일 ~ 1월 26일
우아한남형제들의 주간 미팅 형식은 주간 스프린트 회고와 프로젝트 및 다음 스프린트 방향성에 대해 이야기하는 것으로 구성되어 있습니다. 1. 주간 스프린트 회고 회고는 먼저 일주일 간 각자의 진행 상황 보고로 시작합니다. 이번 스프린트에서 마음에 들었던 점, 개선이 필요한 점에 대해 논의합니다. 이번 주에는 각자의 서비스 개발에 진척이 있었지만 JavaDoc, Test Code, 자원 배치 및 CD 작업이 미완료되었습니다. 추가로 완수해야 할 작업은 미완료된 서비스 개발입니다. 이 세 가지 측면에서 회고한 후 Jira에 체크한 일들을 함께 확인합니다. 이후 이번 스프린트에 대한 후기를 자리에서 남기며, 후기는 좋았던 점과 개선할 점으로 나누어 모두가 함께 이야기합니다. 저는 이번 스프린트에서 애자일 프로세..
2024.01.30 -
Pure Java 프로젝트 의존성 포함법 : Shadow Plugin
1. 문제의 시작: 해축갤 인기 게시물 트래픽 추적 중 에러 해외축구갤러리의 인기 게시물 트래픽을 추적하기 위해 Java 프로그램을 개발하고 Gradle 빌드 시스템을 사용하여 빌드한 후 실행했습니다. 그러나 "java.lang.NoClassDefFoundError: org/jsoup/Jsoup"라는 Gradle 빌드 관련 에러가 발생했습니다. 이는 Spring Boot 프로젝트에서는 경험하지 못한 문제였습니다. Spring Boot 는 jar 파일 빌드시 기본적으로 모든 dependency를 포함하기 때문입니다. 2. Gradle의 기본 동작 이해하기 이 문제를 해결하기 위해 Gradle 커뮤니티의 토론을 참고했습니다. First of all, the default jar that Gradle prod..
2024.01.29 -
우아한남형제들에서 배우는 쉬운 Eureka 서비스 등록 방법
우아한 남형제들 서비스에서 팀원끼리 하나 협의를 한 것이 있습니다. 팀원이 사용해야 될 여지가 있다면 문서로 서로 공유하기로 한 것이죠. 그리고 저는 Eureka를 맡아서 개발하기로 했습니다. 이미 Confluence 에다가는 팀원에게 등록하는 법에 대해 공유는 되어 있지만 무료버전 Confluence 는 문서가 Public 하게 공유가 안되어 티스토리에도 옮기게 되었습니다 :) Eureka 란? Eureka is the Netflix Service Discovery Server and Client. The server can be configured and deployed to be highly available, with each server replicating state about the regi..
2024.01.23 -
H2 Database Unique 제약 조건 찾고 지우는 법
배경 문제는 'MEMBER' 테이블에 가데이터를 삽입하는 도중, 'ROLE_ID' 필드에 대한 "Unique index or primary key violation" 오류가 발생하면서 시작. 이 오류는 '사용자' 테이블의 'ROLE_ID'에 잘못 적용된 unique 제약조건 때문에 발생했습니다. 문제 해결을 위한 접근 https://stackoverflow.com/questions/10008476/dropping-unique-constraint-for-column-in-h2 Dropping unique constraint for column in H2 I try to drop unique constraint for column in h2, previously created as info varchar(2..
2024.01.23