[JPA] 7. 웹 계층 개발 - 홈 화면과 레이아웃
·
BE/스프링부트와 JPA 활용
스프링부트 타임리프 기본 설정spring: thymeleaf: prefix: classpath:/templates/ suffix: .html스프링 부트 타임리프 viewName 매핑`resources:templates/` +{ViewName}+ `.html``resources:templates/home.html`반환한 문자(home)와 스프링부트 설정 `prefix` , `suffix` 정보를 사용해서 렌더링할 뷰(html)를 찾는다.HomeController.java@Controller@Slf4j //Logger log = LoggerFactory.getLogger(getClass());public class HomeController { @RequestMapping("/") p..
[JPA] 6. 주문 도메인 개발 - 주문 검색 기능 개발
·
BE/스프링부트와 JPA 활용
JPA에서 동적쿼리를 어떻게 해결해야 하는가?검색 조건 파라미터 OrderSearch@Getter @Setterpublic class OrderSearch { private String memberName; // 회원 이름 private OrderStatus orderStatus; // 주문 상태(Order, Cancle)}주문 리포지토리에 검색 추가// 주문 조회 -> 검색이 되어야 함public List findAll(OrderSearch orderSearch){ return em.createQuery("select o from Order o join o.member" + "where o.status = :status" + ..
[JPA] 6. 주문 도메인 개발 - 리포지토리/서비스/테스트
·
BE/스프링부트와 JPA 활용
1. 주문 리포지토리 개발OrderRepository.javapackage jpabook.jpashop.repository;import jakarta.persistence.EntityManager;import jakarta.persistence.PersistenceContext;import jpabook.jpashop.domain.Order;import lombok.RequiredArgsConstructor;import org.springframework.stereotype.Repository;import java.util.List;@Repository@RequiredArgsConstructorpublic class OrderRepository { @PersistenceContext priva..
[JPA] 6. 주문 도메인 개발 - 주문, 주문상품 엔티티 개발
·
BE/스프링부트와 JPA 활용
Order.java@Entity@Table(name="orders")@Getter @Setterpublic class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order") private List orderItems = new ArrayList(); @OneToOne(fetch = LAZY) @JoinColumn(name = "delivery_id") private Deliver..
[JPA] 5. 상품 도메인 개발
·
BE/스프링부트와 JPA 활용
1. 상품 엔티티 개발(비즈니스 로직 추가)@Entity@Inheritance(strategy = InheritanceType.SINGLE_TABLE)@DiscriminatorColumn(name = "dtype")@Getter @Setterpublic 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(); @One..
[JPA] 4. 회원 도메인 개발
·
BE/스프링부트와 JPA 활용
1. 회원 리포지토리 개발@Repository // 컴포넌트 스캔에 의해 자동으로 등록(스프링 빈으로 등록)@RequiredArgsConstructorpublic class MemberRepository { // @PersistenceContext 사용하면 EntityManager를 영속성 컨텍스트로 등록해 주입받을 수 있음 // @RequiredArgsConstructor + final 조합은 // final이 붙은 필드를 파라미터로 받는 생성자를 자동으로 생성해준다. private final EntityManager em; public void save(Member member){ em.persist(member); } public Member fin..
[JPA] 3. 애플리케이션 구현 준비
·
BE/스프링부트와 JPA 활용
애플리케이션 아키텍처계층형 구조 사용controller, web: 웹 계층service: 비즈니스 로직, 트랜잭션 처리repository: JPA를 직접 사용하는 계층, 엔티티 매니저 사용domain: 엔티티가 모여 있는 계층, 모든 계층에서 사용패키지 구조jpabook.jpashopdomainexceptionrepositoryserviceweb개발 순서: 서비스, 리포지토리 계층을 개발하고, 테스트 케이스를 작성해서 검증, 마지막에 웹 계층 적용
[JPA] 2. 도메인 분석 설계 - 엔티티 설계시 주의점
·
BE/스프링부트와 JPA 활용
1. 엔티티에는 가급적 Setter를 사용하지 말자JPA에서 엔티티는 단순한 데이터 그릇이 아니다.비즈니스 규칙과 상태를 표현하는 도메인 객체이기 때문에 값을 아무 때나 바꿀 수 있는 @Setter는 유지보수와 안정성을 해친다.Setter가 모두 열려있을 경우 변경 포인트가 너~무 많아서 유지보수하기 어렵다!(Getter는 열어놔도 됨)2. 모든 연관관계는 지연로딩(Lazy)으로 설정하자(⭐️)- 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다.JPA는 크게 2가지 방식으로 데이터를 조회한다.JPQL (객체 중심)"SELECT o FROM Order o"엔티티 기준 쿼리. SQL 아님JPA 메서드 직접 조회em.fin..
[JPA] @Embedded @Embedable 임베디드 타입이란?
·
BE/스프링부트와 JPA 활용
어제 스터디를 하면서 @Embedded는 "JPA에서 자주 사용하는 컬럼들을 모아둔 묶음"이라고 이해했다고 얘기했는데, 공부를 하며 틀린 부분이 있다는 걸 알게 되어 정리해본다. 결론적으로 말하면, @Embedded는 JPA가 미리 제공하는 내장 기능이 아니라, 개발자가 자주 사용하는 컬럼들을 직접 하나의 값 객체로 만들어서 재사용하는 방식이라고 이해하면 된다. 예를 들어 쇼핑몰을 생각해보자.우리가 인터넷 쇼핑을 할 때 회원 정보에 "주소(Address)" 를 입력한다.이 주소는 회원 정보(Member)뿐만 아니라, 주문(Order), 배송(Delivery) 정보에서도 사용될 수 있다.이럴 때 매번 city, street, zipcode 필드를 반복해서 정의하기보다는 공통으로 사용하는 주소 구조를 @Em..
[JPA] 2. 도메인 분석 설계 - 요구사항 분석 / 도메인 모델과 테이블 설계 / 엔티티 클래스 개발
·
BE/스프링부트와 JPA 활용
1. 요구사항 분석기능목록회원 기능회원 등록회원 조회상품 기능상품 등록상품 수정상품 조회주문 기능상품 주문주문 내역 조회주문 취소기타 요구사항상품은 재고 관리가 필요하다.상품의 종류는 도서, 음반, 영화가 있다.상품을 카테고리로 구분할 수 있다.상품 주문시 배송 정보를 입력할 수 있다.2. 도메인 모델과 테이블 설계회원, 주문, 상품의 관계: 회원은 여러 상품을 주문할 수 있다. 그리고 한 번 주문할 때 여러 상품을 선택할 수 있으므로 주문과 상품은 다대다 관계다. 하지만 이런 다대다 관계는 관계형 데이터베이스는 물론이고 엔티티에서도 거의 사용하지 않는다. 따라서 그림처럼 주문상품이라는 엔티티를 추가해서 다대다 관계를 일대다, 다대일 관계로 풀어냈다.상품 분류: 상품은 도서, 음반, 영화로 구분되는데 상..