class 41 - JPA / Hibernate

yoneeki·2023년 4월 5일
0

training-jp

목록 보기
31/31

JPA란

JPA(Java Persistence API)는 자바 진영에서 ORM(Object-Relational Mapping) 기술을 표준화하기 위해 만들어진 인터페이스입니다. ORM은 객체와 관계형 데이터베이스 간의 매핑을 자동화하는 기술로, 개발자가 객체 지향적으로 프로그래밍할 수 있도록 도와줍니다.

JPA는 이러한 ORM 기술을 표준화하여 다양한 ORM 프레임워크들이 통일된 방식으로 데이터베이스와 상호작용할 수 있도록 합니다. JPA는 JDBC를 추상화한 API로, 개발자는 JPA를 사용하여 데이터베이스와 상호작용할 수 있습니다. JPA는 Java SE와 Java EE 환경에서 모두 사용할 수 있으며, Hibernate, EclipseLink, OpenJPA 등 다양한 ORM 프레임워크에서 JPA를 구현하고 있습니다.

Hibernate는 JPA를 구현한 대표적인 오픈소스 ORM 프레임워크입니다. Hibernate는 JPA에 더해 자체적인 확장 기능을 제공하며, 대부분의 JPA 구현체들이 Hibernate를 기반으로 구현되었습니다. Hibernate는 JDBC API 대신 직접 데이터베이스와 통신하여 개발자가 객체지향적으로 프로그래밍할 수 있도록 돕습니다. Hibernate는 다양한 데이터베이스를 지원하며, 성능 최적화를 위해 캐시, 로딩 전략 등 다양한 기능을 제공합니다.

JPA와 Hibernate를 사용하면, 객체와 데이터베이스 간의 매핑 작업을 자동화하여 개발자가 복잡한 SQL 쿼리를 작성하지 않아도 됩니다. 이를 통해 생산성을 향상시킬 수 있으며, 객체 지향적인 설계를 유지할 수 있습니다. 또한, JPA와 Hibernate는 데이터베이스를 추상화하므로, 데이터베이스를 변경하더라도 코드 변경을 최소화할 수 있습니다.

YAML 설정

  • ddl을 create로 설정할 수도 있음
server: 
  port: 9092

#spring setting
spring:
  output:
    ansi:
      enabled: always
  datasource:
    driver-class-name: oracle.jdbc.driver.OracleDriver
    url:  jdbc:oracle:thin:@localhost:1521:xe
    username: "---"
    password: "---"
    
  jpa:
    open-in-view: true
    show-sql: true
    database: oracle
    database-platform:  org.hibernate.dialect.Oracle10gDialect
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    
  # thymeleaf:
  #   cache: false
  
  servlet:  
    multipart:  
      max-file-size:  10MB
      max-request-size: 100MB

  # autoconfigure:  
  #   exclude:  org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration

logging:
  level:
    root: INFO
    '[com.jjang051.todo]': DEBUG

# mybatis:
#   mapper-locations: classpath:mapper/sql/**/*.xml
#   config-location: classpath:mapper/config/config.xml

file:
  path: C:/gallery/upload/

Entity

  • DTO를 JPA 환경에서는 Entity로 부름 (서로 완전히 동일한 개념은 아니지만)
  • Entity가 오라클에서 자동으로 테이블과 동일화. 자바 프로그램을 최초로 실행하는 순간 오라클에 엔티티 명과 동일한 이름과 속성의 테이블이 생성됨
  • @Entity(JPA-엔티티 클래스임을 선언), @Id(PK를 설정), @GeneratedValue(strategy = GenerationType.SEQUENCE)(시퀀스 설정) 등의 어노테이션을 통해 테이블과 설정을 맞출 수 있다

Repository

  • DAO를 JPA 환경에서 Repository라고 함
  • JPA는 CRUD 관련 함수를 제공하기에, JPA가 제공하지 않는 함수를 사용해야 하는 경우 repository에 작성한다
package com.jjang051.jpa.repository;

import com.jjang051.jpa.entity.TodoJpa;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

//import org.springframework.stereotype.Repository;

//@Repository
public interface TodoJpaRepository extends JpaRepository<TodoJpa, Integer> {
  // 여기는 만약 JPA가 제공하는 메서드가 없으면 내가 만들어 쓸 것을
  // 작성하는 공간

  public List<TodoJpa> findAllByOrderByNoDesc();
  // 이렇게 내가 규칙에 맞게 함수 명을 작성하면 order by select 함수가 저절로 !
}

ServiceImpl

  • 그 외에 Service, ServiceImpl과 같은 것은 흐름 상으로는 다 동일
  • 다만 mapper.xml 파일이 없으니 다르게 그 부분을 다리게 처리해야 함
package com.jjang051.jpa.service;

import com.jjang051.jpa.entity.TodoJpa;
import com.jjang051.jpa.repository.TodoJpaRepository;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TodoJpaServiceImple implements TodoJpaService {

  @Autowired
  TodoJpaRepository todoJpaRepository;

  @Override
  public void insertTodo(TodoJpa todoJpa) {
    todoJpaRepository.save(todoJpa);
  }

  @Override
  public List<TodoJpa> getAllTodo() {
    List<TodoJpa> todoList = todoJpaRepository.findAllByOrderByNoDesc();
    return todoList;
  }

  @Override
  public TodoJpa getOneTodo(int no) {
    Optional<TodoJpa> optional = todoJpaRepository.findById(no);
    return optional.get();
  }
}

JPA가 제공하는 함수 (EX.CRUD 등)

JPA는 개발자가 데이터베이스와 상호작용할 수 있는 여러 가지 기능을 제공합니다. 대표적인 CRUD(Create, Read, Update, Delete) 함수들은 다음과 같습니다.

저장(Create) - persist() : JPA에서 새로운 엔티티를 영속성 컨텍스트에 추가하고, 데이터베이스에 저장하는 기능입니다. EntityManager.persist() 메서드를 사용합니다.
조회(Read) - find(), findAll() : JPA에서 엔티티를 조회하는 기능입니다.
단일 엔티티 조회: EntityManager.find() 메서드를 사용합니다.
전체 엔티티 조회: JpaRepository.findAll() 메서드를 사용합니다.
수정(Update) - merge() : JPA에서 엔티티를 수정하는 기능입니다.
EntityManager.merge() 메서드를 사용합니다.
삭제(Delete) - remove() : JPA에서 엔티티를 삭제하는 기능입니다. EntityManager.remove() 메서드를 사용합니다.

이 외에도, JPA는 다양한 검색, 정렬, 페이징 등의 기능을 제공합니다. 예를 들어, JpaRepository에서는 다음과 같은 함수를 제공합니다.
count() : 엔티티의 전체 개수를 조회합니다.
existsById(ID id) : 주어진 ID를 가진 엔티티가 존재하는지 여부를 확인합니다.
save(S entity) : 엔티티를 저장하거나 수정합니다. (insert, update)
deleteById(ID id) : 주어진 ID를 가진 엔티티를 삭제합니다.
이 외에도 다양한 함수들이 있으며, 개발자가 직접 쿼리를 작성할 수도 있습니다.

profile
Working Abroad ...

0개의 댓글