분류 전체보기 379

[Elasticsearch] ES cluster(2 node) 구조에서의 데이터 정합성 이슈

회사 프로젝트에서 장비의 실시간 통계 정보를 저장하기 위해 Elasticsearch 검색엔진을 활용합니다. 단일 node를 가지는 standalone 구조에서는 primary, replica shard가 각각 1, 0으로 세팅되어 있으며, 클러스터 구조(2 node 이상) 에서는 5, 1로 세팅되어 있습니다. (ES 1.7.x 기준이며 템플릿 설정에 따라 다를 수 있습니다.) Failover를 위한 HA 구조 (ES 1(master), ES 2(backup) 에서 데이터의 정합성 이슈가 발생하였습니다. 해당 이슈에 대해 대략적인 내용을 설명드리겠습니다. 이슈 발생 상황장비의 CPU, Memory, Port Usage, Connectivity 정보와 같은 통계 정보를 일정 주기에 맞춰서 ES에 저장합니다...

[Spring] csv 파일의 데이터 파싱 및 저장 성능 개선기 (JPA save() vs JdbcTemplate batchUpdate() vs MariaDB LOAD DATA INFILE)

운영 중인 사내 시스템에서 IEEE OUI 파일(https://standards-oui.ieee.org/oui/oui.txt)을 다운로드하여 MAC 주소와 제조사 정보를 추출하고, 이를 DB에 저장해야 하는 요구사항이 있었습니다. 기존 처리 흐름 (AS-IS)oui.txt file -> oui.csv 파일 형식으로 파싱합니다.csv 파일을 BufferedReader로 읽어서 JPA save() 반복 호출로 저장합니다. 즉, 애플리케이션 런타임 시점에 csv 파일을 oui, vendor 정보로 파싱하여 일일이 save() 메서드를 호출하는 방식이었습니다. 하지만, 해당 방식은 매우 성능이 낮으며 이에 대한 첫 번째 대안으로는 saveAll() 메서드를 활용할 수 있습니다. 먼저, JPA에서 제공하는 sa..

Java/Spring 2025.05.22

[Effective Java] 6장. 열거 타입과 애너테이션

[item-34] int 상수 대신 열거 타입을 사용하라enum type 나오기 전에는 정수 열거 패턴(int enum pattern)을 사용해 왔습니다.public static final int APPLE_FUJI = 0;public static final int APPLE_PIPPIN = 1;public static final int ORANGE_NEVEL = 0;public static final int ORANGE_TEMPLE = 1; 위와 같은 정수 열거 패턴은 타입 안정성을 보장하기 어렵습니다.위의 대안으로 나온 것이 열거 타입입니다. 열거 타입public enum Apple { FUJI, PIPPIN, GRANNY_SMITH}public enum Orange { NAVEL, TEM..

Java/Effective Java 2025.05.20

[Effective Java] 5장. 제네릭

[item-26] 로 타입은 사용하지 말라 제네릭 타입: 클래스 혹은 인터페이스 선언에 타입 매개변수가 쓰이는 경우로 타입: 제네릭 타입에서 타입 매개변수를 사용하지 않는 것ex) List, Set ..(제네릭 타입) → List, Set제네릭 타입을 하나 정의하면 Raw Type도 함께 정의됩니다.Raw Type은 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 의미합니다.Raw Type은 타입 선언에서 제네릭 타입 정보가 전부 지워진 것처럼 동작합니다. 로 타입을 절대 쓰지 말자자바 언어 차원에서 로 타입 사용을 막지는 않았지만, 절대로 사용하지 말자로 타입을 쓰면 제네릭의 안정성과 표현력을 모두 잃게 됩니다.로 타입은 호환성 때문에 만들어졌습니다. 로 타입을 사용private final C..

Java/Effective Java 2025.05.17

[DB] Spring boot 2.x에서 기본으로 지원하는 HikariCP에 대해 알아보자

Spring boot 2.x 버전에서는 DB Connection Pool로 HikariCP를 지원합니다. 이를 통해 매번 Connection을 생성하지 않아도 되며, Connection Pool에서 Connection을 가져와 DB 연결 및 해제를 효율적으로 할 수 있게 됩니다. 우선 HikariCP가 무엇인지 설명드리고, 연관된 개념과 Connection Pool의 동작 과정에 대해 알아보겠습니다. HikariCP (HikariCP Connection Pool)DB Connection을 관리해 주는 도구Connection Pool이 설정된 connection의 사이즈만큼 연결을 허용하여 http 요청에 대해 순차적으로 db 커넥션을 처리해 주는 기능입니다.DB Connection Pool이며, Comm..

Java/Spring 2025.05.15

[Linux] ssh 원격 접속 실패 시 해결책 (WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!)

ssh로 원격 서버에 접속 시, 다음과 같은 로그가 발생하며 접속에 실패하였습니다. PS C:\Users\admin> ssh root@[ip]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!Someone could be eavesdropping on you right now (man-in-the-middle attack)!It is also po..

Linux 2025.05.14

[JMeter] Apache JMeter를 활용한 성능 테스트

실제 서비스를 운영하다보면 기능이 잘 동작하는지도 중요하지만, 얼마나 많은 요청을 안정적으로 처리할 수 있는지에 대해서도 고려해야 합니다. 그래서 실무에서는 기능 테스트 뿐만 아니라, 성능 테스트 또한 필수적인 과정이라고 생각합니다. 이 과정에 도움이 되는 도구인 JMeter는 JSP, Ajax와 같은 동적 리소스 뿐만 아니라, JavaScript, HTML 파일과 같은 정적 리소스의 성능을 측정할 수 있고, 동시성 및 부하 테스트를 지원합니다. 더불어 테스트에 대한 결과를 Report, Table, Tree, Graph 등 다양한 형태로 추출해줍니다. 이제 장점을 알았으니, JMeter의 개념 및 관련 용어와 설치 방법(Window OS 기준으로 설명), 테스트 과정에 대해 설명드리겠습니다. JMet..

Java/Spring 2025.04.18

[Intellij] JetBrains AI Assistant 사용 방법 및 후기

이번에 회사에서 JetBrains AI Assistant를 지원해 주면서 해당 Tool을 사용한 후기에 대해서 포스팅 해보려고 합니다.  AI Assistant란 JetBrains 사에서 만든 AI Tool 입니다. 반복적인 업무를 줄여주고 개발 효율성을 향상시켜줄 수 있는 좋은 기능입니다. 각종 소스코드의 분석, 최적화, 문서화, 단위 테스트코드까지 작성해 주는 기능을 지원합니다. 이에 더해 기존 ChatGPT처럼 단순 질의응답도 제공합니다. Al Assistant 가격- 가격은 개인으로 지불하려면 월에 약 $8를 지불해야 합니다. 설치 방법 Intellij JetBrains 계정에 해당 서비스가 활성화되어야 합니다. (저는 회사 라이선스라서 AI Pro로 되어 있습니다) Intellij에서 AI As..

기타 2025.04.10

[Spring] java 메모리에 존재하는 list 데이터 페이징 처리

프로그램 실행 중에만 존재하는 메모리 데이터에서의 Pagination은 JPA에서 제공하는 Page 객체를 활용하지 못하고, 페이징 처리를 위한 로직을 별도로 구현해줘야 합니다. 그래서 DB 조회 없이 메모리 내에서 List 데이터를 페이징처리 하기 위한 Util Class를 만들어봤습니다. 특정 Type에 의존하지 않고, 다양한 타입을 처리할 수 있도록 제네릭을 활용하였습니다.   public class PaginatedList { private List list; private List> listOfPages; private int pageSize = 10; private int currentPage = 0; public PaginatedList(List list, int ..

Java/Spring 2025.02.12

[Spring] @Formula annotation을 활용하여 count 조회 성능 개선

사내 애플리케이션에 장비와 사용자 수를 count 하는 쿼리가 존재했습니다. 조회 쿼리 성능을 개선하기 위함임은 알 수 있지만, 구체적으로 어떻게 동작하는지도 알아보려고 합니다. 더불어, 해당 어노테이션의 장점과 단점에 대해서도 상세히 설명드리겠습니다. @Formulaentity 내에서 실제로 db 스키마에 존재하지 않는 가상 컬럼 (jpa 상에서만 존재하고, 실제 db에 존재하지 않는 컬럼)을 정의할 수 있는 기능 다른 컬럼들의 값에 기반하여 계산된 값을 표현할 수 있으며, 엔티티를 조회할때만 계산되어 사용됩니다. (Read-Only)Default: EAGER 전략 이제 @Formula 어노테이션을 적용하였을 때 조회 쿼리와 lazy loading으로 size() 메서드를 호출하였을 때의 쿼리 차이를 ..

Java/Spring 2025.02.10