Pageable

findAll() 과 같은 조회를 하게 된다면 페이징이 필요할 때가 있다.

페이징을 위해 몇 번째 페이지인지에 대한 정보(page) 한 페이지당 보여줄 데이터의 개수(size) 가 필요하다.

 

 

 

예시

@GetMapping
public ResponseEntity<?> page(@RequestParam int page, @RequestParam int size) {
    Pageable pageable = PageRequest.of(page, size);
    Page<Member> members = memberRepository.findAll(pageable);
    return new ResponseEntity<>(members, HttpStatus.OK);
}

 

pageable을 레포시토리 메서드의 인자로 넘기면 JPA가 알아서 페이징을 처리해 준다.

 

 

 

@GetMapping
public ResponseEntity<?> page(Pageable pageable) {
    Page<Member> members = memberRepository.findAll(pageable);
    return new ResponseEntity<>(members, HttpStatus.OK);
}

 

컨트롤러에서 Pageable을 직접 인자로 설정 가능

 

 

 

반환 타입 - Page, Slice, List

Page<Member> page = memberRepository.findAll(pageable);
Slice<Member> slice = memberRepository.findAll(pageable);
List<Member> list = memberRepository.findAll(pageable);

 

Page : count 쿼리 결과를 포함하는 페이징

Slice : count 쿼리 없이 다음 페이지만 확인 가능 (limit + 1) 예로는 맨 아래쪽에 "더보기" 버튼 누르면 다음 몇 개의 게시글 보여주는 방식 (모바일 무한 스크롤), 데이터 양이 많을 수록 slice를 사용하는 것이 성능상 유리

List : 페이징을 하되 결과를 페이징 정보 없이 단순 List로 받음, 카운트 쿼리 실행 안함

 

 

 

엔티티를 DTO로 변환

Page<Member> page = memberRepository.findAll(pageable);
Page<MemberDto> memberDtos = page.map(m -> new MemberDto(m.getId(), ...생성자 형식));

 

DTO로 변환하는 방법

 

 

 

참고 : https://gksdudrb922.tistory.com/

'JPA' 카테고리의 다른 글

[JPA] countQuery  (0) 2024.11.10
[JPA] @OneToOne, 일대일 관계  (0) 2024.02.26
[JPA] 값 타입 (Value Object)  (0) 2024.02.26
[JPA] SQL 쿼리를 활용  (0) 2024.02.19
[JPA] 식별자 생성  (0) 2024.02.19
    @Query(value = "select id, name from product where name = :productName", nativeQuery = true)
    Page<Product> findAllByNameWithPagination(String productName, Pageable pageable);

 

페이징으로 조회 할 때, 다음과 같이 기본적인 쿼리 형식으로 조회할 경우 에러가 발생할 확률이 높아진다.

 

 

 

    @Query(value = "select id,name from product a where name = :productName", nativeQuery = true
            ,countQuery = "select count(*) from product where name = :productName ")
    Page<Product> findAllByNameWithPagination(String productName, Pageable pageable);

 

countQuery 를 이용하여 총 갯수를 구한 후, 조회한다면 에러가 발생하지 않는다.

'JPA' 카테고리의 다른 글

[JPA] JPA의 페이징 - Pageable  (0) 2024.11.26
[JPA] @OneToOne, 일대일 관계  (0) 2024.02.26
[JPA] 값 타입 (Value Object)  (0) 2024.02.26
[JPA] SQL 쿼리를 활용  (0) 2024.02.19
[JPA] 식별자 생성  (0) 2024.02.19

설명

일대일(1:1) 관계에서는 주 테이블이나 대상이 되는 테이블 양쪽 모두 외래 키를 가질 수 있다. 때문에 일대일 관계를 적용할 때는 주 테이블과 대상이 되는 테이블, 어느 쪽에 외래키를 둘지 선택해야 한다.

 

 

 

단방향

 

엔터티가 두개인데, 여기서 LibraryCard에서 보면 LibraryMemeber를 변수로 가지는 owner가 일대일 관계임을 선언하는 조인 컬럼이다. @OneToOne 어노테이션을 설정한다.

 

 

 

 

