본문 바로가기

전체 글63

Full Text Search를 이용한 DB 성능 개선 상품 검색 기능 개선like의 한계LIKE 검색은 인덱스를 활용하지 못하기 때문에 대량의 데이터에서 성능 저하를 유발한다고 한다. 검색 성능 테스트를 하면서, 실제로 데이터 수가 40 → 200만으로 증가했을 때, 검색 속도가 0.4초 → 4.5초로 느려짐을 확인할 수 있었다. 검색 기능 개선방향: MySQL의 FullText N-gram, ElasticSearch현재 구현한 방식인, LIKE '%검색어%' 구문은 문자열의 중간 검색을 수행하므로 B-tree 인덱스를 사용하지 못하고 Full Table Scan을 해야 한다. 보통 like 키워드 검색 성능 최적화를 위해 MySQL의 FullText N-gram이나 ElasticSearch으로 해결한다고 한다. 나의 경우는 Like에서 FullText으로.. 2025. 3. 6.
[item 37] ordinal 인덱싱 대신 EnumMap을 사용하라. 1. ordinal()을 배열 인덱스로 사용하지 말자.배열이나 리스트에서 원소를 꺼낼 때 ordinal 메서드로 인덱스를 얻는 코드가 있다. 하지만 문제가 한가득이다.예시class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } final String name; // 식물 이름 final LifeCycle lifeCycle; // 생애주기 Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return name.. 2025. 2. 26.
[item 36] 비트 필드 대신 EnumSet을 사용하라 비트 필드비트별 OR를 사용해 여러 상수를 하나의 집합으로 모을 수 있으며, 이렇게 만들어진 집합을 비트 필드(bit field)라고 한다. public class Text { public static final int STYLE_BOLD = 1 비트 필드의 문제점비트 필드를 사용하면 비트별 연산을 사용해 합집합과 교집합 같은 집합 연산을 효율적으로 수행할 수 있지만 단점이 있다. 1. 비트 필드는 정수 열거 상수의 단점을 지닌다.비트 필드는 결국 정수 값으로 관리되기 때문에, 컴파일 시점 타입 체크가 어렵고, 의미 없는 값이 들어갈 가능성이 있다. public class Main { public static final int READ = 1 7과 같은 의미 없는 값이 전달되어도 컴파일 오류가 발.. 2025. 2. 17.
[item 35] ordinal 메서드 대신 인스턴스 필드를 사용하라 ordinal 메서드모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal이라는 메서드를 제공한다.ordinal 메서드 잘못 쓸 때1. 상수 선언 순서를 바꾸는 순간 오동작한다.public enum OrderStatus { PENDING, DELIVERED, // 순서를 바꿈 (original: 2) SHIPPED, // original: 1 CANCELLED}만약 OrderStatus 열거형의 상수 선언 순서를 바꾸면, ordinal() 값이 변한다. 2. 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없다.public enum OrderStatus { PENDING, // 0 SHIPPED, // 1 .. 2025. 2. 17.