JAVA/JPA

JPA에 대하여

chan20 2020. 8. 21. 14:37

 

Spring Data

JPA는 Spring Data 하나 이며

관계형 DB, 비관계형 DB 등의 다양한 데이터를 다루는 Spring 기반 Application 손쉽게 개발 할 수 있다 

서브 프로젝트

  • Spring Data JPA
  • Spring Data Mybatis
  • Spring Data MongoDB
  • Spring Data Redis
  • Spring Data for Apache Cassandra
  • Spring Elasticsearch
  • Spring Apache Hodoop

 

JPA

자바 ORM 기술 표준이며 인터페이스의 집합인데 그 중 JPA의 인터페이스를 대표적으로 구현 한 것이 Hibernate 이다.

SQL 중심 개발에서 객체 중심의 개발을 할수 있다.

데이터베이스 연동에 사용되는 코드뿐만 아니라 SQL까지 자동생성하여 제공해준다.

 

JPA 동작원리

 

JPA 구현체

JPA 구현체

Hibernate : 대표적인 ORM 프레임워크며 EJB2 스타일의 Entity Beans 대체할 목적으로 개발 됬다.

eclipseLink : 모든 자바 환경에서 실행 가능하며 문자 그대로 어떤 종류의 데이터 소스나 개체의 읽고 쓰기를 지원하는 종합적이고 일관성 있는 프레임워크를 제공

DataNucleus: Hive 프로젝트에서 metastore의 데이터 저장을 위해 사용 

 

Spring Data JPA

Spring 기반으로 JPA를 사용하는 어플리케이션을 좀 더 쉽게 개발 할 수 있도록 하는 프로젝트 

반복적인 CRUD 코드 문제를 해결

Spring Boot JPA 예제

 

application.properties

# DataBase Settings
spring.datasource.url=jdbc:mysql://localhost:3306/example?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=0000
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# JPA Settings
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.format_sql=true

현재코드는 Spring boot 설정 파일이다.

  • spring.jpa.database-platform : 사용할 데이터 베이스 플랫폼에 적용할 SQL을 올바르게 생성하기 위해 지정

  • spring.jpa.hibernate.ddl.auto : 기본값은 create-drop : 애플리케이션이 실행될 때 Entitiy 클래스 정보를 이용해 테이블 생성하고 종료할 때 테이블을 drop , create, update, none, validate 등을 지정

  • spring.jpa.show-sql : hibernat가 생성한 SQL을 콘솔에 출력 

  • spring.jpa.properties.jibernate.format_sql : hibernate 가 생성한 SQL을 콘솔에 출력 할 때 보기 좋게 만들어줌

User

@Entity
@Table(name="t_customer" , schema = "example")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "customer_id")
    private long seq;

    @Column(name = "customer_login_id")
    private String id;
}

UserVO 안에 있는 JPA 설정들을 보겠다.

  • @Entity : 이 클래스로 생성된 객체를 Entity로 인식

  • @Id : PK 지정, 매핑 식별자

  • @Table : class이름과 table 이름이 다를때 이름 지정

  • @Column : 테이블 컬럼과 엔티티 변수와 이름이 다를 때 지정
    (unique , nullable, insertable, updatable, length 같은 것으로 제한 할 수 있다)

  • @Temporal : Date 타입의 날짜 데이터를 매핑할 때 사용

  • @Transient : 매핑에서 제외할 속성

  • @GeneratedValue : 식별자 값을 자동 증가시키기 위해 사용
    strategy 속성 : 자동 생성 전략  generator 속성 : 이미 생성된 키 생성기를 지정

Strategy 속성

  1. GenerationType.SEQUENCE : 시퀀스를 사용하여 PK 생성

  2. GenerationType.IDENTITY : auto_increment, IDENTITY를 이용하여 PK생성

  3. GenerationType.AUTO : hibernate가 데이터베이스에 맞는 PK값 생성

Repository

package com.example.jpademo.DAO;

import com.example.jpademo.VO.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long>
{

}

현재는 UserRepository인데 JpaRepository가 보일것이며 뒤에 제네릭 값은 <class , pk타입> 로 이루어져 있다.

JpaRepository 구조는 다음과 같다.

Jpa는 그림과 같이 여러개의 interface를 상속 받고 있다.

CRUD 기능 , 페이징, 정렬 기능, JPA 기능을 사용 할 수 있다.

 

Contoller

@RestController
@RequestMapping(value = "/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping()
    public List<User> getUsersAll(){
        return userRepository.findAll(Sort.by(Sort.Direction.DESC, "seq"));
    }

    @GetMapping("{seq}")
    public Optional<User> getUsers(@PathVariable Long seq){
        return userRepository.findById(seq);
    }

    @PostMapping()
    public User insertUser(@RequestBody User c){
        return userRepository.save(c);
    }

    @PutMapping("{seq}")
    public User updateUser(@RequestBody User c , @PathVariable("seq") Long seq)
    {
        c.setSeq(seq);
        return userRepository.save(c);
    }
    @DeleteMapping("{seq}")
    public void deleteUser(@PathVariable("seq") Long seq)
    {    userRepository.deleteById(seq);

    }
}

 Controller부분은 이제 jpaRepository에서 기본적으로 제공하는 것을 토대로 CRUD를 작성