값을 집어넣었다. fk 부분에 PK로 설정한 값이 넣어져 있는 것을 확인할 수 있다.

 

 

 

 

양방향

 

양방향 관계일 경우 다음과 같이 설정하면 된다.

'JPA' 카테고리의 다른 글

[JPA] JPA의 페이징 - Pageable  (0) 2024.11.26
[JPA] countQuery  (0) 2024.11.10
[JPA] 값 타입 (Value Object)  (0) 2024.02.26
[JPA] SQL 쿼리를 활용  (0) 2024.02.19
[JPA] 식별자 생성  (0) 2024.02.19

엔티티 타입 vs 값 타입

 

엔티티 타입

1. @Entity로 정의하는 객체

2. 식별자를 통해 지속적으로 추적이 가능해 값을 변경해도 식별자를 통해 같은 객체인지 인식 가능

3. 생성, 소멸, 영속 등의 생명 주기가 존재

4. 다른 객체에서 참조가 가능

 

 

값 타입

1. int, Integer, String 등 단순히 값으로 사용하는 자바 기본 타입이나 객체

2. 식별자가 없고 값만 존재하기 때문에 추적이 변경시 불가능

3. 생명주기를 엔티티에 의존. 의존하는 엔티티가 제거되면 함께 삭제

4. 공유하지 않는 것이 안전

 

 

 

 

예시

 

 

@Embedded : 값 타입을 사용하는 곳에 작성한다.

@Embeddable : 값 타입을 사용하는 곳에 작성한다.

 

둘 중 하나만 명시해도 되지만, 둘 다 적는 것이 좋다.

 

 

 

 

 

 

 

값이 정상적으로 저장되었다.

 

 

 

 

 

만약 테이블이 2개이고, 한 쪽이 다른 한 쪽을 참조 할 경우

 

 

 

 

 

 

@AttributeOverrides 와 @AttributeOverride 를 이용하여 속성과 (테이블과 컬럼)의 매핑 정보를 정의한다.

 

 

 

 

 

 

값이 정상적으로 등록되었다.

'JPA' 카테고리의 다른 글

[JPA] countQuery  (0) 2024.11.10
[JPA] @OneToOne, 일대일 관계  (0) 2024.02.26
[JPA] SQL 쿼리를 활용  (0) 2024.02.19
[JPA] 식별자 생성  (0) 2024.02.19
[JPA] 테이블에 데이터 넣기 테스트  (0) 2024.02.04

 

엔티티를 다음과 같이 설정한 후,

 

 

 

Enum으로 MemberRole (사용자 role)을 다음과 같이 설정한다. (Enum 은 해당 컬럼의 값이 저 값으로 제한을 하는 역할을 한다.)

 

 

 

 

@Query 어노테이션을 이용하여 조회, 수정 쿼리를 집어넣고, 해당 메서드를 실행하면 해당 쿼리를 실행하는 방식으로 진행하였다.

 

 

 

 

서비스 부분

 

 

 

서비스에서 만들어놓은 addMember() 메소드를 이용하여 값을 집어 넣고

 

 

 

 

생일 컬럼에 값을 집어넣기 위한 Date형 메서드를 만든다.

 

 

 

 

기타 다른 SQL 쿼리를 실행시킬 메서드 역시 다음과 같이 만들고 실행시키면 된다.

 

 

 

 

 

 

값을 집어넣은 경우

'JPA' 카테고리의 다른 글

[JPA] @OneToOne, 일대일 관계  (0) 2024.02.26
[JPA] 값 타입 (Value Object)  (0) 2024.02.26
[JPA] 식별자 생성  (0) 2024.02.19
[JPA] 테이블에 데이터 넣기 테스트  (0) 2024.02.04
[JPA] ORM (Object Relational Mapping)  (0) 2024.02.03

자동증가 컬럼을 지정하기 위해 @GeneratedValue 어노테이션을 쓴다.

 

 

이미 테스트를 하고, 값을 집어넣지 않았었는데, 그 다음 @Commit 어노테이션으로 값을 집어넣으면 1001이 아닌 1002로 값이 넣어진다. 값 넣기 실패를 해도 1이 자동으로 올라가기 때문이다.

