๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด ์ƒํƒœ ์˜ต์…˜

์•Œ๋‹ค์‹œํ”ผ, ๊ฐ์ฒด๊ฐ€ Hibernate์— ์—ฐ๊ฒฐ๋  ๋•Œ ๊ทธ ์ƒํƒœ๋Š” Persistent ๋˜๋Š” Managed ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค . ์–ผ๋งˆ๋‚˜ ๋งž์Šต๋‹ˆ๊นŒ? ์ง€์† ๋˜๋Š” ๊ด€๋ฆฌ?

๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. JPA ์‚ฌ์–‘์— ๋”ฐ๋ฅด๋ฉด ๊ฐ์ฒด๋Š” Persist ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋ฉฐ Hibernate ์‚ฌ์–‘์— ๋”ฐ๋ฅด๋ฉด ํ•ด๋‹น ์ƒํƒœ๋ฅผ Managed๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Hibernate์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์€ org.hibernate.Session ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค . JPA์— ๋”ฐ๋ฅด๋ฉด ํด๋ž˜์Šค๋Š” javax.persistence.EntityManager๋ผ๊ณ  ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์œ ํ˜• ๋ชจ๋‘ ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

org.hibernate.Session ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค.

interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager,    QueryProducer, java.io.Serializable, SharedSessionContract {

}

๋”ฐ๋ผ์„œ Session ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” EntityManager ์ธํ„ฐํŽ˜์ด์Šค ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ ์•„์ง JPA ์‚ฌ์–‘์ด ์—†์—ˆ์„ ๋•Œ ์ด์ „ ๋ฒ„์ „์˜ Hibernate์—์„œ ๋ฌผ๋ ค๋ฐ›์€ ๊ณ ์œ ํ•œ ๊ธฐ๋Šฅ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ „์ฒด ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.

์„ธ์…˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•๊ณผ ์ž‘์—…์˜ ๋‰˜์•™์Šค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

persist() ๋ฉ”์„œ๋“œ์˜ ๋‰˜์•™์Šค

๊ฐœ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ๋•Œ ๋‘ ๊ฐ€์ง€๋ฅผ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ์งธ, ๊ฐœ์ฒด๋ฅผ ์ €์žฅํ•˜๋ฉด ๊ฒฐ๊ตญ SQL ๋ช…๋ น(INSERT ๋˜๋Š” UPDATE) ์ค‘ ํ•˜๋‚˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‘˜์งธ, ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ๊ฐœ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ์งํ›„์— ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.์„ธ์…˜, ํ•˜์ง€๋งŒ ํŠธ๋žœ์žญ์…˜์„ ์ข…๋ฃŒํ•œ ํ›„์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด User ํด๋ž˜์Šค ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค .

@Entity
public class User {
	@Id
	@GeneratedValue
    public Integer id;

	@Columnt(name=โ€user_nameโ€)
    public String name;
}

persist() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค .

User user = new User();
user.setName("Kolyan");
session.persist(user);

์ด ๋ฐฉ๋ฒ•์˜ ๋ชฉ์ ์€ ์ƒˆ ๊ฐœ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ฐœ์ฒด๊ฐ€ ์•„์ง ์—†์œผ๋ฉด INSERT SQL ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค .

๊ฐ์ฒด๊ฐ€ ์ด๋ฏธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ์œผ๋ฉด ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„ธ ๋ฒˆ์งธ ๊ฒฝ์šฐ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ฆฌ๋จ ์ƒํƒœ์˜ ๊ฐœ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋ ค๋Š” ์‹œ๋„์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

User user = new User();
user.setName("Kolyan");
session.persist(user);

session.evict(user);     // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!

save() ๋ฉ”์„œ๋“œ์˜ ๋‰˜์•™์Šค

save() ๋ฉ”์„œ๋“œ๋Š” ์ด์ „ ๋ฒ„์ „์—์„œ ํ˜„์žฌ Hibernate์— ์˜ํ•ด ์ƒ์†๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ์ด๋Š” persist() ๋ฉ”์†Œ๋“œ์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๋ฉฐ INSERT ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์— ์ƒˆ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๋‰˜์•™์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์ด ๋ฉ”์„œ๋“œ๋Š” ๊ฐœ์ฒด์˜ ์ƒˆ ID์ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค . ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋“ฏ์ด ๊ฐœ์ฒด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ถ”๊ฐ€๋˜๊ธฐ ์ „์— ID๊ฐ€ ์—†์œผ๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ด๋ฏธ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„ธ์…˜ ๊ฐœ์ฒด์˜ save() ๋ฉ”์„œ๋“œ ๋Š” ์ €์žฅ๋œ ๊ฐœ์ฒด์— ํ• ๋‹น๋œ ID๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ! Hibernate ID ๋ช…์„ธ์— ๋”ฐ๋ฅด๋ฉด ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์–ด๋–ค ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋„ ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ž์—ด, ์ˆซ์ž, ์—ด๊ฑฐํ˜• ๋“ฑ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ํ•œ ์—ด์— ์™„์ „ํžˆ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

save() ๋ฉ”์„œ๋“œ์—๋Š” ์ง๋ ฌํ™”๋œ ๊ฒฐ๊ณผ ์œ ํ˜•์ด ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์œผ๋กœ ์บ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

๋˜ํ•œ save() ๋ฉ”์„œ๋“œ๋Š” ๊ฐœ์ฒด์˜ Detached ์ƒํƒœ์ธ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ์šด ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ๋‹จ์ˆœํžˆ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

session.evict(user); 	// detach the object from the session
Integer id2 = (Integer) session.save(user);

id ๋ฐ id2 ๋ณ€์ˆ˜๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ฐ save() ์ž‘์—… ์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ๋‘ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค .