Backend 76

REST vs gRPC, MSA에서 어떻게 고를까?

실무에서 MSA 환경을 운영하다 보니,일관성 있는 데이터 동기화와 안정적인 운영을 위해 서비스 간 통신 방식을 정확히 정리하고 선택해야겠다는 생각이 들었습니다. 이 글에서는 REST와 gRPC를 비교해 언제 어떤 걸 쓰면 좋을지, 기준을 잡아보려 합니다. REST vs gRPC 한눈에 비교REST와 gRPC는 모두 서비스 간 통신을 위한 기술이지만, 출발점이 다르고, 잘 맞는 사용 시나리오도 다릅니다. REST는 HTTP를 기반으로 한 리소스 중심의 통신 방식이고,gRPC는 원격 메서드를 호출하는 RPC(Remote Procedure Call) 모델에 가깝습니다. 이 차이가 설계 방식, 성능, 운영 경험 전반에 영향을 줍니다.항목RESTgRPC통신 모델리소스 중심 (URL + HTTP Method)메서..

Backend 2025.12.28

MapStruct와 ObjectMapper, 언제 어떤 걸 써야 할까?

DTO ↔ Entity 변환, 여러분은 어떻게 처리하고 계신가요?🤔 많은 개발자들이 처음에는 직접 생성자나 Builder를 사용해서 매핑합니다.필드가 몇 개 없을 때는 괜찮지만, 점점 DTO/Entity 구조가 복잡해지고, 중복 코드가 많아지면서 유지보수가 어려워지는 것 같습니다.이럴 때 보통 두 가지 대안이 있습니다.ObjectMapper: 빠르고 간편하게 쓸 수 있는 JSON 매핑 도구MapStruct: 컴파일 타임에 타입 안전하게 매핑 코드를 생성해 주는 프레임워크이번 글에서는 두 방식의 차이점과 실무에서 어떤 상황에 어떤 방식을 선택하는 것이 좋은지 정리해 보겠습니다. ObjectMapper란?ObjectMapper는 Jackson 라이브러리에서 제공하는 객체-JSON 변환 도구입니다.(사실 ..

Backend/Java 2025.07.23

[Java] Collectors.toList() vs Stream.toList()

Java에서 Stream API를 사용할 때 Collectors.toList()는 오랫동안 익숙하게 사용해온 방식이었습니다.그런데 최근 IntelliJ에서 Stream.toList() 사용을 권장하는 안내 메시지를 보고 궁금증이 생겼습니다. 🤔이번 글에서는 두 방식의 차이점과 언제 어떤 걸 선택해야 하는지 명확히 정리해보겠습니다. Collectors.toList() → 변경 가능한 리스트 (mutable)List list = Stream.of("A", "B", "C").collect(Collectors.toList());list.add("D"); // 가능! 리스트에 값 추가됨Collectors.toList()는 내부적으로 new ArrayList()를 사용해 리스트를 생성합니다.그래서 리스트에 값..

Backend/Java 2025.07.09

[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

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

[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

[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

JUnit4와 JUnit5의 차이

Java 애플리케이션의 단위 테스트에서 널리 사용되는 JUnit은 개발자에게 필수적인 도구입니다. 🛠️저는 평소 JUnit5를 사용해 왔지만, 최근에 JUnit4를 사용해 볼 기회가 생겼습니다.처음에는 익숙하지 않은 버전이라 조금 낯설었지만, 이를 통해 두 버전의 차이를 직접 체감하며 JUnit의 발전을 이해할 수 있었습니다.이 글에서는 JUnit4와 JUnit5의 차이점, 장단점, 그리고 제가 사용하면서 느낀 점을 정리해 보았습니다.👩🏻‍💻 JUnit4의 특징JUnit4는 간단하고 직관적인 테스트 프레임워크로, 다음과 같은 어노테이션을 제공합니다. @Test: 테스트 메서드 표시.@Before / @After: 테스트 전/후에 실행되는 메서드 지정.@Ignore: 특정 테스트를 비활성화.@Ru..

Backend/TestCode 2025.01.27

JDK 23: 자바 핵심 변경점 정리

JDK 23은 자바 언어와 플랫폼의 최신 개선 사항을 포함하여 개발자 생산성과 애플리케이션 성능을 향상시키는 다양한 기능을 도입했습니다. 주요 변경 사항에 대해 알아보겠습니다.👀  1. 프리미티브 타입에 대한 패턴 매칭 및 switch 문 확장 (JEP 455)1-1. 패턴 매칭의 확장기존에는 instanceof 연산자가 참조 타입에서만 동작했지만, JDK 23부터는 프리미티브 타입에서도 사용할 수 있습니다.int value = 10;if (value instanceof int i && i > 5) { System.out.println("Value는 5보다 큰 정수입니다: " + i);}위 코드는 instanceof 연산자로 프리미티브 타입 int를 확인하고, 조건을 추가적으로 결합하여 안전하고 ..

Backend/Java 2025.01.15