Spring 177

공통 인터페이스 설정 & 적용

MemberRepository는 아래와 같고 testcase로 가보자. package study.datajpa.repository; import org.springframework.data.jpa.repository.JpaRepository; import study.datajpa.entity.Member; public interface MemberRepository extends JpaRepository { } MemberRepositoryTest에서 System.out.println("memberRepository = " + memberRepository.getClass()); 찍어보면 package study.datajpa.repository; import org.assertj.core.api.Ass..

공통 인터페이스 기반 - 순수 JPA 기반 레포지토리 만들기

일단 순수하게 JPA 기반을 레포지토리를 한번 만들어보자. 저장 변경 - > 변경감지 사용 삭제 전체 조회 단건 조회 카운트 => JPA에서 수정은 변경가지 기능을 사용하면 되고 트랜잭션 안에서 엔티티 조회한 다음 데이터 변경하고 트랜잭션 종료 시점에 변경 감지 기능이 작동해서 변경된 엔티티를 감지하고 UPDATE SQL을 실행한다. 기본적인 CRUD를 만들어본다. JPA가 제공하는 JPQL이라는 기술을 사용하자(객체를 대상으로 하는 쿼리) SQL로 번역이 된 다음에 실제 db에서 데이터를 가져와서 반환을 해준다. delete, findById, Optional, count을 사용해서 만들어준다. package study.datajpa.repository; import org.springframewor..

예제 도메인 모델 - 예제 도메인 모델과 동작확인

예제 도메인 모델의 엔티티 클래스와 ERD를 보자. db에서 FK가 다에 들어가야 하기 때문에 member에 들어간것을 확인할 수 있다. Member class를 아래와 같이 설정을 해주고 package study.datajpa.entity; import lombok.Getter; import lombok.Setter; import javax.persistence.*; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; // member와 team은 다대일 관계 @ManyToOne @J..

프로젝트 생성 & 스프링 데이터 JPA와 DB설정, 동작확인

Appreance에서 gradle 설정 및 lombok설정 h2 db 실행은 여기를 참고 - chmod + x [프로그램명] or - chmod 755 h2.sh https://animal-park.tistory.com/301 [Mac] zsh: permission denied: ./h2.sh 맥 터미널에서 프로그램 실행시 "zsh: permission denied: " 에러가 발생한 경우 해결하는 방법에 대해 알아보겠습니다. 해당 오류는 말그대로 파일실행 권한이 없어서 발생한 오류인데요. 해결방법은 animal-park.tistory.com 데이터베이스 파일 생성 방법 jdbc:h2:~/datajpa (최소 한번) jdbc:h2:~/datajpa ~/datajpa.mv.db 파일 생성 확인 이후 부터는..

실전 예제 1 - 요구사항 분석과 기본 매핑

아래 요구사항을 가지고 간단한 쇼핑몰 예제를 만들어 보자. 회원과 주문의 1대다 관계 주문과 주문상품의 관계 1대다 주문상품과 상품의 관계 다대일 테이블 설계와 엔티티 설계 매핑 그림은 아래와 같다. 엔티티 설계와 매핑 예시를 코드로 구현해보자. maven으로 새로운 프로젝트를 생성해준다. 폴더구조에서 persistence.xml을 만들어 주고 설정을 해준다. Member Order OrderItem Item Class를 각각 만들어준다. Member Class에서 Id 식별자는 필수로 해준다. getter setter을 만들어 준다.(setter는 많이 만들면 코드 추적하기가 어렵고 유지보수성에서 떨어진다.) package jpabook.jpashop.domain; import javax.persist..

Spring/JPA 2022.04.14

기본 키 매핑

Member class 이렇게 해서 시작해보자. @Entity public class Member { @Id private Long id; @Column(name = "name", nullable = false) private String username; public Member() { } } 사용할 수 있는 Annotation은 크게 두 가지가 있다. @Id @GeneratedValue 기본 키 매핑 방법 직접 할당: @Id만 사용 자동 생성(@GeneratedValue) id를 string으로 해놓고 id를 직접 할당한다 그러면 아래와 같이 작성 // Member class package hellojpa; import javax.persistence.*; @Entity public class Mem..

Spring/JPA 2022.04.14

필드와 컬럼 매핑

요구사항을 추가시켜보면 회원은 일반 회원과 관리자로 구분 회원 가입일과 수정일이 있어야 함 회원을 설명할 수 있는 필드가 있어야 함 / 필드는 길이 제한이 없다. member class를 아래로 놓고 package hellojpa; import javax.persistence.*; import java.util.Date; @Entity public class Member { @Id private Long id; // 객체는 username으로 테이블은 name으로 @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.STRING) private RoleType roleType; @Temporal(T..

Spring/JPA 2022.04.14

데이터베이스 스키마 자동 생성

DDL을 애플리케이션 실행 시점에 자동 생성(Create문으로 생성을 하고 시작) 테이블 중심 -> 객체 중심 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성 이렇게 생성된 DDL은 개발 장비에서만 사용 생성된 DDL은 운영서버에서 사용하지 않고 다음어서 사용 매핑정보를 보면 어떤테이블인지 알 수가 있는데 JPA에서는 애플리케이션 로딩 시점에 DB를 생성하는 기능도 지원해준다. 애플리케이션 실행시점에 Insert Into같은 것들을 실행시켜주는것이다. 아래와 같이 설정 해두고 실행 시키면 빌드창에서 drop 문구를 생성해주고 create table을 하고 로직이 돈다. -- persistence.xml에 아래와 같이 속성을 두게되면 age라는 변수를 추가로 지정해주고 빌드를 돌려서 h..

Spring/JPA 2022.04.14

엔티티 매핑 - 객체와 테이블 매핑

객체와 테이블 매핑 데이터베이스 스키마 자동 생성 필드와 컬럼 매핑 기본 키 매핑 실전 예제 - 1. 요구사항 분석 & 기본 매핑 순으로 엔티티 매핑에 대해서 학습해본다. 엔티티 매핑을 먼저 살펴보면 객체와 테이블 매핑: @Entity, @Table 필드 & 컬럼 매핑 : @Column 기본 키 매핑: @Id 연관관계 매핑: @ManyToOne, @JoinColumn(ex) 일대다 다대일 다대다 ) @Entity @Entity가 붙은 클래스는JPA가 관리, 엔티티라 한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 JPA 스펙상 아래와 같이 @Entity는 규정이 되어있다. 기본 생성자(parameter가 없는 public 또는 protected 생성자) final 클래스, enum,..

Spring/JPA 2022.04.14

지연 로딩과 조회 성능 최적화 - 엔티티를 DTO로 변환(페치 조인 최적화) ERROR

error log 2022-04-12 15:27:58.833 ERROR 58221 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting "all", found 'o' near line 1,..

Spring/JPA 2022.04.12