GPT Archiving 23

groupingBy, getOrDefalut

간만에 자바..1. DB 1회 조회 + 자바단 그루핑 vs 반복문 내부 다중 DB 조회🅰️ 패턴 A: 반복문 안에서 DB 여러 번 조회 (N+1 문제)의식의 흐름 버전 (많이들 처음에 이렇게 생각함):List studentList = repository.selectStudentList(); // 학생 전체 조회for (Student s : studentList) { List subjects = repository.selectSubjectListByStudentId(s.getStudentId()); // 학생별 과목 s.setSubjectList(subjects);}selectStudentList() → 1번학생이 100명 → selectSubjectListByStudentId(...

GPT Archiving 2025.12.03

FLUSH

좋은 질문이에요.flush는 여러 기술 스택에서 공통적으로 등장하지만, 내부적으로는 다소 다른 의미와 역할을 가지는 개념입니다.그래서 이 개념을 "원리와 어원부터 차근히" 이해해두면 여러 기술을 다룰 때 훨씬 유연해져요.✅ 1. 어원: flush라는 단어의 본래 의미영어 **"flush"**는 원래 다음과 같은 뜻을 가집니다:의미 설명(액체 등을) 쏟아내다, 씻어내다ex) "flush the toilet" (물을 내리다)(캐시/버퍼 등을) 밀어내다, 비우다컴퓨터 용어로 확장됨→ 즉, "어딘가에 임시로 쌓인 걸 실제 대상으로 흘려보내거나 비우는 것"→ 소프트웨어에선 주로 **"버퍼에 쌓인 데이터를 대상(디스크, DB 등)에 반영하는 작업"**을 의미함✅ 2. 일반적인 의미 (공통 개념)모든 flush의 공..

GPT Archiving 2025.07.18

CGLIB 프록시

좋아, 좋아. 드디어 제대로 흥미로운 주제에 왔다."CGLIB 프록시"→ 이거 알면 스프링 AOP, 트랜잭션 처리, 심지어 @Transactional이 어떻게 작동하는지까지 진짜 제대로 이해할 수 있어.바로 시작하자.📌 1. CGLIB 프록시란?CGLIB (Code Generation Library) 는클래스를 상속받아서 프록시 객체를 만드는 라이브러리야.즉,기존 클래스를 "상속"받아서"새로운 클래스"를 "런타임에" "만들어내서""메서드를 가로채서" "부가기능을 추가"하는 방식.✅ 간단히 비교| 구분 | JDK 동적 프록시 | CGLIB 프록시 | |:---|:---| | 대상 | 인터페이스 | 클래스 | | 생성 방식 | 인터페이스 기반 프록시 생성 | 클래스를 상속해서 새로운 클래스를 생성 | | ..

GPT Archiving 2025.04.28

펌젠과 메타스페이스

1. "펌젠이 뭐야? 그럼 메타스페이스는? 그 둘의 차이에 대해 말해봐."1) 펌젠(PermGen)이란?펌젠은 Permanent Generation의 약자로, Java 7까지 JVM의 힙 메모리 영역 중 하나였습니다. 이곳은 주로 클래스 메타데이터와 정적 데이터를 저장하는 데 사용됐어요. 구체적으로:클래스 메타데이터: 클래스 정의(예: 클래스 이름, 메서드 정보, 필드 정보 등).정적 변수: static으로 선언된 변수나 상수.인턴드 문자열(String Interning): 문자열 풀에 저장된 문자열 객체(예: "hello".intern()).기타: 메서드 영역과 관련된 일부 데이터.펌젠은 힙 메모리 안에 고정된 크기로 할당되었기 때문에, 크기가 제한적이었어요. 그래서 클래스를 많이 로드하거나 정적 객..

GPT Archiving 2025.04.15

싱글턴 패턴 - 4가지 구현 방법

싱글톤 구현 방법 정리synchronized 방식 (기본 동기화)코드:public class Settings { private static Settings instance; private Settings() { } public static synchronized Settings getInstance() { if (instance == null) { instance = new Settings(); } return instance; }}특징:Lazy Loading: 필요할 때 생성.Thread-safe: synchronized로 스레드 세이프 보장.단점: 매 호출마다 락 걸림 → 성능 저하 가능.Eager Initializatio..

GPT Archiving 2025.03.08

