Spring&Spring Boot/JPA
JPA란?(HIBERNATE, HIBERNATE설정, jpa 구동방식, ORM)
피자보다 치킨
2022. 4. 29. 18:32
JPA (Java Persistence API)
JPA란?
- JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음
ORM?
- ORM(Object Relational Mapping)
- 자체적으로 쿼리문 생성(SQL문 불필요)
- SQL Query가 아닌 자바 코드(메서드)로 데이터 조작이 가능
- 물론, SQL Query도 사용할 수 있지만, @Query와 같은 Annotation으로 코드에서 사용할 수 있음
- 장점:
- SQL 중심적인 개발이 아닌 Method를 통해서 DB를 조작할 수 있어, 개발자는 객체 모델을 이용해서 비즈니스 로직을 구성하는데만 집중할 수 있음. (개발자가 CRUD용 쿼리를 따로 작성할 필요가 없다)
- 단점:
- 통계 쿼리처럼 매우 복잡한 SQL을 작성하기에는 적합하지 않다 (즉, 결국 SQL문을 써야할 수도 있음)
- 프로젝트의 규모가 크고 복잡해서 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있음
- 자체적으로 쿼리문 생성(SQL문 불필요)
- ↔ SQL Mapper (OR Mapper와는 상반되게 SQL문이 필요하다. 즉, 쿼리문이 자동생성되지 못함
- 대표적인 프레임워크: iBatis, MyBatis
HIBERNATE
- Hibernate: JPA를 구현한 ORM 프레임워크(JPA인터페이스의 구현체라고 생각하면 된다.)
Hibernate 설정
//※ application.yml
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/wisestudy?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
spring.datasource.username=wisestudy
spring.datasource.password=wise$tudy
spring.datasource.initialization-mode=always
spring.datasource.dbcp2.validation-query=SELECT 1
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.open-in-view=false
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.format_sql=true
logging.level.web=DEBUG
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.BasicBinder=TRACE
※출처: 느루.log
datasource
: JDBC 드라이버 설정, driver-class, DB 접속 정보 설정jpa
: JPA 관련 설정, O-R 매핑을 위한 DB 플랫폼 정보 설정, 테이블 생성 관련 설정jpa.hibernate
: Hibernate 구현체에 대한 설정, DDL 사용, SQL 로그 출력 형식 설정 등logging.lovel.org.hibernate
: Hibernate 런타임 로그 관련 설정
@Annotation
- @Entity: 테이블에 대응되는 도메인 클래스를 의미, JPA가 동작할 때, 데이터를 다루는 작업 단위이기도 함
- 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자)
- @Table: 테이블을 생성할 때 사용할 정보를 기술할 수 있음, 기술하지 않으면 클래스 명으로 테이블을 생성
- @Id: Primary Key를 지정
- @GeneratedValue: Primary Key 컬럼의 데이터를 삽입할 때, 사용할 전략, GenerationType.IDENTITY로 지정 시 PK 생성 전략을 데이터베이스에 위임
- @Enumerated: Enum 타입을 사용시 지정
- @Column:
- name: 필드와 맵핑할 테이블의 컬럼 이름
- updatable, insertable: 등록,변경 가능 여부(false시 DB에서 강제로 치는것 아닌이상 update, insert되지 않음)
- nullable: =false 경우 not null 제약조건이 붙는다. (null 값의 허용 여부 설정)
- unique: 한 컬럼에 간단한 유니크 제약조건을 걸 수 있다. (잘 사용하지 않음)
- length: varchar 길이 지정 가능 (String 타입에만 사용가능)
- columnDefinition: 데이터베이스 컬럼 정보를 직접 줄 수 있다.
ex) columnDefinition="varchar(100) default ‘EMPTY'"
- @Enumerated: 자바 enum 타입을 매핑할 때 사용
- 주의: ORDINAL 사용 금지 : enum파일이 수정, 추가되는 순간 순서변경으로 기존데이터 다 꼬여버림
- @Enumerated(EnumType.STRING): enum 이름을 DB에 저장
- @Enumerated(EnumType.ORDINAL): enum 순서를 DB에 저장 (0,1,2 이런식으로)
- @Temporal: 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용
- 자바 8 이후에 나온 LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)
- @Lob: 데이터베이스 BLOB, CLOB 타입과 맵핑
- @Transient: 필드 맵핑 안함
- 데이터베이스에 저장X, 조회X
- 메모리상에서만 임시로 값을 보관하고 싶을 때 사용
JPA 구동방식
- Persistence 클래스 시작
- 설정 정보 조회
- 스프링 부트 없이 순수하게 JPA,하이버네이트 사용시 resources폴더안에 META-INF폴더 생성 후 persistence.xml 파일을 생성해서 직접 사용해야합니다.
//persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> <persistence-unit name="hello"> <properties> <!-- 필수 속성 --> <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> <property name="javax.persistence.jdbc.user" value="sa"/> <property name="javax.persistence.jdbc.password" value=""/> <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <!-- <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>--> <!--dialect: 이런식으로 사용하면 해당 SQL 데이터베이스 방언 지원--> <!-- 옵션 --> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.use_sql_comments" value="true"/> <!--<property name="hibernate.jdbc.batch_size" value="10"/>--> <!--<property name="hibernate.hbm2ddl.auto" value="create" />--> </properties> </persistence-unit></persistence>
- 스프링 부트를 통해서 JPA를 사용하게 되면 스프링 부트가 제공하는 application.yml(or application.properties)을 참고해서 사용합니다.
-
spring: datasource: url: username: password: driver-class-name: org.~~.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: true
- 조회한 설정 정보를 참고하여 EntityManagerFactory 생성
- EntityManager 생성