Spring
Embedded 타입 객체, JPA에서의 값 타입(참조기반) 수정시 주의사항, 값 타입 콜렉션
값 타입 1. 기본값 타입 자바 기본타입(int, double) -> 생명주기를 엔티티에 의존**(회원삭제시 이름, 나이 필드도 함께 삭제됨) 래퍼런스 클래스(Integer, Long) -> 값타입은 공유하면 안된다. (회원 이름 변견시 다른 회원 이름도 함께 변경되면 안됨, 예를들어 update 쿼리를 날릴때, 자바의 기본 타입은 절대 공유 안됨 어차피) String 2. 임베디드 타입(복합 값 타입) 새로운 값 타입(새로운 class 생성, but not Entity)을 직접 정의할 수 있음 이를 JPA는 임베디드 타입이라 한다. 주로 기본 값 타입을 모아서 만든것이라서 복합 값타입이라고도 한다. 예시) Member테이블이 아래와 같은 속성으로 구성된다고 할 때 Address id name start..
JPA 종속 객체 관리 및 영속성 전이(CASCADE), 고아 객체
영속성 전이: CASCADE => 특정 엔티티와 또 다른 엔티티가 종속관계이고 영속상태, 삭제상태 등 라이프 사이클을 어느정도 일치 시키고 싶을 때 사용하면 좋은 방법이다. @OneToMany, @OneToOne, @ManyToOne 어노테이션 등에 속성으로 cascade를 두고 CascadeType을 설정해주면됨 CascadeType 종류 CascadeType.ALL: 모두 적용 (연관관계의 엔티티가 모든 라이프 사이클이 맞물린다면) CascadeType.PERSIST: 영속할때 만 적용 =>특정 엔티티를 영속 상태(persist)로 만들 때 연관된 엔티티도 함께 자동으로 영속상태로 만들고 싶은경우 활용 CascadeType.REMOVE: 삭제할때만 적용 아래 세개는 잘 안씀 CascadeType.ME..
JPA 프록시 활용, 즉시로딩 vs 지연로딩(fetch = FetchType.LAZY)
프록시가 필요한 이유 Member와 Team이 n:1로 매핑되어 있을 때 Member를 조회할 때 팀정보가 조인되어 계속 호출(조인)되어 조회하면 성능이 떨어지지 않을까? 난 Member의 정보만 조회하고 싶은데.. 하면 프록시를 활용해서 Member만 조회할 수 있다. 먼저 프록시가 뭔지 알아보자. 프록시란? 실제 클래스를 거의 유사하게 상속받아서 만들어진 객체로 실제 클래스와 겉모양이 같다. 사용하는 입장에선 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. 프록시 객체는 실제 객체의 참조(target)을 보관한다. em.find() vs em.getReference() 지금 것 우리는 DB의 실제 엔티티 객체를 조회할 때 em.find() 메소드를 사용했다. 프록시 엔티티 객체를 조회하기..
상속 관계 매핑 (Inheritance), 정보 상속(MappedSuperclass)
상속관계 매핑 [객체의 상속 구조]와 [DB의 슈퍼타입 서브타입 관계] 를 매핑 예시) 부모 클래스: Item 자식 클래스: Album, Book, Movie Item은 abstract 클래스 Album, Book, Movie가 extends Item해서 상속받는경우 JPA에서 상속관계 매핑을 위한 3가지 방법이 있다. 1. 단일 테이블(default) 사용방법 @Inheritance(strategy = InheritanceType.SINGLE_TABLE) => Inheriance 설정 안하면 이것이 기본값임(default) @DiscriminatorColumn을 설정안해도 자동으로 구분컬럼 생성됨 장점: 조인이 필요없어서 조회가 쉬움, 쿼리도 쉬움 단점: null 허용으로 인해서 데이터 무결성 입장에선..
연관관계 매핑 기초(단방향, 양방향), 다양한 연결관계 매핑
객체 지향은 참조에 의한 객체 조회 (객체로 조회 하고싶음) vs RDB는 Join에 의해 객체 조회(외부키로 id를 조회) 둘사이의 괴리를 어떻게 해결할 것인가?? => 객체지향언어에서 관계지향 언어의 개념을 삽입한다. 1. 다대일(N:1) 매핑 회원과 팀이 있다. 한 팀에 여러명의 멤버가 속해 있기 때문에 팀과 회원은 다대일 관계이다. (1) Member(회원) 기준(관계에서 N을 맡음) -> Member의 column에 TeamId가 아닌 Team을 추가 -> @ManyToOne 추가 -> @JoinColumn(name = "TEAM_ID") 추가 @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; Member가 Many, Team이 One으로..
자동 DDL 쿼리생성, 엔티티 매핑을 위한 기본키, 콜롬 어노테이션
자동 DDL 쿼리 생성 JPA에는 설정한대로 자동으로 DDL 쿼리를 짤 수 있도록 설정할 수 있다. 사용 방법 persistence.xml에 을 추가하면 된다. value = "create"일 때 작동 방식 1. drop table if exists - 기존에 table존재하면 삭제 2. create table Member... - 테이블 생성 create가 아닌 다른 값인 경우 value: - "create-drop": create처럼 생성하고 종료시점엔 table drop - "update": 변경분만 반영(sql의 alter 명령어와 같음) - "validate": 엔티티와 테이블이 정상적으로 매핑되었는지만 확인 - "none": 사용하지 않음 사용 편의와 로직 -> 애플리 케이션 로딩시점에 설정한..
JPA 시작
JPA 실행 1. DB서버와 잘 연결되는지 확인 테스트할 JpaMain이라는 파일을 만들고 EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유. EntityManager는 Thread간에 공유가 안되기 때문에 사용하고 그냥 버려야 한다. JPA의 모든 데이터 변경은 Trasaction 안에서 실행되어야 한다. public static void main(String[] args){ // start EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); // code // end em.close(); emf.close..
JPA란? JPA 장점, JPA 프로젝트 설정
ORM(Object-reational mpping) => 객체 관계 매핑. 객체지향 언어의 이점을 살려서 관계형 데이터베이스 언어에 접근하는 언어 객체는 객체대로 설계, 관계형 DB는 관계형 DB대로 설계가 가능하다. 이 둘 사이를 이어주는건(mapping) JPA가 알아서한다. JPA(Java Persistence API) - Java의 ORM 기술표준 - SQL을 한땀한땀 만드는 행동줄임(SQL 중심의 개발에서 객체 중심으로 개발 가능) JPA의 장점 -> SQL문을 한땀한땀 만들고 수정하지 않아도 된다. ex) 만약 속성하나 추가 -> 모든 쿼리 수정 -> 객체지향 언어의 성질과 관계형 데이터베이스의 성질의 차이를 극복하기 쉽다. ex) 자바의 컬렉션 형태의 데이터 처리방법을 그대로 사용하여 DB를..