๐ป JAVA/์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ
๋ค์ด๊ฐ๊ธฐ ์ ์ด์ ์๊ฐ์ ์์๋ดค๋ N+1 ํด๊ฒฐ๋ฒ์ ์ด์ด์ FetchJoin์ ์ด์ฉํด์ ํด๊ฒฐํ ์ ์์์ต๋๋ค. ํ์ง๋ง Fetch Join์ด๋ผ๊ณ ๋ค ํด๊ฒฐํ ์ ์๋ ๊ฒ์ ์๋๋๋ค. ์ด๋ฒ ์๊ฐ์๋ Fetch Join์ ์ฌ์ฉํ์ ๋ ์ด๋ ํ ์ฌ์ด๋ ์ดํํธ๊ฐ ์๋์ง ์์๋ณด๊ณ ๊ทธ ํด๊ฒฐ์ฑ
์ ๋ํด์ ์์๋ด
๋๋ค. 1. FetchJoin, EntityGraph ์ฌ์ฉ ์ Pagination์ ์ฌ์ฉํ ์ ์๋ค. FetchJoin๊ณผ EntityGraph ๋ ๋ค ๋์ผํ ์ฆ์์ด ๋ฐ์ํฉ๋๋ค. Fetch Join๋ง ํ
์คํธ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค. @Query( value = "select t from Team t join fetch t.members", countQuery = "select count(t) from Team t" ) List f..
๐ป JAVA/์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ
๐ก ์๋ ์ค์ต์ ์งํํ ๋ชจ๋ ์ฝ๋๋ Github์ ์์ต๋๋ค. JPA N+1์ด๋? ์ค๋ฌด์์ JPA๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด, N+1 ์ฟผ๋ฆฌ๋ฅผ ๋ง๋๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ N+1์ด๋ Team(1) ↔ Member(N) ์ฐ๊ด๊ด๊ณ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์ ๋, ํ๋์ ํ์ ์กฐํํ์ง๋ง ํ ๋ด๋ถ์ ์๋ ๋ชจ๋ ๋ฉค๋ฒ๋ค์ด ํจ๊ป ์กฐํ๋๋ฉด์ 1+N ๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ง์ ํ
์คํธ ์ฝ๋๋ฅผ ํตํด ์ด๋ฌํ ์ํฉ๋ค์ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ๋ค์ ์ดํด๋ณด๊ณ ๊ฐ ์ํฉ์ด ๋ ์ด๋ค ์ฌ์ด๋์ดํํธ๊ฐ ์๋์ง๋ ์์๋ณด๊ฒ ์ต๋๋ค. Entity ๋ฐ Repository ์ฝ๋ ์ค์ต์ ์ฌ์ฉ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Membe..
๐ป JAVA/์๊ณ ๋ฆฌ์ฆ, ์๋ฃ๊ตฌ์กฐ
๊ฐ์ ArrayList๋ฅผ ์์ฃผ ์ฌ์ฉํ๋ ํธ์ธ๋ฐ ArrayList๋ ์ Array์ ๋ค๋ฅด๊ฒ ์ด๊ธฐ ์ฌ์ด์ฆ๋ฅผ ์ ํด์ฃผ์ง ์์๋ ๋๊ณ , ๋ฌดํ์ ์ผ๋ก ์์๊ฐ ์ถ๊ฐ๋๋ ๊ฒ ์
๋๋ค. ์ด ๋ถ๋ถ์ด ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ฉด์๋ ๋ ์๋ฌธ์ด์์ต๋๋ค. ์ค๋์ ArrayList๋ฅผ ๊ฐ๋จํ๊ฒ ํด๋ถํด๋ณผ ๊ฒ ์
๋๋ค. ์์ ์ถ๊ฐํ๋ ๋ถ๋ถ์ ์ค์ ์ ์ผ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค. ArrayList ๋ด๋ถ์ ์ผ๋ก๋ ์ด๋ป๊ฒ ๋์ด์์๊น? public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable { private static final long serialVersionUID = 8683452581122892189L; /** * Default..
๐ป JAVA/๋์์ธ ํจํด
1. ๊ฐ๋จํ ํฉํ ๋ฆฌ ํจํด ๋จผ์ ๊ฐ๋จํ ํฉํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ณด๊ณ ์ด๋ฅผ ์ ์ง์ ์ผ๋ก ํจํด์ ์ ์ฉํ์ฌ ์
๊ทธ๋ ์ด๋ ํ๋ ์์ผ๋ก ์งํํด๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ ์๋์ ๋
ธํธ๋ถ์ ์์ฑํ๋ ํจ์๊ฐ ์์ต๋๋ค. ๋งค๊ฐ๋ณ์ type์ ๋ฐ๋ผ์ ๋
ธํธ๋ถ์ ์์ฑํ๊ณ ์ค๋น, ์ค์ , ํฌ์ฅํด์ ์ต์ข
์ ์ผ๋ก ๋
ธํธ๋ถ์ ๋ฐํํ๊ฒ ๋ฉ๋๋ค. public NoteBook creatNoteBook(String type) { NoteBook noteBook; if(type.equals("Macbook")) { noteBook = new MackBook(); } else if (type.equals("LG Gram")) { noteBook = new LGGram(); } else if (type.equals("GalaxyBook")) { noteBook = new Ga..
๐ป JAVA/์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ
CascadeType.DELETE, orphanRemoval ์ฐจ์ด์ ๋ชฉํ CASCADE.REMOVE ์ orphanRemoval์ ์ฐจ์ด์ ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค. ํ
์คํธ์ฉ ์ํฐํฐ public class Parent { @OneToMany(mappedBy = "parent") private List children = new ArrayList(); } public class Child { @ManyToOne @JoinColumn(name = "PARENT_ID") private Parent parent; } CASCADE.REMOVE @OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE) private List children = new ArrayLi..
๐ป JAVA/์ ๋ฆฌ์ ๋ฆฌ์ ๋ฆฌ
ObjectMapper? Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋์ค ์ค ํ๋์ธ ObjectMapper ํตํด JSON → Object(์ญ์ง๋ ฌํ), Object → JSON(์ง๋ ฌํ)๋ฅผ ๊ฐ๋จํ๊ฒ ํ์ฑํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋๋ค. readValue() test.json { "name" : "john", "age" : 20 } json → Object ๋น์ง๋ ฌํ ์ฝ๋ People people = objectMapper.readValue(new File("static/test.json"), People.class); people์ ๊ฐ ๊ฐ์ ์ฐ์ด๋ณด๋ฉด ์ ์ถ๋ ฅ๋ฉ๋๋ค. System.out.println(people.getName() + ", " + people.getAge()); // john, 20 ๊ทธ๋ฐ๋ฐ ๋ง์
๋๋ค.. Peopl..