본문 바로가기

전체 글

(77)
[TIL 2022-2-25] JPA 값 타입, PriorityQueue JPA 값 타입은 불변객체여야한다. 임베디드 타입을 포함한 모든 값 타입은 불변객체여야 한다.(값을 변경할 수 없는 객체, 생성자 또는 정적팩터리 메서드를 만들어 인스턴스를 생성한 이후에 setter 등으로 값을 변경할 수 없어야함) 값타입은 참조가 달라도 그 안에 값이 같으면 같은 것으로 봐야하므로 equals()를 재정의 해줘야한다. 값 타입 컬렉션 @ElementCollection, @CollectionTable 을 통해 지정해준다. 값 타입 컬렌션읜 영속성 전이(Cascade) 와 고아 객체 제거 기능을 필수로 가진다.(라이프사이클을 주인 객체에 의존). 기본적으로 지연 로딩으로 설정되어있다. 다 정리하면 엔티티 타입 객체는 스스로 라이프사이클을 관리하지만 값 타입은 모든 것을 주인 객체에 의존한..
[TIL 2022-2-25] JPA, DFS JPA 값 타입 엔티티 타입 - @Entity로 정의하는 개체 - 데이터가 변해도 식별자로 지속해서 추적 가능 값 타입 -식별자가 없고 값만 있으므르 변경시 추적 불가 ex) String, int, Integer 등 값 타입의 종류 기본값 타입 - 자바 기본 타입(int, double) - 래퍼 클래스(Integer, Long) - String primitive 타입은 값 자체가 복사되므로 공유되지 않는다. 래퍼클래스나 String은 참조값을 공유하는 객체지만 변경될 수 없으므로 사이드 이펙트를 발생시키지않는다.(불변 객체라 그런 것 같다) 임베디드 타입(복합 값 타입) 엔티티에서 의미적으로 묶을 수 있는 값 타입을 모아서 새로운 값 타입으로 만들어 사용한다. @Embedded 를 엔티티에서 값타입을 사..
[TIL 2022-02-23] 지연로딩, 순열 알고리즘 즉시로딩과 지연로딩 연관관계 매핑을 통해 @ManyToOne, @OneToMany등으로 설정된 변수에 (fetch = FetchType.LAZY) 로 설정하면 지연로딩으로 설정되어 부모객체(참조를 가지고 있는 객체)를 조회할 때 참조에 프록시 객체를 만들어 집어넣는다. 프록시 객체는 실제객체를 상속받아 만들어지고, 실제 데이터를 조회하려고 할때 데이터베이스를 조회한다. 즉시로딩의 문제점 - 예상하지 못한 SQL 발생 연관관계가 복잡해지면, 예상할 수 없는 조인이 수없이 연결되어 심각한 성능 저하를 발생시킬 수 있다. - N + 1 문제 jpql을 통해 조회를 할 경우, SQL문으로 변환되어 실행된다. SQL문 실행 후 즉시로딩되어있는 객체에는 꼭 데이터를 채워줘야하므로 추가적인 SQL을 발생시킨다. 기본..
[TIL 2022-02-22] JPA 프록시에 대해서, Set의 equals JPA 프록시(Hibernate에서) 하이버네이트는 EntityManger의 getReference() 메소드 호출시, 조회하고자 하는 객체를 상속받는 프록시 객체를 만들어 반환한다. 프록시 객체는 메소드 호출 즉시 데이터베이스에 select를 호출하는 것이 아니라, 개발자가 실제 매핑된 데이터를 조회하고자 할 때 데이터베이스에서 데이터를 가져온다. 아래 코드와 실행 결과를 보면 getRefernce() 호출이 아닌 getName() 메소드 호출 시점에 데이터베이스에 select 쿼리를 날리고 데이터를 가져오는 것을 알 수 있다. 위의 결과처럼 getName()메소드 호출 시 Member 객체와 매핑되어있는 테이블에서 데이터를 조회한다. 프록시 객체는 실제 엔티티 객체를 참조하는 target을 보관한다...
[TIL 2022-2-20] JPA 연관관계 매핑, 프로그래머스 다양한 연관관계 매핑 다중성 데이터베이스와 연관관개를 매핑하기 위해 존재하는 개념이다. 두 테이블간에 일대다, 다대일, 일대일, 다대다 로 나뉘는 상대적인 연관관계들 말한다. JPA 에선 아래의 어노테이션을 통해 엔티티의 연관관계를 매핑한다. 일대다: @OneToMany 다대일: @ManyToOne 일대일: @OneToOne 다대다: @ManyToMany 단방향과 양방향 테이블에선 외래키 하나를 통해 양쪽 두 테이블을 모두 Join할 수 있기 때문에 방향이라는 개념이 없다. 하지만 객체에서는 참조값 필드가 있는 방향으로만 조회가 가능 하기 때문에, 필요에 따라 연관관계 필드를 설정 해줘야만 조회가 가능하다. 연관관계의 주인 위에서 말한 것 처럼 엔티티 객체의 연관관계에서 한 객체를 통해 다른 객체를 조회..
JPA 사용시 주의점 : 양방향 연관관계와 영속화 양방향 연관관계를 가지는 엔티티 객체를 영속화 하면 연관관계가 있는 다른 객체까지 영속화를 시켜주지 않을까 하는 잘못된 생각을 잠깐 했다. 물론 아니었다. 위 코드와 같이 Order 객체와 연관관계를 갖지 않는 다른 엔티티들을 영속화 하지 않고 Order 객체만 persist()를 통해 영속화 시키고 커밋했을 때 아래처럼 바로 에러를 뱉어냈다. Error during managed flush [org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.memb..
[TIL 2022-2-15]JPA 양방향 매핑 양방향 매핑 테이블의 연관관계에는 방향이라는 개념이 필요없다. 하지만 객체에서는 외래키가 아니라 객체의 참조값을 이용하기 때문에 하나의 엔티티를 통해 다른 연관관계의 엔티티에 접근하기 위해선 양방향 매핑을 사용 해야한다. 꼭 연관 관계를 통해 양쪽 객체 모두에서 접근할 필요가 없다면 단방향 매핑으로 구현하는 것이 좋다. 하지만 실무에서는 다양한 상황들이 존재하고 양방향 매핑이 이를 손쉽게 해결해 주기 때문에 잘 알고 사용하면 좋다고 한다. (객체지향 관점에서도 두 객체가 서로 참조하고 있는 것은 좋지는 않음) 연관관계의 주인 객체와 테이블간은 연관관계를 맺는 방식이 다르다. 테이블은 외래키 '하나'로 양뱡향으로 모두 조인할 수 있는 양방향 연관관계를 갖지만, 객체에서는 연관관계에 있어서 한 쪽이 다른 객..
[TIL 2022-2-12] JPA 필드와 컬럼 매핑 필드와 컬럼 매핑 @Entity @Getter @Setter @NoArgsConstructor @SequenceGenerator(name="member_seq_generator",sequenceName = "member_seq", initialValue = 1, allocationSize = 50) public class Member { /* * > * 기본키 생성을 데이터베이스에 위임. 세가지 전략이 있음 * * - IDENTITY * 데이터베이스에 전략을 위임. MySQL의 경우 Auto_Increment. persist()시 바로 Insert, 그 이후에만 ID값을 알 수 있음 * * - Sequance -> 이걸로 전략 만들어서 사용할 것! * 시퀀스 객체를 생성에 기본키값을 받아 세팅. 시퀀스 ..