목록JPA (28)
개발놀이터
*값 타입 JPA의 데이터 타입 분류에는 두가지 타입이 있다. 1. 엔티티 타입 2. 값 타입 1. 엔티티 타입 특징 1-1. @Entity로 정의하는 객체 1-2. 데이터가 변해도 식별자로 지속해서 추적 가능 (PK) 1-3. ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 추적 가능 2. 값 타입 특징 2-1. int ,Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 2-2. 식별자가 없고 값만 있으므로 변경시 추적 불가 2-3. ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입에는 세가지 분류가 있다 1. 기본값 타입 2. 임베디드 타입 3. 컬렉션 타입 1. 기본값 타입 자바에서 흔히 사용하는 타입으로 자바 기본타입인 int, do..
*지연 로딩과 즉시 로딩 지연로딩과 즉시로딩을 알기 전에 프록시라는 것을 짚고 넘어가야 한다. *프록시 프록시의 의미는 앞에서 대신 무언갈 중계해준다. 정도의 느낌이다. 프록시 서버도 마찬가지의 매커니즘이다. 그럼 지연로딩과 즉시로딩에서 프록시는 어떤 역할을 할까? 말 그대로 로딩 즉 데이터를 읽어오는 과정을 중계해준다. 예를 들어서 Member 엔티티와 Team 엔티티가 있다고 가정해보자, 비지니스 로직상 Member에 있는 데이터들만 조회하거나 입력할텐데 Team까지 필요하진 않을 것이다. 그런데 @ManyToOne 혹은 @OneToOne 어노테이션에서는 em.find(Member.class, member.getId()); 를 하면 Member 테이블은 물론이고 Team까지 조인해서 값을 가져온다. ..
*상속관계 매핑 테이블을 설계하는것에 있어서 공통된 칼럼이 계속 등장하면 어떻게해야할까? 방법은 크게 세가지로 나눌 수 있다. 1. 한 테이블에 다 때려박는 SINGLE_TABLE 전략 2. 각 테이블에 중복되는 칼럼을 그냥 집어넣는 TABLE_PER_CLASS 전략 3. 슈퍼타입와 서브타입를 이용하는 JOINED 전략 *JOINED 전략 관계형 데이터베이스에는 상속관계라는 것이 없다. 하지만 비슷한 모델링이 있는데 바로 슈퍼타입 서브타입이다. 예를 들어서 앨범, 책, 영화 테이블에 각각 공통 칼럼인 이름과 가격을 슈퍼타입인 아이템 테이블에 다 담는 것이다. 그리고 서브타입인 앨범, 책, 영화에는 슈퍼클래스의 PK값을 PK,FK값으로 사용함으로써 추후에 서브타입를 찾으려 할때는 조인을 사용해서 찾을 수 ..
*연관관계의 주인 연관관계의 주인 딜레마는 양방향 연관관계에서 고민해야할 문제인데 양방향 매핑 규칙이 있다. 연관관계의 주인이란 단방향 연관관계를 두개를 만들어야하는 양방향 연관관계에서 둘 다 객체를 만들어버리면 예를들어 Member, Team 두개에서 Team클래스에서는 Member member로 단방향 매핑을 구축하고 Member 클래스에서는 Team team으로 단방향 매핑을 구축하면 둘 중 어떤 클래스에서 디비에 있는 FK를 수정할지 결정을 해야한다. 이것이 바로 연관관계의 주인이다. 양방향 매핑 규칙 1. 객채의 두 관계중 하나를 연관관계의 주인으로 지정 2. 연관관계의 주인만이 외래키를 관리 (등록, 수정) 3. 주인이 아닌 쪽은 읽기만 가능 4. 주인은 mappedBy 속성 사용 X 5. 주..
*기본 키 매핑 기본 키 매핑 방법 1. 직접 할당 (@Id) 2. 자동 생성 (@GeneratedValue) -IDENTITY : 데이터베이스에 위임, MYSQL -SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE (@SequenceGenerator 필요) -TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용 (@TableGenerator 필요) -AUTO : 방언에 따라 자동 지정, 기본값 *IDENTITY 전략 -@GeneratedValue(strategy = GenerationType.IDENTITY) -기본 키 생성을 데이터베이스에 위임 -주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용 (ex) MySQL의 AUTO_INCREMENT) -JP..
*엔티티 매핑 @Entity -@Entity가 붙은 클래스는 JPA가 관리, 엔티티라고 한다. -JPA를 사용해서 테이블과 매핑할 클래스는 @Entity필수 -주의 1. 기본생성자 필수 2. final 클래스, enum, interface, inner 클래스 사용 X 3. 저장할 필드에 final 사용 X *@Table(name = "Member") -테이블 명과 매핑시킬 수 있음 -관례는 클래스 이름이 테이블 이름과 매핑됨 *@Column(name = "username") -컬럼명을 매핑 시키는 어노테이션 -객체를 사용할 때 변순는 name으로 사용하고 싶고 실제 디비상에서의 컬럼은 username이라고 되어있을 때 매핑하기 위한 어노테이션 @Column의 속성 -name = "username" 필드와..
*JPA에서 가장 중요한 2가지 1. 객체와 관계형 데이터베이스 매핑하기 2. 영속성 컨텍스트 *영속성 컨텍스트 정의 : 엔티티를 영구저장하는 환경 디비에 저장한다는 개념이 아니라 영속성 컨텍스트를 통해서 엔티티를 영속화를 한다는것 = 영속성 컨텍스트에 저장한다는 것 엔티티 매니저는 영속성컨텍스트를 1대1로 가지고 있다. 영속성컨텍스트는 눈에 보이지 않는 논리적인 개념이다. *비영속 member 객체를 생성하고 엔티티매니저에 아무것도 넣지않은 상태 Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); 이렇게 JPA가 관여하지 않은 객체 생성의 상태 *영속 em.persist(member); 이런식으로 객체를 저장..
*JPA JPA 시작하기 1. META-INF/persistence.xml에 정보를 입력한다. (jdbc드라이버, user, password, jdbc url, dialect 이렇게 설정을 해준다음에 2. JPA를 시작하려는 클래스에 EntityManagerFactory emf = persistence.createEntityManagerFactory(persistence.xml에 있는 persistence-unit 을 적어준다) 3. EntityManager em = emf.createEntityManager(); 4. EntityTransaction tx = em.getTransaction(); 5. DTO를 만들어주고 @Entity를 적어서 jpa가 이 클래스를 관리하도록 어노테이션을 적는다. 6. ..