Spring 23

Flyway 사용법 (#2)

Flyway 사용법 (#2)Flyway 사용법 (#1) 에서 대략적인 Flyway 사용방법을 다뤄 봤습니다.이번 글에서는 Flyway 사용 중 자주 발생하는 문제와 해결 방법을 정리합니다. SQL 파일과 Entity 의 불일치 문제Flyway SQL 파일이 무한히 늘어나는 문제 1. SQL 파일과 Entity 의 불일치 문제1.1 문제 개요Flyway는 SQL 기반으로 DB 스키마를 관리합니다.하지만 JPA Entity는 코드 기반으로 스키마를 정의하기 때문에, 두 구조가 항상 일치한다는 보장이 없습니다. 1.2 ddl-auto: validate 설정Entity 구조가 DB 스키마와 일치하는지 자동으로 확인할 수 있습니다.spring: jpa: hibernate: ddl-auto: val..

Spring 2025.11.15

Spring WebSocket(STOMP) 통합 테스트 정리

Spring WebSocket(STOMP) 통합 테스트 정리 1. 통합 테스트를 결정한 이유WebSocket의 전반적인 흐름을 실제와 동일하게 검증하기 위해 통합 테스트 방식을 선택하였습니다.현재 STOMP 구조는 다음과 같습니다.StompDispatcher → 각 command에 맞는 handler → SEND의 경우 @MessageMapping이 선언된 단에서 처리이 흐름에서 최초 handshake 단계에서 사용자의 인증 및 인가 상태를 확인하며, 필요한 인가 정보는 session에 저장합니다.이후 각 command에 해당하는 handler는 handshake 과정에서 설정된 session 값을 활용하여 비즈니스 로직을 수행합니다.이러한 일련의 흐름은 단위 테스트로는 충분히 검증하기 어렵기 때문에, ..

Spring 2025.10.17

Flyway 사용법 (#1)

Flyway 사용법 (#1)지금까진 ERDCloud로 전체적인 DB 구조와 컬럼을 관리하고, 변경사항이 생기면 세 가지 단계를 거쳤습니다. 먼저 ERDCloud를 수정하고, 그다음 Spring Boot 코드(Entity)를 수정한 뒤, 마지막으로 DB에 직접 쿼리를 실행해 반영하는 방식이었습니다. 하지만 이 과정에는 몇 가지 문제가 있었습니다. 가장 큰 문제는 DB에 직접 쿼리를 날리는 시점과 실제 서비스 배포 시점이 정확히 맞아야 한다는 점이었습니다. 시점이 어긋나면 서비스가 정상적으로 동작하지 않을 위험이 있었습니다. 또한, Entity와 ERDCloud 간 불일치 문제가 자주 발생했습니다. 원래는 ERDCloud에서 DDL을 추출한 뒤, 그중에서 수정되거나 추가된 부분만 직접 쿼리로 DB에 적용하는..

Spring 2025.09.25

JPQL 실행 시 Flush와 영속성 컨텍스트 동작 확인

JPQL 실행 시 Flush와 영속성 컨텍스트 동작 확인이 테스트는 두 가지 주요 목적을 가지고 있습니다:JPQL 실행 전 flush가 실행되는지 확인합니다.영속성 컨텍스트에 동일한 ID를 가진 엔티티가 존재할 경우, JPQL로 가져온 값이 영속성 컨텍스트의 값으로 대체되지 않는지 확인합니다. @Test@DisplayName("닉네임 변경 요청시 해당 회원의 닉네임을 변경한다.")void updateMemberWithNickNameRequest() throws Exception { //given Member member = saveMemberAndMemberImage(); Long memberId = member.getId(); Jwt jwtCreatedBySavedMember = generate..

Spring 2024.07.22

API 통신 시 null 값 처리: 포함 vs. 미포함의 장단점

API 통신 시 null 값 처리: 포함 vs. 미포함의 장단점JSON 기반의 API 통신에서 값이 null일 경우 이를 요청/응답에 포함시켜야 하는지는 자주 논의되는 주제입니다. 이 글에서는 StackOverflow 토론 내용을 기반으로 정리해 보았습니다. 대형 플랫폼의 사례StackOverflow에서 소개된 사례에 따르면, Twitter 같은 대규모 플랫폼에서는 "someGenericProperty": null 같은 26바이트의 단순 필드 제거만으로도 하루 300GB 이상의 트래픽 절감 효과를 얻을 수 있었다고 합니다.-> 하루 수십억 건의 API 요청이 발생하는 환경에서는 이런 미세한 최적화도 큰 비용 절감으로 이어집니다. 하지만 때로는, 응답에서 null 필드를 무조건 제외하는 것이 좋은 것은 아..

Spring 2024.07.22

JPA에서 단방향 및 양방향 일대일 관계의 외래키 처리와 지연 로딩 문제

JPA에서 단방향 및 양방향 일대일 관계의 외래키 처리와 지연 로딩 문제❗️일대일 대상 테이블에 외래키 단방향 관계는 JPA에서 지원하지 않으며, 양방향 관계만 지원합니다. [인프런 김영한님 자료]대상 테이블에 외래키가 존재하는 경우, 프록시 기능의 한계로 인해 지연 로딩으로 설정해도 항상 즉시 로딩됩니다.예를 들어, Member 객체를 가져왔을 때 JPA는 가져온 Member 객체에 Locker가 있는지 여부를 알아야 합니다. 1. 외래키가 Locker 에 있을 때외래키가 Locker에 있다면, Member 엔티티를 가져올 때 Member 클래스에 정의된 Locker가 존재하는지 확인해야 합니다. 이때 Member 테이블에는 외래키가 존재하지 않기 때문에, 지연 로딩 설정 여부와 상관없이 Locker ..

Spring 2024.07.22

Optional 클래스의 orElseThrow

Optional 클래스의 orElseThrow orElseThrow는 Optional 클래스의 메서드로, 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 예외를 던지도록 설계되었습니다. 이 메서드는 Supplier 인터페이스를 통해 예외를 생성하는데, Supplier는 인자를 받지 않고 결과를 반환하는 함수형 인터페이스입니다. orElseThrow 메서드는 다음과 같이 정의되어 있습니다public T orElseThrow(Supplier exceptionSupplier) throws X { if (value != null) { return value; } else { throw exceptionSupplier.get(); }}이 메서드는 값이 존재하면 그..

Spring 2024.07.22

[Spring] Enum 타입으로 Exception 구현하기

[Spring] Enum 타입으로 Exception 구현하기기존에 예외 처리를 다음과 같이 Enum 타입으로 구현했습니다.public enum AdminException { FAIL_TO_SIGN_IN(HttpStatus.BAD_REQUEST, "로그인에 실패했습니다."); private final HttpStatus status; private final String message;} Enum 타입은 기본적으로 java.lang.Enum을 암시적으로 상속받기 때문에 extends 키워드를 사용할 수 없습니다. 따라서 상속 기능을 구현하기 위해 interface를 사용했으며, interface는 다중 상속을 지원하므로 아래 코드와 같이 enum 클래스들이 CustomException 인터페이스를 impl..

Spring 2024.07.22

redis를 통해 로그아웃 기능 구현

RedisRedis는 오픈 소스 기반의 비관계형 DBMS로, Key-Value 구조의 비정형 데이터를 저장하고 관리한다. 이는 우리가 흔히 사용하는 MySQL과는 다르게, 인메모리 데이터 구조를 가진 저장소이다.MySQL과 같은 전통적인 DB는 데이터를 디스크에 저장한다. 이로 인해 서버가 다운되더라도 데이터는 보존되지만, 데이터를 조회할 때 디스크에서 읽어야 하므로 속도 면에서 불리하다. 반면, Redis는 자주 사용되는 데이터를 메모리에 저장하여 빠른 데이터 접근 속도를 제공한다.따라서 이번 프로젝트에서는 Redis를 활용하여 사용자의 로그아웃 시 발급된 JWT 토큰을 저장하고, 이를 BlackList로 관리한고, JWT 토큰의 유효 시간 동안 해당 토큰을 Redis에 보관함으로써, 로그아웃 후 토..

Spring 2023.11.27