์คํ๋ง์์ JPA๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์คํ๋ง ์ปจํ
์ด๋๊ฐ ํธ๋์ญ์
๊ณผ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์์ต๋๋ค. ๋น์ฐํ๊ฒ๋ ์ด๋ฌํ JPA์ ๋ด๋ถ ๋์์๋ฆฌ๋ฅผ ๋ชจ๋ฅด๊ณ ์ฌ์ฉํ๋ค๋ฉด ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ํด๊ฒฐํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ด๋ฒ ๊ธ์ ํตํด JPA๊ฐ ๋์ํ๋ ๋ด๋ถ ๋ฐฉ์์ ์ดํดํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ๋ ๋ฐ์ํ ์ ์๋ ๋ค์ํ ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ ๋ฐฉ์์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ํธ๋์ญ์
๋ฒ์์ ์์์ฑ ์ปจํ
์คํธ ์คํ๋ง ์ปจํ
์ด๋์ ๊ธฐ๋ณธ ์ ๋ต์ 'ํธ๋์ญ์
๋ฒ์์ ์์์ฑ ์ปจํ
์คํธ' ์
๋๋ค. ์คํ๋ง์์ JPA๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ์คํ๋ง ์ปจํ
์ด๋๊ฐ ์ ๊ณตํ๋ ์ ๋ต์ ๋ฐ๋ผ์ผ ํฉ๋๋ค. ์คํ๋ง ์ปจํ
์ด๋๋ JPA์ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ์ง์ํ ๋, ๊ธฐ๋ณธ ์ ๋ต์ผ๋ก ํธ๋์ญ์
๋ฒ์์ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํธ๋์ญ์
..
JPA์์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ํ๊ธฐ ์ํ ๋ช๊ฐ์ง ๋ฐฉ๋ฒ๋ค์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ชจ๋ ์ฐ๊ด๊ด๊ณ๋ ์ง์ฐ๋ก๋ฉ ๋ชจ๋ ์ฐ๊ด๊ด๊ณ๋ FetchType.LAZY๋ฅผ ํตํ ์ง์ฐ๋ก๋ฉ์ผ๋ก ์ค์ ํด ์ฃผ์๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์ฆ์ ๋ก๋ฉ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์์ํ์ง ๋ชปํ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ต์ ํ๋ฅผ ๋ฐฉํดํ๋ ์์๊ฐ ๋ฉ๋๋ค. XToOne ๊ด๊ณ ํ์น ์กฐ์ธ์ ์ฌ์ฉํฉ๋๋ค. ToOne ๊ด๊ณ๋ฅผ ๋ชจ๋ ์ง์ฐ ๋ก๋ฉ์ผ๋ก ์ค์ ํ ์ดํ, ์กฐํํ๋ ์์ ์ ํ์น ์กฐ์ธ์ ํตํด ์กฐํํ๋ ๊ฒ์ผ๋ก ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ToOne ๊ด๊ณ๋ ์กฐํ ์ row์๋ฅผ ์ฆ๊ฐ์ํค์ง ์๊ธฐ ๋๋ฌธ์, ์๋ฌด๋ฐ ๋ฌธ์ ์์ด ํ์ด์ง๋ ๊ฐ๋ฅํฉ๋๋ค. ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ๋์๋ ์ํฐํฐ๋ก ์กฐํํ๋ ๋ฐฉ๋ฒ๊ณผ, DTO๋ก ๋ฐ๋ก ์กฐํํ๋ ๋ฐฉ๋ฒ์ ์ ํํ ์ ์์ต๋๋ค. ์ฑ๋ฅ์ ๊ทนํ์ผ๋ก ๋์ด์ฌ๋ฆฌ๋ ค๋ ๊ฒ์ด ..
๋ณํฉ๊ณผ ๋ณ๊ฒฝ๊ฐ์ง JPA๋ฅผ ์ฌ์ฉํ ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ์๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํฉ๋๋ค ํ๋๋ ๋ณ๊ฒฝ ๊ฐ์ง(Dirty Checking)์ ์ฌ์ฉํ๋ ๊ฒ์ด๊ณ , ๋ค๋ฅธ ํ๋๋ ๋ณํฉ (merge())๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ธ๋ฐ, ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ๋ณํฉ(merge)์ ๋์์๋ฆฌ ๋ณํฉ์ ์ฌ์ฉํ๋ค๋ฉด ์ฐ์ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ค์์ ์ํฐํฐ์ ์๋ณ์ ๊ฐ์ผ๋ก 1์ฐจ ์บ์์์ ์กฐํํฉ๋๋ค. ๋ง์ฝ 1์ฐจ์บ์์ ์ํฐํฐ๊ฐ ์๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํฐํฐ๋ฅผ ์กฐํํ ํ 1์ฐจ ์บ์์ ์ ์ฅํฉ๋๋ค. ์กฐํํ ์์ ์ํฐํฐ์ merge(์๋ก์ด์ํฐํฐ) ์์ ๋ฃ์ด์ค '์๋ก์ด์ํฐํฐ'์ ๊ฐ์ ๋ฃ์ด์ค๋๋ค. ์ด๋ ๋น ๊ฐ์ ๋ฌด์ํ๋ ๊ฒ์ด ์๋๋ผ null๋ก ์ฑ์๋ฃ์ต๋๋ค. ๋ง์ฝ merge()์ ๋ค์ด๊ฐ ๊ฐ๋ค ์ค null ๊ฐ์ด ์๋ค๋ฉด ๊ทธ ๊ฐ์ด ๋ฌด์๋๊ณ ..
์คํ๋ง๋ถํธ ์ฌ์ฉ ์ EntityManagerFactory๋ฅผ ์ฃผ์
๋ฐ๋ ๋ฐฉ๋ฒ @PersistenceUnit ๋๋ ๊ทธ๋ฅ @Autowired๋ฅผ ์ฌ์ฉํด๋ ๋ฉ๋๋ค. ์ฌ์ฉ @PersistenceUnit private EntityManagerFactory emf; Reference ์ค์ ! ์คํ๋ง ๋ถํธ์ JPA ํ์ฉ1 - ์น ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ - ์ธํ๋ฐ | ๊ฐ์ ์ค๋ฌด์ ๊ฐ๊น์ด ์์ ๋ก, ์คํ๋ง ๋ถํธ์ JPA๋ฅผ ํ์ฉํด์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ค๊ณํ๊ณ ๊ฐ๋ฐํฉ๋๋ค. ์ด ๊ณผ์ ์ ํตํด ์คํ๋ง ๋ถํธ์ JPA๋ฅผ ์ค๋ฌด์์ ์ด๋ป๊ฒ ํ์ฉํด์ผ ํ๋์ง ์ดํดํ ์ ์์ต๋๋ค., ์คํ www.inflearn.com
์ํฐํฐ, ํ
์ด๋ธ, ์ปฌ๋ผ๋ช
์์ฑ ์ ๋ต https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/htmlsingle/#howtoconfigure-hibernate-naming-strategy https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#naming ์๋ ํ์ด๋ฒ๋ค์ดํธ๋ ์ํฐํฐ์ ํ๋๋ช
์ ๊ทธ๋๋ก ํ
์ด๋ธ์ ์ปฌ๋ผ๋ช
์ผ๋ก ์ฌ์ฉํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์คํ๋ง ๋ถํธ์ SpringPhysicalNamingStrategy๊ฐ ์ด๋ฆ์ ๋ฐ๊ฟ์ค๋๋ค. ์คํ๋ง ๋ถํธ ๊ธฐ๋ณธ ์ค์ SpringPhysicalNamingStrategy๊ฐ ๊ธฐ๋ณธ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ์ค..
๊ณ์ธตํ ๊ตฌ์กฐ ๋งคํํ๊ธฐ @Entity @Getter public class Category { @Id @GenerateValue @Column(name = "CATEGORY_ID") private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "PARENT_ID") private Category parent; @OneToMany(mappedBy = "parent") private List child = new ArrayList(); } ์ด๋ฆ๋ง ์๊ธฐ ์์ ์ด์ง, ๊ทธ๋ฅ ๋ค๋ฅธ ์ํฐํฐ์ ๋งคํํ๋ ๋๋์ผ๋ก ๋งคํํด์ฃผ๋ฉด ๋ฉ๋๋ค. ์์ฑ๋๋ ํ
์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. Reference ์ค์ ! ์คํ๋ง ๋ถํธ์ JPA ํ์ฉ1 ..
ํ์น ์กฐ์ธ(fetch join) ํ์น ์กฐ์ธ์ด๋ SQL ์กฐ์ธ์ ์ข
๋ฅ๊ฐ ์๋๋ฉฐ, JPQL์์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด์ ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ฅ์
๋๋ค. ํ์น ์กฐ์ธ์ ์ํฐํฐ๋ฅผ ์กฐํํ ๋ ์ฐ๊ด๋ ์ํฐํฐ๋ ์ปฌ๋ ์
์ ํ๋ฒ์ SQL๋ก ํจ๊ป ์กฐํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํจ์ผ๋ก์จ N+1๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ฒ ๋์์ค๋๋ค. ์ผ๋ฐ ์กฐ์ธ์ ์คํ ์ ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ํจ๊ป ์กฐํํ์ง ์์ต๋๋ค. ๋จ์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์์ ํ
์ด๋ธ๊ฐ์ ํ์์ ์ํด ์ฌ์ฉ๋๋ ๊ฒ์
๋๋ค. ๊ธฐ์กด ์กฐ์ธ์ ๋ฌธ์ @Entity class Member( @Id @Column(name = "member_id") @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long = 0, var username: String, var age: In..
๋ฒํฌ ์ฐ์ฐ ๋ง์ฝ ํ ํด๊ฐ ์ง๋์ ๋ชจ๋ ํ์์ ๋์ด๋ฅผ 1์ฉ ์ฌ๋ ค์ฃผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์? JPA์ ๋ณ๊ฒฝ ๊ฐ์ง ๊ธฐ๋ฅ์ผ๋ก ์คํํ๋ ค๋ฉด ๋๋ฌด ๋ง์ SQL์ด ์คํ๋ฉ๋๋ค. ์ด๋ด ๋ ๋ฒํฌ ์ฐ์ฐ์ ์ฌ์ฉํ ์ ์๋๋ฐ, ์ฟผ๋ฆฌ ํ๋ฒ์ผ๋ก ์ฌ๋ฌ ํ
์ด๋ธ์ ๋ก์ฐ๋ฅผ ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค. executeUpdate() ๋ฒํฌ ์ฐ์ฐ์ executeUpdate()๋ฅผ ํตํด ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ฐํ๊ฐ์ ์ํฅ์ ๋ฐ์ ์ํฐํฐ์ ์๋ฅผ ๋ฐํํฉ๋๋ค. UPDATE์ DELETE๋ฅผ ์ง์ํ๋ฉฐ ํ์ด๋ฒ๋ค์ดํธ์์๋ INSERT๋ ์ง์ํฉ๋๋ค. em.createaQuery("delete from Product p where p.price < :price") .setParameter("price" , 100) .executeUpdate(); ๋ฒํฌ ์ฐ์ฐ์ ์ฃผ์์ ๋ฒํฌ ์ฐ์ฐ์ ..