Entity란 데이터베이스에서 테이블과 1:1로 매칭되는 객체를 의미한다. Spring Boot의 JPA 기술을 사용할 때 사용되며, JpaRepository를 상속받은 클래스에서 ORM을 사용할 수 있다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
@Entity : 해당하는 클래스가 JPA가 관리할 수 있는 Entity 클래스로 지정하는 애너테이션이다.
@Column : 데이터베이스의 컬럼을
설정하는 애너테이션으로, null, unique등 데이터 관련 설정을 할 수 있다.
@Id : 기본키로 설정할 수 있다. => 식별자 역할을 수행하는 애너테이션이다. (PRIMARY KEY)🗝️
@GeneratedValue : 기본키가 자동으로 1씩 증가할 수 있게 설정하는 애너테이션이다. (AUTO_INCREMENT)
여기서 영속성 컨텍스트(persistence)를 알아보자
Persistence를 쉽게 표현해 보자면 Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간이라고 할 수 있다.
SQL을 작성하지 않아도 JPA를 사용하여 CRUD가 가능하다. 이러한 일련의 과정을 효율적으로 처리하기 위해 JPA는 Persistence에 Entity 객체들을 저장하여 관리하면서 DB와 소통할 수 있게된다.
EntityManager : Entity를 관리하는 관리자 ▼
- 영속성 컨텍스트에 접근하여 Entity를 저장하고 조회하고 수정하고 삭제하기 위해서 EntityManager가 필요하며, EntityManagerFactory를 통해 생성하여 사용할 수 있다.
EntityManagerFactory는 일반적으로 DB 하나당 하나만 생성되어 애플리케이션이 동작되고, persistence.xml 파일을 만들어 정보를 넣어두면 사용할 수 있다. /resources/META-INF/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="{엔티티 클래스 이름}">
<class>com.entity.엔티티 클래스</class>
<properties>
<property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="jakarta.persistence.jdbc.user" value="{유저 이름}"/>
<property name="jakarta.persistence.jdbc.password" value="{비밀번호}"/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/{엔티티 클래스 이름}"/>
<property name="hibernate.hbm2ddl.auto" value="non/create/create-drp/update/validate" /> # 하나 사용
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
</properties>
</persistence-unit>
</persistence>
EntityManagerFactory emf;
EntityManager em;
void setUp() {
emf = Persistence.createEntityManagerFactory("{엔티티 클래스 이름}");
em = emf.createEntityManager();
}
Persistence 클래스 내부의 createEntityManagerFactory 메서드를 사용해서 EntityManagerFactory에 Entity 정보를 담을 수 있다.
여기서 JPA의 트랜잭션을 알아보자
트랜잭션이란 DB 데이터들의 무결성과 정합성을 유지하기 위한 하나의 논리적 개념으로, 우리의 일상속에 송금과 송금취소 시스템에 사용되는 기능이다.
- 모든 SQL이 성공적으로 수행이 되면 DB에 영구적으로 변경을 반영하지만 단 하나라도 실패를 하게 된다면 모든 변경을 되돌리게 된다.
- 영속성 컨텍스트에 Entity 객체들을 저장했다고 해서 DB에 바로 반영이 되지는 않는다.
- JPA에서는 영속성 컨텍스트로 관리하고 있는 변경이 발생한 객체들의 정보를 쓰기 지연 저장소에 가지고 있다가 마지막에 SQL을 한 번에 요청해서 변경을 반영한다.
EntityManager 내부에 EntityTransaction을 가져올 수 있다. =>
em.getTransaction() 이 기능의 역할은 START TRANSACTION 과 같은 기능을 수행할 수 있다.
EntityTransaction et = em.getTransaction(); // EntityManager 에서 EntityTransaction 을 가져옵니다.
et.begin(); // 트랜잭션을 시작합니다.
try { // DB 작업을 수행합니다.
/*
객체를 생성한뒤, setter를 통해 데이터를 넣어주는 코드.
*/
et.commit(); // 오류가 발생하지 않고 정상적으로 수행되었다면 commit 을 호출합니다.
// commit 이 호출되면서 DB 에 수행한 DB 작업들이 반영됩니다.
} catch (Exception ex) {
ex.printStackTrace();
et.rollback(); // DB 작업 중 오류 발생 시 rollback 을 호출합니다.
} finally {
em.close(); // 사용한 EntityManager 를 종료합니다.
}
emf.close(); // 사용한 EntityManagerFactory 를 종료합니다.
}
이후 내용 부터는 다음 TIL에서 다루어 보도록 하겠습니다. 🖐️
'🔥스파르타 TIL (Spring)' 카테고리의 다른 글
Bean 이란? (0) | 2025.02.09 |
---|---|
JPA 란? (2) - Spring Data JPA (0) | 2025.02.08 |
JPA 란? (1) (0) | 2025.02.08 |
Entity란 무엇일까? (3) - Entity의 상태 (0) | 2025.02.07 |
Entity란 무엇일까? (2) - 영속성 콘텍스트의 기능 (0) | 2025.02.04 |