SPRING 21

@RequestBody는 왜 Servlet이나 Spring Filter에서 사용할 수 없을까?

Spring MVC에서는 @RequestBody를 사용하면 요청 바디(JSON 등)를 자동으로 Java 객체에 매핑해주는 아주 편리한 기능을 제공합니다.하지만 Servlet, Filter, 또는 Spring Security Filter 같은 컨트롤러 이전 단계에서는 이 기능을 쓸 수 없습니다. 먼저, @RequestBody는 어떤 역할을 할까? 하지만 Filter나 Servlet은 DispatcherServlet보다 먼저 동작함Filter는 HTTP 요청이 Spring MVC에 전달되기 전에 실행됩니다.. 따라서 Filter에서는: @RequestBody가 작동할 수 있는 구조 자체가 아님요청 바디는 아직 Spring에 의해 파싱되지 않았음직접 request.getInputStream()으로 읽어야만 가능함

SPRING 2025.05.19

[Spring]QueryDSL의 Expression이란?

1. Expression의 정의 Expression은 SQL에서 "하나의 값"이 될 수 있는 것을 표현하는 QueryDSL의 핵심 인터페이스야. 2. Expression의 주요 종류 타입설명Expression모든 표현식의 최상위 타입StringExpression문자열 값 표현 (user.name.like("%abc%"))NumberExpression숫자 값 표현 (user.age.add(1), gt(10))BooleanExpression논리 표현식 (user.age.gt(20).and(user.status.eq("Y")))DateExpression날짜 관련 표현식SimpleExpression특별한 타입이 없을 때 사용StringTemplate / NumberTemplate직접 SQL 함수나 표현식 지정 ..

SPRING 2025.04.25

[QueryDsl] QueryDSL의 BooleanBuilder

QueryDSL을 쓰다 보면 동적으로 WHERE 조건을 조립해야 할 때가 많습니다.예를 들어 검색 조건이 유동적으로 들어오거나, 여러 필터를 선택적으로 적용해야 할 때가 있죠.이럴 때 사용하는 게 바로 **BooleanBuilder**입니다.BooleanBuilder란?BooleanBuilder는 QueryDSL의 Predicate들을 유연하게 조합할 수 있도록 도와주는 조건 조립용 빌더 객체입니다. 왜 BooleanBuilder를 쓰는가?보통 검색 API는 다양한 필터 조건을 입력받습니다.이름 검색나이 필터지역 선택가입일 기간이처럼 조건이 전부 선택적일 때,만약 각각의 조건마다 쿼리를 분기 처리하려면 코드가 지저분해지고 중복이 많아집니다.👉 BooleanBuilder를 쓰면?조건이 있는 것만 .and..

SPRING 2025.04.23

QueryDSL에서 문자열 포함 검색 (LIKE %keyword%) 처리 방법 정리

Spring Boot + QueryDSL을 사용하면서 검색 조건을 동적으로 구성할 때,특정 문자열이 포함되어 있는지 여부를 확인하는 기능은 정말 자주 사용됩니다 예를 들어 회원 이름에 홍길동이 포함된 데이터를 조회하는 경우,SQL에서는 보통 아래처럼 작성하죠. 하지만 QueryDSL에서는 like('%홍길동%')처럼 직접 문자열을 넣을 수 없기 때문에,문자열 연결 (concat)을 활용한 처리가 필요합니다. QueryDSL은 타입 안정성과 자동 완성이라는 장점이 있지만,SQL처럼 직관적으로 LIKE '%값%'을 쓰긴 어렵기 때문에concat()과 Expressions.asString()을 적절히 활용해야 합니다.

SPRING 2025.04.22

[Spring] Spring에서 에러 명칭을 관리하는 방법(에러처리)

에러는 언제든지 발생할 수 있습니다. 중요한 건 어떤 에러가 발생했는지를 명확히 표현하고, 적절하게 처리할 수 있도록 만드는 것이죠.Java나 Spring에서는 이를 위해 RuntimeException을 상속하여 명확한 명칭의 커스텀 예외를 자주 사용합니다. 왜 RuntimeException을 확장할까?기본적으로 RuntimeException은 checked 예외와 다르게 컴파일 시점에 예외 처리를 강제하지 않습니다.이는 비즈니스 로직에서 많이 발생하는 예외 처리에 적합합니다.그리고 RuntimeException을 확장하여 우리가 정의한 도메인에 맞는 명확한 에러명을 만들 수 있습니다.예를 들어볼까요?  CApiServiceErrorException 같은 커스텀 예외를 쓰는 이유 & 장점 로깅/모니터링에..

SPRING 2025.04.08

[Spring] 테스트 코드에 config적용법

