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는 데이터베이스를 추상화하므로, 데이터베이스를 변경하더라도 코드 변경을 최소화할 수 있습니다.
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
(JPA-엔티티 클래스임을 선언), @Id
(PK를 설정), @GeneratedValue(strategy = GenerationType.SEQUENCE)
(시퀀스 설정) 등의 어노테이션을 통해 테이블과 설정을 맞출 수 있다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 함수가 저절로 !
}
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는 개발자가 데이터베이스와 상호작용할 수 있는 여러 가지 기능을 제공합니다. 대표적인 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를 가진 엔티티를 삭제합니다.
이 외에도 다양한 함수들이 있으며, 개발자가 직접 쿼리를 작성할 수도 있습니다.