분류 전체보기 48

@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

JSONObject

JSONObject는 Java에서 JSON 데이터를 표현하고 다루기 위한 객체입니다.JSON은 데이터를 키-값 쌍으로 표현하는 형식이며, JSONObject를 사용하면 Java 코드에서 이 구조를 손쉽게 만들고 읽을 수 있습니다. 주요 기능 문자열로 된 JSON을 파싱하여 객체처럼 다룸키-값 형태의 JSON 데이터 생성값을 가져오거나 수정, 삭제 가능간단한 JSON 응답 구성이나 디버깅용으로 유용 내부 구조JSONObject는 내부적으로 데이터를 Map 구조로 저장하며,문자열, 숫자, boolean, 배열, 중첩된 JSONObject 등 다양한 값을 저장할 수 있습니다.

Java 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

[Java] Enum

Enum Type(열거형 타입)이란 무엇인가요? 언제 사용해야 하나요?Enum(열거형 타입)**은 서로 관련된 상수들의 집합을 정의하는 특별한 데이터 타입입니다. Java에서 Enum은 특정한 이름을 가진 고정된 상수 집합을 정의할 때 사용되며, 각 상수는 Enum 타입의 인스턴스로 표현됩니다. 사용 시점고정된 상수 집합: 예를 들어 요일, 계절, 방향(북, 남, 동, 서) 등과 같은 고정된 상수 집합을 정의할 때 사용합니다.타입 안전성 보장: Enum을 사용하면 지정된 값들만 허용되므로, 잘못된 값이 사용되는 것을 방지할 수 있습니다.가독성과 유지보수성: 의미 있는 이름을 가진 상수를 사용하므로, 코드의 가독성을 높이고, 유지보수도 용이하게 만듭니다.Enum의 장점은 무엇이며, 기존의 정수 상수와 비교..

Java 2024.09.11

[Java] 제너릭(Generics)

제네릭(Generics)**은 Java에서 다양한 타입의 객체를 다룰 수 있는 클래스, 인터페이스, 메서드를 정의할 수 있도록 해주는 기능입니다. 제네릭은 컴파일 시 타입을 지정하고 검사할 수 있게 하여 타입 안정성을 보장하고, 형변환의 필요성을 줄여 코드의 가독성과 유지보수성을 향상시킵니다. 제네릭이 해결한 문제타입 안정성 부족: Java 5 이전에는 컬렉션과 같은 데이터 구조에 다양한 타입의 객체를 저장할 수 있었지만, 이를 다시 사용할 때마다 형변환(casting)을 해야 했습니다. 이 과정에서 런타임 시점에 ClassCastException이 발생할 가능성이 있었습니다.형변환의 불편함: 매번 객체를 사용할 때마다 수동으로 형변환을 해야 하므로 코드가 복잡해지고, 실수를 유발할 가능성이 높아졌습니다..

Java 2024.09.11