반응형

Java 15

Java Stream API 실전 - map, filter, collect 제대로 쓰기

Stream API가 처음 나왔을 때 실무에서 잘못 쓰인 걸 정말 많이 봤어요. 열 줄이면 될 for문을 세 줄짜리 .stream().filter().map().collect()로 바꾸긴 했는데, 안에서 다시 forEach로 리스트에 add를 하고 있어서 사실상 for문에 껍데기만 씌운 코드. 저도 처음엔 그렇게 썼습니다. Stream을 제대로 쓴다는 건 파이프라인처럼 데이터 변환 흐름을 표현한다는 뜻이고, 그때 진짜로 코드가 짧아지고 읽기도 편해집니다. 오늘은 실무에서 자주 쓰는 map·filter·collect 패턴과 자주 하는 실수를 정리해볼게요.개념 / 원리Stream은 컬렉션이 아닙니다. "데이터를 흘려보내는 파이프라인"에 가까워요. 컬렉션은 데이터를 담아두는 그릇, Stream은 그 데이터가 ..

IT·리눅스/Java 2026.07.10

java.lang.OutOfMemoryError: Java heap space - 원인 진단부터 해결까지

java.lang.OutOfMemoryError: Java heap space - 원인 진단부터 해결까지서비스가 잘 돌아가다가 어느 순간 응답이 뚝 끊기고, 로그를 열어보면 java.lang.OutOfMemoryError: Java heap space 한 줄이 딱 찍혀 있는 상황, 백엔드 개발자라면 한 번씩은 다 겪어보셨을 거예요. 저도 신입 때 이 로그를 처음 봤을 때 "힙이 뭐길래 터졌다는 거지?" 하고 무작정 -Xmx부터 늘려서 잠깐 넘긴 적이 있는데요, 며칠 뒤 똑같이 터지고 나서야 근본 원인을 찾아야 한다는 걸 알았습니다. 오늘은 이 에러가 정확히 뭘 의미하고, 어떻게 원인을 찾아서 진짜로 해결하는지 정리해 볼게요.개념 / 원리java.lang.OutOfMemoryError: Java heap ..

IT·리눅스/Java 2026.07.05

equals()와 hashCode() 계약 - 깨면 HashMap이 어떻게 망가지나

분명히 HashMap에 put했는데 똑같은 키로 get했더니 null이 나오는 황당한 경험, 자바 좀 만져보신 분이라면 한 번쯤은 겪어보셨을 겁니다. 저도 신입 시절에 새로 만든 도메인 클래스를 HashMap 키로 썼다가 같은 증상으로 한 시간을 헤맸어요. 원인은 equals()만 오버라이드하고 hashCode()는 빼먹은 거였습니다. 오늘은 이 둘이 왜 항상 같이 다녀야 하는지, 안 그러면 뭐가 깨지는지 들여다보겠습니다.개념 / 원리equals()는 "두 객체가 의미상 같은가?"를 판단하고, hashCode()는 "이 객체를 해시 기반 자료구조에 넣을 때 어느 버킷으로 보낼 것인가?"를 결정합니다. HashMap, HashSet 같은 컬렉션은 다음 순서로 동작해요.hashCode()로 버킷 위치를 찾는..

IT·리눅스/Java 2026.06.25

@Transactional의 함정 - 프록시와 self-invocation

스프링 처음 배울 때 @Transactional 어노테이션 한 줄이면 다 된다고 배웁니다. 그래서 결제 메서드 위에 @Transactional 붙여 두고 잘 돌리고 있었는데, 어느 날 운영에서 "환불 처리가 일부만 반영되고 다른 부분은 그대로다"는 알람이 옵니다. 분명 예외가 던져졌는데 롤백이 안 된 거예요. 이런 케이스가 한두 가지가 아닙니다. private 메서드, self-invocation, checked exception, 모두 @Transactional을 무력화시키는 함정이에요. 오늘은 이 어노테이션이 어떻게 동작하는지부터 시작해서, 신입이 가장 많이 당하는 함정들을 정리해 볼게요.개념 / 원리핵심은 @Transactional이 스프링 AOP 프록시 기반으로 동작한다는 점입니다. 빈을 그대로 ..

IT·리눅스/Java 2026.06.02

[Java] JVM 메모리 누수 - 원인과 진단 도구 한 번에 정리

[Java] JVM 메모리 누수 - 원인과 진단 도구 한 번에 정리운영 중인 자바 서버가 며칠에 한 번씩 OOM으로 죽어서 새벽마다 알람이 울린 적이 있습니다. 처음엔 그냥 힙을 늘렸어요. 6GB → 8GB → 12GB. 그런데 결국 또 터지더라고요. GC 로그를 보니 Full GC가 분 단위로 돌면서도 Old 영역이 90% 아래로 안 떨어지는 패턴이 반복되고 있었습니다. 그제서야 "아, 이건 누수구나" 싶었죠. 자바는 GC가 알아서 청소해 주니까 누수가 없을 거라고 생각하기 쉬운데, 실은 자바 개발자라면 한 번쯤은 꼭 마주치는 문제입니다. 오늘은 지난 G1 GC 글에 이어서, JVM 메모리 누수가 왜 생기는지 그리고 힙 덤프부터 MAT까지 어떻게 추적하는지 한 번에 정리해 볼게요.개념 / 원리자바의 G..

IT·리눅스/Java 2026.05.12

[Java] G1 GC 내부 동작 - Region과 Garbage First의 정체

