본문 바로가기

Spring/JPA

(5)
JPA @OneToOne은 FetchType.LAZY가 안 먹힐 수 있다? JPA에서 @OneToOne 연관관계일 때 지연 로딩이 안 될 수 있다? 이제는 JPA가 상당히 많이 쓰이고 있기도 하고 유명한 모 강의도 있어서 많은 사람들이 잘 알고 쓰고 있긴하다. 그러나 실제 경험해본 것과 학습을 통해서 아는 것에는 차이가 있다. 실무 중에 @OneToOne 연관 관계가 설정되어 있는 엔티티에 Querydsl을 이용하여 통계 데이터를 조회해보면서 Lazy로 동작하지 않는 것을 확인하며 블로그로 남겨야겠다고 생각했다. (🔥 이 포스트의 독자의 기준은 JPA 기초 정도는 아는 사람이라고 판단하고 작성했다!) 대부분의 JPA를 학습한 사람들이 알고 있듯, ~ToOne(@OneToOne, @ManyToOne) 연관 관계일 때는 Default로 FetchType.EAGER로 동작하고 있다...
JPA Entity Validation @Column(nullable=false)가 아닌 @NotNull을 써야한다고? JPA Entity Validation JPA Entity Validation. 여러분은 어떻게 유효성 검사를 하고 계신가요? 이번에 인턴사원분들과 코드리뷰를 진행하다가 새롭게 알게 된 사실을 정리하려고 합니다. 저는 보통 유효성 검사를 할 때, @Column(nullable = false) 나 @NotNull 같은거 쓰면 되지 않나?하고 지냈습니다. 조금 찾아보니까 여러 블로그에서 @Column(nullable = false) 를 사용하지말고 @NotNull을 써야한다고 나와있습니다. 그 이유는 대부분 @Column(nullable = false) 의 경우, JPA를 통해 ddl을 자동 생성할 때에만 create 쿼리(Query)에만 들어가고, Entity의 @Column(nullable = false..
JPA 연관 관계 한방에 정리 (단방향/양방향, 연관 관계의 주인, 일대일, 다대일, 일대다, 다대다) JPA에서 가장 중요한 것 JPA에서 가장 중요한 것을 뽑자면, "객체와 관계형 데이터베이스 테이블이 어떻게 매핑되는지를 이해하는 것"이라고 생각합니다. 🏅 왜냐하면 JPA의 목적인 "객체 지향 프로그래밍과 데이터베이스 사이의 패러다임 불일치를 해결"이라는 것과 가장 직접적으로 연관되어 있기 때문입니다. Hibernate Document(2. Domain Model)에서도 객체와 테이블 매핑이 전체 스크롤 중, 조금 과장해서 표현하면 절반 수준의 비중인 것을 봐도 객체와 테이블 매핑의 중요성을 짐작할 수 있습니다. 그러나 객체와 테이블 매핑에 대한 내용을 조금 더 구체적으로 나누면 컬럼, 타입, 테이블, ... 등에 대한 1차원적인 매핑과 테이블 간의 연관 관계 매핑으로 나눌 수 있습니다. (개인 의견)..
값 타입(JPA에서 @Entity 내부에 값들을 객체로 다루는 방법, @Embedded, @Embeddable) 위의 그림은 JPA에서 사용하는 타입을 정리한 것이다. JPA를 배울 때 다짜고짜 Entity라는 개념을 배우고 그 객체안에 String 타입의 name, int 타입의 age등의 속성들을 정의하여 사용했다. 그런데 Entity는 객체로 잘 다뤘으면서 내부의 변수(속성)는 객체로 다루지 않고 나열식으로 사용했었다. 그래서 그 것들이 Entity는 아니지만 엔티티 객체 내부에서 값이지만 객체로 사용되게 하는 방법으로 값 타입이 있다. 그것에 대해 알아본다. JPA에서 사용하는 타입은 엔티티 타입(@Entity), 값 타입(int, String, Integer)으로 나뉜다. 값 타입은 다시 3개의 타입으로 나뉜다. 기본 값 타입(int, Integer, String) 임베디드 타입(새로 정의한 복합 타입) ..
JPA 프록시와 연관 관계 정리, 영속성 전이, 언제 사용하는 것이 좋고 어떻게 사용할까? (지연로딩 vs 즉시로딩) "도서 (자바 ORM 표준 JPA 프로그래밍 - 김영한 지음)"를 공부하고 정리한 내용임을 사전에 알려드립니다. 프록시와 연관관계 정리 - 프록시 JPA는 객체지향언어와 관계형 데이터베이스의 패러다임 불일치를 해결하는 기술이다. 프록시가 이 문제에 도움을 주는데 어떤 부분에서 도움을 주는지 정리한다. 객체는 team1.getMembers().get(0); 이런식으로 연관된 객체들을 탐색할 수 있는 반면 RDB의 경우 참조하는 외래키를 이용해서 테이블간의 조인 쿼리를 작성해서 탐색해야한다. 그러다보니 연관된 객체를 쓰일지 안 쓰일지도 모르는 체 전부다 가져와야하는 문제가 있다. 이 문제를 프록시라는 기술로 해결한다. 프록시는 실제 연관된 객체를 즉시 join을 통해 DB로부터 가져오는 것이 아니라 앞서 프..