객체를 관계형DB에 저장해서 관리하는 형태에서 객체지향적으로 개발을 해도, 결국엔 DB가 SQL만 알아듣기 때문에 SQL 중심적인 개발이 된다CRUD 쿼리, 자바 객체 -> SQL, SQL -> 자바 객체테이블마다 반복적으로 해주어야 한다필드가 변경되면, 그에 맞게 관
객체는 객체대로 설계관계형 DB는 관계형 DB대로 설계ORM 프레임워크가 중간에서 SQL 매핑을 담당해줌과거 개발자가 SQL 매핑을 해주던것을 ORM 프레임워크가 해 준다자바 진영의 ORM 기술 표준JPA가 JDBC API를 사용해서 SQL를 작성JPA에게 객체를 넘기
JPA를 사용하기 위해선 일단 EntityManagerFactory가 필요하다.Persistence를 사용해 생성하면 된다EntityManagerFactory가 생성되면 DB와 연결되고 쿼리를 날릴 수 있게된다.생성한 EntityManagerFactory로 Entity
필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다JPA는 SQL을 추상화한 JPQL이라는 객체지향 쿼리언어를 제공한다.테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리JPQL은 엔티티 객체를 대상으로 쿼리를 날리고, SQL은 DB테이블을
JPA에서 가장 중요한 2가지! 객체와 관계형 데이터베이스 매핑하기 영속성 컨텍스트 영속성 컨텍스트 영속성 컨텍스트를 이해하면 JPA 내부 동작 방식을 알 수 있다. JPA를 사용하면, EntityManagerFactory를 통해서 고객 요청시마다 EntityMan
JPA에서는 애플리케이션 로딩 시점에 DB 테이블을 생성하는 기능을 지원한다.테이블을 먼저 만들고, 객체를 만드는 형태로 개발했었는데, JPA를 사용하면 객체 매핑을 다 해놓고 애플리케이션을 로딩할 때 테이블이 알아서 만들어진다테이블 중심 -> 객체 중심데이터베이스 방
엔티티 매핑 객체와 테이블 매핑 @Entity, @Table 필드와 컬럼 매핑 @Column 기본 키 매핑 @Id 연관관계 매핑 @ManyToOne, @JoinColumn ... 객체와 테이블 매핑 @Entity / @Table @Entity @E
테이블에 맞춰서 외래키를 가져와서 조회하는 방식이 아니라, 다이렉트로 객체를 가져올 수 있는 연관관계를 맺어서 객체지향스럽게 설계하는 방법객체와 테이블 연관관계의 차이를 이해해야 하고, 이해를 바탕으로 객체의 '참조'와 테이블의 '외래키'를 매핑하는 방법을 알아야 한다
관계형 데이터베이스는 상속관계가 없다.'슈퍼타입', '서브타입' 관계라는 모델링 기법이 객체 상속과 유사하다\-> 상속관계 매핑은 객체의 상속구조와 DB의 슈퍼타입 서브타입 관계를 매핑한 것이다.JOINED : 조인 전략SINGLE_TABLE : 단일 테이블 전략TAB
공통 매핑 정보가 필요할 때 사용한다. (상속관계 매핑x)엔티티가 아니며, 테이블과 매핑되지 않음부모 클래스(@MappedSuperclass)를 상속받는 자식 클래스에 매핑정보만 제공 DB는 변함없고, 객체입장에서 상속받아 사용하는 형태직접 생성해서 사용하지 않기 때문
실제 클래스를 상속받아서 만들어진다.실제 클래스와 겉모양이 같다.사용하는 입장에서는 진짜 객체인지, 프록시 객체인지 구분하지 않고 사용하면 된다.프록시 객체는 실제 객체의 참조(target)을 보관한다.프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다
EX) Member를 조회할 때, Team도 함께 조회해야 할까?\-> 단순히 member 정보만 사용하는 거라면, Member만 조회하는 것이 좋다.Team도 함께 조회하는 것은 효율이 떨어지며 낭비!그래서 JPA는 '지연로딩' 옵션을 제공한다.그러나, Member를
특정 엔티티를 영속 상태로 만들 때, 연관된 엔티티도 함께 영속화하고 싶을 때 사용하는 옵션ex) 부모 엔티티를 저장할 때, 자식 엔티티도 함께 저장부모 엔티티)자식 엔티티)CASCADE 옵션을 키지 않고, 엔티티를 저장할 때)parent, child 엔티티를 일일이
@Entity로 정의하는 객체데이터가 변해도 식별자로 지속해서 추적이 가능하다EX) Member 엔티티의 속성을 변경해도 식별자로 인식/추적이 가능하다int, Integer, String처럼 단순 값으로 사용하는 자바 기본 타입/객체식별자가 없고 값만 있으므로 변경 시
기본값 타입은 공유되지 않기 때문에 안전하다.하지만, 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다.\-> 부작용 발생 가능성이 있다.주소를 변경하면, 회원1, 회원2가 참조하는 주소가 같이 변경되버린다.때문에 값을 복사해서 사용한다.항상 값을 복사해
값 타입 컬렉션 값 타입을 컬렉션에 담아서 사용하는 것을 의미한다 값 타입을 하나 이상 저장할 때 사용한다 영속성 전이(CASCADE) + 고아 객체 제거 기능을 가지는 느낌 상위 엔티티를 통해서 하위 엔티티의 생명주기를 관리 지연 로딩 전략을 사용한다 테이블에
특정 시간에 몇천개의 데이터를 저장할 일이 생겼다.JPA의 saveAll 메소드로 처리했는데 내가 기대한 동작과는 달리 하나씩 Insert가 되었다.조금이라도 성능을 향상시키기 위해 한번에 Insert 하고 싶었다.알아보니 JPA에서 @GeneratedValue의 st
https://velog.io/@choidongkuen/JPA-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-DynamicInsert-DynamicUpdate-%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%