본문 바로가기

Back-end/JPA 개념48

20. 값 타입(3) - 객체 비교와 equals() 재정의 0. 개요 - 이번 포스팅에서는 값 타입 객체를 이용한 비교에 대해서 알아보자. 1. 값 비교 a) 일반적인 값 비교 - 일반적으로 Java에서는 값을 비교할 때 비교 연산자(==)와 equals를 사용한다. → 동일성(identity) 비교: 비교 연산자(==)를 사용하여 참조 값을 비교한다. 즉, 메모리 주소 값을 비교한다. → 동등성(equivalance) 비교: equals() 메서드를 사용하여 객체의 내용을 비교한다. 즉, 객체의 값(= value)을 비교한다. - 다음 예시를 살펴보자. public class JpaMain { public static void main(String[] args) { Integer a = new Integer(10); Integer b = new Integer(.. 2022. 4. 18.
19. 값 타입(2) - 문제점과 불변 객체 0. 개요 * 본 포스팅은 이전 포스팅과 이어지는 내용임을 알립니다. - 이전 포스팅에서 값 타입에 대해서 알아보았다. - 이번 포스팅에서는 값 타입을 사용할 때 발생하는 문제점과 이를 해결하기 위해 사용하는 불변 객체에 대해서 알아보자. 1. 값 타입을 사용하는 이유 - 이전 포스팅에서 값 타입에 대해서 배웠다. - 굳이 값 타입을 사용하는 이유가 무엇일까 생각해볼 필요가 있다. - 왜냐면 JPA를 사용하므로, 이미 객체지향적 프로그래밍을 달성했다고 볼 수 있기 때문이다. a) 굳이 값 타입을 사용하는 이유 - 값 타입을 사용하는 이유는 객체의 내용을 조금이라도 더욱 간소화하기 위함이다. - 그러므로 값 타입 또한 단순하고 간단한 구조를 이뤄야 한다. - 더불어, 값 타입을 사용함에 있어서 그 안정성이.. 2022. 4. 15.
18. 값 타입(1) - 개념 0. 개요 - 이번 포스팅에서는 JPA의 데이터 타입에 대해서 알아보자. 1. 값 타입 - JPA는 두 가지 데이터 타입을 사용한다. a) Entity 타입 - JPA의 최상위 타입이다. - @Entity로 정의된 클래스 객체를 의미한다. - Entity 타입은 값이 변경되어도 식별자(= id, PK)를 이용하여 추적이 가능하다. ex) 게시판의 1번 글(= 객체)의 내용이 수정 또는 삭제되어도 1번 아이디를 이용하여 객체의 상태를 추적할 수 있다. b) 값 타입 - int, String, Integer와 같이 자바의 Primitive 또는 Wrapper 클래스를 이용하여 생성된 객체 - 식별자가 없으므로 값의 변경 시 추적이 불가능하다. ex) int a = 100이라면, 이를 a = 200으로 변경해.. 2022. 4. 14.
17. 고아 객체(Orphan) 0. 개요 - 이번 포스팅에서는 고아 객체란 무엇인지 알아보자. 1. 고아 객체(Orphan) a) 개념 - 고아 객체는 부모 객체와 연관 관계가 끊어진 자식 객체를 의미한다. b) orphanRemoval 옵션 - JPA는 자식 객체가 고아 객체의 상태가 되면 해당 객체를 자동으로 삭제하는 기능을 가진다. - 이는 다음 사진처럼 옵션으로 설정이 가능하다. - 위의 코드는 childList에서 삭제된 객체를 연관 관계가 끊긴 것으로 판단하여 객체 자체를 삭제한다. - 옵션을 설정한 후, 다음과 같은 코드를 실행해보자. - 위의 코드를 실행하면 다음과 같아 DELETE 쿼리가 자동으로 발생하는 것을 확인할 수 있다. - 다음 사진과 같이, 연관 관계가 끊긴 자식 객체가 DB에서 삭제된 것을 확인할 수 있다.. 2022. 4. 13.
16. 영속성 전이(Cascade) 0. 개요 - 웹 개발 공부를 했다면 Cascade라는 단어가 익숙할 수 있다. - CSS(Cascade Style Sheet)에서 사용되는 단어이기 때문이다. - Cascade라는 단어는 폭포처럼 흐른다는 의미를 갖는다. - 이를 의역해보면 연쇄적인, 종속적인, 상속적인, 전이되는 등으로 해석할 수 있다. - 이처럼 어떤 속성을 전수하는 것을 Cascade라고 표현한다. - 이번 포스팅에서는 JPA에서 사용하는 Cascade에 대해서 알아보자. 1. 영속성 전이(Cascade) a) 영속성 전이란? - 어떤 Entity를 영속성 Context에 등록할 때, 연관 객체도 함께 등록하는 기능이다. - 즉, 어떤 Entity를 영속 상태로 만들 때, 연관 객체 또한 함께 영속 상태가 되도록 하는 것이다. -.. 2022. 4. 12.
15. 지연 로딩 & 즉시 로딩(N + 1 문제) 0. 개요 - 이전 포스팅에서 Proxy에 대해 알아보았다. - 이번 포스팅에서는 Proxy를 이용한 지연 로딩과 즉시 로딩에 대해서 알아보자. 1. 지연 로딩 a) 예시 코드 - 다음과 같은 객체를 가지는 프로젝트가 있다고 해보자. @Entity public class Player { @Id @GeneratedValue @Column(name = "PLAYER_ID") private Long id; @Column(name = "PLAYER_NAME") private String name; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; // Getter & Setter 생략 } @Entity public class Team { @Id @Gene.. 2022. 4. 11.
14. 프록시(Proxy) 0. 개요 - 이번 포스팅에서는 JPA Proxy에 대해서 알아보자. - proxy는 JPA 개념 중에서도 어려운 개념에 속한다. 차근차근 배워보자. 1. Proxy를 사용하는 이유 a) 언제, 왜 사용할까? - 예를 들어, Player와 Team 객체를 모두 조회하는 비즈니스 로직이 있다고 해보자. - 경우에 따라 Player와 Team 객체가 모두가 필요할 때도, 두 객체 중 하나만 필요할 때도 있을 것이다. - 그러나 이미 두 객체를 모두 조회하도록 비즈니스 로직을 선언하였기에, 매번 Player와 Team 객체를 모두 조회한다. - 이처럼 필요하지 않은 객체에 대한 조회는 자원 낭비를 발생시킨다. - JPA는 이러한 상황을 해결하기 위해 지연 로딩을 사용하는데, 이때 Proxy라는 개념이 사용된다.. 2022. 4. 8.
13. @MappedSuperClass 0. 개요 - 이번 포스팅에서는 @MappedSuperClass라는 기능에 대해서 알아보자. 1. @MappedSuperClass - @MappedSuperClass는 공통 매핑 정보를 필요로 할 때 사용하는 기능이다. - 이는 상속 관계 매핑과 DB와는 별도의 기능으로, 객체의 관점만 집중하는 기능이다. a) @MappedSuperClass란? - 모든 Entity에 동일한 필드가 존재하는 경우, 이를 Entity를 정의할 때마다 중복적으로 작성한다. - 이러한 중복 필드를 공통으로 관리하여 중복적인 작성을 방지하는 기능이다. b) 예시 코드 - 다음 예시 코드를 통해서 @MappedSuperClass의 역할을 이해해보자. @Entity public class A { @Id @GeneratedValue.. 2022. 4. 7.
12. 상속 관계 매핑 0. 개요 - 상속 관계는 OOP에 존재하지만, RDB에는 존재하지 않는 개념이다. - 그러므로 JPA는 객체 간의 상속 관계를 RDB에 적용할 수 있도록 변환하는 작업을 수행한다. - 이번 포스팅에서는 JPA를 이용하여 상속 관계를 매핑하는 방법에 대해서 알아보자. 1. 상속 관계 매핑 - DB를 설계할 때 관계를 논리 모델과 물리 모델을 이용하여 표현한다. → 논리 모델: 사물의 관계를 도식화하여, 사물이 서로 어떻게 interact 하는지 표현한다. → 물리 모델: 논리 모델을 기반하여 ERD로 표현한다. a) 논리 모델 구현 - 슈퍼 타입, 서브 타입 - 상속 관계를 RDB로 구현할 때 우선 논리 모델을 구현한다. - 이때 논리 모델의 슈퍼/서브 타입을 사용하여 객체의 상속 관계를 유사하게 표현할.. 2022. 4. 6.