Spring/JPA 20

필드와 컬럼 매핑

요구사항을 추가시켜보면 회원은 일반 회원과 관리자로 구분 회원 가입일과 수정일이 있어야 함 회원을 설명할 수 있는 필드가 있어야 함 / 필드는 길이 제한이 없다. 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

플러시 & 준영속 상태 정리

플러시 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것 INSERT SQL / DELETE SQL / UPDATE SQL이 데이터베이스에 날라가는거라고 보면된다. 플러시 발생 변경 감지(Dirty checking) 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리) 영속성 컨텍스트를 플러시 하는 방법 em.flush() - 직접 호출 트랜잭션 커밋 - 플러시 자동 호출 JPQL 쿼리 실행 - 플러시 자동 호출 아래를 실행할 때 commit을 하게되면 insert문이 담기고 flush를 할 때 쿼리가 바로 DB에 반영이 된다. try { // 영속 Member member = new Member(200L, "member2..

Spring/JPA 2022.04.12

내부 동작 방식 - 영속성 컨텍스트 2

영속성 컨텍스트는 내부에 1차 캐시를 들고 있다. 조회할 때 find해서 동작하게되면 member를 먼저 조회 안하고 1차 캐시에서 조회를 하게 된다. 1차 캐시 엔티티에 member가 있게되면 member를 그냥 조회해온다. member2를 이제 찾게 되면 find를 했을 때 1차 캐시에 없으므로 DB에서 찾아서 1차캐시 엔티티에 저장하게 된다. 이후에 find("member2")를 하게되면 DB를 조회하지 않고 바로 1차캐시 엔티티에서 가져오게 된다 엔티티 매니저라는 것은 DB 트랜잭션 단위로 보통 만들고 DB 트랜잭션이 끝날 때 종료시켜버린다. 1차 캐시는 DB 트랜잭션 안에서만 효과가 있기 때문에 성능에 이점을 얻을 수 있는 장점은 없다. 이제 저장을 하고 조회를 하기위해 실행을 하면 데이터베이스..

Spring/JPA 2022.04.12

내부 동작 방식 - 영속성 컨텍스트 1

JPA에서 가장 중요한 2가지는 아래와 같다. 객체와 관계형 데이터베이스 매핑하기(Object Relational Mapping) 영속성 컨텍스트 아래 그림을 보면 고객의 요청이 올 때 마다 엔티티 매니저 팩토리를 통해서 엔티티 매니저를 생성한다. 엔티티 매니저는 내부적으로 DB 커넥션을 통해서 DB를 사용하게 된다. JPA를 이해하는데 가장 중요한 용어가 영속성 컨텍스트이고 "엔티티를 영구 저장하는 환경"이라는 뜻이다. Entity Manager.persist(entity); 즉 영속성 컨텍스트를 통해서 영속화 한다는 뜻인데 엔티티를 영속성 컨텍스트라는 곳에 저장 영속성 컨텍스트는 논리적인 개념 눈에 보이지 않고 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 1:1로 눈에 보이지 않는 영속성 컨텍스트 ..

Spring/JPA 2022.04.12

데이터베이스 스키마 자동생성 - create-drop

아래 create-drop가 제대로 작동안함(h2 db보면 member table이 그대로 있음) // persistence.xml 해결 JPAMain.java package hellojpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import java.util.List; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persist..

Spring/JPA 2022.04.04