Project Lombok은 자바 코드의 반복적인 작업을 줄이고, 생산성을 향상시키는 라이브러리입니다. Lombok은 어노테이션(Annotation)을 통해 getter, setter, constructor 등의 보일러플레이트 코드를 자동으로 생성해줍니다.Lombok을 사용하는 이유코드 간소화: toString(), equals(), hashCode(), getters, setters 등의 일반적인 메서드를 자동으로 생성합니다.가독성 향상: 불필요한 코드가 줄어들어 코드의 의도가 더 명확하게 드러납니다.개발 시간 단축: 작성해야 할 코드가 줄어들어 비즈니스 로직에 집중할 수 있습니다.리팩토링 용이성: 필드 이름을 변경하더라도 getter/setter를 따로 수정할 필요가 없습니다.Lombok의 주요 기능..
오늘은 Spring Boot에서 API 응답을 깔끔하고 일관되며 사용하기 쉽게 구조화하는 가장 좋은 방법에 대해 이야기해보려고 합니다. 이 글을 끝까지 읽으면, 당신의 API가 더 깔끔하고 일관성 있으며, 사용자 친화적으로 바뀌는 모습을 볼 수 있을 것입니다.API 응답 구조가 왜 중요할까?먼저, 잘 구조화된 API 응답이 왜 중요한지 살펴봅시다. 일관된 응답 구조는 다음과 같은 장점을 제공합니다:클라이언트 측 에러 처리 개선: 프론트엔드 팀에서 크게 감사할 것입니다.가독성과 유지보수성 향상: 미래의 당신이나 팀이 명확함에 감동할 것입니다.디버깅과 로깅 간소화: 문제를 빠르고 효율적으로 파악할 수 있습니다.좋은 API 응답의 조건잘 구조화된 API 응답은 다음과 같은 특징을 가져야 합니다:일관성: 다양한..
이 글에서는 시스템 실행 중 성능을 향상시키기 위해 데이터를 캐싱하는 몇 가지 기술을 살펴보겠습니다. 일반적으로 계산하는 데 시간이 오래 걸리는 값을 캐싱하면 나중에 액세스할 때 시간을 절약할 수 있습니다. 캐싱되는 값은 자주 변경되지 않거나, 최신 버전이 필요하지 않은 경우가 많습니다.Spring Boot에서 캐싱Spring Boot REST API에서 캐싱을 활성화하는 가장 간단한 방법은 애플리케이션에 설정하고, 엔드포인트에 @Cacheable 어노테이션을 사용하는 것입니다.애플리케이션에서 다음과 같이 @EnableCaching 어노테이션을 추가하기만 하면 됩니다.@SpringBootApplication@EnableCachingpublic class SpringBootCachingApplication..
이 글에서는 메모리 소비 문제로 인해 기존 방식으로는 구현할 수 없는 REST 엔드포인트의 예를 살펴보겠습니다.시나리오이번 예제에서는 Customer, Order, OrderItem, 그리고 Product로 구성된 간단한 시나리오를 사용합니다.우리의 목표는 보고서를 생성하는 엔드포인트를 만드는 것입니다. 이 엔드포인트는 다음 데이터를 쿼리하고 반환해야 합니다.백만 개의 주문(Orders)500만 개 이상의 주문 항목(OrderItems)기존 구현몇 가지 필드를 가진 DTO를 정의해보겠습니다.@Datapublic class ReportDto { private final Long orderId; private final LocalDate date; private final String customerN..
multipart 기본 경로 Spring Boot 설정에서 spring.servlet.multipart.location를 특정 경로로 설정하지 않을 경우 기본적으로 tmp 폴더로 지정됩니다. 각 운영체제 tmp 경로 Windows: C:\User\사용자\AppData\Local\Temp Linux: \tmp 각 운영체제 basedir 경로 Windows: C:\User\사용자\AppData\Local\Temp\tomcat.xxxxxx.8080\work\Tomcat\localhost\ROOT Linux: \tmp\tomcat.xxxxxx.8080\work\Tomcat\localhost\ROOT 위와 같이 눈으로 보기에도 많이 지저분한 경로에 저장이 되므로 작업과 관리가 용이하도록 경로를 직접 설정해 주는 ..
Spring Boot에서 MultipartFile와 Bootstrap의 Modal을 사용하여 이미지 파일을 업로드하는 방법에 대해 알아보겠습니다. Spring Boot 2.6.11 버전과 Bootstrap 5를 사용하였습니다. MultipartFile MultipartFile이란 스프링에서 업로드한 파일을 표현할 때 사용되는 인터페이스입니다. 파일 내용은 메모리에 저장되거나 임시로 디스크에 저장됩니다. 요청 처리가 끝나면 임시 저장소는 지워집니다. 설정 Spring Boot application.properties 설정 파일에 파일 업로드 경로와 파일 사이즈를 설정합니다. 윈도우 기준으로 d:/upload/ 경로로 파일을 업로드합니다. # 지도 파일 업로드 경로 spring.servlet.multipar..
WebSocket 이란 웹소켓(WebSocket)은 하나의 TCP 접속에 전이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜이다. 웹소켓 프로토콜은 2011년 IETF에 의해 RFC 6455로 표준화되었으며 웹 IDL의 웹소켓 API는 W3C에 의해 표준화되고 있다. 위키백과 HTTP 프로토콜과 호환되며, 실시간 양방향 통신을 제공하기 위한 프로토콜이며 Spring 4.0에서 등장한 네트워크 서비스입니다. (접속까지는 HTTP 프로토콜을 사용하지만 이후 WebSocket 프로토콜로 변경) Spring Boot로 구현하기 Spring Boot에서 WebSocket과 자바스크립트에서 STOMP을 사용하여 메시지를 주고받는 예제를 구현해 보려고 합니다. 의존성 추가 pom.xml에 spring-boot-star..
동일 트랜잭션 내부 연관 엔티티가 수정되었을 경우 CascadeType과 상관없이 자동으로 수정됩니다. 같은 트랜젝션이라 하더라도 해당 엔티티가 CasecadeType.PERSIST 로 설정 되어 있지 않으면 연관 엔티티를 추가하더라도 반영되지 않습니다. (CascadeType.MERGE 로 설정 되어도 추가는 되지 않음) CascadeType 별 동작 CascadeType.ALL 상위 엔티티에서 하위 엔티티로 모든 작업을 전파합니다. 모든 Cascade 설정을 적용합니다. CascadeType.PERSIST 상위 엔티티를 생성하고, 하위 엔티티를 추가하였을 때 persist()를 수행하면 하위 엔티티도 같이 persist()가 수행됩니다. 만약, 하위 엔티티가 DB에 등록된 키값을 가졌다면 detach..
QueryDslPredicateExecutor를 이용하는 findAll, findOne 등은 where, Sort, Limit 등의 조건만 넣을 수 있습니다. 하지만 Join이나 Group by 등의 기능을 사용하려면 인터페이스 선언만으로는 기능을 구현하기 힘듭니다. 이를 해결하기 위해서 Spring Data JPA에서 제공하는 QuerydslRepositorySupport 추상 클래스가 있습니다. QuerydslRepositorySupport는 개발자에게 querydsl 객체를 직접 제공합니다. 예를 들어 권한별 사용자 수에 대한 데이터가 필요하다면, 다음과 같이 할 수 있습니다. 사용자 클래스와 DTO 클래스를 생성합니다. @Data @Entity @Table public class User { @I..
Query DSL JPA, JDO, SQL 같은 백엔드를 위해 type-safe SQL을 만드는 프레임워크 Domain Specific Language 특정한 도메인에 초점을 맞춘 제한적인 표현력을 가진 컴퓨터 프로그래밍 언어 특징 type-safe 조회에 특화된 프로그래밍 언어 단순, 간결 다양한 저장소 조회 기능 통합 (데이터 조회 기능 추상화) 동작 방식 Member java or Member table의 메타 데이터를 참조하여 코드 생성기를 통해 QMember.java를 생성합니다. APT: Annotation Processing Tool Table Meta: Querydsl-maven-plugin 기능 Query: from, where, join Path: QMember, Qmember.name..