JPA(1) - JPA란?
JPA의 기본적인 개념에 대해서 설명하겠습니다.
📖JPA의 개념
자바 진영의 ORM(Object Relational Mapping)의 대표적인 기술입니다.
ORM이란 객체와 관계형 데이터베이스를 맵핑시켜주는 기술입니다.
애플리케이션과 JDBC중간에서 SQL문 없이 DB접근이 가능하도록 만든 기술입니다.
JPA를 구현한 라이브러리 구현체로는 Hibernate, DataNucleus, EclipsLink가 있습니다.
ORM : 객체를 중심으로 DB와 연동하여 맵핑(JPA)
SQL-Mapping : SQL문으로 직접 DB를 조작(JdbcTemplet, Mybatis)
❗JPA의 사용 목적
JPA의 사용목적은 단순한 JDBC의 SQL문을 줄여 SERVICE로직에 집중 할 수 있게 하는 것입니다.
👉🏾JPA동작 과정
짧게 설명하자면 Repository가 바로 Hibernate구현체로 접근 할 수 있고 Spring Data JPA로 접근
할 수있습니다. Spring Data JPA는 JPA의 활용을 Spring에서 더 편리하게 사용 할 수 있도록 만들어
놓은 것입니다.
그리고 JPA를 통해 JDBC API에 접근하여 다양한 일들을 합니다.
엔티티 분석, SQL 생성, CONN 생성 및 소멸등이 있습니다.
🔑JPA사용 전 알아야 할 기본정보
1. Entity
엔티티는 직접 DB와 맵핑되는 객체를 일컫는 말입니다. 아래의 코드는 제가 만든 엔티티입니다.
엔티티의 특징은 POJO형태의 클래스여야하며 테이블 내에 존재하지 않은 필드를 가져서는 절대
안됩니다.
@Getter
@Entity
@NoArgsConstructor
@Table(name = "URISTORE")
public class Uri {
@Id
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long seq;
@Column(nullable = false)
private String originuri;
@Column(nullable = false)
private String changeduri;
@Builder
public Uri(String originuri, String changeduri) {
this.originuri = originuri;
this.changeduri = changeduri;
}
}
위에서 Getter, Setter와 Getter, Builder쓰는 것의 차이가 무엇인지 궁금했습니다.
이것은 build를 사용함으로써 더 직관적이게 객체를 생성하는 것을 볼 수 있다는 차이입니다.
다른 애노테이션의 경우는 구글링을 하면 더 자세하게 설명이 되어있습니다.
2. Hibernate
JPA의 구현체입니다. 수 많은 ORM기술 중 Hibernate만 거의 사용합니다.
하이버네이트 관련 내용은 따로 포스팅하도록 하겠습니다.
📌기본적인 JPA사용법
일단 JPA를 사용해야 하는경우 Dependency를 설정해줘야합니다. 저는 H2 DB를 이용하겠습니다.
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
다음으로 위의 그림에서 보듯이 Datasource가 무엇이고 DB접근 드라이브를 설정해줘야합니다.
그리고 프로그램이 시작 될 경우 JPA의 초기 상태를 설정해주겠습니다.
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.jpa.hibernate.ddl-auto=none
여기까지의 설정이 끝났으면 DataSource와 EntityManager를 Config파일에 Singleton으로 생성해줍니다. 그리고 사용하고 싶은 곳에서 의존성주입(@Autowired)를 통하여 주입받습니다. 그 후 em을 사용하여 기본적인 CRUD작업을 진행 할 수 있습니다.
private final EntityManager em;
private final DataSource dataSource;
public SpringConfig(EntityManager em, DataSource dataSource) {
this.em = em;
this.dataSource = dataSource;
}
<Create>
User user = User.builder()
.seq(1)
.userName("hoony")
.age(27)
.build();
em.persist(user);
<Read>
User findUser = em.find(User.class, seq);
<Update>
user.setuserName("abcde");
<Delete>
em.remove(user);
이렇게 간단한 CRUD작업을 진행 할 수 있습니다. 그리고 여기에 Spring Data JPA를 이용하면
더욱 편리하게 JPA를 이용할 수 있습니다.