JPA에 대하여
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 구현체
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 속성
-
GenerationType.SEQUENCE : 시퀀스를 사용하여 PK 생성
-
GenerationType.IDENTITY : auto_increment, IDENTITY를 이용하여 PK생성
-
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를 작성