2025/04 22

Java 대용량 데이터 처리 (4) - 비동기 데이터 수집

4. 즉시저장 → 모아서 저장 (비동기 데이터 수집)즉시 저장 vs 모아서 저장 (비동기 처리)즉시 저장은 데이터가 들어올 때마다 매번 DB에 저장하는 방식.하지만 대량의 트래픽이 발생하면 DB 부하가 급격히 증가하고, 성능 저하 발생 가능.모아서 저장 (비동기 처리)는 데이터를 메모리 큐 등에 임시로 저장하고,일정 수 이상이 모이거나 일정 시간이 지나면 한꺼번에 DB에 저장.이를 통해 시스템 부하를 줄이고, 응답 속도를 빠르게 유지할 수 있음.비동기 처리 예제Bad case: 동기 처리public class SynchronousSave { public void saveData(Data data) { // 요청이 들어오자마자 즉시 DB 저장 saveToDatabase(dat..

CS 정리 2025.04.29

Java 대용량 데이터 처리 (3) - 비동기 처리

3. 즉시응답 -> 비동기 예약 (10만 건 엑셀 다운로드)즉시 응답 vs 비동기 예약 처리즉시 응답은 사용자가 요청을 보낸 후 즉시 결과를 반환하는 방식. 그래서 대용량 데이터 처리 시 서버에 큰 부담을 주고, 응답 속도가 지연.비동기 예약은 사용자가 요청을 보내면 즉시 예약을 하고, 실제 데이터 처리 작업은백그라운드에서 비동기적으로 처리. 이 방식은 서버 과부하를 방지하고, 사용자가 요청 상태를 기다리지 않아도 됨. (추후 알림 등 기능과 연계하여 요청완료)비동기 처리 예제Bad case: 동기 처리public class SynchronousProcessing { public void processData() { // 대용량 데이터 처리 processLargeData()..

CS 정리 2025.04.27

Java wrapper class and caching, boxing & unboxing

1. wrapper class기본 자료형(Primitive Type)을 객체(Reference Type) 로 감싸서 다룰 수 있는 클래스byte -> Byte, int -> Integer, char -> Character, boolean -> Boolean 등 왜 필요한가?기본 자료형을 객체로 사용해야하는 경우 필요함. 1. java의 많은 기능들은 객체(Object)를 통해 사용할 수 있도록 설계되어 있음. 그래서 Object의 자식이 아닌 기본 자료형을 사용할 수 없고 wrapper 를 통해 사용함.Collections, Generic, Reflection , Annotaion 등 2. wrapper 는 기본 제공 기능이 있어 유용함.equals(), parseInt(), toString(), com..

CS 정리 2025.04.24

Java 대용량 데이터 처리 (2) - Stream 메모리 효율 높이기

2. List -> Stream (장기간 저장된 로그 분석) Stream 처리 예제Bad case : 모두 조회, 모두 처리List logs = logRepository.findAll(); // 100만 건logs.forEach(this::analyze);OutOfMemoryError 발생 위험GC 부하응답속도 지연 Stream 처리란?데이터를 한 번에 다 불러오지 않고, 하나씩 처리하면서 다음 데이터를 읽는 방식List에 모두 올리지 않기Iterator처럼 지연(Lazy) 처리Good case : stream으로 하나씩 처리@QueryHints(value = @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_FETCH_SIZE, value = "1000"))@..

CS 정리 2025.04.20

Java 대용량 데이터 처리(1) - Cursor 방식

1. 한 번에 처리하기 -> 작게 나눠서 천천히 처리하기Cursor-based 예제Bad case : 모두 조회, 모두 처리List allData = repository.findAll();processAll(allData);Good case : Cursor 방식으로, 배치 사이즈로 조회하여, 부분처리Long lastId = 0L;int batchSize = 1000;while (true) { List batch = repository.findBatch(lastId, batchSize); if (batch.isEmpty()) break; processAll(batch); lastId = batch.get(batch.size() - 1).getId();}@Query(value = "SE..

CS 정리 2025.04.20

Java 대용량 데이터 처리(0)

Java에서 대용량 데이터란 무엇인가?1) 한 번에 메모리에 올리기 어렵다.2) 처리/응답 속도가 저하된다.3) I/O 병목 발생4) GC 부하 발생5) DB 부하 발생 * 성능에 영향을 줄 만큼 크거나 빈번한 데이터를 의미함.그러므로, "절대 크기"보다는 "시스템 리소스 대비 상대적"인 성격을 가진다. Java에서 대용량 데이터 처리 방안은 무엇인가?1. 한 번에 처리하기 -> 작게 나눠서 천천히 처리하기 (1년치 주문 데이터 정산)2. List -> Stream (장기간 저장된 로그 분석)3. 즉시응답 -> 비동기 예약 (10만 건 엑셀 다운로드)4. 즉시저장 -> 모아서 저장 (비동기 데이터 수집)5. DB만 사용 -> DB와 캐시와 계층구조 활용 (상품 상세정보 조회)6. 싱글 쓰래드 -> 멀티..

