JPA/JPA Basic 28

[JPA] 지연로딩(Lazy Loading)을 사용해야 하는 이유

[JPA] 프록시( Proxy ) 위 사진은 영속성 컨텍스트가 동작하는 과정이다. 엔티티 객체를 생성하려면 SELECT문을 DB에 실행해야 한다. APP과 DB는 서로 다른 영역으로 I/O가 발생한다. 잦은 I/O는 성능저하의 원인이 되므로 lordofkangs.tistory.com 프록시를 다루면서 지연로딩(Lazy Loading)에 대해서 다루어 보았다. A엔티티와 B엔티티는 서로 연관되어 있다. JPA가 A엔티티를 로드하면 A가 참조하는 B엔티티도 로드되어야 한다. 하지만 DB와 잦은 소통은 성능을 저하시킨다. JPA(하이버네이트)는 성능 최적화를 위해, 연관된 엔티티는 가짜 객체(프록시,Proxy)로 만들어 실제 엔티티 객체 생성을 지연시키는 전략을 구사한다. 이를 지연 로딩(Lazy Loadin..

JPA/JPA Basic 2023.06.08

[JPA] 프록시( Proxy )

위 사진은 영속성 컨텍스트가 동작하는 과정이다. 엔티티 객체를 생성하려면 SELECT문을 DB에 실행해야 한다. APP과 DB는 서로 다른 영역으로 I/O가 발생한다. 잦은 I/O는 성능저하의 원인이 되므로 성능 최적화를 위해 필요한 엔티티 객체만 생성해야 한다. Member 엔티티를 조회했다고 가정해보자. Member 엔티티는 Team엔티티와 연관관계에 있다. Member 엔티티 객체가 생성될 때 연관된 Team 엔티티도 만들어져야 한다. 그러나 연관된 모든 엔티티를 객체로 만들면 많은 I/O가 발생한다. 그래서 JPA(하이버네이트)는 성능 최적화를 위해, 연관된 객체는 가짜 객체(프록시,Proxy)로 만들고 실제 엔티티 객체 생성은 지연시키는 전략을 구사한다. 이를 지연 로딩(Lazy Loading)..

JPA/JPA Basic 2023.06.08

[JPA] 공통속성 처리하기 - @MappedSuperclass

많은 엔티티가 공통으로 사용하는 속성이 있다. 수정일자, 등록일자, 수정자 같은 속성은 거의 모든 엔티티가 사용한다. 그러므로 공통으로 사용하는 속성을 중복으로 코딩하면 개발자가 효율이 떨어진다. JPA는 @MappendSuperclass 어노테이션을 지원하여 공통속성을 중복없이 처리한다. 엔티티는 공통속성을 가진 클래스를 상속한다. '상속'으로 구현했지만 '컬럼'이 필요할 뿐, 부모의 역할을 원하는 것이 아니다. 그러므로 BasicColumn은 엔티티가 아닌 추상클래스로 선언한다. 그리고 @MappedSuperclass 어노테이션으로 표시를 한다. JPA는 엔티티가 아닌 추상클래스이므로 테이블을 생성하지 않는다. @MappedSuperclass 어노테이션으로 표시되었음으로 클래스를 상속한 엔티티는 공통..

JPA/JPA Basic 2023.06.07

[JPA] 상속관계 매핑 - JOIN전략, SINGLE_TABLE전략

객체지향과 관계형DB의 대표적인 패러다임 불일치가 '상속'이다. 객체지향은 '상속'이 있지만 관계형DB는 '상속' 개념이 없다. 그럼 관계형DB에서 상속을 어떻게 구현할 것인가? 1. JOIN 전략 2. SINGLE_TABLE 전략 JOIN 전략 JOIN전략은 '외래키'를 이용한 전략이다. 외래키를 이용하면 상속과 비슷한 형태로 구현할 수 있다. 학교구성원에는 학생(Student)과 교수(Professor)가 있다. 공통필드는 MEMBER 테이블에 외래키로 JOIN하여 가져온다. 개발자는 JPA에게 구현하고 싶은 전략을 어노테이션으로 알려주면, JPA는 자동으로 전략에 따라 테이블을 구현한다. MEMBER 엔티티 ( 부모 엔티티 ) @Entity @Inheritance(strategy = Inherita..

JPA/JPA Basic 2023.06.07

[JPA] 연관관계 매핑 - 다대다 ( @ManyToMany )

학생은 여러 강의를 들을 수 있고 강의는 여러 수강생을 가진다. 이런 다대다 관계는 한 가지 문제가 있다. 관계형DB는 외래키로 테이블에 접근하는데, 외래키는 다대일 관계에서 '다'쪽이 갖는 것이 '규칙'이다. 그럼 다대다 관계에서는 누가 외래키를 가져야 할까? 둘 다 못 갖는다. 학생은 수많은 강의의 외래키를 관리할 수 없고 강의 또한 수많은 학생을 하나하나 외래키로 관리할 수 없다. 그래서 관계형 DB에서는 연결테이블을 만든다. 연결테이블이 '다' 포지션이 되고 학생과 강의가 '일' 포지션이 되면 '다대다'관계를 구현할 수 있다. 자료구조 강의 course_id가 1이라면 SELECT student_id FROM 연결 WHERE course_id = 1 이런 간단한 SQL문으로 자료구조강의를 듣는 학..

JPA/JPA Basic 2023.06.07

[JPA] 연관관계 매핑 - 일대일 ( @OneToOne )

일대일관계는 주테이블이 외래키를 가지고 있느냐, 대상테이블이 외래키를 갖고 있느냐에 따라 성격이 달라진다. 회원과 라커는 일대일 관계이다. 회원이 있어도 라커는 없어도 된다. 반대로 회원이 없는데 라커가 있으면 안 된다. 이처럼 주도권을 가지고 있는 객체의 테이블을 주테이블이라고 한다. 주테이블이 외래키(FK)를 가지고 있으면 객체지향과 패러다임이 일치한다. 회원테이블이 외래키를 가지므로 회원테이블에서 라커테이블에 접근한다. 그러나 한 가지 문제가 있다. 회원만 있고 라커가 없다고 가정해보자. 라커가 없으면 FK는 NULL값이 된다. FK에 NULL값이 들어갈 수는 있지만 DB관점에서 좋지 못하다. 그럼 반대로 대상테이블에 외래키(FK)가 있는 경우를 생각해보자. 회원과 라커는 양방향 관계가 된다. 라커..

JPA/JPA Basic 2023.06.06

[JPA] 연관관계 매핑 - 일대다 ( @OneToMany )

[JPA] 연관관계 매핑 - 다대일 ( @ManyToOne ) JPA는 객체지향설계와 관계형DB의 패러다임 불일치를 해결하는 프레임워크이다. 객체지향설계의 가장 대표적인 특성이 '연관관계'이다. 객체는 주소를 참조하여 다른 객체에 접근할 수 있다. A객 lordofkangs.tistory.com 지난 포스팅에서 다대일 관계를 알아보았다. 다대일관계는 관계형DB와 패러다임이 일치하여 객체지향설계에서 가장 많이 사용하는 연관관계이다. 이에 반해, 일대다매핑은 거의 사용되지 않는다. 일대다 관계는 '일'이 '다'쪽을 참조하는 관계이다. 그러나 DB테이블은 '다'가 외래키를 갖고 있어, '다'가 '일'에 접근해야 한다. 이렇듯, 패러다임이 불일치하여 혼란을 줄 여지가 있어 일대다 매핑은 거의 사용되지 않는다. ..

JPA/JPA Basic 2023.06.05

[JPA] 연관관계 매핑 - 다대일 ( @ManyToOne )

JPA는 객체지향설계와 관계형DB의 패러다임 불일치를 해결하는 프레임워크이다. 객체지향설계의 가장 대표적인 특성이 '연관관계'이다. 객체는 주소를 참조하여 다른 객체에 접근할 수 있다. A객체 ➟ B객체 ➟ C객체 .. 주소에 주소를 타고 여러 객체에 연속으로 접근할 수 있다. 반면 관계형DB는 다르다. 관계형DB는 오로지 '외래키'로 JOIN 연산이 수행되어야 다른 테이블에 데이터를 가져올 수 있다. 객체지향만큼 데이터 접근이 자유롭지 못하다. 연관관계와 외래키JOIN방식의 간극은 JPA에 의해 해결된다. 개발자는 JPA가 처리할 수 있도록 어노테이션으로 '표시'만 남기면 된다. 그럼 개발자는 어떤 어노테이션을 남겨야 할까? 다대일 관계 [ N : 1 ] ( @ManyToOne ) 가장 많이 사용되는 ..

JPA/JPA Basic 2023.06.02

[JPA] 엔티티 매핑 - @Temporal, @Enumerated, @Lob, @Transient

[JPA] 엔티티 매핑 - @Entity, @Table, @Column 엔티티매니저에 의해 생성된 엔티티는 DB의 테이블과 매핑된다. 매핑 작업은 JPA프레임워크가 담당한다. 개발자가 해야할 일은 어떤 엔티티가 어떤 테이블과 매핑되어야 하는지, 어떤 필드가 기 lordofkangs.tistory.com 이전 포스팅에서 기본적인 엔티티 매핑 어노테이션을 알아보았다. 이번 포스팅에서는 다양한 어노테이션을 정리해보겠다. @Temporal @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface Temporal { TemporalType value(); } @Temporal은 Tempo..

JPA/JPA Basic 2023.06.02

[JPA] 엔티티 매핑 - 기본 키 생성전략 ( IDENTITY, SEQUENCE )

JPA는 어노테이션으로 엔티티와 테이블을 매핑한다. [JPA] 엔티티 매핑 - @Entity, @Table, @Column 엔티티매니저에 의해 생성된 엔티티는 DB의 테이블과 매핑된다. 매핑 작업은 JPA프레임워크가 담당한다. 개발자가 해야할 일은 어떤 엔티티가 어떤 테이블과 매핑되어야 하는지, 어떤 필드가 기 lordofkangs.tistory.com 테이블에서 가장 중요한 개념 중 하나가 '기본 키' 이다. 개발자는 기본 키 정보를 엔티티에 어노테이션으로 '표시'하여 JPA에게 전달해야 한다. JPA는 표시된 어노테이션을 바탕으로 테이블과 엔티티를 매핑한다. @Id @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy...

JPA/JPA Basic 2023.05.31