JPA 기본

밀크야살빼자·2023년 4월 13일
0

JPA

  • 자바 ORM 기술에 대한 API 표준 명세(ORM을 사용하기 위한 인터페이스의 모음)
  • API의 규격일 뿐이여서 라이브러리나 프레임워크가 아님

ORM(Object-Relation Mapping)

  • 객체가 DB 테이블이 되도록 매핑시켜주는 프레임워크
  • 객체간의 관계를 바탕으로 SQL을 자동으로 생성
  • 프로그램의 복잡도를 줄이고, 자바 객체와 쿼리를 분리할 수 있음
  • 트랜잭션 처리나 기타 DB 관련 작업들을 편리하게 처리할 수 있는 방법

JPA 동작과정

  • JPA는 애플리케이션과 JDBC 사이에서 동작하여 개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하고, DB와 통신한다.

장점

  • 객체 중심적 개발 기능, SQL 코드의 반복, 객체지향과 관계지향 데이터베이스의 패러다임 불일치 해소. DBMS에 대한 종속성 감소 : DB 컬럼 변경에 따른 테이블/쿼리 수정 작업 감소
  • 생산성, 유지보수 용이. SQL을 직접 작성하는 것이 아닌, 객체를 사용하여 동작 => 재사용성 증가
  • 실시간 처리용 쿼리에 최적화

단점

  • 업무 비즈니스가 복잡할 경우 JPA로 처리하기 어려움
  • 대용량 데이터 기반 환경에서 튜닝 어려움

Dependency

build.gradle 파일의 dependencies 부분에 추가하기!

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

application.yml

spring:  
 datasource:  
  driver-class-name: com.mysql.cj.jdbc.Driver  
  url: jdbc:mysql://localhost:8081/together?serverTimezone=Asia/Seoul
  username: root  
  password:   
 jpa:  
  database-platform: org.hibernate.dialect.MySQL5InnoDBDialect  
  open-in-view: false  
  show-sql: true  
  hibernate:  
   format_sql: true  
   ddl-auto: create

logging:  
 level:  
  org:  
   hibernate:  
    SQL: DEBUG  
    type:  
     descriptor:  
      sql:  
       BasicBinder: TRACE

공통 인터페이스, JpaRepository 적용

spring data jpa는 JpaRepository라는 공통 인터페이스 제공
JpaRepository<T,ID>를 상속하는 인터페이스를 구성

  • T : 엔티티 타입
  • ID : 식별자 타입
    public interface EntityRepository extends JpaRepository<T,ID>{}

주요 메소드
|주요 메소드|설명|
|:----:|:--------------:|
|save(S entity)|새로운 엔티티는 저장하고 이미 있는 엔티티는 병합|
|void delelte(T entity)|엔티티 하나를 삭제한다. EntityManager.remove() 호출|
|Optional findById(Id id)|엔티티 하나를 조회한다. EntityManager.find() 호출|
|T getOne(Id id)|엔티티 프록시로 조회한다. EntityManager.getReference() 호출|
|List findAll(...)|모든 엔티티를 조회. 정렬(Sort)나 페이징(Pageable)조건을 파라미터로 제공 가능|

쿼리 생성
메서드 이름에 관한 규칙(By 필드명)
|쿼리 종류|이름규칙|
|:-----:|:--------------:|
|조회|find…By, read…By, get…By, query…By, search…By, stream…By|
|EXISTS|조회, boolean 반환|
|COUNT|count 조회, long 반환|
|삭제|delete...By, remove...By, long 반환|
|DISTICT|findDistinct, findMemberDistinctBy|
|LIMIT|findFirst3, findFirst, findTop, findTop3|

-> 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 꼭 함께 변경해야 함. 그렇지 않으면 애플리케이션을 시작하는 시점에 오류 발생

매핑 어노테이션에 따른 매핑

@Entity : 이 클래스에 테이블과 매핑한다고 JPA에게 알려줌
@Table : 엔티티 클래스에 매핑할 테이블 정보를 알려줌 이 어노테이션을 생략하면 클래스 이름을 테이블 이름으로 매핑
@Id : 엔티티 클래스의 필드를 테이블의 기본 키에 매핑(이 어노테이션이 쓰인 필드를 식별자 필드라 부름)
@Column : 필드를 칼럼에 매핑

profile
기록기록기록기록기록

0개의 댓글