[JPA] JPQL(객체지향 쿼리 언어) 정리
·
DB Access/JPA
객체지향 쿼리 언어#JPA/기본/JPA가 지원하는 다양한 쿼리 방법JPQL (아래에서 자세히 다룸)JPA Criteria/Criteria 소개: 문자열 기반 jpql의 한계를 극복하기 위해 등장.너무 복잡하고 실용성이 없음.QueryDSL/QueryDSL 소개: JPQL 빌더 역할자바 코드로 JPQL 작성할 수 있음.컴파일 시점 문법 오류 찾을 수 있고, 동적 쿼리 작성이 편리함.단순, 쉬움, 실무 사용 권장.네이티브 SQL/네이티브 SQL 소개em.createNativeQuery(sql, Member.class)SQL을 직접 사용. JPQL로 해결할 수 없는 특정 DB에 의존적인 기능을 위해 사용JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용/JDBC 직접 사용..
[JPA] 값 타입
·
DB Access/JPA
값 타입#JPA/기본/기본값 타입JPA의 데이터 타입 분류엔티티 타입@Entity로 정의하는 객체식별자로 추적 가능회원 값이 바껴도 PK로 추적 가능값 타입: 식별자 X 추적 불가회원의 주소 추적 불가. 단순히 값 처럼 취급됨/값 타입 분류/기본값 타입(int, double, Integer, Long, String, …)엔티티에 생명주기 의존(회원 삭제시 이름, 나이,… 삭제)공유하면 안됨. (동명이인 회원 A,B: 회원 A 이름 바꿨는데 회원 B 이름도 바뀌면 안됨)ex) 래퍼 클래스, primitive type/임베디드 타입(복합 값 타입)새로운 값 타입을 직접 정의할 수 있음.ex) x, y 좌표를 담는 Position 클래스ex) {근무 시작일, 근무 종료일}, {주소 도시, 주소 번지..
[JPA] 프록시와 연관관계 관리
·
DB Access/JPA
프록시와 연관관계 관리#JPA/기본/프록시:엔티티 조회시 연관된 엔티티까지 조회해야 할까?/프록시 기초em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회/프록시 특징실제 클래스와 겉모양이 같다. 사용자는 구분하지 않고 사용하면 됨.프록시 객체는 원본 엔티티를 상속받음타입 체크 시== 대신 instanceof 사용프록시 객체는 실제 객체의 참조(target)를 보관하고, 실제 객체의 메서드를 호출한다(위임)프록시 객체는 처음 사용할 때 한 번만 초기화.프록시를 통해 실제 객체의 필드를 처음 조회시 실제 엔티티를 조회한다. (즉, 필드를 처음 조회시 쿼리 나감)영속성 컨텍스트에 엔티티가 이미 있으면 em...
[JPA] 고급 매핑 - 상속 관계 매핑
·
DB Access/JPA
고급 매핑 - 상속 관계 매핑#JPA/기본/상속관계 매핑: DB에는 상속관계가 없다.객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑각각 테이블로 변환 → 조인 전략통합 테이블로 변환 → 단일 테이블 전략서브타입 테이블로 변환 → 구현 클래스마다 테이블 전략객체 입장에서는 셋 다 똑같음. 다 매핑이 가능함./주요 어노테이션@Inheritance(strategy=InheritanceType.XXX)@DiscriminatorColumn(name="DTYPE")@DiscriminatorValue("XXX")/조인 전략@DiscriminatorColumn 추가 시 DTYPE 칼럼 생김.DTYPE을 안넣어도 되는데, 넣어주는게 좋다.@DiscriminatorValue("A")로 하위 테이블 이름 지정 가능..
[JPA] 다양한 연관관계 매핑
·
DB Access/JPA
다양한 연관관계 매핑#JPA/기본/연관관계 매핑시 고려사항 3 가지/다중성 (N:M)/단방향, 양방향: 테이블과 객체의 차이 고려!/연관관계의 주인은 어디에?/다대일 [N:1]/다대일 단방향/다대일 양방향연관관계 주인: FK 기준/일대다 [1:N]/일대다 단방향: 객체에서 연관관계 주인은 1쪽이지만, DB에서 FK는 다쪽에 있다.객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 특이한 구조FK 위치와 연관관계 주인 위치가 달라서 @JoinColumn을 꼭 사용해야 함. 안쓰면 조인 테이블 생김FK 위치와 연관관계 주인 위치가 달라서 일쪽에서 저장 시 FK 매핑을 위한 쿼리가 추가적으로 나감 권장 X다쪽에..
[JPA] 연관관계 매핑 기초
·
DB Access/JPA
연관관계 매핑 기초#JPA/기본/연관관계가 필요한 이유객체지향 설계의 목표는 자율적인 객체들의 협력 공동체 를 만드는 것이다/객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다./단방향 연관관계/객체 지향 모델링@Entitypublic class Member {@Id @GeneratedValueprivate Long id;@Column(name = "USERNAME")private String name;private int age;// @Column(name = "TEAM_ID")// private Long teamId;@ManyToOne@JoinColumn(name = "TEAM_ID")private Team team;...(연관관계 저장)//팀 저장Team team = ne..
[DB Access] 커넥션풀과 데이터소스 이해
·
DB Access
02. 커넥션풀과 데이터소스 이해정리이전 챕터에서 학습한 코드의 동작 방식에는 한 가지 큰 문제점이 있다. 쿼리를 날릴 때 마다 커넥션을 매번 획득한다는 점이다.데이터베이스 커넥션을 획득할 때는 복잡한 과정을 거친다.애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다.DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 물론 이 과정에서 3 way handshake 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다.DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW와 기타 부가정보를 DB에 전달한다.DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성한다.DB는 커넥션 생성이 완료되었다는 응답을 보낸다.DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다..
[JDBC] JDBC 이해
·
DB Access/Jdbc
1. JDBC 이해#Spring/DB/Jdbc정리JDBC 등장이유클라이언트가 애플리케이션 서버를 통해 데이터를 저장하거나 조회하면, 애플리케이션 서버는 다음 과정을 통해서 데이터베이스를 사용한다.애플리케이션 서버와 DB - 일반적인 사용법커넥션 연결: 주로 TCP/IP를 사용해서 커넥션을 연결한다.SQL 전달: 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다.결과 응답: DB는 전달된 SQL을 수행하고 그 결과를 응답한다. 애플리케이션 서버는 응답 결과를 활용한다.문제는 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 그리고 결과를 응답 받는 방법이 모두 다르다는 점이다또한, 데이터베이스 종류를 변경하면 애플리케이션 서버에 개발된 데이터베..
[JPA] 엔티티 매핑
·
DB Access/JPA
엔티티 매핑#Spring/DB/JPA/기본엔티티 매핑에 사용하는 대표적인 애노테이션은 다음과 같다.객체와 테이블 매핑 : @Entity, @Table필드와 칼럼 매핑 : @ColumnPK 매핑 : @Id연관관계 매핑 : @ManyToOne, @JoinColumn객체와 테이블 매핑@Entity@Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다.JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수주의기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자)JPA에서 reflection, proxy 등의 기술을 사용하기 때문에 기본 생성자가 필요하다.final 클래스, enum, interface, inner 클래스 사용X저장할 필드에 final 사용 X@Entity 속성..
[JPA] 영속성 관리
·
DB Access/JPA
영속성 관리#Spring/DB/JPAJPA의 핵심 두 가지객체와 관계형 데이터베이스 매핑하기영속성 컨텍스트영속성 관리에 대해 자세히 살펴보자엔티티 매니저 팩토리와 엔티티 매니저영속성 컨텍스트EntityManager.persist(entity);“엔티티를 영구 저장하는 환경”엔티티를 영속성 컨텍스트에 저장한다.DB에 저장하는게 아님영속성 컨텍스트는 논리적인 개념눈에 보이지 않는다.엔티티 매니저를 통해서 영속성 컨텍스트에 접근엔티티의 생명주기비영속 (new/transient)영속성 컨텍스트와 전혀 관계가 없는 새로운 상태영속 (managed)영속성 컨텍스트에 관리되는 상태준영속 (detached)영속성 컨텍스트에 저장되었다가 분리된 상태삭제 (removed)삭제된 상태비영속Member member = new..