자바 스프링 부트 3일차 b01 Spring Data JPA 기본 및 CRUD

2026. 4. 6. 17:26대우개발원 수업 내용/spring boot, framework

반응형

Spring Data JPA 기본 및 CRUD
반복적인 SQL 작성 없이, 인터페이스 상속만으로 데이터베이스를 다루는 핵심 기술

레포지토리(Repository) 생성
  - 방법: extends JpaRepository\<엔티티, PK타입\>
  - 특징: JPA의 기본 기능(CRUD, 페이징 등)을 그대로 물려받아 바로 사용 가능
  - 테이블 자동 생성: @Entity 클래스와 application.properties의 ddl-auto 설정을 통해 
DB 테이블을 직접 SQL로 만들지 않아도 자동 생성됨

기본 CRUD 메서드
  - Insert: testInsert() / boardRepository.save(board) / PK(bno)가 없는 새 객체면 INSERT 실행
  - Select: testSelect() / boardRepository.findById(bno) / 데이터 조회 시 Optional로 감싸서 반환
  - Update: testUpdate() / board.change(...) 후 boardRepository.save(board) / PK가 이미 존재하면 자동으로 UPDATE 처리
  - Delete: testDelete() / boardRepository.deleteById(bno) / PK 기준으로 해당 레코드 삭제

Optional 이란?
NullPointerException을 방지하는 Wrapper 클래스
  - orElseThrow(): 값이 없으면 예외 발생 (가장 많이 사용)
  - orElse(null): 값이 없으면 null 반환
  - isPresent(): 값 존재 여부 (true/false)

-----

페이징 (Paging) 처리
전체 데이터가 아닌, 필요한 만큼의 데이터를 페이지 단위로 나눠서 조회하는 기능

핵심 인터페이스 및 클래스
  - Pageable: 페이징 정보를 담는 인터페이스
  - PageRequest: Pageable을 구현한 실제 객체. PageRequest.of(페이지번호, 데이터개수, 정렬조건) 형태로 사용 
(페이지 번호는 0부터 시작)

조회 결과 (Page\<Board\>)

  - etTotalElements(): 전체 데이터 개수
  - getTotalPages(): 전체 페이지 수
  - getNumber() / getSize(): 현재 페이지 번호 / 페이지당 크기
  - getContent(): 실제 조회된 데이터 리스트 (List\<Board\>) 반환

-----

QueryDSL (동적 쿼리 프레임워크)
Spring Data JPA만으로는 복잡한 조건이나 동적 쿼리(검색 조건에 따라 쿼리가 바뀌는 것)를 처리하기 어렵기 때문에 도입

QueryDSL의 장점
1.  컴파일 시점 오류 확인: 문자열(SQL)이 아닌 자바 코드로 작성하여 문법 오류를 실행 전에 파악
2.  IDE 자동완성: 인텔리제이 등 자동완성 지원
3.  동적 쿼리 작성의 편리함: 복잡한 if문 조건을 BooleanBuilder 등으로 깔끔하게 처리

QueryDSL 구현 핵심 구조 (중요)
QueryDSL 적용을 위한 3단계 구조

1.  사용자 정의 인터페이스 (BoardSearch)
  - 사용할 검색 메서드 선언 (예: search1, searchAll)


2.  구현 클래스 (BoardSearchImpl)
  - QuerydslRepositorySupport 상속 및 BoardSearch 구현(implements)
  - Q클래스(QBoard)를 사용하여 실제 쿼리 로직을 자바 코드로 작성

3.  기존 레포지토리에 상속 (BoardRepository)
  - 기존 JpaRepository와 함께 생성한 BoardSearch 인터페이스 다중 상속

검색 로직 분석 (searchAll 메서드)
  - JPQLQuery\<Board\> query = from(board): 쿼리 작성 시작
  - BooleanBuilder: 검색 조건(Title, Content, Writer) 존재 시 or 조건으로 동적 결합
  - this.getQuerydsl().applyPagination(...): 페이징 처리를 쿼리에 적용 (LIMIT 문 생성)
  - query.fetch() / query.fetchCount(): 실제 쿼리를 실행하여 리스트 데이터와 총 데이터 개수 조회
  - return new PageImpl\<\>(...): 조회된 결과를 JPA의 페이징 객체인 Page 타입으로 변환하여 반환