01. 영속성 전이: CASCADE 사용 목적 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용한다. 예시로 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하고 싶을 때가 있다. 영속성 전이(CASCADE)를 사용하지 않는다면? 위의 Parent와 Child에 대한 예시로 코드를 작성해보겠다. Child와 Parent는 다대일 양방향 연관관계를 갖는다. 다음은 Child 클래스 코드이다. @Entity public class Child { @Id @GeneratedValue private Long id; private String name; @ManyToOne @JoinColumn(name = "parent_id") private Parent parent; //..
요구사항 BaseEnetity 클래스의 createdAt 필드와 lastModifiedAt 필드를 자동화 하는 것! 모든 테이블에 공통으로 들어가는 필드인 createdAt과 lastModifiedAt 필드를 다음과 같이 BaseEntity에 작성했다. @Getter @MappedSuperclass public abstract class BaseEntity { @Column(name = "created_at") private LocalDateTime createdAt; @Column(name = "last_modified_at") private LocalDateTime lastModifiedAt; } 그리고 이 필드들이 다른 테이블에 들어갈 수 있게 아래와 같이 작성했다. // 상위 어노테이션 생략 (e..
01. 지연 로딩 Member를 조회할 때 Team도 함께 조회해야 할까? 다음 그림과 같은 연관관계를 맺고 있는 엔티티가 있다고 할 때, 단순히 member 정보만 사용하는 비즈니스 로직은 println(member.getName()); 이다. 이 경우, Team도 조인해서 가져오면 손실이 있다. JPA는 지연 로딩이라는 것을 제공한다. 지연 로딩을 이용하면 이 문제를 해결할 수 있다. 지연 로딩 LAZY를 이용해서 프록시로 조회하는 예시 Member 클래스의 @ManyToOne에 속성 (fetch = FetchType.LAZY)을 추가한다. @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; 해당 속성을..
01. 프록시 개요 Member를 조회할 때 Team도 함께 조회해야 할까? Member와 Team은 다음과 같은 관계를 맺고 있다. 회원과 팀을 함께 출력하는 경우, 코드는 다음과 같다. public void printUserAndTeam(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTeam(); System.out.println("회원 이름: " + member.getUsername()); System.out.println("소속팀: " + team.getName()); } 회원만 출력하는 경우, 코드는 다음과 같다. public void printUser(String memberId)..
01. @MappedSuperclass 사용 목적 공통 매핑 정보가 필요할 때 사용한다. DB 입장에서 테이블은 다른데 객체 입장에서 상속 받아서 사용하고 싶을 때 사용한다. 아래 그림에서 id와 name이 공통 속성인 것을 볼 수 있다. @MappedSuperclass는 1) 상속관계 매핑이 아니다. 2) 엔티티를 나타내는 것이 아니며, 테이블과 매핑하지 않는다. 3) 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공한다. 4) 조회 및 검색이 불가능하다. 5) 직접 생성해서 사용할 일이 없으므로 추상 클래스로 만들기를 권장한다. 6) 테이블과 관계는 전혀 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 한다. 7) 주로 등록일, 수정일, 등록자, 수정자와 같은 전체 엔티티에..
01. 문제 상황 저번주에 작업한 내용을 확인하고자 npm start 명령어로 프로젝트를 실행했는데, 다음과 같은 에러가 나타났다. 분명 저번주에는 잘 보였는데.. Home.jsx 에서 문제가 발생한 것이다. import React from 'react'; import { BrowserRouter as Route, Routes, BrowserRouter } from 'react-router-dom'; import Home from './components/Home'; import Login from './components/Login'; import SignUp from './components/SignUp'; function App() { return ( ); } export default App; 브..
01. 상속관계 매핑 상속관계 매핑 개요 객체에는 상속관계가 있지만, 관계형 데이터베이스에는 상속관계가 없다. 하지만 관계형 데이터베이스에서, 슈퍼타입-서브타입 관계라는 모델링 기법이 객체 상속과 유사하다. 상속관계 매핑 상속관계 매핑이란 슈퍼타입-서브타입 논리 모델을 실제 물리 모델로 구현하는 방법이다. 아래 그림이 논리 모델이다. 아래 그림은 객체의 상속 관계를 보여준다. 상속관계 매핑 방법 상속관계를 매핑하는 방법으로는 3가지가 있다. 조인 전략은 각각을 테이블로 변환하는 것이다. 단일 테이블 전략은 하나의 통합 테이블로 변환하는 것이다. 구현 클래스마다 테이블 전략은 서브타입 테이블로 변환하는 것이다. 02. 상속관계 주요 어노테이션 @Inheritance 상속관계 매핑 시 사용하며 슈퍼타입에 작..
01. 연관관계 매핑 시 고려사항 3가지 다중성 다대일 @ManyToOne 일대다 @OneToMany 일대일 @OneToOne 다대다 @ManyToMany 단방향, 양방향 테이블은 외래 키 하나로 양쪽에서 조인이 가능하다. 객체는 참조용 필드가 있는 쪽으로만 참조가 가능하다. 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향이라고 생각하면 된다. 사실 단방향, 양방향이라는 말은 우리가 이해하기 쉽게 사용하는 용어이다. 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺는다. 객체 양방향 관계는 참조가 2군데이다. (A에서 B로 참조하는 것 하나, B에서 A로 참조하는 것 하나) 객체 양항뱡 관계는 참조가 2군데 있으므로 둘 중 테이블의 외래 키를 관리할 곳을 지정해야 한다. 연관관계의..