분류 전체보기 174

[Spring] WebClient vs RestTemplate 차이점 정리

평소 외부 API나 클라이언트와 연동할 때 WebClient와 RestTemplate을 자주 사용해 왔습니다.하지만 문득 "정확하게 어떤 차이가 있고, 언제 어떤 걸 써야 할까?"라는 생각이 들어 이번 기회에 정리해보려고 합니다.☁️ 🔍 RestTemplate이란?RestTemplate은 Spring 3부터 지원된 동기 방식의 HTTP 클라이언트입니다.가장 널리 쓰이는 getForObject(), postForEntity() 같은 메서드들을 통해 API를 쉽게 호출할 수 있어, 직관적이고 익숙한 방식이에요!RestTemplate restTemplate = new RestTemplate();String response = restTemplate.getForObject("https://api.exampl..

Backend/Spring 2025.06.29

MongoDB Compound Index 제대로 이해하고 성능까지 비교해보자.

NoSQL은 유연한 스키마와 수평 확장이 강점인 데이터베이스입니다.하지만 대용량 데이터를 효과적으로 처리하고, 원하는 쿼리 성능을 확보하기 위해서는 관계형 데이터베이스와 마찬가지로 인덱스 설계가 매우 중요하다고 생각합니다.특히, 하나의 조건만으로는 부족할 때 여러 필드를 동시에 고려할 수 있는 `Compound Index`(복합 인덱스)는 매우 강력한 도구가 될 수 있습니다. Compound Index(복합 인덱스) 란? 🤔복합 인덱스는 말 그대로 두 개 이상의 필드를 조합해서 만든 인덱스입니다.MongoDB에서는 다음과 같이 생성할 수 있습니다.db.order.createIndex({ userId: 1, orderDate: -1 })(이 인덱스는 userId를 오름차순, orderDate를 내림차..

Data/MongoDB 2025.06.21

JPA + AttributeConverter 사용 시 equals/hashCode가 필요한 이유

프로젝트에서 다음과 같은 Hibernate 경고 메시지를 마주쳤습니다. 😨HHH000481: Encountered Java type [...] which does not appear to implement equals and/or hashCode. This can lead to significant performance problems [...]처음 보면 당황스럽지만, 핵심은 간단합니다.equals/hashCode가 구현되어 있지 않아서 Hibernate의 Dirty Checking이 제대로 동작하지 않는다!이 글에서는 왜 이런 일이 생기는지, @AttributeConverter를 쓸 때 왜 equals/hashCode가 꼭 필요한지, 그리고 실제 코드로 어떻게 해결하는지를 정리해 보겠습니다. 왜 eq..

Backend/Spring 2025.06.02

OutOfMemory: IntelliJ IDEA로 Heap Dump(.hprof) 분석하기

주니어 개발자라면 한 번쯤 마주할 수 있는(?) OutOfMemoryError (OOM)저도 JVM 기반 백엔드 서비스를 운영하다가 실제로 OOM을 겪게 되었고, 이를 계기로 `.hprof` 파일을 분석해 보게 되었습니다.(참고로 이번 OOM은 메모리 사용량 자체보다는 설정 이슈였지만, 메모리 문제에 대비한 분석 경험으로 의미 있었기에 글로 정리합니다!) 📦 .hprof 열기 (IntelliJ Ultimate 기준).hprof 파일은 JVM에서 OOM 발생 시 생성되는 힙 메모리 스냅샷입니다.IntelliJ Ultimate에서는 아래와 같이 쉽게 열 수 있어요! 1. .hprof 파일을 IntelliJ로 드래그하거나 File → Open으로 열어줍니다. 2. 파일을 열어주면 자동으로 Heap Dump..

Backend/Java 2025.05.28

왜 헥사고날인가? 구조적 고민과 실천의 기록

실무에서 주로 레이어드 아키텍처(Layered Architecture)를 자연스럽게 사용했습니다. Controller, Service, Repository처럼 층을 나누고 각 레이어에서 역할을 나누는 방식은 익숙하고 구조를 파악하기도 쉬웠습니다.하지만, 시간이 지날수록 위의 구조에 대해 불편함이 생겼습니다.도메인 로직이 Service나 Repository에 흩어져 도메인 규칙이 명확하지 않음비즈니스 로직이 상위 레이어에 의존적으로 퍼짐Kafka, 외부 API, 배치 등 새로운 인프라를 기존 구조에 끼워 넣기 애매함테스트 시 상위 계층의 많은 의존성 고려 필요이런 문제를 겪으면서, 헥사고날 아키텍처(Hexagonal Architecture) 또는 포트-어댑터 아키텍처(Ports and Adapters Ar..

[Java] Map.getOrDefault()가 예외를 던진다고?

Map.getOrDefault()를 사용하다가 Exception을 만난 경험이 있다면, 이 글이 도움이 될 수 있습니다.많은 사람들이 "getOrDefault는 키가 없을 때만 기본값을 사용한다"라고 생각하지만, 실제 동작은 다릅니다.이 글에서는 getOrDefault()의 진짜 동작 방식을 알아보고, 안전한 대안까지 정리해 보겠습니다. 👩🏻‍💻 예상 못한 예외, 어디서부터 잘못된 걸까?다음 코드에서 NumberFormatException이 발생했습니다.Long no = noMap.getOrDefault(update.getNo(), Long.valueOf(update.getNo()));에러 메시지는 아래와 같았습니다.java.lang.NumberFormatException: For input str..

Backend/Java 2025.04.16

MSA 환경에서 살아남기 위한 멀티모듈 구조

실제 MSA 환경에서 하나의 DB를 여러 서비스가 동시에 접근하면서, 각 레포지토리에서 중복된 방식으로 데이터를 다루는 일이 잦아졌습니다.이로 인해 데이터 관리가 복잡해지고, 리팩토링 또한 점점 어려워지는 문제를 경험하게 되었습니다..😥“이런 구조를 조금 더 효율적으로 개선할 수는 없을까?”라는 고민을 하던 중 멀티모듈 구조를 알게 되었고, 이를 실무에 적용해 보면서 얻은 경험과 개념들을 정리해보고자 합니다.  왜 멀티모듈 구조를 사용하는가?1. 단일 모듈 구조의 한계하나의 프로젝트에 모든 도메인과 기능을 넣는 단일 모듈 방식은 규모가 작을 때는 문제가 없지만, 기능이 점점 많아지면서 관리가 어려워지고 코드 의존성도 높아지게 됩니다. 특히 대규모 서비스에서는 유지보수가 어려워지고, 모듈 간 책임이 불명..

개발끄적 2025.03.22

Nested Set Model: 효율적인 트리 구조

실무에서 Nested Set Model로 구성된 데이터를 관리하면서 겪은 경험과 개념을 정리해보고자 합니다.👩🏻‍💻  Nested Set Model이란?데이터베이스에서 트리 구조를 저장하는 방법에는 여러 가지가 있지만, Nested Set Model은 lft, rgt 값을 이용해 한 번의 SQL 쿼리로 전체 트리 구조를 빠르게 조회할 수 있는 방식입니다.많은 경우, 부모-자식 관계를 나타내는 Adjacency List 방식을 사용하지만, 이 방법은 하위 노드를 조회할 때 반복적인 SQL 실행이 필요하다는 단점이 있습니다. 반면, Nested Set Model은 하나의 SQL로 모든 하위 노드를 조회할 수 있다는 강력한 장점이 있습니다.(물론 둘을 혼용하여 쓰는 방법도 있습니다. 🤔) Nested ..

Data/DataBase 2025.03.14

413 Request Entity Too Large 오류 해결하기 (Nginx & Node.js 환경)

웹 애플리케이션을 개발하다 보면 서버에서 설정한 요청 크기보다 큰 요청이 들어왔을 때 다음과 같은 오류를 마주할 수 있습니다.413 Request Entity Too Large이 오류는 서버가 처리할 수 있는 최대 요청 크기를 초과했을 때 발생합니다.이번 글에서는 Node.js(Express)와 Nginx 환경에서 발생하는 413 Request Entity Too Large 오류의 원인과 해결 방법을 정리해 보겠습니다.  🛑 PayloadTooLargeError 발생 원인이 오류는 서버가 허용하는 요청 크기를 초과한 경우 발생합니다. 일반적으로 다음과 같은 원인에서 비롯됩니다.Express의 요청 크기 제한 초과Express에서는 기본적으로 JSON 및 URL-encoded 요청의 크기를 제한합니다.N..

개발끄적 2025.03.05

[Spring] RestTemplate에서 PATCH가 안 된다면? 원인과 해결 방법 정리

RestTemplate를 사용하던 도중 PATCH 메서드를 호출할 때 아래와 같은 오류가 발생했습니다. 👀org.springframework.web.client.ResourceAccessException: I/O error on PATCH request for “https://api.example.com/resource/1”: Invalid HTTP method: PATCH; nested exception is java.net.ProtocolException: Invalid HTTP method: PATCH나는 위와 같은 오류를 경험했지만, PATCH 요청을 보낼 때 다음과 같은 다른 오류가 발생할 수도 있다고 합니다.org.springframework.web.client.HttpClientErrorE..

Backend/Spring 2025.03.01