QueryDSL을 사용하다 보면 Predicate와 BooleanExpression 두 가지 타입을 자주 마주치게 됩니다. 둘 다 쿼리의 조건을 표현하는 데 사용되지만, 사용 목적과 특징이 조금 다릅니다. 이번 TIL에서는 이 두 타입의 차이를 정리하고, 언제 어떤 것
쿠키에서 JWT를 검증할 때 Bearer 처리가 문제되는 이유는 헤더와 쿠키가 데이터를 다루는 방식이 다르기 때문입니다. 이를 더 구체적으로 설명하겠습니다.헤더는 문자열 형태로 데이터를 전송하며, 클라이언트와 서버 간의 데이터 교환을 위해 사용됩니다.보통 Authori
Lazy Loading은 실제로 필요한 시점까지 데이터를 "지연"하여 조회하는 방식으로, 데이터베이스와 연결된 Entity 객체들을 필요할 때만 가져와 성능을 최적화하려는 기법입니다.예를 들어, Comment가 Todo와 관계가 있는 상황에서 FetchType.LAZY
이번 작업에서는 JPQL로 작성된 쿼리를 QueryDSL로 변경하여 동적 쿼리 작성과 N+1 문제 해결을 목표로 했습니다. QueryDSL은 직관적인 메서드 체인을 통해 동적 쿼리를 작성할 수 있는 라이브러리로, 엔티티 간의 조인을 명확하게 설정하여 JPA를 활용한 쿼
N+1 문제는 데이터베이스 성능을 저하시키는 대표적인 문제입니다. 특히 연관된 엔티티를 조회할 때 발생하며, 한 번의 기본 쿼리(N) 이후, 연관 엔티티를 조회하기 위한 추가 쿼리(+1)가 반복적으로 발생합니다.예를 들어, Comment 엔티티 목록을 조회하면서 각 댓
QueryDSL은 JPA의 엔티티(Entity) 정보를 활용하여 객체 지향적으로 쿼리를 작성할 수 있게 도와주는 쿼리 빌더입니다. SQL을 문자열로 작성하는 대신, 쿼리 전용 클래스(Q클래스)와 메서드를 사용하여 쿼리를 객체처럼 다루게 해줍니다. 덕분에 타입 안전성을
오늘은 Spring Data JPA에서 JpaRepository를 더 간편하게 활용하기 위한 방법들을 정리해 보았습니다. Optional을 깔끔하게 처리하고, 복잡한 메서드 이름을 줄이며, 간단한 데이터 업데이트 로직을 추가하는 방식으로 코드를 더 읽기 쉽고 관리하기
이번 글에서는 @OneToMany 관계와 FetchType.LAZY 옵션을 간단히 설명하겠습니다. 이 두 가지는 데이터베이스와 연결된 엔티티들이 어떻게 불러와지는지를 제어하는 데 중요한 역할을 합니다.@OneToMany는 '하나가 여러 개를 가진다'는 의미로, 예를 들
프로젝트 개발 중, 관리자 권한이 필요한 API의 접근 권한을 검증하는 로직이 서비스와 인가 필터에 분산되어 있다는 피드백을 받았습니다. 이로 인해 코드의 일관성이 떨어지고, 관리 기능이 추가될수록 검증 로직이 각기 다른 위치에서 처리될 가능성이 있었습니다.특히, 현재
진행 기간: 2024-11-01 ~ 2024-11-07스팡잇츠는 배달의민족과 쿠팡이츠를 벤치마킹하여 개발된 배달 서비스 앱의 백엔드 프로젝트입니다.사용자는 다양한 가게의 메뉴를 검색하고 주문할 수 있으며, 사장님은 가게와 메뉴를 관리할 수 있습니다.주요 기능으로는 회원
회원 탈퇴 기능을 소프트 삭제 방식으로 구현하기 위해, MemberStatus Enum 클래스를 추가하여 멤버의 상태를 ACTIVE 또는 DELETED로 구분했습니다. 이 후, 이미 회원 탈퇴한 사용자가 재가입하려는 경우 예외처리를 위해 회원가입 API에서 UserDe
회원가입 기능을 구현하고 /api/auth/signup 경로로 API 요청을 테스트하던 중, HTTP 200 OK 응답만 반환되고, 요청이 컨트롤러에 도달하지 않는 문제가 발생했습니다. 잘못된 URL로 요청해도 동일하게 200 OK 응답이 반환되어, 필터 체인이 요청을
Spring Security를 활용해 인증/인가 필터를 구현하다 보면 UserDetails와 UserDetailsService를 구현하는 과정이 포함됩니다. 처음엔 왜 굳이 이 클래스들이 필요한지 의문이 들었지만, Spring Security의 인증 과정과 표준화된 보
AOP를 통해 API 접근 로그를 기록하려고 AOP를 적용했으나, 테스트에서 JWT 필터가 Invalid JWT token 오류를 발생시키며 실패하는 문제가 발생했습니다.해결 시도 : AOP의 포인트컷을 해제하니 정상적으로 작동했습니다. 이는 AOP가 활성화될 때 JW
Spring에서는 예외 처리를 좀 더 편리하게 관리하고, 사용자에게 전달할 에러 메시지를 체계적으로 관리할 수 있는 기능을 제공합니다. 이를 통해 코드의 중복을 줄이고 유지보수를 쉽게 만들며, 효율적인 에러 메시지 관리는 사용자에게 명확한 피드백을 제공할 수 있습니다.
AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 공통 관심 사항을 핵심 로직과 분리하여 코드의 가독성과 유지보수성을 높이는 프로그래밍 패러다임입니다. Spring AOP는 이러한 공통 기능을 비즈니스 로직에 깔끔하게 추가하는 데 사용
즉시 로딩은 엔티티를 로딩할 때 연관된 엔티티도 함께 조회하는 방식입니다. 필요하지 않은 데이터도 미리 로딩되기 때문에 메모리를 많이 사용하지만, 반복 쿼리 발생을 방지할 수 있습니다.설정: @OneToOne(fetch = FetchType.EAGER) 또는 @Many
데이터 검증은 Java 프로그래밍에서 매우 중요한 과정입니다. 특히 Spring에서는 다양한 애너테이션을 활용해 Bean Validation을 간편하게 적용할 수 있어 코드가 간결해지고 오류를 줄일 수 있습니다.Java는 null 값에 접근할 때 NullPointerE
Java의 record는 Java 16에서 도입된 기능으로, 데이터를 간결하고 명확하게 표현하기 위해 설계된 불변(immutable) 데이터 클래스를 만드는 데 사용됩니다. 주로 데이터를 저장하고 전달하는 용도로 사용되며, DTO(Data Transfer Object)
이번 글에서는 사용자 관리 기능을 구현하면서 배운 내용을 정리해 보았습니다. 회원가입, 로그인, 그리고 필터를 활용한 인증과 인가를 어떻게 구현했는지 살펴보았습니다.회원 정보를 저장하기 위해 User 엔터티 클래스를 작성했습니다. 이 클래스는 회원의 ID, 사용자 이름