본문 바로가기
반응형

전체 글57

Spring Bean을 이용한 팩토리 메서드 패턴으로 객체 분리하기 일이 너무 많아 오랜만에 글을 쓰는 것 같다... 새롭게 배운 내용도 엄청 많고 정리해야할 내용도 엄청 많은데 바쁘고 귀찮다는 핑계로 미뤄두다가 오랜만에 써보게 되는 것 같다. 후후... 그러면 간만에 리팩토링한 내용을 정리해보려고 한닷. ㄱㅈㅇ!! 문제상황 기존의 코드는 아래와 같다. Mybatis에서 Union All을 통해 여러가지 쿼리가 조건에 따라 합쳐져서 보여지고 있는 형태이다. ㅂㄷㅂㄷ... SELECT ... FROM Table1 JOIN ... WHERE ... UNION ALL SELECT ... FROM Table2 JOIN ... WHERE ... UNION ALLSELECT ... Table3 JOIN ... WHERE ... UNION ALL ... 위의 코드에서 여러 문제점이 .. 2024. 4. 7.
정적분석툴 SonarQube A-Z 조사 두둥.. 회사 프로젝트에서 정적분석툴을 연동해서 통합적으로 코드 품질을 관리하고자 하는 니즈가 생겼다. 그래서 정적분석툴에 대해 조사해보니, 소나큐브가 압도적으로 레퍼런스도 많고 지속적인 버전관리도 되고 있어 강력한 후보군으로 추천하고 싶어졌다. 이제 정적분석툴은 뭐고 소나큐브는 무슨맛인지 한번 알아보자...! SonarQube 소개 SonarQube는 오픈 소스 기반의 정적 코드 분석 도구라고 한다. 코드의 품질을 분석하고 개선하는 데 도움을 주는 도구로, 다양한 프로그래밍 언어와 프로젝트 유형을 지원하며 코드 복잡성, 중복 코드, 버그, 취약점 등과 같은 다양한 측면의 코드 품질을 검사하여 표시하고, 개발자들이 품질을 개선할 수 있는 지표와 피드백을 제공한다. 또한, CI/CD 파이프라인에 통합하여 .. 2023. 8. 26.
Redis와 Spring Scheduler를 사용해서 사이트 일일 방문자 저장하기 AWS ElasticCache Redis 를 생성해놓고 어디에 쓸지 째려보기만한지 어언 한달... 드디어 결단의 시간이 왔다. Redis를 사용해서 사이트 일일방문자수를 확인하는데 사용하려고 한다. 왜 Redis를 사용하냐면, 실시간으로 접속하는 모든 방문자를 캐치하여 즉시 DB에 저장하는 것은 DB Connection과 I/O를 많이 발생시켜 비효율적으로 보였기 때문이다. 따라서, Redis라는 캐시를 두어 실시간으로 접속하는 방문자를 캐시에 저장해두고 일정시간마다 DB에 저장하여 DB I/O를 줄여보고자 한다. 로직은 다음과 같이 작성하려고 한다. 1. 특정 경로로 온 요청에 대해 방문자 Interceptor 작동. 2. Redis에 ip_date 를 key값으로 존재여부 확인 후 저장. 3. Sch.. 2023. 2. 3.
Maria DB / HikariCP Connection 누수 개선 (Too many connections) 이슈 발생 현재 Maria DB를 사용하면서 Connection에 대한 이슈가 발생했다. 많은 개발자들이 DB에 달라 붙다보니 당연히 DB Connection Session이 늘어나게 된다. 그러면서 이제 1차적인 문제가 발생했다. Too many connections DB Setting을 통한 1차 해결 현재 DB 세팅은 max-pool-size가 150이며 Connection의 유휴상태(sleep)에서 default대기 시간이 8시간이다. -- max pool size 확인 show variables like '%max_connect%'; -- connection timeout 확인 show variables like 'wait_timeout'; 즉, 150개의 요청의 세션이 sleep상태로 살아있다.. 2023. 1. 20.
[Java] 멀티스레드를 통한 성능개선 화스트 페이스 경보 발생... 문제상황 프로젝트 진행 중 이번달 말에 계산을 돌려야하는데 시간이 오래 걸린다고 성능을 개선해달라는 요청을 받았다. Slow Query가 있겠거니 하고 소스를 뜯어봤더니 왠 걸,, 프로시저로 되어있다. 메인 프로시저 하나에 수십개의 프로시저가 딸려있는 구조였다. 정리하자면, java단에서 반복문으로 한명 씩 해당 프로시저를 호출해서 계산하는 구조인데 해당 프로시저는 수십개의 서브 프로시저를 달고있는 구조였으며, 1명당 약 3.6초가 소요됐다. 100명을 돌리면 360초. 1000명을 돌리면 3600초...... 그..그만!! 해결방안 모색 여러가지 해결방안을 모색했고 적합한 방식을 찾아나갔다. Query 튜닝 처음에는 Slow Query가 있을 줄 알고 까보니 수십개의 프로.. 2023. 1. 19.
AWS[Elasti Cache] ElastiCache for Redis란? 노드/샤드/클러스터 Redis? Redis(Remote Dictionary Server)는 오픈 소스 기반 인 메모리 데이터 저장소이다. 데이터를 key-value 형식으로 저장하고 strings, hashes, lists, sets, and sorted sets와 같은 다양한 데이터 구조를 지원한다. 또한 데이터 노드의 Master-Slave 복제, Lua 스크립팅, 키 만료 등 다양한 고급기능을 사용할 수 있다. Redis는 인 메모리 기반 데이터 저장소로 사용되지만 RDB(특정 시점 스냅샷), AOF(쓰기 작업 로그) 방식의 백업을 통해 데이터를 디스크에 저장할 수 있다. 따라서 재부팅이나 충돌이 발생해도 데이터를 보존시켜 계속 사용할 수 있다. Redis는 고성능, 확장성 및 low latency로 유명하므로 실시간.. 2023. 1. 14.
AWS[Elasti Cache] - Redis 생성 및 Ec2에서 접속 미루고 미룬 Redis에 대해 슬슬 다뤄보려 한다. 이미 Ec2에서 was, nginx, jenkins, postgresql까지 돌리고 있어 Redis까지 설치하면 미안한 감정이 들어 Aws에서 제공하는 Elastic Cache를 사용하려고 한다. 바아로 생성해보자. AWS - Elastic Cache 생성 AWS - Elastic Cache검색 후 접속 클러스터 생성 - Redis 클러스터 클러스터 설정 새 클러스터 구성 및 생성 클러스터 모드 비활성화 free-tier는 t2.micro 노드 1개에 대해 무료로 제공하기때문에 동적으로 노드갯수가 늘어나서 요금이 발생하지 않을까하는 우려심에 비활성화 했다. Free-tier를 사용한다면 노드유형을 t2.micro로 셋팅해야 별도로 요금이 부과되지 않는다.. 2023. 1. 12.
DataBase Index에서 기본적으로 HashTable이 아닌 B-Tree를 쓰는 이유 의문의 시작 해시 테이블은 삽입, 삭제, 탐색 시 평균적으로 O(1)의 시간복잡도를 가지는 좋은 성능의 자료구조인데 DateBase에서 Index로 사용안하는지 갑자기 의문이 생겼다. 지금 생각해보면 조금만 고민하면 답을 찾을 수 있는데 왜 안보였는지... 서치를 해보니 나와 같은 의문점을 가진 사람들이 꽤 있어서 자료가 찾기 편했다. 바로 알아보자! 자료구조 비교 HashTable HashTable이란 Key와 Value로 데이터를 저장하는 자료구조 중 하나로써, 데이터의 삽입, 삭제, 탐색에 평균적으로 O(1)이라는 빠른 성능의 시간복잡도를 자랑하는 자료구조이다. HashTable의 프로세스를 알아보면, 검색하고자 하는 키값을 입력받아서 해시함수를 통해 반환받은 HashCode를 배열의 Index로 .. 2023. 1. 9.
Nginx로 Rate limit 설정 멍청함엔 끝이 없다 머리가 멍청하면 몸이 고생하더라,,, 옛 어르신들 말 틀린게 하나 없다. Nginx를 Webserver로 구축하면서 rate limit을 설정이 있는 걸 확인했다. 기존에 Application단에서 Filter로 구현하기 전에 nginx로 구현 가능한지 찾아봤으면 이렇게 두 번 일하는 일이 없을 텐데 이렇게 몸이 고생하는 것도 능력이다. 하하하 Java filter로 rate limit 구현은 아래 링크를 확인하면 된다. https://foot-develop.tistory.com/52 그럼 바로 Nginx에서 rate limit을 어떻게 다루는지 알아보자. Nginx에서 rate limit을 구현하기 위해 네트워킹에서 많이 사용 되는 누수 버킷(leaky bucket) 알고리즘을 사용.. 2023. 1. 4.
반응형