CS/Spring(17)
-
[Spring/Springboot] @Valid 란?
@Valid스프링에서 입력 데이터의 유효성(Validation)을 자동으로 검사클라이언트가 보낸 데이터를 확인해서 규칙에 맞지 않으면 자동으로 오류를 알려줌1. DTO 클래스에서 사용import javax.validation.constraints.Email;import javax.validation.constraints.NotNull;public class SignUpRequestDTO { @NotNull(message = "이름은 필수") private String name; @NotNull(message = "이메일은 필") @Email(message = "유효한 이메일 주소를 입력") private String email;}//각각 @NotNull, @Email(이..
2024.12.23 -
[Spring/Springboot] Spring Data JPA - Paging/Slice
Spring Data JPA의 PagingSpring Data JPA는 페이징을 위해 2가지 객체를 제공 → Page, SlicePaging사용자가 어떠한 데이터를 요청했을 때, 전체 데이터 중 일부를 원하는 정렬 방식으로 보여주는 방식페이징 파라미터page : 페이징 기법이 적용되었을 때, 원하는 페이지size : 해당 페이지에 담을 데이터 개수sort : 정렬 기법⇒ 해당 파라미터들을 Peageable 구현체에 담아서 페이징 설정계층구조PeageablePagination을 위한 정보를 저장하는 객체interface로 Pageable의 구현체인 PageRequest 객체를 사용PageRequest 생성자의 파라미터에 page, size, sort를 파라미터로 사용 가능Pageable 사용 흐름클라이언트..
2024.12.23 -
[Spring/Springboot] @RestControllerAdvice/API 응답 통일/에러 핸들러
@RestContollerAdviceRestControllerAdvice = ControllerAdvice + ResponseBody@RestControllerAdvice 로 선언하면 컨트롤러에서 리턴하는 값이 응답 값의 body로 세팅되어 클라이언트에게 전달됨@RestControllerAdvice는 애플리케이션 전반에서 발생하는 예외를 전역적으로 처리함@RestController에서 발생하는 예외가 @RestControllerAdvice에 의해서 관리됨@Slf4j@RestControllerAdvice(annotations = {RestController.class})public class ExceptionAdvice extends ResponseEntityExceptionHandler { @Exc..
2024.12.22 -
[Spring/Springboot] N+1 문제 해결 방안 - Batch Size/2차 캐시/Subselect Fetching/DTO
1. Batch Size 설정Hibernate에서는 @BatchSize 어노테이션이나 hibernate.default_batch_fetch_size 설정을 통해 배치 크기(Batch Size)를 지정하여 N+1 문제를 해결할 수 있습니다.배치 크기를 설정하면 한 번에 가져올 연관 엔티티의 개수를 지정하여, 지연 로딩(Lazy Loading)을 사용할 때도 여러 엔티티를 한 번에 가져올 수 있습니다.@Entitypublic class Review { @ManyToOne(fetch = FetchType.LAZY) @BatchSize(size = 10) // 한번에 10개씩 로딩 private Store store; @ManyToOne(fetch = FetchType.LAZY) @B..
2024.12.22 -
[Spring/Springboot] QueryDSL이란?
QueryDSL문자가 아닌 자바코드로 JPQL을 작성할 수 있음JPQL 빌더 역할컴파일 시점에 문법 오류를 찾을 수 있음동적 쿼리 작성 편리함단순하고 쉬움실무 사용 권장JPAFactoryQuery query = new JPAQueryFactory(em);QMember m = QMember.member;List list = query.selectFrom(m) .where(m.age.get(18)) .orderBy(m.name.desc()) .fetch(); Querydsl의 개념과 JPQL과의 차이점Querydsl은 타입 안전한 쿼리 작성을 도와주는 도구로, 쿼리를 마치 메서드를 호출하듯이 Java 코드로 작성가능Querydsl은 쿼리의 동적 생성이 필요할 때 특히 유용하며, J..
2024.12.22 -
[Spring/Springboot] @EntityGraph
@EntityGraph@EntityGraph는 JPA에서 Fetch Join과 유사하게 사용되는 기능엔티티를 조회할 때 연관된 엔티티를 함께 로딩하여 N+1 문제를 해결@EntityGraph는 JPQL 쿼리가 아닌, 메서드에 직접 설정 ⇒ 특정 엔티티와 그 연관 엔티티를 한 번에 조회할 수 있도록@EntityGraph는 Lazy Loading을 사용하는 연관 엔티티를 즉시 로딩(Eager Loading)으로 바꾸어, 원하는 엔티티와 그 연관된 엔티티를 함께 조회할 수 있도록JPA에서는 지연 로딩(Lazy Loading)으로 인해 연관된 엔티티를 사용할 때마다 쿼리가 추가로 발생하는 N+1 문제가 생기는데, @EntityGraph는 이런 문제를 간단하게 해결@EntityGraph를 사용하는 방법@Entit..
2024.12.22