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 |