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๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋..
๐๏ธ Spring/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..
๐ง ์์์ฑ ์ ์ด(CASCADE) ์ด๋ ํ ์ํฐํฐ๋ฅผ ์์ํ(persist) ํ ๋, ํด๋น ์ํฐํฐ์ ์ฐ๊ด๋ ์ํฐํฐ๋ ํจ๊ป ์์ํํ๊ณ ์ถ์ ๊ฒฝ์ฐ ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. JPA๋ CASCADE ์ต์
์ผ๋ก ์์์ฑ ์ ์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ, ์ด๋ฆ ๊ทธ๋๋ก ์์์ฑ์ ์ ์ดํ๋ ๊ฒ์
๋๋ค. ์ค๋ช
์ ๋๊ธฐ ์ํด ๊ฐ๋จํ ์์๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค. @Setter @Getter @Entity public class Parent { @Id @GeneratedValue @Column(name = "PARENT_ID") private Long id; @OneToMany(mappedBy = "parent") private List childList = new ArrayList(); } @Getter @Setter @Entity pu..
์ง์ฐ ๋ก๋ฉ๊ณผ ์ฆ์ ๋ก๋ฉ JPA์์๋ ๊ฐ๋ฐ์๊ฐ ์ฐ๊ด๋ ์ํฐํฐ์ ์กฐํ ์์ ์ ์ ํํ ์ ์๋๋ก ๋ค์ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ฆ์ ๋ก๋ฉ (EAGER LOADING) @XToX(fetch = FetchType.EAGER) ์ํฐํฐ๋ฅผ ์กฐํํ ๋ ์ฐ๊ด๋ ์ํฐํฐ๋ ํจ๊ป ์กฐํํฉ๋๋ค. ์ง์ฐ ๋ก๋ฉ (LAZY LOADING) @XToX(fetch = FetchType.LAZY) ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์ค์ ์ฌ์ฉํ ๋ ์กฐํํฉ๋๋ค. (์ฌ์ฉ ์ ๊น์ง๋ ํ๋ก์๋ก ์กฐํํฉ๋๋ค.) ์ฆ์ ๋ก๋ฉ์ ์ธ๋ถ ์กฐ์ธ(Left Outer Join)์ด ๋ฐ์ํ๋ ์ด์ ์ฆ์ ๋ก๋ฉ์ ์ฌ์ฉํ ๋, ์คํ๋๋ SQL์ด ๋ด๋ถ ์กฐ์ธ(Inner Join)์ด ์คํ๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ณ , ์ธ๋ถ ์กฐ์ธ(Left Outer Join)์ด ์คํ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ ์ด์ ๋..
์ฐ๊ด๊ด๊ณ๊ฐ ์กด์ฌํ๋ ์ํฐํฐ๋ฅผ ์กฐํ ์, ์ฐ๊ด๋ ์ํฐํฐ๋ก ํจ๊ป ์กฐํํด์์ผ ํ๋์ง์ ๋ํด์ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ํ๋ฒ์ ๊ฐ์ด ์กฐํํ๋ ๊ฒ์ด ์ข์๊ฒ์ด๊ณ , ํจ๊ป ์ฌ์ฉํ๋ ์ผ์ด ๊ฑฐ์ ๋ฐ์ํ์ง ์๋๋ค๋ฉด ์กฐํํ์ง ์๋๊ฒ์ด ์ฑ๋ฅ์ ์ข์ ๊ฒ์
๋๋ค. JPA์์๋ ์์ ๊ฐ์ ์ํฉ๋ค์ ๋๋นํ์ฌ, ์ํฐํฐ๊ฐ ์ค์ ์ฌ์ฉ๋ ๋๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ์ง์ฐํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ง์ฐ ๋ก๋ฉ(lazy loading)์ด๋ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง์ฐ ๋ก๋ฉ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด, ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค. EntityManager์ ๋๊ฐ์ง ๋ฉ์๋ ํ๋ก์์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ ์ ์ EntityManger์์ ์ ๊ณตํ๋ ๋๊ฐ์ง ๋ฉ์๋์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. find : ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํตํด์ ์ค์ ..
@AssocicationOverride @MappedSuperclass๋ฅผ ํตํด ์์ ๋ฐ์ ๊ฒฝ์ฐ๋ @Embedded๋ฅผ ํตํด ์์๋ฐ์ ํ๋ ์ค, ์ฐ๊ด๊ด๊ณ๋ฅผ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค. @AssocicationOverride ํน์ @AssocicationOverrides๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. @AssociationOverride(name="๋ถ๋ชจ ํ๋๋ช
", joinColumns=@JoinColumn(name="์ฌ์ ์ํ FK ์ปฌ๋ผ๋ช
")) @MappedSuperclass public class Employee { ... @ManyToOne protected Address address; ... } @Entity @AssociationOverride(name="addr..