🔥스파르타 TIL (Spring)

Entity란 무엇일까? (1)

승승장규 2025. 2. 3. 22:12

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에서 다루어 보도록 하겠습니다. 🖐️