Spring Framework/[인프런] Java ORM 표준 프로그래밍 - JPA

Chapter 02. JPA 시작하기

계란💕 2022. 9. 3. 23:33

2.1 프로젝트 생성

 

H2 데이터베이스 설치와 실행

  • H2는 웹 용 Query tool을 제공하는 가벼운 실습용 데이터 베이스이다. 시퀀스, auto increment 기능 지원
  • 데이터베이스 시뮬레이션 기능이 있다. 
  • H2 데이터베이스를 설치한다.    https://www.h2database.com/html/main.html

다운로드 선택

 

  • maven 프로젝트 생성
  • maven - 라이브러리 자동 다운로드 및 의존성 관리
    • 아까 사이트에서 다운받은 2.1.214 버전과 같은 드라이버를 사용해야한다.
html
열기

 

  • JPA 설정 -  persistence.xml파일을 만들어서 META-INF에 저장한다.
    • 필수 속성: h2-console에서 사용할 id, password,url이다. hibernate.dialect의 "H2diarect"를 오라클 버전으로 변경할 수도 있다. 그러면 Main클래스를 실행했을 때 오라클 버전으로 쿼리(format_sql)가 출력된다. 
java
열기

 

 

 

데이터베이스의 방언(dialect) - SQL 표준을 지키지 않는 특정 데이터베이스의 고유 기능

  • JPA는 특정 데이터베이스에 종속적이지 않다
  • 각각 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르다.
    • ex)
      • 부분 문자열: substr(오라클), substring(sql 표준),
      • 페이징(limit - MySQL, ROWNUM - Oracle)

 

 

2.2 애플리케이션 개발

 

  • JPA 구동 방식

 

  • Main 클래스
    • 엔티티 매니저 팩토리를 만들면 데이터베이스 연결이 된다.
java
열기

 

============================ 오류 ============================ 

JdbcSQLNonTransientConnectionException

 

  - 오류: jdbc와 연결할 수 없다는 오류가 난다.

    -> JdbcSQLNonTransientConnectionException

    -> JDBCConnectionException

  - 원인: H2에 연결되지 않아서 오류가 났다. 그런데 H2에 연결되지 않은 이유가 Java가 설치되어 있지 않았기 때문이었다. JDK가 설치되어 있어야 H2도 돌아간다.

java
열기

 

  • cmd창에서 윈도우는 h2.bat를 실행해야 H2가 연결된다. 맥은 H2.sh 실행
  • Member 클래스를 만든다.
java
열기

 

  • H2 에 들어가서 위 클래스와 필드를 맞춰서 member 테이블을 새로 만든다.
sql
열기

 

  • Main 클래스
    • EntityManagerFactory를 애플리케이션 로딩 시점에 딱 하나만 만들어야한다.
    •  em.persist()
java
열기

  Note) 실행 결과 - 대상 VM에서 연결 해제되었습니다.

  • 멤버에 매개변수를 넣어줬는데도 자동으로 연결이 해제된다는 메시지가 나온다.
    • 왜? 
      • JPA는 "트랜잭션"이라는 단위가 중요하다. 데이터를 변경하는 단위는 반드시 트랜잭션 안에서 작업해야한다.
      • 따라서, EntityTransaction을 꼭 써줘야한다.

 

  • EntityTransaction 추가한다.
    • commit() => 바꾼 내용을 반영하고, close() => 자원을 다 쓰고 나면 데이터베이스 커넥션을 반환해야한다.