지난 글에서 G1 GC를 "구역별로 더러운 곳부터 치우는 청소부"에 비유했었는데요, 사실 그 한 줄이 G1의 정체를 거의 다 말해줍니다. 그런데 옵션 한 줄(-XX:+UseG1GC)로 켜고 끝내는 분들을 보면 안타까운 게, Region이 정확히 뭔지, 왜 "가비지 퍼스트"라고 부르는지를 모르면 GC 로그가 외계어로 보이거든요. 저도 처음엔 로그에 Mixed GC라는 단어가 자꾸 떠서 한참을 검색했던 기억이 있습니다. 오늘은 그 G1의 속을 한 칸 더 들여다보면서, 옵션을 어떤 근거로 만지는지까지 정리해 볼게요.개념 / 원리G1의 모든 비밀은 Heap을 잘게 쪼갠다는 한 줄로 시작합니다. 기존 GC가 Heap을 Young/Old처럼 큰 덩어리로 보던 것과 달리, G1은 같은 크기의 작은 Region으로 나..

IT·리눅스/Java 2026.05.11

[Java] GC의 종류 - Serial / Parallel / G1 / ZGC 비교

운영 중인 자바 서비스의 응답시간 그래프를 보다가, 평소엔 잘 나오다 가끔 1~2초씩 툭 튀는 구간을 보신 적 있으실 거예요. 거의 다 GC가 STW(Stop-The-World)로 잠깐 세상을 멈춘 흔적입니다. 그래프가 어떻게 튀는지는 어떤 GC를 쓰느냐에 따라 패턴이 완전히 달라지고요. 저도 옛날에 옵션 한 줄을 -XX:+UseG1GC로 바꾸고 응답시간 99분위가 1초에서 200ms로 떨어지는 걸 보고 GC 옵션의 무서움을 실감했습니다. 지난 글에서 JVM 메모리 구조를 정리했으니, 오늘은 그 Heap을 청소하는 GC 네 종류를 한 자리에서 비교해 볼게요.개념 / 원리GC가 하는 일은 결국 "Heap에서 안 쓰는 객체 치우기" 한 가지인데, 어떻게 치우느냐에 따라 네 가지로 갈립니다. 핵심 트레이드오프..

IT·리눅스/Java 2026.05.08

[Java] JVM 메모리 구조 - Heap, Stack, Metaspace 한 번에 잡기

자바 애플리케이션이 운영 환경에서 갑자기 OOM(OutOfMemoryError)으로 죽었다는 알람을 받아본 적, 한 번쯤은 있으실 겁니다. 새벽에 폰 알람에 깨서 로그를 보면 어떤 날은 Java heap space, 어떤 날은 Metaspace, 어떤 날은 unable to create new native thread인데, 정작 그게 무슨 차이인지 헷갈려서 일단 -Xmx만 늘려놓고 다시 잠드신 적도 있으실 거예요. 저도 그랬습니다. 오늘은 그 OOM 메시지 한 줄을 제대로 읽어내기 위한 출발점, JVM 메모리 구조를 한 번에 정리해 볼게요.개념 / 원리JVM은 시작할 때 OS로부터 일정량의 메모리를 받아서, 자기만의 규칙대로 영역을 쪼갭니다. 크게 다섯 군데인데, 이름만 들으면 헷갈리지만 역할은 의외로 ..

IT·리눅스/Java 2026.05.07

Java 메서드 완전 정복: 함수 만들기와 호출하기

🎯 이번 포스트 목표메서드(함수)의 구조와 작성법을 이해한다.매개변수와 반환값 개념을 익힌다.메서드를 통해 중복 없는 깔끔한 코드를 작성해본다.✅ 메서드란 무엇인가?메서드(Method)는 하나의 목적을 수행하는 코드 블록입니다.코드를 작성하다 보면 반복적으로 사용하는 동작들이 생기는데, 이를 메서드로 묶어두면 필요할 때 이름만 호출해서 재사용할 수 있습니다.쉽게 말하면,"특정 작업을 수행하는 작은 기계"를 만드는 것이라고 보면 됩니다.🔧 메서드의 기본 구조Java에서 메서드는 아래와 같은 형태로 작성합니다.[접근제어자] [static] [반환형] 메서드이름(매개변수) { 실행할 코드; return 결과값;}예시public static int add(int a, int b) { retu..

IT·리눅스/Java 2025.04.30

Java 공부를 시작한다면, VS Code와 Eclipse 중 무엇을 선택할까?

프로그래밍을 처음 시작하거나 Java 언어를 처음 접하는 분들이라면, 가장 먼저 부딪히는 고민 중 하나가 바로 "어떤 개발 도구를 써야 할까?" 입니다. 개발 툴은 단순한 코드 작성 이상의 역할을 합니다. 프로젝트를 구성하고, 실행하고, 디버깅하는 전 과정을 함께하기 때문에, 자신에게 잘 맞는 도구를 선택하는 것이 학습 효율과 몰입도에 큰 차이를 만들어냅니다.Java 개발에서 가장 많이 언급되는 두 가지 도구는 바로 Eclipse와 Visual Studio Code(VS Code) 입니다. 이 글에서는 각 도구의 특징과 장단점을 비교하면서, 어떤 경우에 어떤 도구가 더 적합한지 정리해보겠습니다.✨ Eclipse - Java 개발의 전통 강자Eclipse는 오랜 기간 동안 Java 개발의 대표 IDE로 자..

IT·리눅스/Java 2025.04.25