1. Over Fetching과 Under Fetching, 그리고 GraphQL의 혁신적 해결법 현대 웹/앱 개발에서 서버와 클라이언트 간 데이터 통신의 효율성은 매우 중요한 이슈입니다. 그동안 REST API가 표준처럼 사용되어 왔지만, 실제 개발 현장에서는 REST의 구조적 한계로 인해 불필요한 데이터 요청(Over Fetching)과 반복적인 데이터 요청(Under Fetching) 문제가 자주 발생합니다. 이 글에서는 REST API의 한계와 이를 극복하는 GraphQL의 특징을 정리합니다. 2. REST API의 오버 페칭(Over-fetching) 문제 오버 페칭이란, 클라이언트가 실제로 필요로 하는 데이터보다 더 많은 데이터를 받아오는 현상입니다. 예를 들어, 사용자 이름만 필요한데 `/u..

전체 글

1. 들어가며 프로젝트를 운영하면서 코드 구조와 리팩토링에 대해 늘 고민하게 됩니다.이번 포스팅에서는 제가 작업 중인"Mori" 프로젝트의 Enum 클래스 변환 메서드를 점진적으로 개선한 경험을 공유하려고 합니다. 서비스에서 Enum 변환은 정말 자주 등장하는 패턴입니다."Mori" 프로젝트는 어린이를 위한 chatGPT 서비스인데, 어린이의 연령대에 맞게 답변을 내려줄 필요가 있어서 아래처럼 of() 메서드를 만들어서 쓰고 있었습니다. @Getter@AllArgsConstructorpublic enum ChildAgeGroup { TODDLER("0 ~ 3세"), KINDERGARTEN("4 ~ 6세"), LOWER_GRADES("7 ~ 9세"), UPPER_GRADES("10 ~..

1. 문제 상황 어린이용 chatGPT를 만드는 프로젝트를 진행중인데,,,문제가 생겼다.LLM이 이전 대화의 맥락을 기억하지 못하는 것이었다.보통 chatGPT를 사용하면 기본적으로 이전 대화 내역을 기억해서 적절한 응답을 내려준다.근데, API 형태로 chatGPT를 사용하면 이전 대화 내역을 기억하지 못하는 문제를 발견했다.개발 환경은 Spring AI 1.0.0-M6, Java 17, gpt-4o-mini 이다. 2. 문제 상황 확인"고양이는 왜 그루밍을 할까?"에 대한 질문을 던졌을 때 적절한 응답을 받았다. 내가 AI에게 요청한 것은 답변을 받고 꼬리 질문을 9개를 받는 것이었다. 꼬리 질문 중에 "그루밍을 하는 다른 동물은 없을까?" 를 요청하고 답변을 받아 보았다. 이전에 고양이에 대해서 이..

1. 개요 Spring AOP(Aspect-Oriented Programming)를 활용하면, 권한 체크 로직을 모든 컨트롤러 메서드마다 반복해서 작성할 필요 없이 관점 지향 프로그래밍(Aspect-Oriented Programming) 방식으로 깔끔하게 분리할 수 있다.Spring AOP를 이용하여 API 호출 시 특정 역할(Role)만 접근 가능하도록 제한하는 방법을 정리하겠다. 2. 구현2 - 1. @RequireRole 어노테이션 생성 먼저, 권한 체크를 적용할 메서드에 사용할 커스텀 어노테이션을 생성한다.package com.example.infra.aspect;import java.lang.annotation.ElementType;import java.lang.annotation.Retenti..

1. 문제 상황 최근 프로젝트에서 Role 이라는 Enum 클래스를 만들면서 of 메서드를 추가하게 되었다. 이 메서드는 문자열 입력값을 받아 Enum 값을 반환하는 역할을 한다. package com.griotold.auth.domain.enums;import lombok.AllArgsConstructor;import lombok.Getter;@Getter@AllArgsConstructorpublic enum Role { MASTER("ROLE_MASTER"), HUB("ROLE_HUB"), DELIVERY("ROLE_DELIVERY"), COMPANY("ROLE_COMPANY"); private final String role; public static Role of(..
1. Record란? Java 16에서 정식으로 도입된 Record는 불변(immutable) 데이터 객체를 생성하기 위한 특별한 형태의 클래스다.주요 특징은 아래와 같은데, 모든 필드가 private final로 선언된다.생성자, getter, equals(), hashCode(), toString()메서드가 자동 생성된다.불변성(immutability)이 보장된다.java.lang.Record를 자동으로 상속한다.final 클래스라 상속이 불가능하다. 2. 기존 DTO vs Record 비교 동일한 데이터 객체를 일반 클래스로 작성했을 때, Record로 작성했을 때를 비교해보자 일반 DTO 클래스public class UserDTO { private final String name; pr..

1. 문제 상황 Kafka topic에 이벤트를 발행하기 위해서는 java 객체를 JSON 으로 직렬화하는 과정이 필요하다.이 때 변환하려는 이벤트에 LocalDateTime 타입의 필드가 있었고, 직렬화하는 과정에서 문제가 발생했다. ReservationCreatedEventpublic record ReservationCreatedEvent( UUID reservationId, Long userId, UUID restaurantScheduleId, LocalDateTime createdAt, // LocalDateTime LocalDateTime expiredAt // LocalDateTime) createdAt, expiredAt 이라는..

1. 문제 상황개발 환경에서는 Config Server 에서 데이터 소스를 가져다가 사용하고운영 환경에서는 github secrets, variales 에서 환경변수를 주입해서 EC2에 배포를 한다. 개발 환경의 yml을 보면,application-dev.ymlspring: application: name: auth-service config: import: "configserver:" cloud: config: discovery: service-id: config-service enabled: trueeureka: client: serviceUrl: defaultZone: http://localhost:19000/eureka/위 처..