java
열기

 

  Note) Main 클래스 실행 결과

  • persistence에 옵션을 정한대로  주석이 표시 되고 그 다음에 sql 포맷이 출력되는 걸 볼 수 있다.
  • 쿼리를 직접 만들지 않았지만 JPA가 알아서 쿼리를 만들고 데이터를 넣어준 것이다.

 

 

  • 위 매인 클래스를 실행한 다음에 H2를 들어가서 멤버 클래스를 조회하면 아래와 같이 데이터베이스에 데이터가 들어간 걸 볼 수 있다.
    • jdbc:h2:tcp://localhost/~/test 
    • 이 부분도 persistence 파일에서 정한대로 ip 주소를 따라가야한다.
    • persistence에 로컬 호스트로 지정해두고 다른 아이피로 들어가지 않도록 해야한다. 
    • 윈도우는 cmd 창에서 h2.bat을 실행해야한다.

 

 

  cf) 만약 클래스의 클래스 / 필드 이름과 데이터베이스의 테이블 / 필드명이 다른 경우에

    - @Table(name=""), @Column(name="")을 이용해서 쌍따옴표 안에 데이터베이스의 테이블 명 또는 필드 명을 적어줘서 매핑할 수 있다.

 

 

 

  Ex) 예외 처리

  • 앞서 작성한 코드는 예외처리가 안되어 있어서 좋은 코드가 아니다. 
  • 중간에 에러가 날 경우에 close() 까지 실행이 되지 않을 것이기 때문이다.
java
열기

 

 

 

  Ex) 회원 정보 찾기

java
열기

  Note) 실행 결과

    - em.remove()를 이용하면 찾은 멤버를 삭제 가능하다.

 

 

  Ex) 회원 정보 수정

  • 그런데 여기서 setName()을 한 뒤에 member를 다시 저장할 필요가 없다.
  • 왜?
    • 엔티티 매니저는 Java의 Collection과 비슷하다. 객체를 대신 저장해준다.
    • JPA를 통해 엔티티를 가져오면 JPA가 관리하도록 설정된다.
    • 그러면 JPA가 커밋하는 시점에 수정된 사항이 있는지 등을 모두 체크한다.
    • 그럼 커밋하기 직전에 update 쿼리를 날린 다음에 커밋이 된다.
java
열기

  Note) 실행 결과

  • H2 데이터베이스 내용도 바뀐 걸 볼 수 있다.

 

 

EntityManagerFactory 주의 사항

  • 엔티티 매니저 팩토리는 하나만 만들어서 애플리케이션 전체에서 공유한다.
  • 앤티티매니저는 스레드 간에  공유하지 않고 쓰고 버려야 한다. - 데이터베이스의 Connection 과 비슷
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행된다. 단순 조회는 상관 없다.

 

 

JPQL(Java Persistence Query Language, 객체 지향 쿼리)이란?

  • 가장 단순한 조회 방법이다.
  • JPA에서도 쿼리를 쓸 수 있다. 
  • EnityManager.find()
  • 객체 그래프 탐색 ex) a.getB()
  • 객체를 대상으로 하는 객체 지향 쿼리이다.
  • JPA를 사용하면 엔티티 객체를 중심으로 개발한다.
  • 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다.
  • 모든 DB 데이터를 객체로 변환해서 검색하는 것을 불가능하다
  • 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.
  • 그래서 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
  • ex) SELECT FROM, WHERE, GROUP BY ..HAVING, JOIN 지원
  • JPQL엔티티 객체 대상, SQL은 데이터베이스 테이블을 대상으로 쿼리

 

 

  Ex) JPQL - createrQuery()

  • JPA에서는 코드를 짤 때 테이블을 대상으로 짜지 않는다.
  • FROM 뒤에 테이블이 아닌 객체(클래스)명이 와야한다.
java
열기

  Note) 실행 결과

  • 주석 안에는 createQuery() 안에 작성한대로 JPQL 쿼리가 그대로 들어가있다. -  멤버 엔티티를 선택한 것이다.
  • 실제 SQL문을 보면 필드를 모두 나열했다.

 

 

  Ex) pagination - LIMIT &OFFSET 

  • 몇 번 부터, 몇 개 가져올 것인지 setFirstResult(), setMaxResults()로 표현 가능하고 get()으로 가져올 수 있다. 
java
열기

  Note) 실행 결과

  • 쿼리를 짜면 properties의 sql 속성(H2 dialect 인지  Oracle dialect인지)에 따라, 각 sql에 맞는 쿼리문을 작성해준다.
  • 현재 결과는 H2 dialect로 설정된 상태이다.

 

 

 

 

출처 - https://www.inflearn.com/course/ORM-JPA-Basic

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com