JPA 11

[8일차] Order 엔티티 매핑

1. 주문 ORDERS Orders - Member : 다대일 관계 데이터베이스의 키워드로 order가 있으니까 구분하기 위해 orders를 넣는다 order 테이블에 여러 개의 order가 모두 보여야한다. 컬렉션이라서 중간 테이블이 생성된다. @OneToMany private List orderList = new ArrayList(); @ManyToOne(cascade = CascadeType.ALL) // order, member 중에서 order를 연관관계의 주인으로 만들려면? private Member member; OrderDetail - Product : 일대다 관계 컬렉션이라서 중간 테이블이 생성된다. Datail 테이블에서는 상품 정보가 필요하지만 상품 테이블에서는 주문 상세 정보가 필요..

[7일차] 관리자 API - 상품 조회

1. Product 관리 - 등록, 수정, 삭제 ProductDto (상품 리스트 반환할 때 쓰인다.) 엔티티인 Product를 직접 사용해서 어떤 코드를 작성하면 참조형 데이터의 특성상 데이터베이스의 내용이 바로 변경될 우려가 있다. 그래서 Dto라는 클래스를 이용한다. @Builder @Data @NoArgsConstructor @AllArgsConstructor public class ProductDto { private Long id; // 상품 테이블의 PK // 상품 리스트를 반환할 때 필요한 정보 private String productName; private Integer price; // 상품 가격 private Boolean soldOutYn; // 품절 여부 private String..

[5일차] 연관 관계 매핑 - 장바구니, 쿠폰

1. 고객 - 장바구니 매핑하기 (일대일) Member @OneToOne @JoinColumn(name = "CART_ID") // 카트의 변수명과 달라도되나??? private Cart cart; Cart 엔티티 추가 @Entity @Builder @NoArgsConstructor @AllArgsConstructor @Data public class Cart { @Id @GeneratedValue() private Long id; private String name; @OneToOne(mappedBy = "cart") @JoinColumn private Member member; // mappedBy를 조인컬럼으로 바꾸면? mamberId 컬럼 생긴다. } MemberServiceImpl - 이메일 인..

Chapter 10. 객체지향 쿼리 언어1 - 기본 문법

10.0 intro JPA가 지원하는 다양한 쿼리 방법 JPQL(Java Persistence Query Language) JPA Criteria(객체 지향 쿼리 빌더): Java 코드를 짜서 JPQL을 빌드해주는 모음 (JPQL의 작성을 도와주는 빌더 클래스이다.) 기본으로 JPQL을 쓰고 안 되는 경우에 네이티브 SQL 사용 QueryDSL 네이티브 SQL 쿼리를 Java 코드로 작성할 수 있도록 도와주는 기술이다. JDBC API 직접 사용, MyBatis, SpringJdbcTemplate을 함께 쓴다. JPQL - 객체 지향 SQL 가장 단순한 조회 방법 EntityManager.find() 객체 그래프 탐색(a.getB().getC()) JPA를 사용하면 엔티티 중심으로 개발한다. 문제는 검색..

Chapter 07. 고급 매핑

7.1 상속 관계 매핑 상속 관계 매핑 - @Inheritance(strategy=infheritanceType.XXX) 관계형 데이터베이스는 상속 관계 매핑이 없다. 그마나 "슈퍼타입 서브타입 관계"라는 모델링 기법이 객체 상속과 가장 유사한다. 상속 관계 매핑: 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것이다. 슈퍼 타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 조인 전략(JOINED): 각각 테이블로 변환 ITEM 이라는 테이블을 만들고 데이터를 같이 가져올 때 조인으로 구성한다. (조인 전략은 비즈니스적으로 중요하고 복잡할 때 쓰면 좋다.) ex) 앨범 데이터를 추가하면 앨범의 이름, 가격은 ITEM에 들어간다. 아티스트 정보는 앨범 테이블에 들어간다. INSERT..

Chapter 05. 연관 관계 매핑 기초

5.1 단방향 연관 관계 연관 관계가 필요한 이유 연관 관계가 없으면 계속해서 객체를 끄집어내서 조회해야한다. => 객체 지향의 성격과 동떨어진다. Ex) jpa-basic 프로젝트의 멤버 클래스 package hellojpa; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name= "USERNAME") // DB에 넣고 싶은 값 private String userName; /..

Chapter 02. JPA 시작하기

2.1 프로젝트 생성 H2 데이터베이스 설치와 실행 H2는 웹 용 Query tool을 제공하는 가벼운 실습용 데이터 베이스이다. 시퀀스, auto increment 기능 지원 데이터베이스 시뮬레이션 기능이 있다. H2 데이터베이스를 설치한다. https://www.h2database.com/html/main.html maven 프로젝트 생성 maven - 라이브러리 자동 다운로드 및 의존성 관리 아까 사이트에서 다운받은 2.1.214 버전과 같은 드라이버를 사용해야한다. 4.0.0 jpa-basic ex1-hello-jpa 1.0.0 org.hibernate hibernate-entitymanager 5.3.10.Final com.h2database h2 2.1.214 JPA 설정 - persisten..

Chapter 01. JPA 소개

1.1 SQL 중심적인 개발의 문제점 문제점 관계형 데이터베이스를 쓰면서 SQL에 의존적인 개발을 피하기 어렵다. 패러다임의 불일치 객체(속성과 기능을 캡슐화해서 쓰는 게 목표) vs 관계형 데이터베이스(데이터 정교화 및 보관) 객체를 영구 보관하는 다양한 저장소 RDB - 관계형 데이터베이스 NoSQL - 비관계형 데이터베이스 File ODB 객체와 관계형 데이터베이스의 차이 객체 - RDB 상속 - Table 슈퍼타입 서브타입 관계 연관 관계: 객체는 참조 사용(ex. get) - 테이블은 외래 키 사용 (pk - fk 조인) 객체는 단방향, 테이블은 양방향 조회 가능하다. 데이터 타입 데이터 식별 방법 1.2 JPA (Java Persistence API)소개 JPA(Java Persiatence ..

Chapter 07. 날씨 저장 스케쥴링

7.1 매일 자정에 날씨 데이터 불러오기 캐싱(Caching)이란? 캐싱은 캐시(cache)라는 빠른 메모리 영역으로 데이터를 가져와서 접근하는 방식을 말한다. 데이터 등을 미리 복사해서 저장해두는 것을 말한다. 요청을 빠르게 처리한다. 캐시 방식 웹 브라우저에서 캐시 - ex) 크롬에서 네이버 화면에 쓰일 데이터를 가져온다. 사이트에 재접속할 때는 기존의 화면에서 바뀐 부분만을 데이터를 가져오므로 로딩이 빠르다. 서버에서 캐시 Client: 모바일 앱, 웹 한번 들어갔던 사이트 정보를 컨트롤러에서 저장해뒀다가 재접속하는 경우에 복사해둔 내용을 보여준다. 속도도 빨라지고 서버의 부하도 줄어든다. 캐싱할 때 유의사항 요청한 것에 대해 응답이 변하지 않는 경우에만 사용 가능하다. 캐시 적용 전 openwea..

Chapter 05. 날씨 데이터 CRUD

5.1 날씨 조회 API 작성 Ex) 조회 - Read repository에 함수 만들기 List findAllByDate(LocalDate date); service public List readDiary(LocalDate date) { return diaryRepository.findAllByDate(date); } Controller - GetMapping @GetMapping("/read/diary") List readDiary(@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date){ return diaryService.readDiary(date); } Note) 실행 결과 - GET send Ex) 날짜 범위를 정..