인기 글
최신 글
Java 레거시 SQL을 Python으로 옮겼더니 5초나 걸렸다: 0.5초로 줄인 5가지 최적화
FastAPI 💨2026.03.24 12:07Java 레거시 SQL을 Python으로 옮겼더니 5초나 걸렸다: 0.5초로 줄인 5가지 최적화

Java 레거시 환경의 입출결 조회 API를 Python(FastAPI + SQLAlchemy)으로 마이그레이션하면서 예상치 못한 성능 저하를 겪었어요.기능은 완전히 동일한데도, 학생 118명 기준 응답 시간이 약 5초나 걸렸죠. 처음엔 "비동기 프레임워크를 썼는데 왜 더 느려졌을까?"라는 의문부터 들었어요. 하지만 병목 구간을 추적해 보니 프레임워크 자체의 문제는 아니었습니다. 레거시 SQL 패턴을 그대로 가져온 점, 실행 계획과 어긋난 인덱스, 불필요한 데이터 조회, 그리고 비동기 환경에 맞지 않는 세션 관리가 복합적으로 얽혀 있었거든요. 이번 글에서는 단순히 쿼리 하나를 튜닝한 경험을 넘어, SQL 패턴과 실행 계획부터 인덱스, 애플리케이션의 호출 구조까지 전반적으로 개선해 응답 시간을 5초에서 0..

JVM GC는 죽은 객체를 어떻게 판별할까요?
Java ☕️2026.03.16 17:04JVM GC는 죽은 객체를 어떻게 판별할까요?

GC(Garbage Collection)를 처음 접하면 흔히 '사용하지 않는 메모리를 자동으로 지워 주는 기능'이라고 생각하기 쉬워요. 틀린 말은 아니지만, 이 설명만으로는 GC의 진짜 핵심을 놓칠 수 있습니다. GC의 진정한 출발점은 메모리를 비우는 동작 자체가 아니라, 무엇을 회수 대상으로 볼 것인지 판단하는 일에 있기 때문이죠. 메모리에서 어떤 객체를 회수하려면 먼저 그 객체가 더 이상 쓰이지 않는다고 판정해야 해요. 즉, GC를 제대로 이해하려면 가장 먼저 죽은 객체란 무엇인가?를 정의해야 합니다.이 판정 기준이 명확히 서야 비로소 실제 수거 알고리즘이 의미를 가지거든요. 이번 글에서는 객체의 생사 판정 기준을 시작으로, JVM의 메모리 관리 전략을 단계별로 알아볼게요. 💡 이 글에서 다룰 내용..

나만의 MCP 서버 만들고 npm에 배포하기 (feat. velog-mcp)
인공지능 🧠2026.03.11 23:36나만의 MCP 서버 만들고 npm에 배포하기 (feat. velog-mcp)

최근 AI를 활용한 개발 워크플로우, 이른바 '바이브 코딩(Vibe Coding)'이 대세로 자리 잡았어요.자연스럽게 AI 모델에게 내 프로젝트나 외부 서비스의 정확한 컨텍스트를 제공하는 일이 핵심 경쟁력이 되었죠.이때 등장한 표준 규격이 바로 MCP(Model Context Protocol)입니다. 공식 API가 없는 서비스라도 브라우저가 할 수 있는 일이라면, 코드로 구현해 AI의 새로운 능력으로 확장할 수 있어요.저는 이 방식을 응용해서 AI가 제 Velog 계정에 직접 접근해 글을 읽고 쓸 수 있는 velog-mcp를 개발하고 npm에 배포했습니다. 이번 글에서는 가장 기초적인 MCP 서버 구현부터 npm 오픈소스 배포, 그리고 실전 응용 인사이트까지 단계별로 알아볼게요. 💡 이 글에서 다룰 내..

