Back-End/Inflearn 강의 30

[JPA 활용 - 웹 애플리케이션 개발] 웹 계층 개발

회원 등록 회원 등록 폼 객체 public class MemberForm{ @NotEmpty(message = "회원 이름은 필수입니다.") private String name; private String city; private String street; private String zipcode; } 폼 객체를 사용해서 화면 계층과 서비스 계층을 명확하게 분리한다. 회원 목록 조회 회원 목록 컨트롤러 @GetMapping(value = "/members") public String list(Model model){ List members = memberService.findMembers(); model.addAttribute("members",members); return "members/member..

[JPA 활용 - 웹 애플리케이션 개발] 주문 도메인 개발

주문 엔티티 개발 기능 설명 생성 메서드(createOrder()) : 주문 엔티티를 생성할 때 사용한다. 주문 회원, 배송 정보, 주문 상품의 정보를 받아서 실제 주문 엔티티를 생성한다. 주문 취소(cancel()) : 주문 취소 시 사용한다. 주문 상태를 취소로 변경하고, 주문 상품에 주문 취소를 알린다. 만약 이미 배송을 완료한 상품이면 주문을 취소하지 못하도록 예외를 발생시킨다. 전체 주문 가격 조회 : 주문 시 사용한 전체 주문 가격을 조회한다. 전체 주문 가격을 알려면 각각의 주문 상품 가격을 알아야 한다. 로직을 보면 연관된 주문 상품들의 가격을 조회해서 더한 값을 반환한다. (실무에서는 주로 전체 주문 가격 필드를 주고 역정 규화) public static Order createOrder(..

[JPA 활용 - 웹 애플리케이션 개발] 상품 도메인 개발

상품 엔티티 개발(비즈니스 로직 추가) 비즈니스 로직 분석 addStock() 메서드는 파라미터로 넘어온 수만큼 재고를 늘린다. 이 메서드는 재고가 증가하거나 상품 주문을 취소해서 재고를 다시 늘려야 할 때 사용한다. removeStock() 메서드는 파라미터로 넘어온 수만큼 재고를 줄인다. 만약 재고가 부족하면 예외가 발생한다. 주로 상품을 주문할 때 사용한다. 상품 리포지토리 개발 기능 설명 save() id가 없으면 신규로 보고 persist() 실행 id가 있으면 이미 데이터베이스에 저장된 엔티티를 수정한다고 보고, merge()를 실행 상품 서비스 개발 상품 서비스는 상품 리포지토리에 단순히 위임만 하는 클래스 참고 강의 : https://www.inflearn.com/course/%EC%8A%..

[JPA 활용 - 웹 애플리케이션 개발] 회원 도메인 개발

회원 리포지토리 개발 기술 설명 @Repository : 스프링 빈으로 등록, JPA 예외를 스프링 기반 예외로 예외 변환 @PersistenceContext : 엔티티 매니저(EntityManger) 주입 @PersistenceUnit : 엔티티 매니저 팩토리(EntityManagerFactory) 주입 기능 설명 save() findOne() findAll() findByName() 회원 서비스 개발 기술 설명 @Service @Transactional : 트랜잭션, 영속성 컨텍스트 readOnly=true : 데이터의 변경이 없는 읽기 전용 메서드에 사용, 영속성 컨텍스트를 플러시 하지 않으므로 약간의 성능 향상(읽기 전용에는 다 적용) 데이터베이스 드라이버가 지원하면 DB에서 성능 향상 @Auto..

[JPA 활용 - 웹 애플리케이션 개발] 도메인 분석 설계

도메인 모델과 테이블 회원, 주문, 상품의 관계 : 회원은 여러 상품을 주문할 수 있다. 그리고 한 번 주문할 때, 여러 상품을 선택할 수 있으므로 주문과 상품은 다대다 관계다. 하지만 이런 다대다 관계는 관계형 데이터베이스는 물론이고 엔티티에서도 거의 사용하지 않는다. 따라서 그림처럼 주문 상품이라는 엔티티를 추가해서 다대다 관계를 일대다, 다대일 관계로 풀어냈다. 상품 분류 : 상품은 도서, 음반, 영화로 구분되는데 상품이라는 공통 속성을 사용하므로 상속 구조로 표현했다. 회원 엔티티 분석 회원(Member) : 이름과 임베디드 타입인 주소(Address), 그리고 주문(orders) 리스트를 가진다. 주문(Order) : 한 번 주문시 여러 상품을 주문할 수 있으므로 주문과 주문 상품(OrderIt..

[자바 ORM 표준 JPA 프로그래밍 - 기본편] 객체지향 쿼리 언어2 - 중급 문법

JPQL - 경로 표현식 .(점)을 찍어 객체 그래프를 탐색하는 것 경로 표현식 용어 정리 상태 필드(state field) : 단순히 값을 저장하기 위한 필드(ex: m.username) 연관 필드(association field) : 연관관계를 위한 필드 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티(ex: m.team) 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션(ex: m.orders) 경로 표현식 특징 상태 필드(state field) : 경로 탐색의 끝, 탐색 x 단일 값 연관 경로 : 묵시적 내부 조인(inner join) 발생, 탐색 o 컬렉션 값 연관 경로 : 묵시적 내부 조인 발생, 탐색 x FROM절에서 명시적 조..

[자바 ORM 표준 JPA 프로그래밍 - 기본편] 객체지향 쿼리 언어1 - 기본 문법

객체지향 쿼리 언어 소개 JPA는 다양한 쿼리 방법을 지원 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL 소개 가장 단순한 조회 방법 EntityManager.find() 객체 그래프 탐색(a.getB().getC()) JPQL JPA를 사용하면 엔티티 객체를 중심으로 개발 문제는 검색 쿼리 검색을 할 때는 테이블이 아닌 엔티티 객체를 대상으로 검색 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 SQL과 문법 유사, SELE..

[자바 ORM 표준 JPA 프로그래밍 - 기본편] 값 타입

기본 값 타입 JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 기능 ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경 시 추적 불가 ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본 값 타입 자바 기본 타입(int, double) 래퍼 클래스(Integer, Long) String 임베디드 타입(embedded type, 복합 값 타입) 컬렉션 값 타입(collection value type) 참고 : 자바의 기본 타입은 절대 공유 x int, double 같은 ..

[자바 ORM 표준 JPA 프로그래밍 - 기본편] 프록시와 연관관계 관리

프록시 Member를 조회할 때, Team도 조회해야 하나? -> 어느 경우에는 member만 가져오고 싶은 상황이 생길 수 있음. 프록시 기초 em.find() vs em.getReference() em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시 특징 실제 클래스를 상속받아서 만들어짐 실제 클래스와 겉모양이 같음 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨 (이론상) 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 프록시 객체의 초기화 프록시의 특징 프록시 객체는 처음 사용할 때 한 번..

[자바 ORM 표준 JPA 프로그래밍 - 기본편] 고급 매핑

상속관계 매핑 관계형 데이터베이스는 상속 관계 x 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 각각 테이블로 변환 -> 조인 전략 통합 테이블로 변환 -> 단일 테이블 전략 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED : 조인 전략 SINGLE_TABLE : 단일 테이블 전략 TABLE_PER_CLASS : 구현 클래스마다 테이블 전략 @DiscriminatorColumn(name="DTYPE") @DiscriminatorValue("X..