Java 93

[Spring] application.yml과 docker-compose로 dev/prod 환경 분리

프로젝트에서 개발환경과 배포환경이 달라짐에 따라서 설정 파일을 분리해야 하는 경우가 있습니다.docker로 애플리케이션 환경을 구성할 경우에는 local에서는 db (redis, mariadb..)만 컨테이너로 구성하고, production 환경에서는 RDS와 같은 외부 db 서버를 따로 구축하지 않는다고 가정하고, spring boot까지 함께 DockerFile을 통해 빌드하고 띄울 수 있습니다. 대략적인 아키텍처를 설명드리고, application.yml, docker-compose 파일을 분리하는 과정에 대해 설명드리겠습니다. Architecture docker-compose-dev.ymlmysql, redis만 container로 구성합니다. 외부로 노출되서는 안 되는 db 접속정보, 외부 포트..

Java/Spring 2025.06.29

[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

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

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

Java/Spring 2025.04.18

[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

[Spring] Json 직렬화, 역직렬화

개발 중 Lazy Loading 된 객체에서 해당 소스코드가 존재했습니다.public String getRegionName() { return region == null ? null : region.getName();} Intellij에서 no usage로 해당 메서드를 사용하는 클래스가 존재하지 않았지만, 해당 정보를 가져올 수 있었습니다. 그 이유는 Json 직렬화, 역직렬화의 내부적인 동작과정 때문인데요. Json 직렬화, 역직렬화에 대해 알아보고 정리해 보도록 하겠습니다.  기본적으로 Spring Application을 구동하기 위한 의존성인 spring-boot-starter-web에 Json 직렬화 및 역직렬화를 할 수 있는 라이브러리가 내장되어 있습니다. (Jackson Library)..

Java/Spring 2024.12.24

[Java] Garbage Collection

Java 프로그램을 개발하다 보면 OutOfMemoryError을 마주하게 되는데, 이는 JVM Heap 메모리의 부족 현상에 밀접한 연관이 있는 에러입니다. 이를 해결하기 위해 Garbage Collection 과정이 발생하게 되는데 해당 개념과 동작원리, 알고리즘에 대해 알아보겠습니다.  Garbage Collection 메모리 관리 기술중 하나로서 JVM의 Heap 영역에서 동적으로 할당되었던 메모리 중 사용하지 않은 객체를 모아 주기적으로 제거하는 프로세스입니다. JVM의 메모리 구조중 일부인 Heap 영역에 관여하는 프로세스입니다. 뒷단에 내용을 수월하게 이해하기 위해 JVM Memory 구조를 설명드린 후 핵심 내용에 대해 알아보겠습니다. JVM Memory 구조Static (Method) 영..

Java 2024.12.05