JPA
(중요) 주문 도메인 개발
구현 기능 1. 상품 주문 2. 주문 내역 조회 3. 주문 취소 주문, 주문상품 엔티티 개발 주문 엔티티 코드(생성메서드, 비즈니스 로직) @Entity @Table(name = "orders") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List orderItems = new ArrayList..
상품 도메인 개발
상품 엔티티 개발(비즈니스 로직 추가) @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "dtype") @Getter @Setter public abstract class Item { @Id @GeneratedValue @Column(name = "item_id") private Long id; private String name; private int price; private int stockQuantity; @ManyToMany(mappedBy = "items") private List categories = new ArrayList(); // ==비즈니스 로직== // /** * sto..
회원 도메인 개발
회원 엔티티 코드 package jpabook.jpashop.domain; import java.util.ArrayList; import java.util.List; import javax.persistence.*; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List orders = new ArrayLis..
애플리케이션 구현 준비
구현 요구사항 기능 목록 회원 기능 회원 등록 회원 조회 상품 기능 상품 등록 상품 수정 상품 조회 주문 기능 상품 주문 주문 내역 조회 주문 취소 기타 요구사항 상품은 재고 관리가 필요하다. 상품의 종류는 도서, 음반, 영화가 있다. 상품을 카테고리로 구분할 수 있다. 상품 주문시 배송 정보를 입력할 수 있다 예제를 단순화 하기 위해 다음 기능은 구현X 로그인과 권한 관리X 파라미터 검증과 예외 처리X 상품은 도서만 사용 카테고리는 사용X 배송 정보는 사용X 애플리케이션 아키텍처 계층형 구조 사용 controller, web: 웹 계층 service: 비즈니스 로직, 트랜잭션 처리 repository: JPA를 직접 사용하는 계층, 엔티티 매니저 사용 domain: 엔티티가 모여 있는 계층, 모든 계층..
도메인 분석 설계 - 엔티티 클래스 개발
엔티티 클래스 개발 위 회원 엔티티 관계도를 보고 VO 생성 코드를 만들어 본다. 회원(Member) 엔티티 package jpabook.jpashop.domain; import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List orders = new A..
도메인 분석 설계
요구사항 분석 기능 목록 회원 기능 회원 등록 회원 조회 상품 기능 상품 등록 상품 수정 상품 조회 주문 기능 상품 주문 주문 내역 조회 주문 취소 기타 요구사항 상품은 재고 관리가 필요하다. 상품의 종류는 도서, 음반, 영화가 있다. 상품을 카테고리로 구분할 수 있다. 상품 주문시 배송 정보를 입력할 수 있다 도메인 모델과 테이블 설계 회원, 주문, 상품의 관계 : 회원은 여러 상품을 주문할 수 있다. 그리고 한 번 주문할 때 여러 상품을 선택할 수 있으므로 주문과 상품은 다대다 관계다. 하지만 이런 다대다 관계는 관계형 데이터베이스는 물론이고 엔티티에서도 거의 사용하지 않는다. 따라서 그림처럼 주문상품이라는 엔티티를 추가해서 다대다 관계를 일대다, 다대일 관계로 풀어냈다. 상품 분류: 상품은 도서, ..
[JPA] 트랜잭션 전파 , 중첩된 트랜잭션(Transaction Propagation)
트랜잭션 전파에 대해 간단하게 정리해보려고 한다. 트랜잭션의 전파에 대해 알아보기 전에 우선 스프링의 트랜잭션에 대해 간단하게 정리하면 다음과 같다. @Transaction? @Transaction은 스프링의 AOP를 이용하여 개발자가 편하게 DB 관련 작업을 할 수 있도록 도와준다. JPA, Mybatis 등을 사용하지 않을 때, 만약 Datasource를 이용해서 개발할 경우 getConnection(), close()를 하나하나 처리해줘야 한다. 대략 아래와 같은 코드다. public class QueryExam { private static final String QUERY = "select count(*) from ANIMAL"; private DataSource dataSource; publi..
[JPA] N+1 문제 원인 및 해결방법
JPA를 사용하면 자주 만나게 되는 것이 N + 1 문제이다. N + 1 문제는 성능에 큰 영향을 줄 수 있기 때문에 N + 1 문제가 무엇이고 어떤 상황에 발생되는지, 어떻게 해결하면 되는지에 대해 알아보고자 한다. N+1 문제란? 연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 된다. 즉, 1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것이다. 이를 N+1 문제라고 한다. When 언제 발생하는가? JPA Repository를 활용해 인터페이스 메소드를 호출할 때(Read 시) Who 누가 발생시키는가? 1:N 또는 N:1 관계를 가진 엔티티를 조회할 때 발생 H..
[JPA] 영속성 컨텍스트(Persistence Context)란?
엔티티 매니저 팩토리 & 엔티티 매니저 영속성 컨텍스트에 대해 알아보기 전에 엔티티 매니저 팩토리와 엔티티 매니저에 대해서 알아보고자 한다. 웹 어플리케이션이 구동하는 시점에 엔티티 매니저 팩토리가 생성되며 DB 커넥션 풀을 생성해 둔 후, 고객의 요청이 들어올 때마다 엔티티 매니저를 생성한다. 엔티티 매니저는 DB 연결이 필요한 시점(보통 트랜잭션이 시작되는 경우)에 커넥션 풀에 있는 connection을 얻어 DB를 핸들링하게 된다. 엔티티 매니저 팩토리가 엔티티 매니저를 사용하는 이유 엔티티 매니저 팩토리는 생성되는 시점에 DB 커넥션 풀을 생성하기에 생성 비용이 매우 크다. 그러나 엔티티 매니저의 생성 비용은 거의 들지 않으므로, 엔티티 매니저 팩토리는 필요에 따라 앤티티 매니저를 생성하여 사용한..
[JPA] JPA vs JDBC
신규프로젝트 회의 중에 팀장님이 이렇게 말씀하셨다고 가정해보자. JPA를 사용하면 비즈니스 로직이 복잡해져서 사용하지 않을거예요 그럼 이때 JPA에 대한 개념을 모른다면 그 회의는 저 단어를 시작으로 멍 때리게 될것이다... JPA와 JDBC에 들어가기에 앞서.... Spring은 DB에 접근하기 위해 자바의 API를 사용한다. 웹 서비스에 필요한 기능들이 추상화돼서 Spring이 만들어졌듯이, DB에 접근하는 기술들도 일종의 추상화 과정을 거치며 진화해 나갔다. 이 부분을 처음 공부하는 사람 입장에서는, 비슷해 보이면서 다른 단어들 때문에 개념이 굉장히 헷갈린다. JPA를 검색했는데 뜬금없이 Hibernate에 관한 포스팅만 쏟아지기도 한다. 이 참에 한번 정리를 해보자!!! (각 개념에 그림과 코드를..