분류 전체보기 26

문자열 탐색 성능 개선

필자는 웹메일 업체에서 스팸 차단 솔루션 개발을 담당하고 있다.스팸 차단 솔루션의 특성상 관리자/사용자가 등록한 필터들을 활용한 많은 문자열 탐색이 일어난다.이 기능을 개선하면 솔루션의 성능이 크게 향상될 것이라고 판단하여 진행하게 되었다. 우선 결론부터 말하자면 패턴 매칭의 성능 개선은 진행되지 못하였다.허나 누군가가 나와 같은 고민을 하고 있을 경우 도움을 받을 수 있도록, 또 나와 같은 실수를 하지 않도록 하기 위해 기록하고자 한다.시작 - 어떻게 개선하려 하였는가?우선 회사에서 열심히 놀고 있는 도중 우아한형제 블로그의 아래 글을 보게 되었다.https://techblog.woowahan.com/15764 고르곤졸라는 되지만 고르곤 졸라는 안 돼! 배달의민족에서 금칙어를 관리하는 방법 | 우아한형..

개발일지 2024.05.30

KMP - 문자열 탐색 알고리즘 (By Java)

문자열 탐색 성능 개선 중 KMP알고리즘을 사용하면 기존의 브루트포스 알고리즘보다 더 좋은 성능이 나온다는 이야기를 들었다.정확히 어떻게 성능을 더 빠르게 하는지가 궁금하여 자세한 내용을 정리해보고자 한다. 이 글은 아래 글을 참고하여 작성하였다.https://bowbowbow.tistory.com/6 KMP : 문자열 검색 알고리즘문자열 검색이 뭐지? 워드프로세서를 사용할 때 찾기 기능을 사용한적 있을 겁니다. 브라우저에서도 Ctrl+F 단축키를 눌러 검색할 수 있습니다. 아래 이미지는 브라우저에서 "테이프"를 검색했을bowbowbow.tistory.com KMP 알고리즘이란?문자열 비교 시 효율적인 인덱스 조정을 통해 이미 비교했던 문자열을 최대한 다시 비교하지 않도록 하여 성능을 개선한 문자열 탐색..

BackEnd/Java 2024.05.29

X바(자바) finalize 메소드 쓰지마세요