JVM 메모리 장애 분석: OutOfMemoryError와 StackOverflowError를 제대로 이해하기
Java ☕️2026.03.09 18:40JVM 메모리 장애 분석: OutOfMemoryError와 StackOverflowError를 제대로 이해하기

💡 이 글을 읽으면 알 수 있는 것메모리 장애가 발생했을 때 힙부터 의심하는 습관에서 벗어날 수 있어요.OutOfMemoryError와 StackOverflowError의 차이와 발생 원인을 명확하게 이해할 수 있어요.힙, 스택, 메서드 영역, 다이렉트 메모리처럼 JVM 메모리 영역별 문제의 특징과 대응 방향을 정리할 수 있어요. JVM에서 발생하는 메모리 문제가 모두 같은 종류는 아니에요.힙에 객체가 과도하게 쌓이면 OutOfMemoryError가 발생하고, 호출 스택이 지나치게 깊어지면 StackOverflowError가 발생해요.때로는 다이렉트 메모리처럼 힙 바깥 영역이 한계에 도달하면서 문제가 드러나기도 해요. 실무에서는 이런 장애를 만나면 흔히 “메모리가 부족하다”라고 해석하기 쉬워요.하지만 ..

자바 객체는 메모리에 어떻게 배치될까요? 객체 생성 과정과 메모리 레이아웃
Java ☕️2026.03.09 14:18자바 객체는 메모리에 어떻게 배치될까요? 객체 생성 과정과 메모리 레이아웃

💡 이 글에서 다루는 내용new 키워드가 실행될 때 JVM 내부에서 어떤 과정이 순서대로 일어나는지 살펴봐요.자바 객체가 단순한 필드 값의 묶음이 아니라, 객체 헤더와 패딩까지 포함한 구조라는 점을 이해해요.객체의 실제 메모리 구조를 바탕으로 GC가 어떻게 동작하는지, 메모리 누수가 왜 생기는지 추정하는 감각을 익혀봐요.이전 글에서는 JVM 메모리 영역의 큰 그림을 살펴봤어요.메서드 영역에는 클래스 메타데이터가 올라가고, 스택에는 메서드 호출 문맥이 쌓이며, 힙에는 객체와 배열이 생성돼요. 하지만 “객체는 힙에 생성된다”는 설명만으로는 객체를 충분히 이해하기 어려워요.객체는 힙의 한 칸에 놓인 단순한 데이터 덩어리가 아니에요.JVM은 객체를 만들 때 먼저 어떤 클래스의 인스턴스인지 확인하고, 필요한 메..

자바 메모리 구조: 힙만으로는 부족한 JVM 런타임 데이터 영역 이해하기
Java ☕️2026.03.09 00:53자바 메모리 구조: 힙만으로는 부족한 JVM 런타임 데이터 영역 이해하기

💡 이 글을 읽으면 알 수 있는 것OOM이나 StackOverflowError가 발생했을 때, 힙 외에 어떤 영역을 확인해야 하는지 알 수 있어요.스레드마다 따로 만들어지는 영역과 모든 스레드가 함께 사용하는 영역의 차이를 이해할 수 있어요.JVM이 자바 프로그램을 실행할 때 메모리를 어떻게 나누어 관리하는지 전체 그림을 그릴 수 있어요.자바 메모리를 이야기할 때 가장 먼저 떠오르는 것은 보통 힙(Heap)과 가비지 컬렉션(Garbage Collection, GC)이에요.실제로 많은 객체가 힙에 생성되고, GC도 주로 힙을 기준으로 동작하므로 이 관점은 중요해요. 하지만 자바 프로그램의 실행 과정을 힙만으로 설명하기는 어려워요.메서드 호출은 스택(Stack)에서 관리하고, 현재 실행 중인 명령어 위치는..

