티스토리 뷰

JPA의 엔티티 매니저가 활성된 상태로(Spring Data JPA)를 사용하면 기본옵션이다.

트랜잭션 안에서 데이터베이스에서 데이터를 가져오면 이 데이터는 영속성 컨텍스트가 유지된 상태라고 한다.

이 상탱서 해당 데이터의 값을 변경하면 트랜잭션이 끝나는 시점에 해당 테이블에 변경분을 반영한다.

즉 Entity 객체의 값만 변경하면 별도로 Update 쿼리를 날릴 필요가 없습니다.

 

Repositroy 구현 시 JpaRepository interface를 상솓 받으면 된다.

-JpaRepositroy의 제네릭 타입에는 Entity 클래스와 PK의 타입을 명시해주면 된다.

-CRUD작업이 간편하다 일반적으로 많이 사용하는 데이터 조작을 다루는 함수가 정의되어 있기 때문이다.

 

JPA사용 시 

@NoArgsConstructor(access=AccessLevel.PROTECTED)

->파라미터가 없는 기본 생성자를 추가하는 어노테이션입니다. ( JPA 사용을 위해 기본 생성자 생성은 필수입니다.)

access는 생성자의 접근 권한을 설정하는 속성이며, 최종적으로 protected BoardEntity(){} 와 동일하다

->protected인 이유는 Entity 생성을 외부에서 할 필요가 없기 때문이다.

 

@Setter

->이 어노테이셔는 setter를 자동생성 해주지만 무분별한 setter 사용은 안정성을 보장받기 어려우므로 Builder패턴을 사용합니다

 

비지니스 로직은 Entity를 기준으로 돌아가기 때문에 Entity를 Request,Response용도로 사용하는 것은 적절하지 못하다.

따라서 데이터 전달 목적을 갖는 dto클래스를 정의하여 사용한다.

 

@MappedSuperclass

->테이블로 매핑하지 않고, 자식 클래스(엔티티)에게 매핑정보를 상속하기 위한 어노테이션

@EntityListeners(AuditingEntityListener.class)

->JPA에게 해당 엔티티는 Auditing 기능을 사용한다는 것을 알리는 어노테이션이다.

@CreatedDate

->엔티티가 처음 저장될 때 생성일을 주입하는 어노테이션이다.

->이때 생성일은 update할 필요가 없으므로, updatable = false 속성을 추가한다.

(속성을 추가하지 않으면 수정 시, 해당 값은 null이 되어버린다)

 

@LastModifiedDate

->Entity가 수정될 때 수정일자를 주입하는 어노테이션이다.

 

Auditing기능을 활성하 하기 위해서는

application에서 @EnableJpaAuditing 어노테이션을 추가해줘야한다.

 

@Builder

->해당 엔티티에서 to의 메서드를 호출하여 필요한 값을들 채워 넣어서 setter처럼 활용한다

    public BoardEntity toEntity(){
        BoardEntity boardEntity = BoardEntity.builder()
                .id(id)
                .writer(writer)
                .title(title)
                .content(content)
                .build();
        return boardEntity;
    }

이런식으로 dto에서 메서드를 만들어 dto값들을 넣어준다

 

 

또한 Service에서 Repository 메서드를 호출할 때, Entity를 전달한 이유는 JpaRepository에 정의된 함수들은 미리 정의되어 있기 때문이다.

그래서 엔티티를 전달할 수 밖에 없는것이다.

 

 

save() - Jpa 

 

또한 JpaRepository에서 메서드명의 By 이후에는 SQL의 where 조건 절에 대응되는 것인데 Containing을 붙여주면 Like 검색이 됩니다.

 

StartsWith

- 검색어로 시작하는 Like검색 

- {keyword}%

 

EndsWith

- 검색어로 끝는 Like 검색

- %{keyword}

 

IgnoreCase

- 대소문자 구분 없이 검색

 

Not

- 검색어를 포함하지 않는 검색

 

페이징

 ex)boardRepository.findAll(PageRequest.of(pageNum -1, 페이지 카운트 , Sort.by( Sort.Direction.ASC,"기준조건")));

repository의 find() 관련 메서드를 호출할 때 Pageable 인터페이스를 구현한 클래스 PageRequest.of() 를 전달하면

페이징을 할 수 있습니다. 

 -첫 번째 인자  : limit을 의미합니다, "현재 페이지 번호-1"을 계산한 값이며, 실제 페이지 번호와 SQL조회시 사용되는 limit은 다르기 때문입니다. 따라서 1번째 인자-1을 해준것입니다.

- 두 번째 인자 : offset을 의미합니다.  즉 , 먗개를 가져올 것인가? 입니다

- 세 번째 인자 : 정렬 방식을 결정합니다.

반환된 Page객체getContent() 메서드를 호출하면 엔티티를 리스트로 꺼낼 수 있습니다.

여기서는 하나의 페이지에는 4개의 게시글을 가져오고 총 5개의 번호를 노출합니다.

번호 5개를 채우지 못 하면 (=게시글이 20개가 안되면) 존재하는 번호까지만 노출합니다.

 

'Database > JPA' 카테고리의 다른 글

[JPA] Spring data jpa의 Auditing  (0) 2020.08.15
[JPA]@Id와@GeneratedValue 기본키 전략  (0) 2020.02.11