본문 바로가기
공부/springboot

JPA 사용법(1) -- JPA 사용법

by 샤샤샤샤 2023. 1. 26.

JPA란?

자바와 관계지향 데이터베이스간의 언어적인 차이를 해소시키기 위한 api. 관계지향적인 DB를 객체지향적으로 해석해주며, 객체지향적인 JAVA를 관계지향적으로 변환해주는 일종의 번역기 역할을 한다고 생각하면 된다.

 

JDBC와의 차이

JDBC는 데이터베이스와 소통하기 위한 api이고, JPA는 소통하는 관계지향적 db를 객체지향적으로 바꾸는 api로 기술적인 개념이라고 봐야한다.

 

형식(이미 db에 만들어진 테이블이 있다고 가정하겠다)

 

1. 테이블과 1:1대응될 테이블과 이름이 같은 Entity클래스를 하나 만든다. 

package com.study.springboot;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDate;
@Entity
@Table(name = "member")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class MemberEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "user_id")
    private String userId;
    private String userPw;
    private String userName;
    private String userRole;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate joindate;
}

@Entity :

테이블과 대응되는 클래스라는 것을 알리는 어노테이션. 테이블의 내용물이 Entity클래스의 형식에 따라 변환된다.

@Table (name = 테이블 이름) :

대응되는 테이블을 지정하는 어노테이션. 이때 테이블 이름은 소문자로 쓰더라도 자동적으로 대문자로 변환된다.

@ID :

테이블의 PRIMARY_KEY 컬럼에 대응되는 필드임을 지정해준다.

@GenerateValue(Strage = GenerationType.타입명) :

ID값을 어떻게 생성할지 정한다. sql은 각기 다른 방식으로 pk를 생성하기 때문에 맞는 sql타입에 따라 id생성 전략을 바꿔줘야 한다.

         GenerationType의 종류     

             1. IDENTITY : MySQL, MariaDB, PostgreSql, H2DB
             2. SEQUENCE : Oracle, PostgreSQL
             3. AUTO : 자동으로 생성

@Column(name = "이름") :

테이블의 컬럼명과, 그 값을 담을 필드의 이름이 일치하지 않을때 필드가 담을 컬럼값을 지정해준다.

             따로 지정해주지 않는 경우, 컬럼명과 이름이 같은 필드로 자동 매핑된다.

             DB의 컬럼이 언더바( _ )가 포함된 스네이크 케이스로 적혔을지라도, JPA가 자동으로 대문자로 구분하는 캠맬                   케이스로 변환하여 인식하기 때문에 이에 맞춰서 필드명을 적어줘야 한다.

@DateTimeFormat( patttern= "심볼" ) :

DATE타입을 자바에서 사용 가능하게 변환해서 가져온다. 이때 pattern을 통해 심볼을 지정할수 있다.

 

2. JpaRepository를 확장하는(extends) 인터페이스를 하나 만든다. 이때 JpaRepository를 상속받으면서 두개의 제네릭을 설정해줄수 있는데, 첫번째 제네릭은 엔티티 클래스, 두번째 제네릭은 pk의 데이터 타입을 의미한다.

package com.study.springboot;

import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<MemberEntity, Long> {

}

 

** JpaRepository는 프록시 구현체가 만들어졌기 때문에 따로 클래스로 구현을 안하더라도 클래스처럼 사용 가능하다.

** JpaRepository는 JPA api가 구현된 인터페이스다.

 

JpaRepository는 프록시 구현체로 이미 구현되어 있는 기본메서드가 존재하고, 사용자가 규칙에 맞게 커스텀 메소드를 만들수 있다.

 

기본 메서드

Method 기능
save() 레코드를 저장한다(Insert/ Update)
findOne() primary key로 레코드 하나를 찾는다.
findAll() 모든 레코드를 불러온다.(select * from 테이블)
count() 레코드 갯수를 반환한다.
delete() 레코드를 삭제한다.

** 레코드 : 여러가지 데이터 타입을 가질수 있는 복합형 구조의 데이터 타입이며, 하나의 행(ROW)에 해당한다.

 

커스텀 메소드

       1. findBy로 시작 -- 쿼리를 요청하는 메소드

요청사항 기능
First건수 Limit기능. 반환할 쿼리의 갯수를 지정한다.
(findFirst(건수)By형식으로 사용)
Distinct distinct기능. 중복 삭제.
(findDistinctBy 형식으로 사용)
OrderBy필드명Desc/Asc orderBy기능. 정렬
And/Or where 조건문
find조건By필드명 조건 조건에 따라 쿼리 선택

      2. countBy로 시작 -- 쿼리의 갯수를 반환하는 메소드

            findBy와 똑같이 사용하나, 갯수를 반환한다.

 

이외에도 < 역할을 하는 LessThan과 같은 키워드도 존재한다.

거의 모든 키워드를 제공하니 필요한 키워드는 공식 문서에서 찾아서 사용하자.

 http://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#jpa.sample-app.finders.strategies

 

Spring Data JPA - Reference Documentation

Example 11. Repository definitions using Domain Classes with mixed Annotations interface JpaPersonRepository extends Repository { … } interface MongoDBPersonRepository extends Repository { … } @Entity @Document public class Person { … } This example

docs.spring.io

 

'공부 > springboot' 카테고리의 다른 글

스프링부트: 시큐리티(1)  (0) 2023.02.20
JPA 사용법(2) -- JPQL  (0) 2023.01.26
개발용 임시 DB : H2DB  (0) 2023.01.25
MVC -- Model(2) : 데이터 받아오기  (0) 2023.01.25
데이터의 전송 타입( Get/ Post)  (0) 2023.01.25