본문 바로가기

전체 글

값 타입 jpa의 데이터 타입은 다음과 같이 분류할 수 있다. 엔티티 타입 값 타입 기본 값 타입 자바 기본 타입 (int, double) 래퍼 클래스 (Integer, Long) String 임베디드 타입 컬렉션 값 타입 엔티티 타입의 경우, @Entity로 정의하는 객체이다. 데이터가 변하더라도 식별자로 지속해서 추적이 가능하다는 특징을 가지고 있다. 값 타입은 int, Integer, String처럼 값으로 사용하는 자바 기본 타입이나 객체를 의미한다. 엔티티 타입과 다르게 식별자가 없고 값만 있어서 변경되면 추적이 불가하다. 기본 값 타입자바 기본 타입은 항상 값을 복사하는 반면, Integer 같은 래퍼 클래스나 String 같은 특수한 클래스는 공유 가능한 객체이지만 변경은 불가능하다. 임베디드 타입임.. 더보기
프록시와 연관 관계 관리 프록시이전 예제 기준으로 프록시에 대해서 살펴보자. Member를 조회할 때 Team도 함께 조회해야 할까? 라는 의문이 들 수도 있다. 이 부분은 프록시, 즉시 로딩과 지연 로딩을 이해하면 해결할 수 있다. 엔티티 객체를 조회하는 방법은 다음 두 방법이 있다. - em.find(): DB를 통해 실제 엔티티 객체 조회 - em.getReference(): DB 조회를 미루는 가짜, 즉 프록시 엔티티 객체 조회 프록시의 특징은 다음과 같다. - 실제 클래스를 상속 받아서 만들어진다. - 실제 클래스와 겉 모양이 같다. - 사용자 입장에서는 실제 엔티티 객체인지, 프록시 객체인지 구분하지 않고 사용하면 된다. - 프록시 객체는 실제 객체의 참조를 보관한다. - 프록시 객체를 호출하면 프록시 객체는 실제 객.. 더보기
고급 매핑 상속 관계 매핑관계형 DB에는 상속 관계라는 것은 없다. 하지만 슈퍼 타입, 서브 타입 관계라는 모델링 기법이 있는데, 객체 상속과 유사하다. 상속 관계 매핑이라는 것은 객체의 상속 구조와 DB의 슈퍼 타입 서브 타입 관계를 매핑하는 것이다. 상속 관계 매핑에는 다음 세 가지 방법이 있다. - 조인 전략: 각각 테이블로 변환 - 단일 테이블 전략: 통합 테이블로 변환 - 구현 클래스마다 테이블 전략: 구현 클래스마다 테이블로 변환 조인 전략조인 전략의 경우, 다음 장점과 단점을 가지고 있다. 장점 - 테이블 정규화 - 외래 키 참조 무결성 제약 조건 활용 가능 - 저장 공간 효율화 여기서 외래 키 참조 무결성 제약 조건이라는 것은 외래 키는 참조할 수 없는 값을 가질 수 없다는 것이다. 단점 - 조회 시.. 더보기
다양한 연관 관계 매핑 연관 관계 매핑 시 다음 사항들을 고려해야 한다. - 다중성 - 단방향, 양방향 - 연관 관계의 주인 다중성jpa에서 제공하는 다중성 관련 애노테이션은 다음과 같다. - 다대일: @ManyToOne - 일대다: @OneToMany - 일대일: @OneToOne - 다대다: @ManyToMany 단방향, 양방향과 연관 관계의 주인테이블과 객체는 유사해 보이지만, 단방향, 양방향 관계에 있어서 차이가 있다. 테이블의 경우, 외래 키 하나로 양쪽 조인이 가능해서 사실상 방향이라는 개념이 없다. 그래서, 외래 키만으로 두 테이블이 연관 관계를 맺게 된다. 하지만, 객체는 참조용 필드가 있는 쪽으로만 참조가 가능하다. 한 쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향이 되는 것이다. 객체의 양방향 관계는 a.. 더보기
엔티티 매핑과 연관 관계 매핑 엔티티 매핑- 객체와 테이블 매핑: @Entity, @Table - 필드와 컬럼 매핑: @Column - 기본 키 매핑: @Id - 연관 관계 매핑: @ManyToOne, @JoinColumn 예제 요구사항 - 회원은 상품을 주문할 수 있다. - 주문 시 여러 종류의 상품을 선택할 수 있다. 테이블 설계 엔티티 설계와 매핑 package jpabook.jpashop.domain; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Member { @Id @Gener.. 더보기
영속성 컨텍스트 JPA에서 가장 중요한 2가지는 다음과 같다. - 객체와 관계형 데이터베이스 매핑하기 (Object Relational Mapping) - 영속성 컨텍스트 이제부터 영속성 컨텍스트에 대해서 조금 자세히 알아보려 한다. 영속성 컨텍스트영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻이다. 이때, 엔티티는 데이터의 집합, 객체 정도로 생각하면 된다. 엔티티 매니저를 통해서 영속성 컨텍스트에 접근한다. 엔티티의 생명 주기- 비영속 - 영속 - 준영속 - 삭제 비영속 상태는 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다. 영속 상태는 영속성 컨텍스트에 의해 관리되는 상태이다. 준영속 상태는 영속성 컨텍스트에 저장되었다가 분리된 상태이다. 삭제 상태는 말 그대로 삭제된 상태이다. 아래 사진은 비영속 상.. 더보기
[에러 해결] 데이터 업데이트 안 되는 문제 해결 useQuery 훅을 사용할 때는 쿼리 키를 의존성 배열로 설정해서, 특정 인자가 변경되는 경우도 고려해주어야 한다. 쿼리 키를 동일하게 부여하게 되면 추가적으로 데이터를 불러와야 하는 상황에 데이터를 불러오지 않는다. 예를 들어서, 프로젝트 아이디가 변경되었을 때 다른 데이터를 불러와야 한다면, 의존성 배열에 프로젝트 아이디를 추가해주어야 한다. 그래야, 프로젝트 아이디가 변경됐을 때 서버로부터 데이터를 제때 불러올 수 있는 것이다. 하지만, 모든 쿼리에 동일한 쿼리 키를 설정해 줘서 문제가 생긴 적이 있다. 그 상황에 대해서 조금 더 자세히 알아보자. 평가 탭에서는 프로젝트마다 중간/최종 평가를 보여주게 된다. 그래서, 평가 탭 링크를 눌러서 평가 페이지에 접속한 경우, 바로 서버에서 차트와 랭킹 데.. 더보기
[에러 해결] 프로젝트 삭제 후 뒤로 가기로 인한 에러 해결 아래 사진에서 볼 수 있다시피, 관리 탭에서는 프로젝트 삭제를 할 수 있다. 위 사진에서 프로젝트 삭제를 하게 되면, 맨 처음 프로젝트 관리 페이지로 리다이렉트시켰다. 하지만, 만약 뒤로 가기를 누른다면? 당연히 에러가 난다. 왜냐하면, 삭제한 프로젝트 페이지에 다시 접속 시도를 한 것이기 때문이다. 그래서 나는 프로젝트 삭제 후에는 뒤로 가기를 막으려고 한참을 코드를 작성했다. 내가 알고 있는 바로는 useNavigate 훅을 사용할 때 { replace: true } 값을 넣어주면 뒤록 가기를 막을 수 있다는 것이었다. 하지만, 왜인지 모르게 그 방법으로는 되지 않았다. 그래서 열심히 구글링을 해보았다. 알고 보니 react-router-dom v6에는 replace: true가 동작하지 않는다고 한.. 더보기