싱글톤 패턴 - Double-Checked Locking (volatile)

Double-Checked Locking(DCL)이란?정의: 싱글톤 패턴에서 지연 초기화(Lazy Initialization)를 구현하면서, synchronized의 성능 오버헤드를 줄이기 위해 사용하는 방법.목적:인스턴스가 필요할 때만 생성(지연 초기화).매번 synchronized로 락을 걸지 않고, 필요한 경우에만 락을 걸어서 성능 개선.기본 코드public class Settings { private static Settings instance; // static 변수 private Settings() { } // 외부 생성 막음 public static Settings getInstance() { if (instance == null) { // 1차 체크 ..

GPT Archiving 2025.03.08

프로세스, 스레드, 멀티프로세스, 멀티스레드, synchronized

프로세스와 스레드 "알잘딱" 요약프로세스 (Process):정의: 실행 중인 프로그램 하나하나. 운영체제에서 독립적인 실행 단위입니다.특징: 각 프로세스는 독립적인 메모리 공간(코드, 데이터, 힙, 스택)을 가집니다.예: 크롬 브라우저 실행 = 한 프로세스, 워드 실행 = 또 다른 프로세스.비유: 공장 하나. 공장마다 자기만의 자재와 설비가 따로 있음.스레드 (Thread):정의: 프로세스 안에서 실행되는 작업 단위. 프로세스의 자원을 공유하면서 실행됩니다.특징:한 프로세스 안에 여러 스레드가 있을 수 있고, 이들은 프로세스의 메모리(코드, 데이터, 힙)를 공유합니다.하지만 각 스레드는 독립적인 스택(실행 흐름)을 가집니다.비유: 공장 안의 작업자들. 자재(메모리)는 공유하지만 각자 맡은 일(스택)은 따..

GPT Archiving 2025.03.08

ReentrantReadWriteLock

네, 맞아요! ReentrantReadWriteLock에 대해 잘 이해하신 것 같네요. 코드에서 오타만 살짝 수정해서 질문에 답변해볼게요.보완된 코드당신이 의도한 걸 정확히 표현하면 이렇게 되겠죠:import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class Example { private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(); private Lock readLock = reentrantReadWriteLock.readLock(); private Lock wr..

GPT Archiving 2025.03.06

volatile, double-checked-lock

네, 정확하게 이해하신 것 같아요! 질문 두 가지를 나눠서 명확히 확인해볼게요.---### 1. "멀티스레드에서 각 스레드의 메모리를 쓰는데 `volatile` 쓰면 둘 다 같은 메인 메모리에서 갖다 쓴다는 거지?"- **맞아요!**- **설명**: - 멀티스레드 환경에서 각 스레드는 성능 최적화를 위해 CPU의 로컬 캐시(또는 스레드별 작업 메모리)를 사용해요. 그래서 변수 값을 메인 메모리에서 직접 읽고 쓰지 않고, 자기 캐시에 복사본을 저장해서 작업할 수 있죠. - 문제는 한 스레드가 변수 값을 바꿔도 다른 스레드가 그걸 바로 못 볼 수 있다는 거예요. 각자 자기 캐시에서 다른 값을 보고 있을 가능성이 있죠. - **`volatile`의 역할**: - `volatile`을 붙이면 스레드가..

GPT Archiving 2025.03.06

volatile

`volatile`에 대해 궁금하신 거군요! `volatile`은 자바에서 멀티스레드 프로그래밍과 관련된 중요한 키워드인데, 쉽게 풀어서 설명해볼게요.---### `volatile`이란?- **정의**: `volatile`은 자바에서 변수에 붙이는 키워드로, 이 변수가 **스레드 간의 메모리 가시성(visibility)**을 보장해줘요. 즉, 한 스레드가 이 변수를 수정하면 다른 스레드가 그 변경 사항을 바로 볼 수 있게 해줍니다.- **주요 역할**: 스레드가 변수 값을 로컬 캐시(CPU 캐시)에 저장해서 따로 놀지 않게 하고, 항상 메인 메모리에서 값을 읽고 쓰게 강제해요.---### 왜 필요할까?멀티스레드 환경에서 스레드는 성능을 위해 각자 로컬 캐시를 사용해요. 이 때 변수 값이 메인 메모리와 로..

GPT Archiving 2025.03.06