프로그래밍/스프링

[스프링] 8. JPA

riroan 2022. 8. 4. 07:34

JPA (Java Persistence API)

현재 자바에서 ORM기술 표준으로 알려져 있다.

스프링만을 위한 것은 아니고 자바 전반적으로 사용되는 듯 하다.

지난 시간 도메인 객체를 만들 때 Id, GeneratedValue, Entity 어노테이션이 그 예이다.

 

메소드명 의미
save 객체 하나를 삽입한다.
saveAll 여러개의 객체를 동시에 삽입한다.
findById 특정 Id를 가진 객체를 검색한다.(Optional로 반환)
findAll 테이블에 존재하는 모든 객체를 검색한다.
deleteById 해당하는 Id를 가진 객체를 삭제한다.
deleteAll 모든 객체를 삭제한다.(위험)
delete 해당 객체를 삭제한다.
deleteAllInBatch 모든 객체를 삭제하는데 한번의 SQL만 호출한다. (위험)
count 테이블에 존재하는 튜플의 개수를 센다.
existsById 해당하는 Id를 가진 튜플이 존재하는지 확인한다.

 

deleteAll이나 deleteAllInBatch는 둘 다 테이블에 존재하는 모든 튜플을 삭제하기 때문에 위험하고 잘 쓸 일도 없을 것이다.

기능은 같은데 둘의 차이라면 튜플의 수가 $n$개 있을 때 deleteAll은 각 튜플에 대해서 delete를 $n$번 수행하고 deleteAllInBatch는 한번으로 모두 지운다.

그래서 쓸 일이 생긴다면 deleteAllInBatch가 더 나을 것이다.

 

소마에서 객체는 최대한 보존하는게 좋다고 배웠다.

그래서 delete를 직접 사용하여 객체를 삭제하는 것 보다 deletedAt이라는 필드를 둬서 삭제했다는 표시를 하는게 좋다고 한다.

웬만하면 delete메소드를 사용할 일은 잘 없을 것 같다.

 

그런데 JPA가 CRUD를 수행한다면 Create -> save, Read -> find, Delete -> delete에 대응되는데 Update에 해당하는 메소드가 없다.

이것은 신기하게도 find를 하여 수정한 후 save를 하면 내부적으로 저장하려는 객체가 있다면 update, 아니라면 insert를 수행한다고 한다.

 

기본설정

 

JPA를 사용하기 위해서는 JpaRepository를 상속받은 인터페이스가 필요하다.

// repository/UserRepository.java

public interface UserRepository extends JpaRepository<User, Long> {
}

제네릭에 도메인 타입과 기본키 타입을 적으면 된다.

이 JpaRepository에 각종 메소드들이 있으므로 인터페이스를 활용하면 된다.

이제 UserRepository를 정의하고 위에서 소개한 메소드들을 사용하면 된다.

인터페이스명은 <<도메인 클래스 이름>>Repository 로 짓는게 국룰인 것 같다.

 

// application.yml

spring:
  application:
    name: catalog-service
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console
  jpa:
    defer-datasource-initialization: true
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    generate-ddl: true
    properties:
      hibernate:
        format_sql: true
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb

데이터베이스로 가볍게 h2 인메모리 DB를 사용할 예정인데 위의 코드를 application.properties대신에 넣는다.

이 코드를 이용하면 JPA가 사용하는 SQL문을 볼 수 있다.

 

'프로그래밍 > 스프링' 카테고리의 다른 글

[스프링] 9. 쿼리메소드  (0) 2022.08.10
[스프링] 7. Object Relational Mapping  (0) 2022.08.02
[스프링] 6. 테스트코드 작성  (0) 2022.08.02
[스프링] 5. Lombok  (0) 2022.07.22
[스프링] 4. Object Mapper  (0) 2022.07.18