[Spring] JPA란?

김재연·2023년 2월 28일
0

수숙관

목록 보기
2/17
post-thumbnail

JPA의 동작과정

  • JPAJAVA 애플리케이션JDBC API 사이에서 동작한다.
    <=> JPA 내부에서 JDBC API를 사용해서 SQL을 호출하여 DB와 통신한다.
  • 개발자는 JDBC API를 직접 쓸 필요 없이 JPA를 사용해서 DB와 통신할 수 있다.
  • 즉, 내가 SQL을 쓸 줄 모르는 바보라도 자바에서 이러쿵저러쿵하면 JPA가 알아서 SQL문을 만들어서 디비에 쏴준다는 뜻!

- 예시

저장(C) : jpa.persist(member)
조회(R) : Member member = jpa.find(memberId)
수정(U) : member.setName("변경할 이름")
삭제(D) : jpa.remove(member)

  • ex1)
    개발자가 쓴 코드 : jpa.persist(album);
    JPA가 처리한 코드 : INSERT INTO ITEM ..., INSERT INTO ALBUM ...
  • ex2)
    개발자가 쓴 코드 : Album album = jpa.find(Album.class, albumId);
    JPA가 처리한 코드 : SELECT I.*, A.* FROM ITEM I JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID

dependencies 설정

프로젝트의 build.gradle - dependencies 에 아래 코드를 추가하여 JPA를 사용할거라고 알려준다.

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

application.properties 설정

application.properties에서 상세한 JPA 설정값을 지정할 수 있다. 그중 가장 흔히 사용하는 3가지 설정값에 대해 알아보도록 하겠다.

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

1. ddl-auto

애플리케이션 구동 시 JPA의 데이터베이스 초기화 전략을 설정하는 부분인데, 쉽게 말해서 그냥 프로젝트를 실행할때 DB에 자동으로 테이블이 어떻게 반영되게 할지 설정하는 부분이다.

create : 기존테이블 삭제 후 다시 생성
create-drop : create와 같으나 종료시점에 테이블 삭제
update : 변경된 스키마 반영
validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
none : 사용하지 않음

지난번에 지쿠랑 종자 프로젝트 할 때는 create로 하니까 코드를 고치고 다시 런을 돌릴때마다 디비가 초기화돼서 처음에 테이블 만들때만 해당 줄을 살려놨다가 그 다음부터는 이 줄을 주석처리하고 개발했었다.

근데 이번에는 update로 해놨더니 서버를 다시 시작한다고 해서 디비가 날아가지는 않고 말그대로 변경분만 반영되고 있다. 근데 컬럼 삭제는 반영이 되지 않아서 (컬럼 삭제가 엄청난 문제를 발생시킬 수 있어서 원래 안된다고 한다.) 컬럼 삭제의 경우에는 일일이 mysql workbench를 통해 직접 삭제해주고 있다.

cf) 스테이징, 운영환경에서는 절대로 create, create-drop, update를 사용하면 안된다고 한다.

2. show-sql

이 값을 true로 설정하면 Hibernate가 DB에 날리는 모든 쿼리(DDL, DML)를 보여준다. API 테스트를 할 때 날아간 쿼리가 터미널에 떠있는 것을 볼 수 있다.

3. format_sql

쿼리가 보기좋게 정렬되어서 터미널에 찍힌다.


Reference

[JPA] JPA란

profile
일기장같은 공부기록📝

0개의 댓글