์ฟผ๋ฆฌ ์บ์‹œ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

HQL์—์„œ ์ง์›์„ ๊ฐ€์ ธ์˜ค๋Š” ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Employee director1 = session.createQuery("from Employee where id = 4").uniqueResult();
Employee director2 = session.createQuery("from Employee where id = 4").uniqueResult();

assertTrue(director1 != director2);

์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋Š” ์ฒซ ๋ฒˆ์งธ ๋˜๋Š” ๋‘ ๋ฒˆ์งธ ์ˆ˜์ค€ ์บ์‹œ์— ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ฟผ๋ฆฌ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค . ๋˜ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋‹ค์Œ ํ–‰์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

<property name="hibernate.cache.use_query_cache" value="true"/>

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ•ด๊ฒฐ์ฑ…์˜ ์ ˆ๋ฐ˜์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ์บ์‹œ๋ฅผ ํ™œ์„ฑํ™”ํ–ˆ์ง€๋งŒ ์บ์‹œํ•  ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฟผ๋ฆฌ์— ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Query query = session.createQuery("from Employee where id = 4");
query.setCacheable(true);
Employee director1 = query.uniqueResult();

์ฟผ๋ฆฌ ์บ์‹œ๋Š” ๋‘ ๋ฒˆ์งธ ์ˆ˜์ค€ ์บ์‹œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์™€๋Š” ๋‹ฌ๋ฆฌ ์—ฌ๊ธฐ์„œ ์บ์‹œ ๋ฐ์ดํ„ฐ์˜ ํ•ต์‹ฌ์€ ๊ฐœ์ฒด ์‹๋ณ„์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ์ž์ฒด๋Š” ์ฟผ๋ฆฌ ๊ธฐ์ค€๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐœ์ฒด์˜ ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์บ์‹œ๋ฅผ ๋‘ ๋ฒˆ์งธ ์ˆ˜์ค€ ์บ์‹œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

์บ์‹œ ์ง€์šฐ๊ธฐ

์บ์‹œ๋กœ ์ž‘์—…ํ•  ๋•Œ ์ค‘์š”ํ•œ ์ž‘์—… ์ค‘ ํ•˜๋‚˜๋Š” ์บ์‹œ๋œ ๊ฐœ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ์บ์‹œ์—์„œ ์ œ๊ฑฐ(๋˜๋Š” ์—…๋ฐ์ดํŠธ)๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€ ์ ˆ์ „ ๋ชจ๋“œ๋Š” ์ด๊ฒƒ์„ ๋งค์šฐ ์ž˜ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๊ทธ๋Š” "์ดํ•ดํ•  ์ˆ˜์—†๋Š” ์ƒํ™ฉ์—์„œ ์บ์‹œ๋ฅผ ์ง€์šฐ์‹ญ์‹œ์˜ค"๋ผ๋Š” ๊ทœ์น™์— ๋”ฐ๋ผ ์•ˆ๋‚ด๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

HQL์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Query query = session.createQuery("update Employee set name=โ€™Alexโ€™ where id = 4")
query. executeUpdate();

Hibernate๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฌด์—‡์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ Employee ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ ํ›„ Hibernate๋Š” ์ง์› ์œ ํ˜•์˜ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์บ์‹œ์—์„œ ์‚ญ์ œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ NativeQuery๋Š” ํ›จ์”ฌ ๋” ํฅ๋ฏธ๋กญ๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Query nativeQuery = session.createNativeQuery("update employee set name=โ€™Alexโ€™ where id = 4")
nativeQuery.executeUpdate();

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๊ธฐ๋ณธ SQL ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์ด executeUpdate() ๋ฉ”์„œ๋“œ์—์„œ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค . ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ Hibernate๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ํ”Œ๋ ˆ์ดํ•˜๊ณ  ์บ์‹œ์—์„œ ๋ชจ๋“  ์œ ํ˜• ์˜ ๋ชจ๋“  ๊ฐœ์ฒด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค .

์–ด๋•Œ์š”? ๋‹น์‹ ์€ ๋ฌดํ•ดํ•œ ์š”์ฒญ์„ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ Hibernate๋Š” ์บ์‹œ์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์›๋‹ˆ๋‹ค! ์ด๊ฒƒ์€ ๋ฒ ์ด์Šค์™€ ๋‹ค๋ฅธ ๋ฌผ์ฒด๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ™•์‹คํžˆ ๋‚ซ์ง€๋งŒ ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค!

๋”ฐ๋ผ์„œ Hibernate ์ œ์ž‘์ž๋Š” ์ด ๊ฒฝ์šฐ Hibernate๋ฅผ ๋•๋Š” ๋ฐฉ๋ฒ•์„ ์‹ ์†ํ•˜๊ฒŒ ํŒŒ์•…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์บ์‹œ์—์„œ ์ œ๊ฑฐํ•  ์—”ํ„ฐํ‹ฐ ์œ ํ˜•์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Query nativeQuery = session.createNativeQuery("update employee set name=โ€™Alexโ€™ where id = 4");
nativeQuery.unwrap(org.hibernate.SQLQuery.class).addSynchronizedEntityClass(Employee.class);
nativeQuery.executeUpdate();
๋น„๊ณ  . ๊ธฐ๋ณธ ์„ ํƒ ์ฟผ๋ฆฌ๋Š” ์บ์‹œ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•˜์ง€ ์•Š๊ณ  ์‚ฝ์ž…, ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ, ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ ๋“ฑ๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜๋™ ์บ์‹œ ์ง€์šฐ๊ธฐ

ํŠน์ •ํ•œ ์ด์œ ๋กœ ์บ์‹œ์—์„œ ๊ฐœ์ฒด๋ฅผ ์ง์ ‘ ์‚ญ์ œํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  . ์บ์‹œ์˜ ๊ฐ์ฒด๋Š” region ์ด๋ผ๋Š” ๊ทธ๋ฃน์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค . ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์—ญ ์ด๋ฆ„์€ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ com.codegym.Employee ์œ ํ˜•์˜ ๊ฐœ์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฐœ์ฒด๊ฐ€ " com.codegym.employee " ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๊ทธ๋ฃน(์ง€์—ญ)์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค .

์บ์‹œ์— ์•ก์„ธ์Šคํ•˜์—ฌ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด SessionFactory ๊ฐ์ฒด์™€ getCache () ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

session.getSessionFactory().getCache().evictQueryRegion("com.codegym.employeeโ€);

๋ชจ๋“  ๊ทธ๋ฃน(์ง€์—ญ)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

session.getSessionFactory().getCache().evictAllRegions();

์บ์‹œ์—์„œ ํ•˜๋‚˜์˜ ๊ฐœ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์ด๋ฆ„(์œ ํ˜•)๊ณผ ID๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

session.getSessionFactory().getCache().evictEntityData("Employeeโ€, 4);

session.getSessionFactory().getCache().evictEntityData(com.codegym.Employee.class, 4);

ํŠน์ • ๊ฐœ์ฒด๊ฐ€ ์บ์‹œ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

session.getSessionFactory().getCache().containsEntity("Employeeโ€, 4);
session.getSessionFactory().getCache().containsEntity(com.codegym.Employee.class, 4);