Hibernate ๊ฐ ๋ญ์ง? ํ์ด๋ฒ๋ค์ดํธ ORM์ ์๋ฐ ์ธ์ด๋ฅผ ์ํ ๊ฐ์ฒด ๊ด๊ณ ๋งคํ ํ๋ ์์ํฌ์ด๋ค. ๊ฐ์ฒด ์งํฅ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋งคํํ๊ธฐ ์ํ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณตํ๋ค. JPA์ ๊ตฌํ์ฒด์ ํ ์ข
๋ฅ๋ก, JPA ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉฐ ๋ด๋ถ์ ์ผ๋ก JDBC API ๋ฅผ ์ฌ์ฉํ๋ค. Hibernate ๋ SQL ์ ์ง์ ์ฌ์ฉํ์ง ์๊ณ ๋ฉ์๋ ํธ์ถ๋ง์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค. ( SQL ๋ฐ๋ณต์์
์ ํ์ง ์์๋ ๋๋ค ) ์ปฌ๋ผ์ด ๋ณ๊ฒฝ๋์์ ๋, ํ
์ด๋ธ๊ณผ ๊ด๋ จ๋ DAO ์ ํ๋ผ๋ฏธํฐ, ์ฟผ๋ฆฌ ,SQL ๋ฑ์ ๋์ ์ํํด์ฃผ๊ธฐ ๋๋ฌธ์ ํน์ ๋ฒค๋์ฌ์ ์ข
์์ ์ด์ง ์์ต๋๋ค. ์ด๋ฌํ ํน์ง์ ์ ์ง๋ณด์ ์ธก๋ฉด์์๋ ํฐ ์ฅ์ ์
๋๋ค. ์๋ฅผ ๋ค์ด Mysql ์ ์ฌ์ฉํ๋ค๊ฐ ORCLE ๋ก ๋ณ๊ฒฝํ๋๋ผ๋ Hibernate ๋ ๋ณ๊ฒฝํ ORCLE ๋ก ..
๐ WEB/JPA
๐โ๏ธ ๊ณ์ํด์ ์
๋ฐ์ดํธ ํ๊ธฐ ๐โ๏ธ ๋ง์ง๋ง ์
๋ฐ์ดํธ 2022/03/29 1. Querydsl ์ ์ ์ฌ์ฉํ ๊น? 2. ์๋๋ฐฉ์? 3. ์์กด์ฑ 4. Repository ๊ตฌ์กฐ 5. Projection ์ ๋ํ ๊ณ ์ฐฐ ... 6. ๋์ ์ฟผ๋ฆฌ (BooleanBuilder) 7. ExpressionUtils 8. ์ ๋ ฌ ํ์
์ ๋ฐ๋ฅธ ์ ๋ ฌ ์ฒ๋ฆฌ Querydsl ์ ์ ์ฌ์ฉํ ๊น? JPA ๋ฅผ ์ฌ์ฉํ๋ฉด์ (@Query ํฌํจ) ์กฐํ ๊ธฐ๋ฅ์ ๋ํ ํ๊ณ๊ฐ ์๋ค. ๋์ ์ธ ์ฟผ๋ฆฌ์ธ ๊ฒฝ์ฐ์ธ๋ฐ ์๋ฅผ ๋ค์ด ์ฃผ๋ฌธ ํ์ด์ง๋ฅผ ๊ฒ์ ํ๋ค๊ณ ํ์ ๋ ์นดํ
๊ณ ๋ฆฌ or ์ํ๋ช
or ๊ธฐ์
๋ช
๋ฑ๋ฑ... ์ผ๋ก ๊ฒ์ ์กฐ๊ฑด์ด ๋ฌ๋ผ์ง๋ ๋ถ๋ถ์ด๋ค. ๊ทธ๋์ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ด ๋ฐ๋ก Querydsl ํ๋ ์์ํฌ ์ด๋ค. - ํ์
์ฒดํฌ๊ฐ ๋ฐ๋ก ๊ฐ๋ฅํ๋ค - ์๋ฐ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ..
ํ๋ก์ Team์ ์ํด์๋ Member ๋ฅผ ์กฐํํ ์ Team๊น์ง ์กฐํํ ํ์๊ฐ ์์๊น? ๋น์ง๋์ค ๋ก์ง์์ ํ์ํ์ง ์์ ๋๊ฐ ์๋๋ฐ ํญ์ Team์ ํจ๊ป ์กฐํํ๋ค๋ฉด ๋ญ๋น๊ฐ ๋ฐ์๋๋ค. ์ด ๋ญ๋น๋ฅผ ํ์ง ์๊ธฐ ์ํด ํ๋ก์๋ผ๋ ๊ฐ ๋ฉฐ์ผ๋ก ํด๊ฒฐํ๋ค. - ์ค์ ํด๋์ค๋ฅผ ์์ ๋ฐ์์ ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์ ๊ฒ ๋ชจ์์ด ๊ฐ๋ค - ์ฌ์ฉํ๋ ์
์ฅ์์๋ ์ง์ง, ๊ฐ์ง ๊ฐ์ฒด์ธ์ง ๊ตฌ๋ถํ์ง ์๊ณ ์ฌ์ฉํ๋ฉด ๋๋ค. - ํ๋ก์ ๊ฐ์ฒด๋ ์ค์ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ๋ณด๊ด -> ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ ์ค์ ๊ฐ์ฒด์ ๋ฉ์๋ ํธ์ถ em.find() : ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํตํด์ ์ค์ ์ํฐํฐ ๊ฐ์ฒด ์กฐํ em.getReference() : ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ๋ฏธ๋ฃจ๋ ๊ฐ์ง(ํ๋ก์) ์ํฐํฐ ๊ฐ์ฒด ์กฐํ // ํธ์ถํ ์๊ฐ ์ฟผ๋ฆฌ ์คํ Member findMember..
์์๊ด๊ณ ๋งคํ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์์ ๊ด๊ณ๊ฐ ์๋ค.(์ํผํ์
์๋ธํ์
๊ด๊ณ๋ผ๋ ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ์ด ๊ฐ์ฒด ์์๊ณผ ์ ์ฌํ๋ค) ์ํผํ์
์๋ธํ์
๋
ผ๋ฆฌ ๋ชจ๋ธ์ ์ค์ ๋ฌผ๋ฆฌ ๋ชจ๋ธ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ 1. ๊ฐ๊ฐ ํ
์ด๋ธ๋ก ๋ณํ -> ์กฐ์ธ ์ ๋ต (์ ์) - ํ
์ด๋ธ ์ ๊ทํ - ์ธ๋ ํค ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ํ์ฉ ๊ฐ๋ฅ - ์ ์ฅ๊ณต๊ฐ ํจ์จํ - ์กฐํ์ ์กฐ์ธ์ ๋ง์ด ์ฌ์ฉ -> ์ฑ๋ฅ ์ ํ, ์กฐํ ์ฟผ๋ฆฌ๊ฐ ๋ณต์กํจ - ๋ฐ์ดํฐ ์ ์ฅ์ INSERT ์ฟผ๋ฆฌ๊ฐ 2๋ฒ ํธ์ถ ๋๋ค. ๋น์ง๋์ค์ ์ผ๋ก ์ค์ํ๊ณ ๋ณต์กํ ๋ ์ ํ! ๋ถ๋ชจ ํด๋์ค ์ค์ @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn ์์ ํด๋์ค ์ค์ -> dtype์ ํ์๋ ์ด๋ฆ์ ์ ํด ์ค ๊ฒฝ์ฐ @DiscriminatorVa..
์ฐ๊ด๊ด๊ณ ๋งคํ์ ๊ณ ๋ ค์ฌํญ 3๊ฐ์ง 1. ๋ค์ค์ฑ 2. ๋จ๋ฐฉํฅ, ์๋ฐฉํฅ 3. ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ - ๊ฐ์ฒด ์๋ฐฉํฅ ๊ด๊ณ๋ ์ฐธ์กฐ๊ฐ 2๊ตฐ๋ฐ ์๊ธฐ ๋๋ฌธ์ ๋์ค ํ
์ด๋ธ์ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ ๊ณณ์ ์ง์ ํด์ผํจ - ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๋ ์ฐธ์กฐ - ์ฃผ์ธ์ ๋ฐ๋ํธ : ์ธ๋ ํค์ ์ํฅ์ ์ฃผ์ง ์์, ๋จ์ ์กฐํ ๋ค๋์ผ[N:1] ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํจ ๋จ๋ฐํฅ ์๋์ ๊ฐ์ด [N]์์ ์ธ๋ ํค๋ฅผ ๊ด๋ฆฌํ๊ณ Team์ ์กฐํ ํ๊ณ ์ถ๊ฐํ ์ ์๋ค. Team์ ์๋ ์กฐํํ์ง ๋ชปํจ -> Team์์ Member์ ์กฐํํ๋์ผ์ด ๋น๋ฒํ๋ค๊ณ ํ๋ฉด -> ์๋ฐํฅ ์ผ๋ก ๋งคํํด์ฃผ๋๊ฒ ์ข์. ์๋ฐํฅ ๋จ๋ฐํฅ์์ TEAM์ด MEMBER๋ฅผ mapped by ๋ฅผ ์ถ๊ฐํ์ฌ MEMBER๋ฅผ ์กฐํํ ์ ์๋ค. (์ฝ๊ธฐ ์ ์ฉ) ์ผ๋๋ค[1:N] 1์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด๋ค. ๋จ๋ฐฉํฅ TEAM ์์..
๋ชฉํ - ๊ฐ์ฒด์ ํ
์ด๋ธ ์ฐ๊ด๊ด๊ณ์ ์ฐจ์ด๋ฅผ ์ดํด - ๊ฐ์ฒด์ ์ฐธ์กฐ์ ํ
์ด๋ธ์ ์ธ๋ ํค๋ฅผ ๋งคํ ๊ฐ์ฒด์ ํ
์ด๋ธ ์ฐ๊ด๊ด๊ณ์ ์ฐจ์ด๋ฅผ ์ดํด ๊ฐ์ฒด๋ฅผ ํ
์ด๋ธ์ ๋ง์ถ์ด ๋ชจ๋ธ๋ง ํ์ ๋ ๋ฌธ์ ์ (์ฐธ์กฐ ๋์ ์ ์ธ๋ ํค๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ) ํ๋ ฅ ๊ด๊ณ๋ฅผ ๋ง๋ค ์ ์๋ค. ํ
์ด๋ธ์ ์ธ๋ ํค๋ก ์กฐ์ธ์ ์ฌ์ฉํด์ ์ฐ๊ด๋ ํ
์ด๋ธ์ ์ฐพ๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ๋ฒ๊ฑฐ๋ก์ด ์ฝ๋๊ฐ ๋ฐ์๋๋ค. Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setUsername("member1"); // ์ธ๋ํค ์๋ณ์๋ฅผ ์ง์ ๋ค๋ฃฌ๋ค. member.setTeamId(team.getId()); em.persist(member); // ๋ฉค๋ฒ์ ..
๊ฐ์ฒด์ ํ
์ด๋ธ ๋งคํ @Entity - @Entity๊ฐ ์ ์๋์ด์๋ ํด๋์ค๋ JPA๊ฐ ๊ด๋ฆฌํ๋ค. - ๊ธฐ๋ณธ ์์ฑ์๊ฐ ๊ผญ ์์ด์ผ ํ๋ค. - ์์ฑ: name ->JPA์ ์ฌ์ฉํ ์ํฐํฐ ์ด๋ฆ์ ์ง์ ํ๋ค, ๊ธฐ๋ณธ๊ฐ : ํด๋์ค ์ด๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฉ @Table - name, catalog, schema ๋ฑ๋ฑ. . ํ๋์ ์ปฌ๋ผ ๋งคํ @Column ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปฌ๋ผ๋ช
์ ์ค์ ํด์ค ์ ์๋ค. unique(์ค๋ฌด์์ ์ ์ฌ์ฉํ์ง ์๋๋ค -> ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด ์ด๋ฆ์ ์ค์ ํ ์ ์๋ค ๋์ @Table(uniqueCons.. ์ฌ์ฉ), length ๋ฑ ์ค์ ํ ์ ์๋ค. @Temporal ๋ ์ง ํ์
๋งคํ ํ์ง๋ง LocalDate, LocalDateTime์ ์ฌ์ฉํ ๋๋ ์๋ต ๊ฐ๋ฅํ๋ค. @Enumerated enum ํ์
๋งคํ default..
JPA์์ ๊ฐ์ฅ ์ค์ํ 2๊ฐ์ง - ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋งคํํ๊ธฐ - ์์์ฑ ์ปจํ
์คํธ ์์์ฑ ์ปจํ
์คํธ๊ฐ ๋ญ๊น? JPA๋ฅผ ์ดํดํ๋๋ฐ ๊ฐ์ฅ ์ค์ํ ์ฉ์ด์ด๋ค. "์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ํ๊ฒฝ"์ด๋ผ๋ ๋ป. -> EntityManager.persist(entity); - persist๋ ์ฌ์ค DB์ ์ ์ฅํ๋๊ฒ ์๋๊ณ Entity๋ฅผ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅํ๋ค๋ ๋ป์ด๋ค. - ๋
ผ๋ฆฌ์ ์ธ ๊ฐ๋
์ผ๋ก ๋์ ๋ณด์ด์ง ์๋๋ค. EntityManager๋ฅผ ํตํด์ ์์์ฑ ์ปจํ
์คํธ์ ์ ๊ทผํ๋ค. - ์ฌ๋ฌ๊ฐ์ EntityManager๊ฐ ํ๋์ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ๋ฐ๋ผ๋ณธ๋ค. ์ํฐํฐ์ ์๋ช
์ฃผ๊ธฐ๋ ์ด๋ป๊ฒ ๋ ๊น? ๋น์์ - ์์์ฑ ์ปจํ
์คํธ์ ์ ํ ๊ด๊ณ๊ณผ ์๋ ์๋ก์ด ์ํ ์์ - ์์์ฑ ์ปจํ
์คํธ์ ๊ด๋ฆฌ๋๋ ์ํ ์ค์์ - ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅ๋..
์๋์ ๊ฐ์ด ์์ฑํ์ ๋ ์ ์ฅ์ด ๋ ๊น? ์๋ฌ๊ฐ ์๊ธด๋ค. ์๋ํ๋ฉด JPA๋ ํธ๋ ์ ์
์ด๋ ๋จ์๊ฐ ๋งค์ฐ ์ค์ํ๊ธฐ ๋๋ฌธ์ JPA์ ๋ชจ๋ ๊ธฐ๋ฅ์ ํธ๋ ์ ์
์์์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค. EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); Member member = new Member(); member.setId(1L); member.setName("AE"); em.persist(member); em.close(); emf.close(); ํธ๋ ์ ์
์ ์ถ๊ฐํ ์ฝ๋ EntityManagerFactory emf = Persistence.createEntityMa..
www.inflearn.com/course/ORM-JPA-Basic/dashboard ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์ JPA๋ฅผ ์ฒ์ ์ ํ๊ฑฐ๋, ์ค๋ฌด์์ JPA๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ์กฑํ์ ๋ถ๋ค์ด JPA์ ๊ธฐ๋ณธ ์ด๋ก ์ ํํํ๊ฒ ํ์ตํด์ ์ด๋ณด์๋ ์ค๋ฌด์์ ์์ ์๊ฒ JPA๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค., ๋ณธ ๊ฐ์๋ ์๋ฐ ๋ฐฑ์ www.inflearn.com ์ธํ๋ฐ์ ์๋ ๊ฐ์๋ฅผ ๋ณด๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์
๋๋ค! ๋ชฉํ : ๊ฐ์ฒด์ ํ
์ด๋ธ ์ค๊ณ ๋งคํ - ๊ฐ์ฒด์ ํ
์ด๋ธ์ ์ ๋๋ก ์ค๊ณํ๊ณ ๋งคํํ๋ ๋ฐฉ๋ฒ - ๊ธฐ๋ณธ ํค์ ์ธ๋ ํค ๋งคํ - 1:N, N:1, 1:1, N:M ๋งคํ - ์ค๋ฌด ๋
ธํ์ฐ + ์ฑ๋ฅ ๊ณ ๋ ค - JPA ๋ด๋ถ ๋์ ๋ฐฉ์ ์ดํดํ๊ธฐ - JPA๊ฐ ์ธ์ , ์ด๋ค SQL์ ๋ง๋ค์ด ์คํํ๋์ง ์ดํด J..
Page๊น์ง ์๋ค๋๊ฑด... ๊ธฐ๋ณธ์ ์ธ CRUD๋ฅผ ์๊ณ ๊ณ์ ์ํ๋ก ์ดํดํ๊ณ ์์ฑํ๊ฒ ์ต๋๋ค! ํ ์ผ : ๊ฐ๋จํ ๋ฆฌ์คํธ ๋ฐ์ดํฐ์ Page, Sort ๊ตฌํํ์ฌ API๋ฅผ ๊ตฌํํ๋ค. Service Entity์์ฒด๋ฅผ ๋ฐํํ๋๊ฑด ์ ๋๋ก ํ์ง ์๊ธฐ ๋๋ฌธ์ Response dto๋ฅผ ๋ง๋ค์ด์ ๋ฐํํ๊ธฐ๋ก ํฉ๋๋ค. Repository์์ ๋ฐ์์จ Page UserEntity๋ฅผ Response์ ๋งตํํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐํํ ๋ ์์ฑ์์ stream์ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ ๋งตํ ํด์ค๋๋ค! ์ฌ๊ธฐ์ finAny().orElse("") ๋ user์ ์ด๋ฏธ์ง๊ฐ ํ์๋ ์๋๊ธฐ ๋๋ฌธ์ NPE์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ null์ผ ๊ฒฝ์ฐ String ํ์
์ null์ ๋ฐํํ๊ฒ ํ์ต๋๋ค. ์ด๋ถ๋ถ์ ์ข๋ ์ฐพ์์ ์
๋ฐ์ดํธ ํ๋๋ก ํ๊ฒ ์ต๋๋ค! public Page..