본문 바로가기

반응형

java

[Spring Boot] 🧠 GC 튜닝 없이도 가능한 JVM 메모리 최적화: 실무에서 바로 적용한 팁들 1. 왜 GC 튜닝보다 먼저 메모리 구조를 봐야 할까?Spring Boot 기반의 서비스가 일정 시간이 지나면 점점 느려지거나, 컨테이너 메모리 사용량이 예측 이상으로 올라가는 경험, 해보셨을 겁니다. 대부분은 "GC 튜닝 해야 하나?"라고 생각하지만, GC 로그를 아무리 봐도 정작 병목의 원인은 비효율적인 메모리 사용에 있는 경우가 많습니다.이번 글에서는 JVM 옵션 조정 없이도 메모리 낭비를 줄이고 성능을 개선했던 실전 팁들을 공유합니다. 2. 문제 상황: GC 튜닝 전에 놓치기 쉬운 흔한 패턴들❌ 문제 1: 반복 생성되는 불필요한 객체for (int i = 0; i ObjectMapper는 생성 비용이 크고 내부 캐시가 있음에도 매번 생성→ 결과적으로 Eden 영역에서 빠르게 차고, Minor G.. 더보기
[Java] 자료구조의 시간복잡도와 공간복잡도 소개 자바에서 제공되는 주요 자료구조들의 일반적인 시간 복잡도를 살펴보겠습니다. 시간 복잡도란 알고리즘이 입력 크기에 따라 어떻게 성장하는지를 나타내는 개념입니다. 알고리즘의 성능을 분석하고 비교하기 위해 사용됩니다. 일반적으로, 알고리즘의 수행 시간이나 실행 단계 수를 입력 크기에 대한 함수로 표현합니다. 자료구조 Array 공간 복잡도: O(n) 배열은 각 원소를 연속된 메모리 위치에 저장하므로 모든 원소를 저장하기 위해서는 배열의 크기에 비례한 메모리가 필요합니다. 접근 (Access) O(1) 검색 (Search) O(n) 삽입 (Insertion) O(n) - 평균적인 경우 삭제 (Deletion) O(n) - 평균적인 경우 LinkedList 공간 복잡도: O(n) 각 노드는 데이터와 다음 노.. 더보기
[Java] Jackson 라이브러리 사용법 Object to json Jackson 라이브러리란? Jackson 라이브러리는 Java 언어를 사용하여 JSON 데이터를 처리하고 Java 객체로 변환하거나 반대로 JSON으로 직렬화하는 데 사용되는 라이브러리입니다. Jackson의 장점 강력하고 유연한 JSON 데이터 처리 기능. 빠른 성능. 다양한 데이터 형식(JSON, XML, YAML)을 처리할 수 있음. 2. Jackson 기본 사용법 2.1. 의존성 설정 Maven 또는 Gradle을 사용하여 Jackson 라이브러리를 프로젝트에 추가. 2.2. 객체에서 JSON으로 직렬화 (Serialization) ObjectMapper를 사용하여 Java 객체를 JSON 문자열로 변환. @JsonProperty 어노테이션을 사용하여 JSON 필드 이름 지정. 2.3. JSON.. 더보기
[Java] 변수의 종류 변수의 종류 선언 위치 할당 시점 메모리 위치 메모리 시점 cv(class variable) static으로 선언된 변수 클래스 안 클래스가 메모리에 올라갔을때 Methods application 종료시 삭제 iv(intance variable) static이 선언되지 않은 변수 인스턴스가 생성되었을 Heap 해당 객체가 참조되지 않고 있을때 lv(local variable) 메소드 내부에서 선언된 변수 메소드 안 변수 선언문(method)이 수행 되었을때 Heap 메소드 동작후 삭제 변수의 종류 예제 코드이다. public class Variable { public static String cv = "Hyeon"; // 더보기
[Java] 접근 제어자(Access Modifier) 접근 제어자란 객체 지향 프로그램에서는 예약어를 사용해서 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정할 수 있다. 이러한 예약어를 접근 제어자라고 한다. private -> default -> protected -> public 순으로 많은 접근을 허용 접근 제어자 종류 public 접근제어자가 public으로 설정되었다면 public 접근제어자가 붙은 변수, 메소드는 어떤 클래스에서라도 접근이 가능하다. private 접근제어자가 private으로 설정되었다면 private 이 붙은 변수, 메소드는 해당 클래스에서만 접근이 가능하다. protected 접근제어자가 protected로 설정되었다면 protected가 붙은 변수, 메소드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은.. 더보기
[Spring Boot] ThreadPoolTaskExecutor 예제 @Bean("HyeonTaskExecutor") public TaskExecutor taskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(5); // 기본 스레드 수 taskExecutor.setMaxPoolSize(10); // 최대 스레드 수 return taskExecutor; } core와 max 사이즈를 설정할 수 있습니다. 여기서 주의할 점이 있습니다. 최초 core 사이즈만큼 동작하다가 더 이상 처리할 수 없을 경우 max 사이즈만큼 스레드가 증가할 것이라고 예상할 수 있지만 사실 그렇지 않다. . 내부적으로는 Integer.MAX_VALUE .. 더보기
[SpringBoot] HikariPool stats logging hikari pool의 connection을 확인해야 하는 경우가 있다. 상태 의 종류에는 active, idle, waiting가 있다. logback설정, application.properties 나 yml 설정을 통하여 HikariPool 의 로그를 출력할 수 있다. logback.xml application.properties logging.level.com.zaxxer.hikari=TRACE logging.level.com.zaxxer.hikari.HikariConfig=DEBUGapplication.yml logging: level: com.zaxxer.hikari.HikariConfig: DEBUG com.zaxxer.hikari: TRACE 더보기
DAO, DTO, VO란 DAO DAO(Data Access Object) 는 데이터베이스의 data에 접근하기 위한 객체입니다. DataBase에 접근 하기 위한 로직 & 비지니스 로직을 분리하기 위해 사용합니다. DTO DTO(Data Transfer Object) 는 계층 간 데이터 교환을 하기 위해 사용하는 객체로, DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)입니다. 유저가 입력한 데이터를 DB에 넣는 과정을 보겠습니다. 유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어서 전송합니다. 해당 DTO를 받은 서버가 DAO를 이용하여 데이터베이스로 데이터를 집어넣습니다. VO VO(Value Object) 값 오브젝트로써 값을 위해 쓰입니다. .. 더보기

반응형