Spring

TIL Spring #2-4

๋ฆฐ์˜ˆ์กฐ 2023. 12. 12. 20:59

JPA

Entity

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ


 

1. JPA๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

: ์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ(ORM์ด ์—†๋Š” ํ™˜๊ฒฝ) ์–ด๋–ค ์ปฌ๋Ÿผ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ ๊ทธ์— ๋”ฐ๋ฅธ ์ถ”๊ฐ€์ ์ธ SQL ์ˆ˜์ •์ด ๋ฌด์ˆ˜ํžˆ ๋งŽ์•„์ง„๋‹ค. ์ด๋กœ ์ธํ•ด ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง ๊ฐœ๋ฐœ๋ณด๋‹ค SQL ์ž‘์„ฑ ๋ฐ ์ˆ˜์ •์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ–ˆ๋‹ค. 

 

๊ทธ๋ž˜์„œ ORM ์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. Object Relational Mapping์˜ ์ค„์ž„๋ง๋กœ ์ž๋ฐ” ํด๋ž˜์Šค์™€ DB data ๋ฅผ mapping ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—…์„ ORM์ด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. (์ง์ ‘ DB๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š์•„๋„ ๋จ~)

 

# JPA๋Š” ORM ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ํ‘œ์ค€ ๋ช…์„ธ

- ๊ทธ๋ฆฌ๊ณ  JPA๋ฅผ ๊ตฌํ˜„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๊ฒƒ์ด 'ํ•˜์ด๋ฒ„๋„ค์ดํŠธ' ์ด๋‹ค! (์ž์ฃผ ๋“ฑ์žฅ ์˜ˆ์ •)

JPA ๋™์ž‘ ๋ฐฉ์‹

 

 

2. Entity๋ž€ ๋ฌด์—‡์ผ๊นŒ?

: JPA์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ํด๋ž˜์Šค ์ฆ‰ ๊ฐ์ฒด์ด๋‹ค.

-Entityํด๋ž˜์Šค๋Š” DB ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜์–ด JPA์— ์˜ํ•ด ๊ด€๋ฆฌ๋œ๋‹ค.

 

#ํ”„๋กœ์ ํŠธ ์„ค์ • ์ถ”๊ฐ€

src main resources META-INF persistence.xml

build.gradle์— JPA, MySQL ์ถ”๊ฐ€ / ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ ํ›„ ์—ฐ๊ฒฐ ํ•„์š”.

 

- EntityTest

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class EntityTest {

    EntityManagerFactory emf;
    EntityManager em;

    @BeforeEach
    void setUp() {
        emf = Persistence.createEntityManagerFactory("memo");
        em = emf.createEntityManager();
    }

    @Test
    void test1() {

    }
}

 

-> ์‹คํ–‰ ํ›„ Hibernate์—์„œ create table memo / ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ JPA์—์„œ @Entity์ •๋ณด๋ฅผ ์ฝ๊ณ  ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

- Entity ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ

@Entity // JPA๊ฐ€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Entity ํด๋ž˜์Šค ์ง€์ •
@Table(name = "memo") // ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ์ง€์ •
public class Memo {
    @Id
    private Long id;

    // nullable: null ํ—ˆ์šฉ ์—ฌ๋ถ€
    // unique: ์ค‘๋ณต ํ—ˆ์šฉ ์—ฌ๋ถ€ (false ์ผ๋•Œ ์ค‘๋ณต ํ—ˆ์šฉ)
    @Column(name = "username", nullable = false, unique = true)
    private String username;

    // length: ์ปฌ๋Ÿผ ๊ธธ์ด ์ง€์ •
    @Column(name = "contents", nullable = false, length = 500)
    private String contents;
}

 

@Entity: ํ•ด๋‹น ์• ๋„ˆํ…Œ์ด์…˜์œผ๋กœ JPA๊ฐ€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Entity ํด๋ž˜์Šค๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Table(name="memo"): ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•ด์ค€๋‹ค.

 

- @GeneratedValue ์˜ต์…˜