Backend
Java 레거시 SQL을 Python으로 옮겼더니 5초나 걸렸다: 0.5초로 줄인 5가지 최적화
Java 레거시 SQL을 Python으로 옮겼더니 5초나 걸렸다: 0.5초로 줄인 5가지 최적화
FastAPI 💨
2026.03.24 12:07
Java 레거시 환경의 입출결 조회 API를 Python(FastAPI + SQLAlchemy)으로 마이그레이션하면서 예상치 못한 성능 저하를 겪었어요.기능은 완전히 동일한데도, 학생 118명 기준 응답 시간이 약 5초나 걸렸죠. 처음엔 "비동기 프레임워크를 썼는데 왜 더 느려졌을까?"라는 의문부터 들었어요. 하지만 병목 구간을 추적해 보니 프레임워크 자체의 문제는 아니었습니다. 레거시 SQL 패턴을 그대로 가져온 점, 실행 계획과 어긋난 인덱스, 불필요한 데이터 조회, 그리고 비동기 환경에 맞지 않는 세션 관리가 복합적으로 얽혀 있었거든요. 이번 글에서는 단순히 쿼리 하나를 튜닝한 경험을 넘어, SQL 패턴과 실행 계획부터 인덱스, 애플리케이션의 호출 구조까지 전반적으로 개선해 응답 시간을 5초에서 0..
Spring Boot에서 PostgreSQL Master–Slave Replication 적용하기
Spring Boot에서 PostgreSQL Master–Slave Replication 적용하기
Spring 🌱
2025.11.27 19:09
오늘은 Replication이 구성된 PostgreSQL 환경에서 Spring Boot가 Master(Write) 와 Slave(Read) 를 자동으로 구분해 사용하는 방법을 설명해볼게요. Spring Boot는 기본적으로 다중 데이터소스를 자동 구성하지 않으므로, Master/Slave 분리를 위해 다음 작업이 필요합니다.Master / Slave 각각 별도의 DataSource 정의트랜잭션의 readOnly 여부에 따른 DB 라우팅AbstractRoutingDataSource를 활용한 동적 선택LazyConnectionDataSourceProxy로 실제 커넥션 생성 시점에 데이터소스 결정이 과정을 완료하면 Spring Boot는 읽기 요청은 Slave, 쓰기 요청은 Master 로 자동 라우팅하여 안..
Spring에서 ServiceImpl, 정말 써야 할까요?
Spring에서 ServiceImpl, 정말 써야 할까요?
Spring 🌱
2024.06.14 12:04
안녕하세요! 최근에 본 한 유튜브 영상을 계기로 정리해보고 싶은 이야기가 있어 글을 쓰게 되었어요.아래 영상은 제가 개인적으로 존경하는 개발자 제미니님 채널의 콘텐츠인데요.영상을 보고 나서 “아… 나는 지금까지 너무 관성적으로 개발해온 건 아닐까?” 하는 생각이 강하게 들더라고요.그래서 이번 글에서는 ServiceImpl 패턴을 당연하게 사용하는 관행을 한 번 돌아보고자 해요.가볍게 읽어주세요. (영상을 함께 보시면 더 좋아요!) 이 글에서 이야기할 내용ServiceImpl 패턴이 무엇이며, 왜 스프링에서 거의 국룰처럼 쓰이게 되었는지이 패턴이 실제로 제공하는 장점은 무엇인지그런데도 왜 “무조건 쓰지 말자”는 말이 나오는지마지막으로, 언제 인터페이스를 도입하는 것이 진짜 가치 있는 선택인지결론부터 말씀드..
Redis 캐싱으로 API 성능 개선하기
Redis 캐싱으로 API 성능 개선하기
Spring 🌱
2024.04.01 17:26
이길어때 프로젝트의 장소 상세 화면에서는 리뷰 개수, 댓글 수, 좋아요 수, 평균 평점 등 여러 집계 정보가 필요합니다. 그런데 이 값들을 계산할 때마다 여러 개의 COUNT 쿼리가 실행되면서 DB 부담이 점점 커지는 문제가 생겼습니다. 이 글에서는 이 문제를 Redis 캐싱으로 어떻게 해결했는지, 그리고 마지막에 Spring Cache 추상화(@Cacheable)를 적용해 비즈니스 로직을 깔끔하게 정리한 과정을 소개합니다. 이 글을 읽으면 다음 내용을 알 수 있을거에요Count 기반 데이터를 언제 캐싱하면 좋은지Spring + Redis로 Cache-Aside 패턴을 구현하는 방법Spring Cache 추상화를 활용해 캐시 로직을 서비스 코드에서 분리하는 실전 패턴 문제 상황: 장소 상세 화면에 반복되..
Spring SSE와 Redis Pub/Sub으로 구현하는 실시간 알림 (다중 서버 환경까지 스케일링하기)
Spring SSE와 Redis Pub/Sub으로 구현하는 실시간 알림 (다중 서버 환경까지 스케일링하기)
Spring 🌱
2024.03.19 12:38
제가 개발 중인 이길어때 프로젝트는 최근 SNS 서비스 형태로 확장되고 있습니다.SNS라면 빠질 수 없는 기능이 바로 실시간 알림이죠.좋아요, 댓글, 팔로우 같은 사용자 행동을 바로 알려주면 서비스의 사용성이 크게 좋아지기 때문입니다이번 글에서는 Spring에서 SSE(Server-Sent Events) 로 실시간 알림 기능을 구현하는 방법과,운영 환경에서 실제로 마주쳤던 다중 서버 환경 문제를 Redis Pub/Sub으로 해결한 경험을 정리했습니다. 이 글을 읽으면 다음과 같은 내용에 대한 이해를 얻을 수 있을거에요 :)폴링 / 웹소켓 / SSE 중 알림 시스템에 적합한 방식 고르기Spring SseEmitter로 SSE 알림 구현하기다중 WAS 환경에서 SSE가 겪는 구조적 한계Redis Pub/Su..
스프링 컨테이너 이해하기: BeanFactory와 ApplicationContext
스프링 컨테이너 이해하기: BeanFactory와 ApplicationContext
Spring 🌱
2024.03.12 19:10
스프링의 의존성 주입(DI)을 이해하려면 먼저 스프링 컨테이너(Spring Container) 가 어떤 역할을 하는지 파악하는 것이 중요합니다.스프링 컨테이너는 객체(Bean)를 생성하고 관리하며, 필요한 의존관계를 연결해주는 핵심 엔진입니다. 이번 글에서는 스프링 컨테이너의 기본 개념부터 시작해 BeanFactory와 ApplicationContext의 차이, 그리고 실무에서 ApplicationContext가 사실상 표준으로 쓰이는 이유까지 차근차근 살펴보겠습니다. 이 글을 읽고 나면 다음 내용을 이해할 수 있을거에요Spring Container가 무엇이며 어떤 역할을 하는지BeanFactory와 ApplicationContext의 기능과 차이점ApplicationContext가 실무에서 기본 컨테이..
Spring MVC에서 HandlerMapping과 HandlerAdapter를 나눈 이유
Spring MVC에서 HandlerMapping과 HandlerAdapter를 나눈 이유
Spring 🌱
2024.02.07 22:15
Spring MVC로 개발하다 보면 HandlerMapping, HandlerAdapter, DispatcherServlet 같은 용어를 자주 마주하게 됩니다.하지만 DispatcherServlet이 컨트롤러를 호출하기까지 왜 두 단계를 거쳐야 하는지는 구조를 직접 들여다보기 전에는 쉽게 이해하기 어렵습니다. 최근 진행하고 있는 기술 스터디에서 Spring Web MVC의 요청 처리 흐름을 살펴보던 중“HandlerMapping이 이미 컨트롤러를 찾았는데, 왜 바로 호출하지 않을까?”,“그렇다면 HandlerAdapter는 어떤 역할 때문에 필요한 걸까?”라는 궁금증이 생겼습니다. 이 글을 그 질문에 대한 답을 정리하면서, Spring MVC 요청 처리 구조를 이해하는 데 도움이 되고자 작성해보았습니다...
이벤트 기반으로 파일 업로드 기능 구현하기
이벤트 기반으로 파일 업로드 기능 구현하기
Spring 🌱
2024.02.07 20:21
로그인 기능을 개발한 뒤 멤버 도메인의 CRUD를 구현하면서, 마이페이지에 프로필 이미지를 업로드하는 기능이 필요해졌습니다. 초기에는 서비스 클래스에 파일 업로드 로직을 직접 포함했지만, 곧 여러 문제가 드러났습니다. 서비스 간 결합도가 높아지고, 멀티 모듈 환경에서 공통 모듈 의존성이 커졌으며, 파일 업로드를 동기적으로 처리해야 하는 부담도 생겼습니다. 오늘은 해당 파일 업로드 기능을 서비스 기반 구조에서 이벤트 기반 비동기 구조로 리팩터링하는 과정을 작성해보았어요. 이를 통해 서비스 중심 파일 업로드 방식의 한계를 이해하고, Spring의 ApplicationEvent와 @EventListener를 활용해 결합도를 낮춘 비동기 파일 업로드 구조를 설계하고 구현하는 방법을 설명해볼게요. 문제 상황: 마..
전략 패턴으로 확장성 있게 소셜 로그인 설계하기
전략 패턴으로 확장성 있게 소셜 로그인 설계하기
Spring 🌱
2024.02.07 18:51
여러 소셜 로그인(카카오, 네이버, 구글, 페이스북 등)을 지원하다 보면 컨트롤러에 유사한 로그인 코드가 반복되거나, if-else·switch 문이 길어져 유지보수가 어려워지기 쉽습니다. 이 글에서는 다음 내용을 다룹니다.여러 소셜 로그인을 하나의 엔드포인트로 통합하는 방법로그인 방식별로 전략 패턴(Strategy Pattern)을 적용해 확장 가능한 구조를 만드는 방법새로운 소셜 로그인이 추가되더라도 컨트롤러를 수정하지 않고 확장하는 설계 방식예제 코드는 Spring 기반의 REST API를 기준으로 작성했습니다. 요구사항 및 초기 상황프로젝트에서 로그인 기능을 맡았고, 사용자 경험을 높이기 위해 다양한 소셜 로그인을 제공하기로 했다고 가정해 보겠습니다. 지원 대상: 카카오, 네이버, 페이스북, 구글..
Spring Boot 프로젝트에 PostGIS 적용하기: 위치 정보 관리를 위한 DB
Spring Boot 프로젝트에 PostGIS 적용하기: 위치 정보 관리를 위한 DB
Spring 🌱
2024.02.07 16:08
이 문서는 진행한 사이드 프로젝트에서 여행 경로와 위치 데이터를 저장하고 조회하기 위해 PostGIS를 적용한 전체 과정을 정리한 가이드입니다.PostGIS를 선택한 이유부터 Docker 기반 설치, Spring Boot 연동, 주요 공간 함수 활용까지 전체 흐름을 처음부터 끝까지 설명합니다. 이 글을 통해 다음 내용을 적어보았어요PostGIS를 선택한 이유와 그 장점PostgreSQL + PostGIS 설치 과정Spring Boot 환경에서 Geometry 타입 매핑 및 설정 방법주요 공간 함수(ST_DWithin, ST_MakeLine 등) 사용 예제PostGIS 적용 중 마주한 문제와 그 해결 팁 배경현재 이길어때라는 프로젝트를 진행하고 있으며, 핵심 요구사항은 사용자가 다녀온 여행 코스를 기록하고..
Programming
JVM GC는 죽은 객체를 어떻게 판별할까요?
JVM GC는 죽은 객체를 어떻게 판별할까요?
Java ☕️
2026.03.16 17:04
GC(Garbage Collection)를 처음 접하면 흔히 '사용하지 않는 메모리를 자동으로 지워 주는 기능'이라고 생각하기 쉬워요. 틀린 말은 아니지만, 이 설명만으로는 GC의 진짜 핵심을 놓칠 수 있습니다. GC의 진정한 출발점은 메모리를 비우는 동작 자체가 아니라, 무엇을 회수 대상으로 볼 것인지 판단하는 일에 있기 때문이죠. 메모리에서 어떤 객체를 회수하려면 먼저 그 객체가 더 이상 쓰이지 않는다고 판정해야 해요. 즉, GC를 제대로 이해하려면 가장 먼저 죽은 객체란 무엇인가?를 정의해야 합니다.이 판정 기준이 명확히 서야 비로소 실제 수거 알고리즘이 의미를 가지거든요. 이번 글에서는 객체의 생사 판정 기준을 시작으로, JVM의 메모리 관리 전략을 단계별로 알아볼게요. 💡 이 글에서 다룰 내용..
JVM 메모리 장애 분석: OutOfMemoryError와 StackOverflowError를 제대로 이해하기
JVM 메모리 장애 분석: OutOfMemoryError와 StackOverflowError를 제대로 이해하기
Java ☕️
2026.03.09 18:40
💡 이 글을 읽으면 알 수 있는 것메모리 장애가 발생했을 때 힙부터 의심하는 습관에서 벗어날 수 있어요.OutOfMemoryError와 StackOverflowError의 차이와 발생 원인을 명확하게 이해할 수 있어요.힙, 스택, 메서드 영역, 다이렉트 메모리처럼 JVM 메모리 영역별 문제의 특징과 대응 방향을 정리할 수 있어요. JVM에서 발생하는 메모리 문제가 모두 같은 종류는 아니에요.힙에 객체가 과도하게 쌓이면 OutOfMemoryError가 발생하고, 호출 스택이 지나치게 깊어지면 StackOverflowError가 발생해요.때로는 다이렉트 메모리처럼 힙 바깥 영역이 한계에 도달하면서 문제가 드러나기도 해요. 실무에서는 이런 장애를 만나면 흔히 “메모리가 부족하다”라고 해석하기 쉬워요.하지만 ..
자바 객체는 메모리에 어떻게 배치될까요? 객체 생성 과정과 메모리 레이아웃
자바 객체는 메모리에 어떻게 배치될까요? 객체 생성 과정과 메모리 레이아웃
Java ☕️
2026.03.09 14:18
💡 이 글에서 다루는 내용new 키워드가 실행될 때 JVM 내부에서 어떤 과정이 순서대로 일어나는지 살펴봐요.자바 객체가 단순한 필드 값의 묶음이 아니라, 객체 헤더와 패딩까지 포함한 구조라는 점을 이해해요.객체의 실제 메모리 구조를 바탕으로 GC가 어떻게 동작하는지, 메모리 누수가 왜 생기는지 추정하는 감각을 익혀봐요.이전 글에서는 JVM 메모리 영역의 큰 그림을 살펴봤어요.메서드 영역에는 클래스 메타데이터가 올라가고, 스택에는 메서드 호출 문맥이 쌓이며, 힙에는 객체와 배열이 생성돼요. 하지만 “객체는 힙에 생성된다”는 설명만으로는 객체를 충분히 이해하기 어려워요.객체는 힙의 한 칸에 놓인 단순한 데이터 덩어리가 아니에요.JVM은 객체를 만들 때 먼저 어떤 클래스의 인스턴스인지 확인하고, 필요한 메..
자바 메모리 구조: 힙만으로는 부족한 JVM 런타임 데이터 영역 이해하기
자바 메모리 구조: 힙만으로는 부족한 JVM 런타임 데이터 영역 이해하기
Java ☕️
2026.03.09 00:53
💡 이 글을 읽으면 알 수 있는 것OOM이나 StackOverflowError가 발생했을 때, 힙 외에 어떤 영역을 확인해야 하는지 알 수 있어요.스레드마다 따로 만들어지는 영역과 모든 스레드가 함께 사용하는 영역의 차이를 이해할 수 있어요.JVM이 자바 프로그램을 실행할 때 메모리를 어떻게 나누어 관리하는지 전체 그림을 그릴 수 있어요.자바 메모리를 이야기할 때 가장 먼저 떠오르는 것은 보통 힙(Heap)과 가비지 컬렉션(Garbage Collection, GC)이에요.실제로 많은 객체가 힙에 생성되고, GC도 주로 힙을 기준으로 동작하므로 이 관점은 중요해요. 하지만 자바 프로그램의 실행 과정을 힙만으로 설명하기는 어려워요.메서드 호출은 스택(Stack)에서 관리하고, 현재 실행 중인 명령어 위치는..
ATDD로 바이브코딩 품질 끌어올리기
ATDD로 바이브코딩 품질 끌어올리기
Python 🐍
2026.02.25 13:52
여러분은 바이브 코딩 즐겨 하시나요?바이브코딩은 빠르고 편리하지만, 반복적으로 같은 문제에 부딪히곤 해요.의도와 다른 결과물이 생성되요끝없이 수정을 반복하게 되요언제 내 작업이 완료되는가에 대한 기준이 사라져요 BDD 스타일의 인수테스트를 활용하면 AI에게 객관적인 검증 기준을 줄 수 있고, 이런 문제를 효과적으로 해결할 수 있어요. 이 글을 읽고 나면 아래와 같은 효과를 가질 수 있을거에요바이브코딩에서 품질 문제가 반복되는 원인을 이해해요.BDD(행동 주도 개발) 스타일의 인수테스트가 이 문제를 어떻게 해결하는지 파악해요.Python-behave를 사용해 인수테스트를 직접 작성하고 실행해요.인수테스트를 AI에게 검증 기준으로 넘겨서 바이브코딩 결과물의 품질을 높일 수 있어요. 바이브 코딩의 품질 문제바..
Kotlin에서 JPA를 사용할 때 감수해야 하는 것들
Kotlin에서 JPA를 사용할 때 감수해야 하는 것들
Kotlin 🤖
2024.07.25 17:11
이 글에서는 Kotlin의 핵심 설계 철학이 JPA와 만나면서 어떤 부분에서 구조적인 타협이 생기는지 정리해요. 내용은 이론보다 실제 적용하면서 겪은 경험을 바탕으로 설명할게요. 이 글의 목적은 JPA를 쓰지 말자가 아니에요. Kotlin + JPA 조합이 어떤 비용을 포함하는지를 미리 알고, 그걸 감안한 상태에서 선택할 수 있도록 돕는 데 있어요. Kotlin이 지키고자 하는 핵심 가치Kotlin은 단순히 Java의 문법을 개선하는 데 그치지 않고, 코드를 더 안전하고 예측 가능하게 만드는 방향을 강하게 지향해요.이를 위해 다음과 같은 핵심 가치를 중심에 두고 설계되었어요. 이 지점들이 JPA와 만날 때 종종 타협 포인트가 돼요. JPA 사용 시 발생하는 구조적 충돌1. Null 안정성 약화JPA는 엔..
Java static 키워드 완전 가이드
Java static 키워드 완전 가이드
Java ☕️
2024.05.22 17:58
Java로 개발하다 보면 public static void main() 같은 구문에서 자주 static 키워드를 마주하게 됩니다.하지만 정작 static이 무엇을 의미하는지, 언제 사용해야 하는지, 그리고 어떤 위험이 있는지 헷갈릴 때가 많습니다. 이 글에서는 다음 내용을 중심으로 static을 쉽게 이해할 수 있도록 정리했습니다.static 키워드가 의미하는 것static 변수와 메서드의 동작 방식static을 사용하기 좋은 상황과 피해야 할 상황대표적인 활용 예(유틸리티 클래스, 상수, 싱글톤 등)static의 장단점과 사용 시 주의할 점이 글을 읽고 나면 static을 보다 의도적이고 안전하게, 그리고 객체지향 관점에서 적절하게 활용할 수 있게 될 거에요! static이란 무엇인가?static은 클..
자바 메모리 구조 이해하기
자바 메모리 구조 이해하기
Java ☕️
2024.05.22 14:49
자바 애플리케이션의 성능을 분석하거나 메모리 문제를 해결하려면 JVM(Java Virtual Machine)의 메모리 구조를 정확히 이해하는 것이 무엇보다 중요합니다. 오늘은 아래 내용을 같이 다뤄볼게요JVM 메모리가 어떤 구조로 이루어져 있는지메서드 영역, 힙, 스택이 각각 어떤 역할을 하는지객체와 클래스 정보가 어떻게 저장되는지메서드 호출 시 스택 프레임이 어떤 방식으로 동작하는지실제 코드 예제를 통해 살펴보는 JVM 메모리의 상호작용이 글을 읽으면 자바 프로그램이 메모리를 어떻게 사용하며 실행되는지 전체 흐름을 자연스럽게 이해할 수 있을 거예요. JVM 메모리 구조가 중요한 이유 JVM 메모리를 이해하면 다음과 같은 문제를 더 정확하게 진단하고 최적화할 수 있습니다.메모리 누수나 OutOfMemor..
자바의 가비지 컬렉션(GC) 한 번에 이해하기
자바의 가비지 컬렉션(GC) 한 번에 이해하기
Java ☕️
2024.02.02 21:46
가비지 컬렉션(GC)이란?자바를 배우다 보면 한 번쯤 들어봤을 용어, 바로 가비지 컬렉션(Garbage Collection, GC)입니다. 간단히 말해, GC는 더 이상 접근할 수 없는 객체(=가비지)를 찾아내서 자동으로 메모리를 정리해주는 기능이에요.개발자가 직접 free()나 delete 같은 명령으로 메모리를 해제하지 않아도 된다는 점이죠. 이 덕분에 자바는 “메모리 안전성과 개발 생산성” 두 가지를 모두 잡을 수 있었습니다.GC가 없었다면 매번 메모리를 신경 써야 했을 테니, 개발 속도는 훨씬 느려졌겠죠. 조금 더 깊이 들어가 보면, GC는 JVM의 힙(Heap) 구조에서 작동하며수집기(Collector)의 종류나 동작 방식에 따라 성능이 달라집니다.이 부분을 이해하면 실무에서 메모리 누수나 성능..
String vs StringBuffer vs StringBuilder — 자바 문자열 클래스의 차이 완전 정리
String vs StringBuffer vs StringBuilder — 자바 문자열 클래스의 차이 완전 정리
Java ☕️
2024.02.02 10:17
자바에서는 문자열을 다루기 위해 String, StringBuffer, StringBuilder 세 가지 클래스를 사용합니다.오늘은 각 클래스의 특징, 동작 방식, 성능, 스레드 안정성, 그리고 상황별 선택 기준을 비교해볼게요! 이 글을 통해 아래와 같은 것들을 이해해볼 수 있을거에요!String이 불변(Immutable) 객체인 이유StringBuffer와 StringBuilder의 필요성과 차이상황에 맞는 문자열 클래스 선택 방법 String — 불변(Immutable)한 문자열String 객체는 한 번 생성되면 내부 값이 변경되지 않는 불변(Immutable) 객체입니다.이 덕분에 자바는 문자열을 String Pool에 저장하고, 동일한 문자열 리터럴을 재사용할 수 있습니다.String str1 =..
Review
image