@Import 어노테이션이란?@Import는 Spring의 컨텍스트에 특정 구성 클래스를 명시적으로 로드하여, 해당 클래스의 빈(bean) 정의나 기타 설정을 사용할 수 있도록 하는 어노테이션입니다. 이를 통해 애플리케이션의 특정 설정을 선택적으로 테스트할 수 있습니다.왜 @Import 어노테이션을 테스트 코드에서 사용할까?특정 구성만 테스트할 수 있음: 테스트 중 특정 구성이나 설정이 필요할 때, 전체 애플리케이션 컨텍스트를 로드하지 않고도 필요한 설정만 가져와서 사용할 수 있습니다. 이를 통해 테스트 시간을 단축하고 성능을 최적화할 수 있습니다.테스트 격리: 여러 개의 구성 설정을 테스트할 때, 설정 간의 충돌이나 의존성 문제를 방지하기 위해 @Import를 사용하여 테스트할 특정 설정을 분리할 수 ..

SPRING 2024.09.10

[Spring] @ActiveProfiles 사용 가이드

Spring Framework를 사용하다 보면 서로 다른 환경에서 애플리케이션을 실행해야 할 때가 많습니다. @ActiveProfiles는 Spring의 이러한 Profile 기능을 테스트 코드나 설정 클래스에서 사용할 수 있게 해주는 어노테이션입니다. 특히, @ActiveProfiles 어노테이션은 특정 테스트나 구성 클래스가 실행될 때 어떤 Profile을 활성화할지를 명시하는 데 사용됩니다.Profile이란 무엇인가?Profile은 특정 환경에 맞게 설정된 빈(bean) 구성의 집합입니다. 예를 들어, 개발 환경에서는 개발용 데이터베이스를 사용하고, 테스트 환경에서는 테스트용 데이터베이스를 사용하고, 운영 환경에서는 실제 운영용 데이터베이스를 사용해야 할 수 있습니다. Spring은 이러한 환경 구..

SPRING 2024.09.10

[Spring] Spring Security에서의 AntPathRequestMatcher와 인증 설정

오늘은 Spring Security에서 AntPathRequestMatcher를 사용하여 인증을 설정하는 방법에 대해 알아보겠습니다. AntPathRequestMatcher란 무엇인가?AntPathRequestMatcher는 Spring Security에서 요청 URL과 HTTP 메서드를 매칭하기 위해 사용되는 클래스입니다. 특정 URL 패턴과 HTTP 메서드를 정의하여, 해당 조건에 부합하는 요청을 식별하고 처리할 수 있도록 돕습니다. 예를 들어, 다음과 같은 코드를 살펴보겠습니다:    이 코드는 /login 경로로 들어오는 POST 요청에 대해 인증을 요구하도록 설정합니다. 위 코드에서 사용된 setRequiresAuthenticationRequestMatcher와 AntPathRequestMatc..

SPRING 2024.09.05

[SPRING] - 비동기 처리 도입으로 대량주문 시간 단축

비동기 처리 도입을 통해 대량 주문 처리 시간이 획기적으로 단축되었습니다. ExecutorService없이 Redis만 사용한 코드  기존의 동기식 방식에서는 각 주문을 순차적으로 처리하였고, 이는 총 100,000개의 주문을 생성하는 데 54890ms시간이 소요되었습니다. 반면, 이번 테스트에서는 Java의 ExecutorService를 추가하여 주문 생성을 비동기 방식으로 수행함으로써 성능 최적화를 시도하였습니다. Redis + ExecutorService 추가한 코드  테스트 결과비동기 처리를 사용한 방식은 전체적으로 더 나은 성능을 보였으며, 테스트 결과 총 100,000개의 주문을 처리하는 데 걸린 시간은 기존 방식에 비해 절반으로 줄어들었습니다. 이는 서버의 효율적인 리소스 사용을 가능하게 했..

SPRING 2024.08.30

[Spring] - ExecutorService를 사용하여 대량주문시간단축

이번에 진행한 테스트는 대량 주문 처리 성능 최적화를 목표로 하였습니다테스트 시나리오는 총 100개의 서로 다른 상품과 100,000개의 주문을 생성하여 얼마나 효율적으로 DB에 저장되었는지 비교하는 경우입니다.  먼저, 100개의 서로 다른 상품을 생성하여 데이터베이스에 저장하고, 동시에 Redis 캐시에 각 상품의 정보를 저장함으로써 데이터 조회 성능을 향상시켰습니다. 각 상품은 고유의 이름, 가격, 재고 수량을 가지며, 충분한 재고를 보유하도록 설정했습니다.그 후, 비동기 방식으로 100,000개의 주문을 생성하는 테스트를 진행했습니다. 각 주문은 랜덤으로 선택된 상품과 함께 생성되었으며, 주문 항목의 수량은 1개로 고정하고, 제품 가격과 일치하도록 설정했습니다. 또한, 랜덤한 배송 주소를 생성하여..

SPRING 2024.08.30