@Entity // JPA๊ฐ€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Entity ํด๋ž˜์Šค ์ง€์ •
@Table(name = "memo") // ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ์ง€์ •
public class Memo {
    @Id
		@GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // nullable: null ํ—ˆ์šฉ ์—ฌ๋ถ€
    // unique: ์ค‘๋ณต ํ—ˆ์šฉ ์—ฌ๋ถ€ (false ์ผ๋•Œ ์ค‘๋ณต ํ—ˆ์šฉ)
    @Column(name = "username", nullable = false, unique = true)
    private String username;

    // length: ์ปฌ๋Ÿผ ๊ธธ์ด ์ง€์ •
    @Column(name = "contents", nullable = false, length = 500)
    private String contents;
}

 

@Id ์‹๋ณ„์ž์—ญํ•   (PK)

@GeneratedValue -> AUTO_INCREMENT ์ž๋™์œผ๋กœ ํ•ด์ค€๋‹ค.

 - ๋‹ค์‹œ run ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ํ…Œ์ด๋ธ” ํ™•์ธํ•ด๋ณด๋ฉด id auto_increment ๋˜์–ด ์žˆ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 - ํ•ด๋‹น ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ์ง์ ‘ id๊ฐ’์„ ๋„ฃ์–ด์ฃผ์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ์ˆœ์„œ์— ๋งž๊ฒŒ ๊ธฐ๋ณธ ํ‚ค๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

 

 

3. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€ ๋ฌด์—‡์ผ๊นŒ? 

- Entity๊ฐ์ฒด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ณต๊ฐ„์ด๋‹ค.

SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ JPA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ˆ˜์ •, ์‚ญ์ œ ๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋Ÿฐ ์ผ๋ จ์˜ ๊ณผ์ •์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด JPA๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— Entity ๊ฐ์ฒด๋“ค์„ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋ฉฐ  DB์™€ ์†Œํ†ตํ•œ๋‹ค.

 

- Entity Manager

 - Entity๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ด€๋ฆฌ์ž์ด๋‹ค. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ ‘๊ทผํ•˜์—ฌ Entity ๊ฐ์ฒด๋“ค์„ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.

 - EntityManagerFactory๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

- EntityManagerFactory

์ผ๋ฐ˜์ ์œผ๋กœ DB ํ•˜๋‚˜์— ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘ํ•˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ๋œ๋‹ค.

- ์ด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” DB์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋ฉฐ /resources/META-INF/ ์œ„์น˜์— persistence.xml ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("memo");
//ํ•ด๋‹น ์ฝ”๋“œ๋กœ JPA๋Š” persistence.xml์˜ ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ emf๋ฅผ ์ƒ์„ฑ
EntityManager em = emf.createEntityManager();
//emf๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ em๋ฅผ ์ƒ์„ฑ

 

 

 # ํŠธ๋žœ์žญ์…˜์ด๋ž€?

- ํŠธ๋žœ์žญ์…˜์€ DB ๋ฐ์ดํ„ฐ๋“ค์˜ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์ •ํ•ฉ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๊ฐœ๋…์ด๋‹ค. (์‰ฝ๊ฒŒ ๋งํ•ด DB ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ)

- ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ์—ฌ๋Ÿฌ SQL์ด ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” ์ ์ด๋‹ค.

- ๋ชจ๋“  SQL์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฉด DB์— ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ˜์˜๋˜๋‚˜ SQL ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ๋ชจ๋“  ๋ณ€๊ฒฝ์„ ๋˜๋Œ๋ฆฐ๋‹ค.

 

*ํŠธ๋žœ์žญ์…˜ ํ™•์ธํ•˜๊ธฐ (MySQL)

START TRANSACTION; # ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

INSERT INTO memo (id, username, contents) VALUES (1, 'Robbie', 'Robbie Memo');
INSERT INTO memo (id, username, contents) VALUES (2, 'Robbert', 'Robbert Memo');
SELECT * FROM memo;

COMMIT; # ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.

SELECT * FROM memo;

 

