๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

JPA

ํŒจ์ŠคํŠธ์บ ํผ์Šค ์ฑŒ๋ฆฐ์ง€ 6์ผ์ฐจ - ์—”ํ‹ฐํ‹ฐ ์ƒ๋ช…์ฃผ๊ธฐ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ

๐Ÿ“Œ ์—”ํ‹ฐํ‹ฐ ์ƒ๋ช…์ฃผ๊ธฐ

โœ”๏ธ ๋น„์˜์†

  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ
  • @Transient: ์—”ํ‹ฐํ‹ฐ์˜ ๋งคํ•‘์ •๋ณด์—์„œ ์ œ์™ธ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๊ด€๋ฆฌ ๋Œ€์ƒ์—์„œ ์ œ์™ธ
  • new ๋ฅผ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ์‹œ์  (์—”ํ‹ฐํ‹ฐ๋ณด๋‹ค๋Š” ๊ทธ๋ƒฅ ๊ฐ์ฒด์ธ ์ƒํƒœ)
    ex) User user = new User("kim", 10);

โœ”๏ธ ์˜์†

  • EntityManager.persist();
  • ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ
  • ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋ฏ€๋กœ ์“ฐ๊ธฐ์ง€์—ฐ, ์บ์‹ฑ ๋“ฑ์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ด๋‹ค.

โœ”๏ธ ์ค€์˜์†

  • EntityManager.detach();
  • ํ•œ ๋ฒˆ ์˜์†ํ™” ๋˜์—ˆ๋˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ


๐Ÿ“Œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ

โœ”๏ธ 1์ฐจ ์บ์‹œ

  • ๋”ฐ๋กœ ์บ์‹ฑ์— ๋Œ€ํ•œ ์„ค์ •์—†์ด ์—†๋‹ค๋ฉด ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด ๋™์ผํ•œ PK์— ๋Œ€ํ•ด ์บ์‹ฑ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.
  • 1์ฐจ ์บ์‹œ๋Š” PK๋ฅผ key๊ฐ’์œผ๋กœ๋Š” map์˜ ํ˜•ํƒœ

โœ”๏ธ @Transactional

  • ์ผ๋ จ์˜ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋ฅผ ์ง€์ •
  • ๋ฉ”์„œ๋“œ ํ˜น์€ ํด๋ž˜์Šค ๋‹จ์œ„์— ์„ค์ •์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ฐ EntityManager์˜ ๋ฉ”์„œ๋“œ ๋‹จ์œ„๋กœ @Transactional์ด ๋™์ž‘
    (SimpleJpaRepository ์ฐธ๊ณ )

โœ”๏ธ Flush๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ 

  • commit ์‹œ์  (๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚˜๋Š” ์‹œ์ )
  • ๋ช…์‹œ์ ์œผ๋กœ flush() ํ˜ธ์ถœ
  • ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ
@DisplayName("3. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ํ…Œ์ŠคํŠธ")
@Test
void ์˜์†์„ฑ_์ปจํ…์ŠคํŠธ_ํ…Œ์ŠคํŠธ1() {
    User user = userRepository.findById(1L).get();
    user.setEmail("modify");

    // ๋”ํ‹ฐ์ฑ„ํ‚น์ด ๋œ๋‹ค๋ฉด ์ด ์‹œ์ ์— DB์™€ ์˜์†์„ฑ์ปจํ…์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ๋Š” ๋™๊ธฐ๊ฐ€ ์•ˆ๋งž์•„์•ผ ํ•จ
    // but, ์ถœ๋ ฅ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋” ์ตœ์‹ ์˜ ๊ฐ’์œผ๋กœ ๋™๊ธฐ๊ฐ€ ๋งž์Œ
    // ๋‚ด๋ถ€์ ์œผ๋กœ flush๋ฅผ ์ˆ˜ํ–‰ํ•ด์„œ DB๋กœ ๋ฐ˜์˜ ํ›„ ์ƒˆ๋กœ ์กฐํšŒํ•ด์˜ค๋Š” ๊ฒƒ
    // ๋ช…์‹œ์ ์œผ๋กœ flush๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒƒ๋„ ์ปค๋ฐ‹์‹œ์ ๋„ ์•„๋‹˜ flush๊ฐ€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋งˆ์ง€๋ง‰ ๊ฒฝ์šฐ? (๋ณต์žกํ•œ ์ฟผ๋ฆฌ ?..)
    User userAll = userRepository.findAll().get(0);

    System.out.println(">>> user : " + user.getEmail()); // modify
    System.out.println(">>> userAll : " + userAll.getEmail()); // modify
}

โœ”๏ธ generated-ddl

  • jpa.generated-ddl
  • jpa์˜ ์†์„ฑ (๊ตฌํ˜„์ฒด์— ๊ด€๊ณ„์—†์ด ddl ์ƒ์„ฑ)

โœ”๏ธ ddl-auto

  • jpa.hibernate.ddl-auto
  • hibernate์˜ ์†์„ฑ

ddl-auto๊ฐ€ ๊ตฌํ˜„์ฒด ์ฆ‰ ๊ตฌ์ฒด์ ์ธ ์„ค์ •์ด๋ฏ€๋กœ ddl-auto๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ generated-ddl ์†์„ฑ์€ ๋ฌด์‹œ๋จ


โœ”๏ธ datasource.initialization-mode: always

  • resouces ์ดํ•˜
    schema.sql or data.sql ํŒŒ์ผ์„ ๋กœ๋”ฉ
  • true ์„ค์ •์‹œ schema.sql์ด ์žˆ๋‹ค๋ฉด ddl-auto๋ฅผ ๋ฌด์‹œํ•˜๊ณ  schema.sql์˜ ์„ค์ •๋Œ€๋กœ ddl์ด ๊ตฌ์„ฑ๋จ
  • default: embeded
    ์ž„๋ฒ ๋””๋“œDB์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ schema.sql or data.sql ๋กœ๋”ฉ

๐Ÿ‘ ์ˆ˜๊ฐ•์ธ์ฆ

 

 

ํŒจ์ŠคํŠธ์บ ํผ์Šค [์ง์žฅ์ธ ์‹ค๋ฌด๊ต์œก]

ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์˜์ƒํŽธ์ง‘, UX/UI, ๋งˆ์ผ€ํŒ…, ๋ฐ์ดํ„ฐ ๋ถ„์„, ์—‘์…€๊ฐ•์˜, The RED, ๊ตญ๋น„์ง€์›, ๊ธฐ์—…๊ต์œก, ์„œ๋น„์Šค ์ œ๊ณต.

fastcampus.co.kr

๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค ํ™˜๊ธ‰ ์ฑŒ๋ฆฐ์ง€ ์ฐธ์—ฌ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.