개발자들은 객체를 단순히 테이블에 맞추어 데이터 전달 역할만 하도록 개발하는 데에 의문이 들었다 -> 객체 모델링을 적용해보았지만 세밀하게 진행할수록 객체와 관계형 데이터베이스의 차이를 메우기 위해 더 많은 SQL을 작성해야 했음!! 그리고 결과적으로는 또 객체 모델이 데이터 중심의 모델로 변해갔다고 한다. -> 이러던 중 객체와 관계형 데이터베이스 간의 ...
해당 장에서는 JPA를 사용해서 테이블 하나를 등록/수정/삭제/조회하는 간단한 JPA 애플리케이션을 만들어보겠다. 2.1 이클립스 설치와 프로젝트 불러오기 해당 절은 필자는 IntelliJ를 사용하기 때문에 이클립스 설치 부분은 넘기겠다. 예제 프로젝트 불러오기 파트도 Gradle 기반 프로젝트로 진행하기 위해 프로젝트 생성하는 것으로 다뤄보겠다! Sp...
[JPA가 제공하는 기능] 엔티티와 테이블을 매핑하는 설계 부분 매핑한 엔티티를 실제 사용하는 부분(3장 주요 내용!!) 엔티티 매니저 = 엔티티를 관리하는 관리자 -> 엔티티 저장, 수정, 삭제, 조회하는 등 엔티티와 관련된 모든 일 처리 -> 개발자 입장에서 가상의 데이터베이스로 생각하면 된다. 3.1 엔티티 매니저 팩토리와 엔티티 매니저 데이터베이...
JPA를 사용하는 데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것 -> 매핑 어노테이션을 숙지하고 사용해야 한다. [대표 어노테이션 4가지 분류] 객체와 테이블 매핑 : @Entity, @Table 기본 키 매핑 : @Id 필드와 컬럼 매핑 : @Column 연관관계 매핑 : @ManyToOne, @JoinColumn -> 이번 장에서는 테이블...
엔티티들은 대부분 다른 엔티티와 연관관계가 있다. but, 객체는 참조(주소)를 사용해서 관계를 맺고 테이블은 외래키를 사용해서 관계를 맺는다. -> 이 둘은 완전히 다른 특징을 갖는다. 객체 관계 매핑(ORM)에서 가장 어려운 부분이 바로 객체 연관관계와 테이블 연관관계를 매핑하는 일이다. * 객체의 참조와 테이블의 외래 키를 매핑하는 것이 이장의 목표다...
엔티티의 연관관계를 매핑할 때는 3가지를 고려해야 한다. 다중성 (보통 다대일과 일대다를 많이 사용하고 다대다 관계는 실무에서 거의 사용하지 x) 다대일 일대다 일대일 다대다 단방향, 양방향 연관관계의 주인 다중성과 단방향, 양방향을 고려한 가능한 모든 연관관계 다대일 : 단방향, 양방향 일대다 : 단방향, 양방향 일대일 : 주 테이블 단방...
7장에서 다룰 고급 매핑은 다음과 같다. 상속 관계 매핑 : 객체의 상속 관계를 데이터베이스에 어떻게 매핑하는지 다룬다. @MappedSuperclass : 등록일, 수정일 같이 여러 엔티티에서 공통으로 사용하는 매핑 정보만 상속받고 싶으면 이 기능을 사용하면 된다. 복합키와 식별 관계 매핑 : 데이터베이스의 식별자가 하나 이상일 때 매핑하는 방법을 다룬다...
8.1 프록시 엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아니다. 예를 들어 회원 엔티티를 조회할 때 연관된 팀 엔티티는 비즈니스 로직에 따라 사용될 때도 있지만 그렇지 않을 때도 있다. 아래 코드를 보자. printUserAndTeam() 메소드는 memberId로 회원 엔티티를 찾아서 회원은 물론이고 회원과 연관된 팀의 이름도 출력한다...
JPA의 데이터 타입은 크게 엔티티 타입과 값 타입으로 나눌 수 있다. 엔티티 타입은 @Entity로 정의하는 객체이고, 값 타입은 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체를 말한다. 엔티티 타입은 식별자를 통해 지속해서 추적할 수 있어서 값을 변경해도 같은 엔티티이지만, 값 타입은 식별자가 없고 숫자나 문자...
JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 지원한다. JPQL은 가장 중요한 객체지향 쿼리 언어다. 이 장에서 다루는 Criteria나 QueryDSL은 결국 JPQL을 편리하게 사용하도록 도와주는 기술이므로 JPA를 다루는 개발자라면 JPQL을 필수로 학습해야 한다. 이 장 마지막에는 객체지향 쿼리에 대한 심화...
12.1 스프링 데이터 JPA 소개 스프링 데이터 JPA는 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트다. 이 프로젝트는 데이터 접근 계층을 개발할 때 지루하게 반복되는 CRUD 문제를 해결해준다. 우선 CRUD를 처리하기 위한 공통 인터페이스를 제공하고, 리포지토리를 개발할 때 인터페이스만 작성하면 실행 시점에 스프링 데이터...
컨테이너 환경에서 JPA가 동작하는 내부 동작 방식을 이해하고 컨테이너 환경에서 웹 애플리케이션을 개발할 때 발생할 수 있는 다양한 문제점과 해결 방안을 알아보자. 13.1 트랜잭션 범위의 영속성 컨텍스트 13.1.1 스프링 컨테이너의 기본 전략 스프링 컨테이너는 * 트랜잭션 범위의 영속성 컨텍스트 * 전략을 기본으로 사용한다. 이 전략은 트랜잭션의 범위...
JPA가 지원하는 컬렉션의 종류와 중요한 부가 기능들을 알아보자. 14.1 컬렉션 JPA는 자바에서 기본으로 제공하는 Collection, List, Set, Map 컬렉션을 지원하고 다음 경우에 이 컬렉션을 사용할 수 있다. 이 컬렉션들은 그림과 같은 구조를 가진다. @OneToMany, @ManyToMany를 사용해서 일대다나 다대다 엔티티 관계를 매...
15.1 예외 처리 15.1.1 JPA 표준 예외 정리 JPA 표준 예외들은 javax.persistence.PersistenceException의 자식 클래스다. 그리고 이 예외 클래스는 RuntimeException의 자식이다. 따라서 JPA 예외는 모두 언체크 예외다. JPA 표준 예외는 크레 2가지로 나눌 수 있다. 트랜잭션 롤백을 표시하는 예외 트...
16.1 트랜잭션과 락 트랜잭션 기초와 JPA가 제공하는 낙관적 락과 비관적 락에 대해 알아보자. 16.1.1 트랜잭션과 격리 수준 트랜잭션은 ACID라 하는 원자성, 일관성, 격리성, 지속성을 보장해야 한다. 원자성 : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하든가 모두 실패해야 한다. 일관성 : 모든 트랜잭션은 일관성 있는...