Java9부터는 Deprecate 되었어요 쓰지 마세요. 과거 필자는 특정 객체 동작하면서 남긴 임시 파일을 해당 객체가 소멸될 때 제거되도록 하기 위해finalize 메소드를 사용하여 처리하려 했던 적이 있었다.허나 적용하기 위해 검색하여 보니 finalize 메소드를 사용하지 말라는 내용이 많았고이펙티브 자바에 자세하게 설명되어 있어 이 내용을 한번 정리해보고자 한다. finalizer란?자바에서 객체가 더 이상 참조되지 않을 때 Garbage Collector가 객체에 할당한 메모리를 회수하기 전객체의 finalize 메소드의 내용을 진행하는 객체 소멸자이다.이외에도 자바에는 cleaner라는 객체 소멸자가 하나 더 있다. finalizer 예시public class Finalize { @Over..

BackEnd/Java 2024.05.06

Java HashMap의 내부 동작 - 해시 버킷 개수 조정

관련 포스팅 Java HashMap의 내부 동작 - 이론편 Java HashMap의 내부 동작 - 실전편 Java HashMap의 내부 동작 - 해시 버킷 개수 조정 이번 글에서는 자바의 HashMap의 성능을 위한 해시 버킷의 개수에 관련해 알아보자 해시 버킷 개수 조정 우선 저번 글에서 확인하였듯이 HashMap에서는 데이터를 해시버킷에 나누어 저장해둔다. 여기서 해시버킷의 인덱스 계산을 "X.hashCode() % M(해시 버킷의 개수)"을 통하여 진행하는데 만일 해시버킷의 개수가 적다면 데이터가 증가할 수록 더 많은 해시충돌이 발생할 것이고, 이는 성능 저하로 이어지게 된다. 이를 방지하기 위해 HashMap에서는 데이터 개수가 "load factor(기본값 3/4) * 현재 해시 버킷의 개수"에..

BackEnd/Java 2024.04.21

Java HashMap의 내부 동작 - 실전편

관련 포스팅 Java HashMap의 내부 동작 - 이론편 Java HashMap의 내부 동작 - 실전편 Java HashMap의 내부 동작 - 해시 버킷 개수 조정 이번 글에서는 Java에 HashMap이 실제 코드로 어떻게 되어있는지 확인해보자 한다. 데이터 삽입(put) put 메소드의 데이터 추가는 아래 3가지의 경우를 순서대로 처리한다. 1. 해당 인덱스의 해시 버킷(LinkedList) 확인 - 해당 해시 버킷에 값이 없을 경우 새로운 Node 추가 후 종료 2. 해당 해시 버킷의 키 값 일치여부 확인 - key가 일치할 경우 해당 키에 대한 값 변경해준 후 종료 3. 해당 해시 버킷에 값 추가 - Tree일 경우와 / LinkedList일 경우 분기하여 처리 final V putVal(int..

BackEnd/Java 2024.04.16

Java HashMap의 내부 동작 - 이론편

해당 글은 Java8 기준으로 작성되었습니다. https://potwings.tistory.com/56 Java HashSet, HashMap 내부 구조 & List보다 contains의 성능이 더 좋은 이유 알고리즘 문제를 풀거나 실무에서 Hash 자료 구조를 자주 접하게 된다. 이들을 사용하면서 궁금했던 점, 느낀 점에 대해 정리해보고자 한다. HashSet이 HashMap보다 성능이 좋지 않을까? 우선 필자는 H potwings.tistory.com 이전 글에서 ArrayList와 HashMap의 contains의 성능을 비교해보았고 HashMap의 contains는 HashMap에서 get 후 null 체크를 진행하는 것을 확인하였다. 여기서 HashMap에서 get은 단순히 키값을 hashCod..

BackEnd/Java 2024.04.14

DTO 그렇게 쓰는 거 아닌데 ㅋㅋ

미안하다 이거 보여주려고 어그로 끌었다. 최근 DTO 관련된 글을 하나 읽었다. 원글 : https://medium.com/@bubu.tripathy/dto-free-java-ee70c43b5ad5 DTO-Free Java Moving Beyond DTOs to Enhance Application Design medium.com 해당 글에서 필자는 기존 DTO의 문제점을 제기하고 그에 대한 해결 방안을 제안하였다. 필자가 말하는 기존 DTO의 문제점 1. DTO는 비지니스 로직 없이 단순 데이터만 가지고 있어 해당 DTO를 다루는 곳에서 중복 코드가 발생할 수 있다. 2. 도메인 객체나 비즈니스 로직이 변경될 경우 DTO에도 동일한 수정 작업이 필요하다. 3. 대규모 어플리케이션에서 DTO의 증가함에 따..

BackEnd/Java 2024.03.17

Java HashMap이 List보다 contains의 성능이 더 좋은 이유

보통 실무에서 데이터를 불러올 경우 DB에서 정렬을 통하여 불러오기 떄문에 그 순서를 유지하기위해 ArrayList에 담는 경우가 많다. 처음 개발을 시작할 때는 자료구조의 'ㅈ'자도 몰라서 그냥 아무생각 없이 ArrayList의 contains 메소드를 호출하여 해당 데이터가 들어있는지 확인하였다. 허나 개발을 점점 해보면서 ArrayList의 contains는 시간복잡도가 O(n)이고 HashSet의 경우 시간복잡도가 O(1)이라 성능이 더 좋다는 것을 알게되었다. 이에 대해 ArrayList의 경우 모든 객체의 값을 하나하나 확인을 해봐야하나 HashSet의 경우 Key로 가지고 있기 때문에 바로 불러올 수 있어서 라고만 단순히 생각하였다. 그렇게 사용하던 중 정확히 내부에서 어떻게 동작하는지가 궁..

BackEnd/Java 2023.11.26

JAVA 객체 배열, 리스트 값 비교(Comparable, Comparator)를 통한 정렬

실무에서는 데이터 정렬 시 주로 쿼리에서 진행하지만, 최근 정렬 알고리즘 문제를 풀던 중 Comparable, Comparator을 사용하여 정렬을 하게 되어 비교 인터페이스에 대해 정리해보자 한다. 비교 인터페이스를 사용하는 이유 일반적인 숫자의 경우 기본적인 비교 연산자를 통하여 대소비교를 진행할 수 있다. 하지만 객체의 경우를 보자, 만일 String name, int age 두 개의 값을 가지고 있는 Person 객체를 비교한다해보자. Person 객체는 나이의 크기 통하여 대소비교를 진행할 지 이름값의 알파벳 순으로 대소비교를 진행할 지를 알 수 없으니 일반적인 방식으로는 대소비교가 불가능하다. 이 때 우리는 해당 객체에 비교 인터페이스를 상속시켜 해당 객체를 어떤값을 통하여 대소 비교를 진행할..

BackEnd/Java 2023.09.03

MySQL SELECT 쿼리 성능 개선

최근 회사에서 저장기간이 지난 데이터 삭제 중 slow query가 발생하였다. 해당 운영 환경에는 2천만건의 데이터가 저장되어있고 과거의 데이터를 추출하려다보니 이 있어 문제가 되었다. 문제가 발생한 데이터와 쿼리는 아래와 유사한 구조였다.(예시를 위한 테스트 테이블,쿼리) SELECT seq, date, subject, content FROM test_data WHERE date < {date} AND type IN ({type},{type}...) LIMIT {offset}, {limit}; 결합 인덱스 수정 우선 처음으로 select 시 해당 테이블의 인덱스를 정상적으로 사용하지 못하여 문제가 발생한다 생각하였다. 실행 계획을 확인하였을 때 아래와 같았다. 따라서 인덱스를 date와 type 모두..

개발일지 2023.08.20