From 9f3efad22725570db8952a21dd72da8837a07b63 Mon Sep 17 00:00:00 2001 From: pywoo Date: Thu, 7 Nov 2024 21:53:29 +0900 Subject: [PATCH 1/3] =?UTF-8?q?keyword:=205=EC=A3=BC=EC=B0=A8=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyword/chapter05/keyword.md | 211 +++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 keyword/chapter05/keyword.md diff --git a/keyword/chapter05/keyword.md b/keyword/chapter05/keyword.md new file mode 100644 index 0000000..7e47b84 --- /dev/null +++ b/keyword/chapter05/keyword.md @@ -0,0 +1,211 @@ +## Domain +- 애플리케이션에서 해결하고자 하는 문제의 영역 + + +- 예시) + - 쇼핑몰 애플리케이션 : 상품, 주문, 결제, 배송 등으로 문제 영역을 나눌 수 있다. + - 은행 애플리케이션 : 에금/출금, 대출, 계좌관리 등으로 문제 영역을 나눌 수 있다. + + +- 도메인 모델 + - 도메인을 이해하기 위한 형태로 구조화한 것 + - 구성요소, 규칙, 기능을 정의 + - 도메인 자체를 이해하는 것이 목적이므로 모델링 방법은 중요하지 않다. + - 그러나 객체지향 프로그래밍 환경에서는 클래스 다이어그램과 같은 UML 표기법을 사용하는 것이 유용하다. + + +- 도메인 모델의 분류 + - 엔티티 : 고유한 식별자를 가지는 객체, 식별자만으로 동일성 판단 + - 값 객체 : 고유한 식별자가 없는 객체, 모든 속성 값으로 동일성 판단 + + +- 하나의 모델을 각각 엔티티와 값 객체로 표현한 예제 +```java +// 엔티티로 표현한 User +class User { + + private final String userId; // 고유 식별자로 사용 + private String name; + private int age; + + // 생성자 + public User(String userId, String name, int age) { + this.userId = userId; + this.name = name; + this.age = age; + } + + // Getter 및 Setter ... + + // 동일성은 식별자(userId)를 기준으로 판단 + @Override + public boolean equals(Object o) { + // ... + return userId.equals(user.userId); + } + + @Override + public int hashCode() { + return Objects.hash(userId); + } +} +``` +```java +// 값 객체로 표현한 User +final class User { + + private final String name; + private final int age; + + // 생성자 + public User(String name, int age) { + this.name = name; + this.age = age; + } + + // Getter 메서드만 ... + // 불변 객체를 보장되어야 하므로 Setter X + + // 동일성 비교는 모든 속성 값을 기준으로 한다. + @Override + public boolean equals(Object o) { + // ... + return (age == user.age && name.equals(user.name)); + } + + @Override + public int hashCode() { + return Objects.hash(name, age); + } +} +``` + +- 엔티티와 값 객체를 선택하는 기준 + - 고유한 식별자가 필요하다. -> 엔티티 (User, Order) + - 상태가 바뀌어도 동일한 객체로 간주한다. -> 엔티티 (User의 개명) + - 객체의 상태가 변하지 않는다. -> 값 객체 (Address) + + +## 양방향 매핑 +- 두 개체가 양방향 연관관계를 갖도록 설정하는 것 + + +- 양방향 연관관계 + - 두 개체가 서로를 참조하고 있는 관계 + + +- 관계형 데이터베이스의 양방향 매핑 + - 한 테이블이 다른 테이블에 대한 기본 키를 외래 키로 갖는다. + - JOIN을 통해 서로 다른 테이블 간의 탐색이 가능해진다. + + +- 객체 지향 프로그래밍의 양방향 매핑 + - 서로 다른 두 객체가 각각을 인스턴스로 갖는다. + - 즉 2번의 객체 참조로 양방향을 설정할 수 있다. + + +- 패러다임의 불일치 + - 관계형 데이터베이스에서는 하나의 테이블이 외래키를 관리한다. + - 객체 지향 패러다임에서는 두 번의 참조로 양방향 관계를 구현한다. + - 따라서 데이터의 무결성, 관계의 명확한 관리를 위해 한 엔티티만 외래키를 관리하도록 한다. + + +- '외래키를 관리한다'의 의미 + - DB 상에서 FK를 갖는다. + - 실제 DB에 대한 저장, 수정, 삭제 권한을 갖는다. + + +- JPA 양방향 매핑 예시 +```java +@Entity +public class Member { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String username; + + @ManyToOne + @JoinColumn(name = "team_id") // 외래 키 정의 + private Team team; + + // 생성자, Getter ... + + public void setTeam(Team team) { + this.team = team; + } +} +``` +```java +@Entity +public class Team { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + @OneToMany(mappedBy = "team") + private List members = new ArrayList<>(); + + // 생성자, Getter ... + + // 연관관계 편의 메서드는 자주 사용하는 엔티티에 위치하도록 한다. + public void addMember(Member member) { + members.add(member); + member.setTeam(this); + } +} +``` + + +## N + 1 문제 +- ORM 기술에서 엔티티 조회 시, 연관관계도 함께 조회하여 추가적인 쿼리가 나가는 문제 + + +- 즉시로딩에서 N + 1 예제 +```java +@Entity +public class Team { + @Id + @GeneratedValue + private long id; + private String name; + + @OneToMany(fetch = FetchType.EAGER) + private List members = new ArrayList<>(); +} + +``` +```java +em.createQuery("select t from Team t", Team.class).getResultList(); // 패치 전략 무시 +``` + + +- 지연 로딩에서 N + 1 예제 +```java +// @OneToMany(fetch = FetchType.Lazy)로 변경 +List teams = teamRepository.findAll(); + +teams.stream().forEach(team -> { + team.getMembers().size(); // 실제 사용 시점에 SELECT 쿼리가 나간다. +}); +``` + + +- 발생 원인 + - 즉시 로딩에서의 원인 : JPQL은 글로벌 패치 전략을 무시한 채 JPQL 그대로 조회하기 때문이다. + - 지연 로딩에서의 원인 : 실제 엔티티가 사용되는 시점까지 조회를 미루기 때문이다. + + +- 해결 방법 + - 조인 패치 : @Query("select t from Team t join fetch t.members") - 1번의 쿼리로 객체 그래프 조회 + - 엔티티 그래프 : @EntityGraph(attributePaths = {"members"}) - members 필드 Eager 조회 + - 배치 사이즈 : @BatchSize(size = 10) - IN 절 사용 + + +- 각 연관관계의 default 속성 + - @ManyToOne : EAGER + - @OneToOne : EAGER + - @ManyToMany : LAZY + - @OneToMany : LAZY \ No newline at end of file From 63c49900293a1e0b831ff11f1f7400a2d11994c6 Mon Sep 17 00:00:00 2001 From: pywoo Date: Thu, 7 Nov 2024 21:54:07 +0900 Subject: [PATCH 2/3] =?UTF-8?q?keyword:=206=EC=A3=BC=EC=B0=A8=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyword/chapter06/keyword.md | 227 +++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 keyword/chapter06/keyword.md diff --git a/keyword/chapter06/keyword.md b/keyword/chapter06/keyword.md new file mode 100644 index 0000000..12ca0e5 --- /dev/null +++ b/keyword/chapter06/keyword.md @@ -0,0 +1,227 @@ +## 지연로딩과 즉시로딩의 차이 +- 지연로딩 : 엔티티 조회 시, 연관된 엔티티는 실제 사용하는 시점에 조회하는 방식 +- 즉시로딩 : 엔티티 조회 시, 연관된 엔티티를 함께 조회하는 방식 + + +- 즉시로딩 예시 +```java +public class Member { + @ManyToOne(fetch = FetchType.EAGER) + private Team team; +} + +Member member = em.find(Member.class, 1L); // team도 join으로 함께 조회한다. +``` +- 즉시로딩 장점 : 데이터를 한 번에 로딩하기 때문에 성능이 향상된다. +- 즉시로딩 단점 : 메모리 낭비, 필요하지 않은 데이터도 가져온다. + + +- 지연로딩 예시 +```java +public class Member { + @ManyToOne(fetch = FetchType.Lazy) + private Team team; +} + +Member member = em.find(Member.class, 1L); +team1.getTeam().getName(); // 실제 target이 사용되는 시점에 조회 쿼리가 나간다. +``` +- 지연로딩 장점 : 필요한 데이터만 로딩하기 때문에 메모리 사용량이 줄어든다. +- 지연로딩 단점 : 사용하는 연관 객체가 많다면 성능 저하가 발생할 수 있다. + + +## Fetch Join +- JPQL에서 연관된 엔티티나 컬렉션을 SQL 한번에 함께 조회하는 기능 + + +- 사용 예시 +```java +// members가 LAZY여도 로딩하여 성능이 향상된다. +@Query("SELECT DISTINCT t FROM Team t JOIN FETCH t.members WHERE t.id = :id") +Team findTeamByMemberId(@Param("id") Long id); +``` + + +- 일반 조인과 패치조인의 차이 + - 일반 조인은 연관 엔티티에 조인을 걸어도 SELECT 되지 않는다. + - 패치 조인은 조인이 걸린 연관 엔티티도 함께 SELECT 하여 객체 그래프를 로드한다. +```java +@Query("SELECT distinct t FROM Team t JOIN t.members") // 팀 관련 컬럼만 가져온다. + +@Query("SELECT distinct t FROM Team t JOIN FETCH t.members") // 팀과 멤버 컬럼을 가져와 영속화한다. +``` + + + +- 단점 + - 조인이다 보니, 1:N에서 중복이 발생하고 페이징 API 사용이 불가능하다. + - 두 개 이상의 컬렉션을 패치 조인 X + - 쿼리문을 직접 작성해야 한다. + + +## @EntityGraph +- 연관된 엔티티를 즉시로딩하는 어노테이션 +- 패치 조인의 어노테이션 버전이라고 생각하면 된다. + + +- 사용 예시 +```java +// 공통 메서드 + @EntityGraph +@Override +@EntityGraph(attributePaths = {"members"}) +List findAll(); + +// 쿼리 메서드 + @EntityGraph +@EntityGraph(attributePaths = {"members"}) +@Query("SELECT t FROM Team t WHERE t.name = :name") +List findByName(@Param("name") String name); +``` + + +- 패치 조인과의 차이점 + - 패치조인은 inner join, @EntityGraph는 left outer join으로 동작한다. + - attributePaths에 필드를 여러 개 지정할 수 있다. + + +## JPQL +- JPA에서 제공하는 객체 지향 쿼리 언어 +- 테이블이 아닌 엔티티 객체를 대상으로 쿼리를 작성할 수 있다. + + +- 특징 + - 엔티티의 이름과 필드는 대소문자를 구분한다. + - 엔티티의 별칭은 필수적으로 명시해야한다.(as 생략) + + +- JPQL 예시 +```java +// Member Entity 대상 select +@Query("SELECT m FROM Member m") + +// 객체의 필드에 접근하듯이 사용 +@Query("SELECT m FROM Member m WHERE m.name = :name") + +// 이름 기준 파라미터 바인딩 +String jpql = "select m from Member m where m.name = :name"; +TypedQuery query = em.createQuery(jpql, Book.class); +query.setParameter("name", param); + +// DTO 조회 가능. 단 패키지명을 모두 명시해야 한다. +String jpql = "select new com.example.MemberDto(m.name, m.age) from Member m"; +TypedQuery query = em.createQuery(jpql, MemberDto.class); +``` + + +- JPQL vs SQL + - 조회 대상 : 엔티티 / 테이블 + - 필드 : 엔티티의 필드 / 테이블의 컬럼 + - 실행 과정 : JPA가 JPQL -> SQL 변환 / SQL 그대로 실행 + + +## QueryDSL +- SQL/JPQL 쿼리를 안전하게 생성 및 관리해주는 프레임워크이다. + + +- 기존 JPQL의 문제점 + - 쿼리를 문자열로 입력하여 관리하는데 어려움이 있다. + - 실제로 쿼리를 실행하기 전까지 오류를 확인하기 어렵다. + - 동적 쿼리 작성이 어렵다. + + +- QueryDSL의 장점 + - 문자가 아닌 코드로 쿼리를 작성하여 컴파일 시점에 문법 오류를 확인한다. + - 복잡한 쿼리와 동적 쿼리 작성이 편리해진다. + + +- JPQL을 QueryDSL로 리팩토링한 예시 +```java +String jpql = "select * from Member m join Point p on p.member_id = m.id" +List result = em.createQuery(jpql, Member.class).getResultList(); +``` +```java +return jpaQueryFactory + .from(member) + .join(member.point, point) + .fetch(); +``` + + +- 동적 쿼리 예시 +```java +private final QMember member; + +public List findMembers(String name, Integer minAge) { + BooleanBuilder builder = new BooleanBuilder(); + + // BooleanExpression으로 동적 조건 추가 + builder.and(nameEq(name)); + builder.and(ageGoe(minAge)); + + return queryFactory + .selectFrom(member) + .where(builder) + .fetch(); +} + +// 도시 조건 +private BooleanExpression cityEq(String city) { + return city != null ? member.city.eq(city) : null; +} + +// 최소 나이 조건 +private BooleanExpression ageGoe(Integer minAge) { + return minAge != null ? member.age.goe(minAge) : null; +} +``` + + +## N+1 문제 해결 방법 +- BatchSize 사용 + - WHERE 절이 동일한 여러 개의 SELECT 쿼리를 하나의 IN 쿼리로 만들어준다. + - size로 분할되는 만큼 SELECT 쿼리를 따로 날린다. + + +- BatchSize 예시 +```java +@Entity +public class Parent { + @BatchSize(size = 100) + @OneToMany(mappedBy = "parent") + private List children = new ArrayList<>(); +} +``` +```mysql-sql +// 적용 전 +SELECT * FROM child WHERE child.parent_id = 1 +SELECT * FROM child WHERE child.parent_id = 2 +... +SELECT * FROM child WHERE child.parent_id = 100 + +// 적용 후 +SELECT * FROM child WHERE child.parent IN (1, 2, ... ,100) +``` + + +- Fetch Join 사용 + - 단일 SQL 쿼리로 연관된 엔티티를 함께 조회 + - 페이징 X, 모든 데이터를 메모리에 올려 JPA가 따로 페이징을 한다. + - 둘 이상의 컬렉션을 한꺼번에 패치 조인 X + + +- Fetch Join 예시 +```java +@Query("SELECT t FROM Team t JOIN FETCH t.members") +List findAllWithMembers(); +``` + + +- @EntityGraph 사용 + - fetch join과 유사한 기능을 한다. + - 어노테이션으로 적용할 수 있어 쿼리를 직접 작성하지 않아도 된다. + + +- @EntityGraph 예시 +```java +@EntityGraph(attributePaths = "members") +Page findByName(String name, Pageable pageable); +``` \ No newline at end of file From 755c6ca690c4bb94f20938466038a77310df26d7 Mon Sep 17 00:00:00 2001 From: pywoo Date: Mon, 11 Nov 2024 14:04:11 +0900 Subject: [PATCH 3/3] =?UTF-8?q?mission:=205=EC=A3=BC=EC=B0=A8=20=EB=AF=B8?= =?UTF-8?q?=EC=85=98=20=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mission/chapter05/DBConnect.png | Bin 0 -> 18947 bytes mission/chapter05/Table.png | Bin 0 -> 26012 bytes mission/chapter05/mission.md | 7 +++++++ 3 files changed, 7 insertions(+) create mode 100644 mission/chapter05/DBConnect.png create mode 100644 mission/chapter05/Table.png create mode 100644 mission/chapter05/mission.md diff --git a/mission/chapter05/DBConnect.png b/mission/chapter05/DBConnect.png new file mode 100644 index 0000000000000000000000000000000000000000..02d9a88659cd735bbf44d11a40914ff05a970bdf GIT binary patch literal 18947 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 literal 0 HcmV?d00001 diff --git a/mission/chapter05/Table.png b/mission/chapter05/Table.png new file mode 100644 index 0000000000000000000000000000000000000000..db467a026b2be0ea12b935bb4ed8ca0043842dbd GIT binary patch literal 26012 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 literal 0 HcmV?d00001 diff --git a/mission/chapter05/mission.md b/mission/chapter05/mission.md new file mode 100644 index 0000000..b779952 --- /dev/null +++ b/mission/chapter05/mission.md @@ -0,0 +1,7 @@ +## 미션 + +### 1. 데이터 베이스 연결 +- ![DBConnect.png](DBConnect.png) + +### 2. 테이블 생성 +- ![Table.png](Table.png) \ No newline at end of file