๋ชจ๋“  ์ฟผ๋ฆฌ๊ฐ€ ์ž˜ ์ˆ˜ํ–‰๋˜๋ฉด ์˜๊ตฌ์ ์œผ๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๊ฒŒ ๋œ๋‹ค.

 

JPA์˜ ํŠธ๋žœ์žญ์…˜

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ entity ๊ฐ์ฒด๋ฅผ ์ €์žฅํ–ˆ๋‹ค๊ณ  ํ•ด์„œ DB์— ๋ฐ”๋กœ ๋ฐ˜์˜๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.

์œ„์—์„œ DB์˜ ํŠธ๋žœ์žญ์…˜์ฒ˜๋Ÿผ JPA์—์„œ๋„ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•œ Entity ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ์“ฐ๊ธฐ ์ง€์—ฐ ์ €์žฅ์†Œ์— ์ „๋ถ€ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ฐ€ ๋งˆ์ง€๋ง‰์— SQL์„ ํ•œ๋ฒˆ์— DB์— ์š”์ฒญํ•ด ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•œ๋‹ค.

 

*EntityTransaction ์„ฑ๊ณต ํ…Œ์ŠคํŠธ

@Test
@DisplayName("EntityTransaction ์„ฑ๊ณต ํ…Œ์ŠคํŠธ")
void test1() {
    EntityTransaction et = em.getTransaction(); // EntityManager ์—์„œ EntityTransaction ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    et.begin(); // ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

    try { // DB ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

        Memo memo = new Memo(); // ์ €์žฅํ•  Entity ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
        memo.setId(1L); // ์‹๋ณ„์ž ๊ฐ’์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.
        memo.setUsername("Robbie");
        memo.setContents("์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ํŠธ๋žœ์žญ์…˜ ์ดํ•ดํ•˜๊ธฐ");

        em.persist(memo); // EntityManager ์‚ฌ์šฉํ•˜์—ฌ memo ๊ฐ์ฒด๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

        et.commit(); // ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ๋‹ค๋ฉด commit ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
        // commit ์ด ํ˜ธ์ถœ๋˜๋ฉด์„œ DB ์— ์ˆ˜ํ–‰ํ•œ DB ์ž‘์—…๋“ค์ด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
    } catch (Exception ex) {
        ex.printStackTrace();
        et.rollback(); // DB ์ž‘์—… ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ rollback ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
    } finally {
        em.close(); // ์‚ฌ์šฉํ•œ EntityManager ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
    }

    emf.close(); // ์‚ฌ์šฉํ•œ EntityManagerFactory ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
}

 

- @Entityํด๋ž˜์Šค์—์„œ Setter ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ:

Setter๋Š” ์ด๋ฏธ ์ƒ์„ฑ์ด ๋œ ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Entity๋Š” DB์™€ ๋งคํ•‘์ด ๋˜๋Š” ๊ฒƒ์ด๋ผ ๊ณ ๋ฏผํ•˜๊ณ  ํ•„์š”ํ•œ ๋ถ€๋ถ„์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. (๋งŒ์•ฝ setter์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด db์— ๋ฐ˜์˜๋˜๋ฉด ์•ˆ๋œ๋‹ค.)

 

์˜์†์„ฑ ์ปจํƒ์ŠคํŠธ์˜ ๊ธฐ๋Šฅ

# 1์ฐจ ์บ์‹œ

- ์˜์†์„ฑ ์ปจํƒ์ŠคํŠธ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์บ์‹œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ €์žฅํ•˜๋Š” Entity ๊ฐ์ฒด๊ฐ€ 1์ฐจ ์บ์‹œ(์บ์‹œ์ €์žฅ์†Œ)์— ์ €์žฅ๋œ๋‹ค.

- ์บ์‹œ์ €์žฅ์†Œ๋Š” ์ด๋ ‡๊ฒŒ Map ์ž๋ฃŒ๊ตฌ์กฐ ํ˜•ํƒœ๋กœ ๋˜์–ด์žˆ๋‹ค. 

- key์—๋Š”@Id๋กœ ๋งคํ•‘ํ•œ ๊ธฐ๋ณธ ํ‚ค ์ฆ‰, ์‹๋ณ„์ž ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. value์—๋Š” ํ•ด๋‹น Entityํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค.

- ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ์บ์‹œ ์ €์žฅ์†Œ key์— ์ €์žฅํ•œ ์‹๋ณ„์ž๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ Entity ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

 

1์ฐจ ์บ์‹œ ๊ธฐ๋Šฅ์œผ๋กœ DB์กฐํšŒ ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ์ฃผ๋ฉฐ DB row ํ•˜๋‚˜๋‹น ๊ฐ์ฒด 1๊ฐœ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค.(๊ฐ์ฒด ๋™์ผ์„ฑ ๋ณด์žฅ)

 

#์“ฐ๊ธฐ ์ง€์—ฐ ์ €์žฅ์†Œ

JPA ๊ฐ€ ํŠธ๋žœ์žญ์…˜์ฒ˜๋Ÿผ SQL์„ ๋ชจ์•„ DB์— ํ•œ๋ฒˆ์— ๋ฐ˜์˜ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. 

์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์“ฐ๊ธฐ์ง€์—ฐ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค์–ด SQL์„ ๋ชจ์•„๋‘๊ณ  ์žˆ๋‹ค๊ฐ€ ํŠธ๋žœ์žญ์…˜ commit ํ›„์— DB์— ๋ฐ˜์˜ํ•œ๋‹ค.

 

+flush()

- ํŠธ๋žœ์žญ์…˜ commit ํ›„ ์“ฐ๊ธฐ ์ง€์—ฐ ์ €์žฅ์†Œ์˜ SQL์ด ํ•œ๋ฒˆ์— ์š”์ฒญ๋œ๋‹ค.

- commitํ›„์— ์ถ”๊ฐ€์ ์ธ ๋™์ž‘์ด ํ•˜๋‚˜ ์žˆ๋‹ค. em.flush() ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ์ด๋‹ค.

ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ๋‚ด์šฉ์„ DB์— ๋ฐ˜์˜ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. (์“ฐ๊ธฐ ์ง€์—ฐ ์ €์žฅ์†Œ์˜ SQL์„ DB์— ์š”์ฒญํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰.)

 

# Insert, Delete, Update ๋“ฑ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ SQL์„ DB์— ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŠธ๋žœ์žญ์…˜ ํ™˜๊ฒฝ์— ์žˆ์–ด์•ผํ•œ๋‹ค. ์•„๋‹˜ ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•จ. 

 

- JPA์—์„œ Update๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•.

loaded state : ์ตœ์ดˆ ์ƒํƒœ์™€ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์žˆ๋‹ค๋ฉด Update SQL์„ ์ƒ์„ฑํ•˜์—ฌ ์“ฐ๊ธฐ ์ง€์—ฐ ์ €์žฅ์†Œ์— ์ €์žฅ ํ›„ DB๋ฅผ ์š”์ฒญํ•œ๋‹ค.

(๋ณ€๊ฒฝ์„ ์›ํ•˜๋ฉด ์šฐ์„  ์กฐํšŒ)

 

Entity์˜ ์ƒํƒœ

- ๋น„์˜์†

  • ๋น„์˜์† ์ƒํƒœ์—์„œ๋Š” JPA์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ๋ณ€๊ฒฝ ๊ฐ์ง€๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.
Memo memo = new Memo(); // ๋น„์˜์† ์ƒํƒœ
memo.setId(1L);
memo.setUsername("Robbie");
memo.setContents("๋น„์˜์†๊ณผ ์˜์† ์ƒํƒœ");

 

- ์˜์† ์ƒํƒœ

em.persist(memo);

 

ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋˜์—ˆ๊ณ  ์ด์ œ JPA์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์˜์†์ƒํƒœ์˜ entity๊ฐ€ ๋˜์—ˆ๋‹ค.

'Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

TIL Spring #3-1  (0) 2023.12.14
TIL Spring #2-5  (0) 2023.12.13
TIL Spring #2-3  (0) 2023.12.12
TIL Spring 2-2  (0) 2023.12.08
TIL Spring 2-1  (1) 2023.12.07