CS 정리 2025.04.19

객체지향 이해하기

(내가 나를 가르치는 글이라 반말입니다)자동차가 가진 속성이 뭘까? 색상, 브랜드, 제조일자, 몇인승, 튜닝여부, 현재 속도, 운전중/주차중, 키로 수, 연료량 등행위는? 가속하기, 정지하기, 멈추기, 주유하기, 세차하기, 수리하기 등이 있을것이다클래스로 만들어보자public class Car { private String name; private int speed; public Car(String name) { this.name = name; this.speed = 0; } public void accelerate() { speed += 10; System.out.println(name + " 차 가속! 속도: " + speed);..

Idea 2025.04.16

제조업 경험을 도메인으로(5) - MES/MSA 자재 관리 설계

자재 관리 주요 업무2주 단위 생산 계획에 필요한 자재의 충분 여부 점검부족한 자재에 대해 구매 요청 등록 및 승인 흐름 수행불량 자재에 대해 교체 신청 등록 및 처리 흐름 관리(추가) 생산 계획 기준으로 필요한 자재 소요량 자동 산정 및 수급 가능 여부 판단(추가) 자재 사용 예약 등록 (생산 Lot에 대한 자재 Lot 할당 요청)(추가) 생산 공정에 실제로 사용된 자재 Lot 이력 등록(추가) 자재 상태(WMS 제공) 기반으로 생산 사용 가능 여부 판단(추가) 불량 자재 발생 시, 해당 생산 계획/공정/품질 결과에 미치는 영향 추적(추가) 구매 요청 및 교체 요청 처리 현황에 대한 상태 추적 (진행 중 / 완료 등)설계 목적생산 계획과 자재 수급 상황의 정합성을 확보하여 생산 지연 요소를 사전에 방지..

STW, Stop the world 제어하기

GC에 대해 공부하다보니, 어떻게 좋은 성능으로 최적화 할 수 있을까? 감지 방법과 해결 방법에 대해 알아보자 !감지 하기GC 성능이 나쁜 상황은 다음과 같다.GC 시간이 길다/ Throughput이 낮다 : GC Pause Time이 100ms 이상 반복적으로 발생, GC Time 비율이 전체 10% 이상Minor GC/ Major GC/ Full GC가 잦다 : Minor GC가 초에 수 회 반복, Full GC 가 분단위로 발생Promotion Failure 발생: Full GC 발생 가능성 상승CPU 사용률이 GC에 쏠림OutOfMemoryError 발생= 장애상황어떻게 알 수 있을까?로그 분석 또는 모니터링 도구 활용할 것 ( VisualVM, GCViewer, Prometheus + Grafa..

CS 정리 2025.04.13

메세지 큐, Message Queue

메세지 큐, Message Queue비동기 메시지 기반 통신 방식, 한쪽에서 메세지를 보내면 다른 한 쪽에서 꺼내서 처리하는 구조를 말함. 동작원리생산자(Produce) -> 메세지 발행 -> 큐(Queue) -> 메세지 대기 -> 소비자(Consumer) -> 메세지 처리 -> 큐(Queue) -> ACK/NACK 매커니즘으로 성공 실패 분류, 성공 시 삭제/ 실패 시 옵션처리생산자 : 메세지를 큐에 넣는 주체큐 : 메세지를 임시 저장하는 중간 저장소소비사 : 메세지를 꺼내 처리하는 주체특징생산자와 소비자가 직접 통신하지 않고 큐를 통해 간접적으로 연결됨. 이러한 구조를 통해 시스템 간 결합도를 낮추고 유연성을 높일 수 있음. 종류RabbitMQApache KafkaAmazon SQS (Simple Q..

CS 정리 2025.04.13