개발이 취미인 사람

[JPA] - 기본 동작 방식과 단순 CRUD 본문

백앤드(Back-End)/Jpa

[JPA] - 기본 동작 방식과 단순 CRUD

RyanSin 2024. 11. 19. 18:19
반응형

개요

안녕하세요. 이번 시간에는 JPA에서 기본적인 동작방식에 대해 알아보겠습니다.

 

기본 동작 방식

JPA에는 기본적으로 Persistence 라는 클래스를 통해 설정 정보를 가져와 EntityManagerFactory를 만듭니다.

그 후 필요에 따라 EntityManger를 생성해서 CRUD를 수행할 수 있습니다.

 

EntityManger는 간단하게 생각해서 DB Connection을 하나 생성한다고 볼수 있습니다.

 

여기서 중요한 부분은 EntityManagerFactory는 애플리케이션 전체에서 공유해서 사용합니다. 하지만 EntityManger는 쓰레드 간에 공유를 하면 안됩니다

 

그리고 JPA에서 모든 데이터 변경은 트랜잭션 안에서 실행되어야 동작합니다.

 

 

기본 동작 방식

 

 

단순 CURD

1. Entity 생성

import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id
import jakarta.persistence.Table

@Entity
@Table(name = "member")
class MemberEntity(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long? = null,
    var name: String
)

 

위 코드에서는 중요한 부분이 몇가지 있습니다.

 

 

  1. @Entity
    • JPA에서 이 클래스가 데이터베이스 테이블과 매핑되는 엔티티 클래스임을 나타냅니다.
    • JPA가 이 클래스를 관리 대상으로 인식하게 만듭니다.
    • 반드시 @Entity가 지정된 클래스에는 @Id를 통해 기본 키를 지정해야 합니다.
  2. @Table(name = "member")
    • 엔티티가 매핑될 데이터베이스 테이블 이름을 지정합니다.
    • 여기서는 데이터베이스의 member라는 테이블에 매핑됩니다.
    • @Table은 생략 가능하며, 생략 시 클래스 이름(기본적으로 MemberEntity)이 테이블 이름으로 사용됩니다.
  3. class MemberEntity
    • 엔티티의 이름은 MemberEntity로 정의되었지만, 실제로는 @Table 어노테이션에 따라 데이터베이스의 member 테이블과 매핑됩니다.
    • 엔티티 클래스는 데이터베이스 테이블의 구조를 모델링합니다.
  4. @Id
    • 데이터베이스 테이블의 기본 키(primary key)를 나타냅니다.
    • id 필드가 기본 키로 사용되며, 데이터베이스에서 유일하게 식별할 수 있는 값이어야 합니다.
  5. @GeneratedValue(strategy = GenerationType.IDENTITY)
    • 기본 키 값 생성 전략을 정의합니다.
    • GenerationType.IDENTITY는 데이터베이스가 기본 키를 자동으로 생성하도록 설정합니다.
      예를 들어, MySQL에서는 AUTO_INCREMENT 속성을 사용합니다.
    • 다른 생성 전략:
      • AUTO: JPA가 데이터베이스에 맞는 전략을 자동 선택.
      • SEQUENCE: 데이터베이스의 시퀀스를 이용.
      • TABLE: 키 생성용 별도 테이블을 사용.
  6. var id: Long? = null
    • id는 Long 타입이며, 기본 키 필드입니다.
    • null 초기값은 생성 시 ID가 없음을 나타냅니다.
      데이터베이스에서 값이 자동 생성된 후, JPA가 값을 채워줍니다.
  7. var name: String
    • name은 String 타입이며, 데이터베이스의 name 열과 매핑됩니다.
    • 이 필드는 @Column 어노테이션이 생략되어 있습니다.
      JPA는 필드 이름과 동일한 열을 데이터베이스에서 찾아 매핑합니다.
      추가 설정이 필요하다면 @Column 어노테이션을 사용할 수 있습니다.

 

아주 기본적으로 생성한 엔티티 클래스입니다. 하지만 아주 중요한 부분들이 있으니 꼭 실습하시는 걸 추천드립니다.

 

2. Create - 데이터 저장

fun main() {
    val emf = Persistence.createEntityManagerFactory("ryan")
    val em = emf.createEntityManager()

    createMember(em)

    em.close()
    emf.close()
}

fun createMember(em: EntityManager) {
    val tx = em.transaction
    tx.begin()
    try {
        val member = MemberEntity(name = "HelloA")
        em.persist(member)
        tx.commit()
    } catch (e: Exception) {
        tx.rollback()
    }
}

 

 

3. Reade - 데이터 조회

fun main() {
    val emf = Persistence.createEntityManagerFactory("ryan")
    val em = emf.createEntityManager()

    findMemberByName(em)

    em.close()
    emf.close()
}

fun findMemberByName(em: EntityManager): MemberEntity {
    val memberEntity = em.find(MemberEntity::class.java, 1L)
    println("Member Id = ${memberEntity.id}")
    println("Member Name = ${memberEntity.name}")
    return memberEntity
}

 

4. Update -  데이터 수정

fun main() {
    val emf = Persistence.createEntityManagerFactory("ryan")
    val em = emf.createEntityManager()

    val memberEntity = findMemberByName(em)
    updateMember(memberEntity, em)

    em.close()
    emf.close()
}

fun findMemberByName(em: EntityManager): MemberEntity {
    val memberEntity = em.find(MemberEntity::class.java, 1L)
    println("Member Id = ${memberEntity.id}")
    println("Member Name = ${memberEntity.name}")
    return memberEntity
}

fun updateMember(member: MemberEntity, em: EntityManager) {
    val tx = em.transaction
    tx.begin()
    try {
        member.name = "HelloB"
        tx.commit()
    } catch (e: Exception) {
        tx.rollback()
    }
}

 

5. Delete - 데이터 삭제

fun main() {
    val emf = Persistence.createEntityManagerFactory("ryan")
    val em = emf.createEntityManager()

    val memberEntity = findMemberByName(em)
    removeMember(memberEntity, em)

    em.close()
    emf.close()
}

fun findMemberByName(em: EntityManager): MemberEntity {
    val memberEntity = em.find(MemberEntity::class.java, 1L)
    println("Member Id = ${memberEntity.id}")
    println("Member Name = ${memberEntity.name}")
    return memberEntity
}

fun removeMember(member: MemberEntity, em: EntityManager) {
    val tx = em.transaction
    tx.begin()
    try {
        em.remove(member)
        tx.commit()
    } catch (e: Exception) {
        tx.rollback()
    }
}

 

 

이번 시간에는 JPA에서 사용되는 아주 간단한 개념과 CRUD에 대해 알아봤습니다.

 

전체 소스 코드는 아래 링크를 통해 확인할 수 있습니다. 꼭 실습하시는 걸 추천드리겠습니다.

 

Github

 

GitHub - Ryan-Sin/kotlin-spring-jpa: 코프링 환경에서 기본 jpa부터 spring-data-jpa를 사용하는 방법에 대해

코프링 환경에서 기본 jpa부터 spring-data-jpa를 사용하는 방법에 대해 학습합니다. - Ryan-Sin/kotlin-spring-jpa

github.com

'백앤드(Back-End) > Jpa' 카테고리의 다른 글

[JPA] - 영속성 컨텍스트(2)  (0) 2024.11.29
[JPA] - 영속성 컨텍스트(1)  (1) 2024.11.24