'JPA' 카테고리의 다른 글

[JPA] 값 타입 (Value Object)  (0) 2024.02.26
[JPA] SQL 쿼리를 활용  (0) 2024.02.19
[JPA] 테이블에 데이터 넣기 테스트  (0) 2024.02.04
[JPA] ORM (Object Relational Mapping)  (0) 2024.02.03
[JPA] 시작  (0) 2024.02.03

 

테스트 쪽에 메인 부분처럼 exam.entity 패키지를 만들고, 그 안에 BookRepositoryTest 자바 파일을 만든다.

패키지 밖에 RoastTest 자바 파일 역시 만든다.

 

 

 

 

테스트를 위한 RoastTest 클래스, @SpringBootTest 라는 어노테이션을 작성한다.

 

 

 

 

위의 RoastTest 클래스를 상속 받는 BookRepositoryTest. 이미 만든 BookRepository 클래스를 불러와서, 해당 메서드의 부모 메서드에서 상속받은 save() 메서드로 테스트를 해 본다.(데이터 추가 메서드). 다음과 같이 작성 후,  @Test 어노테이션을 설정한다. @Transactional 은 데이터를 집어 넣지 않고, 테스트 성공 여부만 알려주는 역할이다. @Commit은 그게 싫다면 데이터를 추가해주는 역할. 우클릭 후 Run As에 Junit test를 누르면 된다.

 

 

 

 

그 결과 테이블에 데이터가 추가되었다.

 

 

 

 

값을 불러오기 위해서는 findAll() 이라는 메소드를 쓴다. 모든 데이터를 List로 묶어 for문으로 출력한다.

 

 

 

 

그럼 다음과 같이 출력된다. ToString을 사용하지 않아 해당 데이터의 주소값이 뜬다.

 

 

 

 

그럴 경우 이미 만들어놓은 Book 엔티티 클래스에 ToString 어노테이션을 추가하고 다시 실행하면 데이터들이 불러와진다.

'JPA' 카테고리의 다른 글

[JPA] 값 타입 (Value Object)  (0) 2024.02.26
[JPA] SQL 쿼리를 활용  (0) 2024.02.19
[JPA] 식별자 생성  (0) 2024.02.19
[JPA] ORM (Object Relational Mapping)  (0) 2024.02.03
[JPA] 시작  (0) 2024.02.03

ORM (Object Relational Mapping)

객체구조와 테이블구조를 매핑시키는 기법

 

 

 

 

 

말 그대로 클래스와 테이블을 매핑하는 것, 해당 클래스가 해당 테이블임을 확인시켜주는 어노테이션들과 컬럼 어노테이션들을 다음과 같이 매핑하면 된다. 만약 속성명이 테이블의 컬럼명과 같을 경우 굳이 @Column 어노테이션을 설정하지 않아도 된다.

 

 

 

 

 

 

데이터를 삽입, 삭제, 조작 등을 할 수 있는 레포시토리 인터페이스, DAO 같은 역할을 한다.

'JPA' 카테고리의 다른 글

[JPA] 값 타입 (Value Object)  (0) 2024.02.26
[JPA] SQL 쿼리를 활용  (0) 2024.02.19
[JPA] 식별자 생성  (0) 2024.02.19
[JPA] 테이블에 데이터 넣기 테스트  (0) 2024.02.04
[JPA] 시작  (0) 2024.02.03

그 동안 MyBatis를 위주로 공부했고, 프로젝트도 MyBatis 기반으로 만들었다. JPA를 새로 배우기 시작했고, 아래는 Spring Boot 기본적인 셋팅을 완료하였다.

 

 

JPA(Java Persistence API) 란?

Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음

자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스

인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함

 

'JPA' 카테고리의 다른 글

[JPA] 값 타입 (Value Object)  (0) 2024.02.26
[JPA] SQL 쿼리를 활용  (0) 2024.02.19
[JPA] 식별자 생성  (0) 2024.02.19
[JPA] 테이블에 데이터 넣기 테스트  (0) 2024.02.04
[JPA] ORM (Object Relational Mapping)  (0) 2024.02.03

+ Recent posts