본문 바로가기

Backend

값 타입 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) - 영속성 컨텍스트 이제부터 영속성 컨텍스트에 대해서 조금 자세히 알아보려 한다. 영속성 컨텍스트영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻이다. 이때, 엔티티는 데이터의 집합, 객체 정도로 생각하면 된다. 엔티티 매니저를 통해서 영속성 컨텍스트에 접근한다. 엔티티의 생명 주기- 비영속 - 영속 - 준영속 - 삭제 비영속 상태는 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다. 영속 상태는 영속성 컨텍스트에 의해 관리되는 상태이다. 준영속 상태는 영속성 컨텍스트에 저장되었다가 분리된 상태이다. 삭제 상태는 말 그대로 삭제된 상태이다. 아래 사진은 비영속 상.. 더보기
빈 스코프 스프링 빈은 스프링 컨테이너의 시작과 함께 생성돼서 스프링 컨테이너가 종료될 때까지 유지된다고 학습했다. 이는 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 빈이 존재할 수 있는 범위를 나타낸다. 스프링이 지원하는 스코프는 다음과 같다. 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프 웹 관련 스코프 request: 웹 요청이 들어오고 나갈 때까지 유지되는 스코프 session: 웹 세션이 생성되고 종료될 때까지 유지되는 스코프 application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프 컴포넌트 스캔.. 더보기
빈 생명주기 콜백 데이터베이스 커넥션 풀이나 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요하다. 간단하게 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정해보자. 실제로 네트워크에 연결하는 것은 아니고, 단순히 문자만 출력하도록 했다. 이 NetworkClient는 애플리케이션 시작 시점에 connect()를 호출해서 연결을 맺어두어야 하고, 애플리케이션이 종료되면 disconnect()를 호출해서 연결을 끊어야 한다. // NetworkClient.java package ghdtjgus76.core.lifecycle; public class NetworkClient { private Stri.. 더보기