전체 글 38

[JAVA] equals()를 재정의 하면 hashCode()도 재정의 해야 할까?

equals() 메소드를 Override 하는 이유 서로 다른 객체의 동등성을 보장하기 위해 재정의 한다. 동일성 vs 동등성 동일성(Identity) 두 객체가 완전히 같음을 뜻한다. 자바에서의 동일성이란, 두 변수가 같은 Instance의 참조를 바라보고 있음을 뜻한다. TestValue value1 = new TestValue("value1"); TestValue value2 = value1; //value1 == value2; true이므로 value1과 value2는 동일하다. TestValue value1 = new TestValue("value1"); TestValue value2 = new TestValue("value2"); //value1 == value2; false이므로 value1..

JAVA 2021.01.21

[JPA] 17. 값 타입

프로젝트 git url github.com/rtef23/JpaStudy 필요 1. docker 2. docker-compose 프로젝트 정보 mysql : 5.7 - docker image java : 1.8 JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 추적 가능 값 타입 int, Integer, String과 같이 단순히 값으로 사용하는 자바 기본 타입 또는 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 해당 값 타입을 소유한 엔티티에 생명주기를 의존한다. 값 타입 값 타입은 복잡한 객체 세상을 단순화 하기 위해 만든 개념 > 값 타입은 단순하고 안전하게 사용할 수 있어야 한다. 기본값 타입 종류 자바 기본 타입(int, double, ...) 래..

JPA 2021.01.21

[JPA] 16. 영속성 전이(CASCADE)

프로젝트 git url github.com/rtef23/JpaStudy 필요 1. docker 2. docker-compose 프로젝트 정보 mysql : 5.7 - docker image java : 1.8 영속성 전이(CASCADE) 특정 엔티티를 영속 상태로 만들 때, 연관된 엔티티도 함께 영속 상태로 만드는 것 부모 엔티티를 저장할 때, 자식 엔티티도 함께 저장하는 것 @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List children = new ArrayList()..

JPA 2021.01.18

[JPA] 15. 즉시 로딩과 지연 로딩

프로젝트 git url github.com/rtef23/JpaStudy 필요 1. docker 2. docker-compose 프로젝트 정보 mysql : 5.7 - docker image java : 1.8 지연 로딩 연관 관계에 있는 엔티티를 데이터베이스에서 조회할 때 같이 조회하는 것이 아니라, 연관 관계에 있는 엔티티를 사용하는 경우 추가 쿼리로 데이터베이스에서 조회하도록 하는 방법 연관된 엔티티를 fetch = FetchType.LAZY로 설정하면 된다. 최초 조회시에 연관 관계의 엔티티는 hibernate 프록시 객체로 들어가 있게 된다. @OneToMany, @ManyToMany (xxxToMany)는 지연 로딩이 기본 값이다. 가급적 지연 로딩을 사용하는 것을 추천한다. @Entity pu..

JPA 2021.01.18

[JPA] 14. Hibernate 프록시

프로젝트 git url github.com/rtef23/JpaStudy 필요 1. docker 2. docker-compose 프로젝트 정보 mysql : 5.7 - docker image java : 1.8 Hibernate 프록시 사용 이유 조회시 연관관계에 있는 데이터를 사용하는 경우에만 추가로 조회하도록 하는 방법(지연로딩, 즉시로딩) 특징 실제 클래스를 상속 받아서 생성됨 동일성 비교 결과 값은 false이다. 아래 예제에서는 영속성 컨텍스트에서 객체를 가져오지 않는 경우를 가정 타입 비교시에는 반드시 instanceof 연산자로 비교해야한다. Member memberEntity = entityManager.find(Member.class, 1L); Member memberProxy = enti..

JPA 2021.01.15

[JPA] 13. @MappedSuperclass

프로젝트 git url github.com/rtef23/JpaStudy 필요 1. docker 2. docker-compose 프로젝트 정보 mysql : 5.7 - docker image java : 1.8 @MappedSuperclass 공통 매핑 정보가 필요할 때 사용 공통인 부분을 추출하여 필요한 값을 상속 관계로 넘겨주는 방법 같은 부모 클래스를 상속 받더라도 자식 엔티티의 테이블 간에는 연관관계가 없다. Superclass로는 조회 불가(CreateInfo) 직접 생성해서 사용할 일이 없기 때문에 추상 클래스로 사용하는 것을 권장 @MappedSuperclass public class CreateInfo { private String creator; private LocalDateTime cr..

JPA 2021.01.11

[JPA] 12. 상속 관계 매핑

프로젝트 git url github.com/rtef23/JpaStudy 필요 1. docker 2. docker-compose 프로젝트 정보 mysql : 5.7 - docker image java : 1.8 상속 관계 매핑 관계형 데이터베이스에서는 상속 관계는 없다.(슈퍼 타입 - 서브 타입 관계 모델링이 상속과 유사) 조인 전략 공통화할 수 있는 부분(Item - name, price)은 슈퍼 타입으로 분할하는 방식 @Entity @Table(name = "ITEM") @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn public class Item { @Id @GeneratedValue @Column(name = "item_i..

JPA 2021.01.11

[JPA] 11. 연관관계 매핑 - 다대다(N : M)

프로젝트 git url github.com/rtef23/JpaStudy 필요 1. docker 2. docker-compose 프로젝트 정보 mysql : 5.7 - docker image java : 1.8 다대다(N : M) @ManyToMany 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음 > 중간 매핑 테이블을 추가해서 일대다, 다대일 관계로 풀어내야 함 객체는 컬렉션을 사용하여 다대다 관계를 표현할 수 있음 @JoinTable로 연결 테이블을 지정 다대다 단방향 매핑 @Entity @Table(name = "USER") public class User { @Id @GeneratedValue @Column(name = "user_id") private Long id; ..

JPA 2021.01.11

[JPA] 10. 연관관계 매핑 - 일대일(1 : 1)

프로젝트 git url github.com/rtef23/JpaStudy 필요 1. docker 2. docker-compose 프로젝트 정보 mysql : 5.7 - docker image java : 1.8 일대일(1 : 1) @OneToOne 주 테이블(USER)이나 대상 테이블(LOCKER) 중에 외래키 선택 가능 외래키에 DB 유니크 제약조건이 추가하는 편이 좋다. //User 클래스가 연관관계의 주인일 경우 @Entity @Table(name = "USER") public class User { @Id @GeneratedValue @Column(name = "user_id") private Long id; @Column(name = "username") private String username..

JPA 2021.01.11

[JPA] 9. 연관관계 매핑 - 일대다(1 : N)

프로젝트 git url github.com/rtef23/JpaStudy 필요 1. docker 2. docker-compose 프로젝트 정보 mysql : 5.7 - docker image java : 1.8 일대다(1 : N), '일'이 연관관계의 주인의 경우 @OneToMany mappedBy ; 연관관계의 주인 필드를 선택한다. fetch ; 글로벌 페치 전략을 설정한다. cascade ; 영속성 전이 기능을 사용한다. targetEntity ; 연관된 엔티티의 타입 정보를 설정한다. 추천하는 연관관계는 아니다. @Entity @Table(name = "USER") public class User { @Id @GeneratedValue @Column(name = "user_id") private L..

JPA 2021.01.11