์ํฐํฐ, ํ
์ด๋ธ, ์ปฌ๋ผ๋ช
์์ฑ ์ ๋ต 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๊ฐ ๊ธฐ๋ณธ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ์ค..
๐๏ธ Spring
๊ณ์ธตํ ๊ตฌ์กฐ ๋งคํํ๊ธฐ @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(); ๋ฒํฌ ์ฐ์ฐ์ ์ฃผ์์ ๋ฒํฌ ์ฐ์ฐ์ ..
Named ์ฟผ๋ฆฌ ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ ํด๋ ํ ์ด๋ฆ์ ๋ถ์ฌํด์ ํ์ํ ๋ ์ฌ์ฉํ ์ ์๋๋ฐ, ์ด๊ฒ์ Named ์ฟผ๋ฆฌ๋ผ ๋ถ๋ฆ
๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
๋ก๋ฉ ์์ ์ ์ฟผ๋ฆฌ๋ฅผ ๊ฒ์ฆํ ๋ค ์ฌ์ฉ๋๋ค๋ ์ฅ์ ์ ๊ฐ์ง๋๋ค. Named ์ฟผ๋ฆฌ๋ฅผ ์ด๋
ธํ
์ด์
์ ์ ์ @NamedQueries({ @NamedQuery( name = "Member.findByUsername", query = "select m from Member m where m.username =:username") }) @Entity public class Member{} ์ฌ์ฉ em.createNamedQuery("Member.findByUsername",Member.Class) ์คํ๋ง DATA JPA ์คํ๋ง DATA JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋..
JPQL(Java Persistence Query Language) JPQL์ SQL์ ์ถ์ํํ์ฌ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค SQL์ ์์กด์ ์ด์ง ์์ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด์
๋๋ค. ํ
์ด๋ธ์ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ํ๋๊ฒ์ด ์๋ ๊ฐ์ฒด(์ํฐํฐ)๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ํ๊ธฐ์ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค. JPQL์ ๊ฒฐ๊ตญ SQL๋ก ๋ณํ๋์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌ๋ฉ๋๋ค. JPQL ๋ฌธ๋ฒ ์์ select m from Member as m where m.age > 18 ์ํฐํฐ์ ์์ฑ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. (Member, age) JPQL ํค์๋๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. (SELECT, select ๋ชจ๋ ๊ฐ๋ฅ) ํ
์ด๋ธ์ด ์๋ ์ํฐํฐ์ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค. (Member) ๋ณ์นญ์ ํ์์
๋๋ค. (m) (as๋ ์๋ต ๊ฐ๋ฅ) EXISTS,..
JPA์์ ์ง์ํ๋ ์ฟผ๋ฆฌ ๋ฐฉ๋ฒ JPQL QueryDSL ๋ค์ดํฐ๋ธ SQL JDBC API ์ง์ ์ฌ์ฉ JdbcTemplate ... Creiteria ๋ฑ ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ ๋ง์ง๋ง ๊ทธ๋ค ์ค ๋ช๊ฐ์ง๋ง ๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. JPQL SQL์ ์ถ์ํํ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด์
๋๋ค. JPQL์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค. JPQL์ ๊ฒฐ๊ตญ ํ
์ด๋ธ์ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ SQL๋ก ๋ฒ์ญ๋์ด ์ํ๋ฉ๋๋ค. ์ฌ์ฉ Query query = em.createQuery("SELECT m FROM Member m"); List resultList = query.getResultList(); ์ด๋ Member๋ ํ
์ด๋ธ์ ์ด๋ฆ์ด ์๋ ์ํฐํฐ์ ์ด๋ฆ์
๋๋ค. ๋ค์ดํฐ๋ธ SQL JPQL์ ํ์ค SQL์ด ์ง์ํ๋ ๋๋ถ๋ถ์ ..
@AttributeOverride @MappedSuperclass๋ฅผ ํตํด ์์ ๋ฐ์ ๊ฒฝ์ฐ๋, @Embedded๋ฅผ ํตํด ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํ๋์ ์ ์ธํ ๊ฒฝ์ฐ ํด๋น ์ํฐํฐ์์๋ ๋ค๋ฅธ ์ปฌ๋ผ๋ช
์ ์ฌ์ฉํ๊ณ ์ถ์ ๋๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ ์ด๋
ธํ
์ด์
์
๋๋ค. @AttributeOverride ํน์ @AttributeOverrides๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. @AttributeOverride(name = "๋ถ๋ชจ ํด๋์ค ํ๋๋ช
", column = @Column(name = "์์์์ ์ฌ์ฉํ ์ปฌ๋ผ๋ช
")) @MappedSuperclass public class Vehicle { @Id @GeneratedValue private Integer id; private String iden..