자바 ORM 표준 JPA 프로그래밍 - 기본편 1주차
1주차
01. JPA 소개
- 추가 JPA이전의 영속성 프레임워크
JDBC API
- 자바 표준 Api으로 DB connection, SQL을 통한 기본 DB연동 구현
- 커넥션 관리, 쿼리 관리가 불편하여 SQLMAPPER 등장
SQLMAPPER
- SQL을 java코드에서 분리해냄
- 메소드에 관한 쿼리를 XML으로 매핑해주고 매핑해둔 쿼리를 사용.
ORM
- Object Relational Mapping
- 근본적으로 DB와 객체지향의 패러다임 불일치로 인한 문제 해결.
1.1 SQL을 직접 다룰 때 발생하는 문제점
-
반복적인 코드를 계속해서 작성해야함
(1.SQL 작성 - 2. JDBC API로 SQL 실행 - 3. 조회결과를 매핑)
-
SQL에 의존적인 개발
: DAO를 사용해서 SQL을 숨겨도 DAO를 직접 실행해서 SQL을 확인해야한다.
-> SQL에 의존적인 개발을 할 수 밖에없다.
-
SQL에 의존적이므로 진정한 의미의 계층분할이 어렵다
- 추가 JPA이전의 영속성 프레임워크
JDBC API
- 자바 표준 Api으로 DB connection, SQL을 통한 기본 DB연동 구현
- 커넥션 관리, 쿼리 관리가 불편하여 SQLMAPPER 등장
SQLMAPPER
- SQL을 java코드에서 분리해냄
- 메소드에 관한 쿼리를 XML으로 매핑해주고 매핑해둔 쿼리를 사용.
ORM
- Object Relational Mapping
- 근본적으로 DB와 객체지향의 패러다임 불일치로 인한 문제 해결.
1.1 SQL을 직접 다룰 때 발생하는 문제점
-
반복적인 코드를 계속해서 작성해야함
(1.SQL 작성 - 2. JDBC API로 SQL 실행 - 3. 조회결과를 매핑) -
SQL에 의존적인 개발
: DAO를 사용해서 SQL을 숨겨도 DAO를 직접 실행해서 SQL을 확인해야한다.
-> SQL에 의존적인 개발을 할 수 밖에없다. -
SQL에 의존적이므로 진정한 의미의 계층분할이 어렵다
-> JPA를 통해서 SQL에 의존적인 부분을 제거할 수 있다.
EX)
jpa.persist(member); //저장
String memberId = "helloId";
Member member = jpa.find(Member.class, memberId); //조회
1.2 패러다임 불일치
객체지향 프로그래밍과 데이터 베이스 각각의 패러다임.
객체지향 프로그래밍
정의
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악
- 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 의 주요개념.
- SOLID
데이터 베이스
정의
여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합이다. 작성된 목록으로써 여러 응용 시스템들의 통합된 정보들을 저장하여 운영할 수 있는 공용 데이터들의 묶음
- 데이터 중심으로 구조화, 집합적인 사고를 요함
- 데이터를 빠르게 조회하는 것이 주된 목적.
-> 둘의 목적과 패러다임이 다르기 때문에 객체지향을 DB에 적용시키려면 개발자가 중간에서 해결해야함!
패러다임 불일치 문제 & JPA를 통한 해결
- 상속
- 연관관계
- 데이터 타임
- 데이터 식별 방법
1.2.1 상속
- 객체 : 상속의 개념 존재
- 데이터베이스 : 상속 X, 유사한 슈퍼타입과 서브타입 존재
JPA 없이 패러다임 불일치 해결하려면?
- 저장시, 부모와 자식을 따로 insert 해줘야함
- 자식 조회시, 부모와 자식 테이블 따로 select 한다음 join 해줘야함.
INSERT INTO ITEM - - -
INSERT INTO ALBUM - - -
SELECT FROM ITEM, ALBUM - - -
JOIN - - - 조건
JPA를 통한 해결
- 자바 컬렉션처럼 데이터를 저장할 수 있음!
//저장
jpa.persist(album);
//조회
String albumId="100id";
Album album=jpa.find(Album.class,albumId);
1.2.2 연관관계
- 객체 : 참조를 통해서 연관관계 조회.
- 테이블 : 외래키를 통해서 조인하여 연관된 테이블 조회.
- 객체는 참조가 있는 방향으로만 조회 가능.(반대 방향 불가능)
JPA없이 해결하려면? 객체지향 모델링
- 개발자가 직접 객체를 생성하고 연관관계를 설정해서 반환한다.
public Member find(String memberId){
//SQL 실행
Member member = new Member();
//DB에서 조회한 회원 정보 입력
Team team = new Team();
//회원과 팀 관계 설정
member.setTeam(team);
return member;
}
JPA를 통한 해결
- 회원과 팀의 관계 설정하고 회원객체를 저장하기만 하면 된다.
//연관관계 설정후 저장
member.setTeam(team);
jpa.persist(member);
1.2.3 객체 그래프 탐색
정의
참조를 사용해서 연관된 객체를 계속해서 찾아가는 것.
- 객체라면 마음 껏 그래프 탐색이 가능해야함 -> DB를 객체로 만들면 가능해야함!
JPA이 없다면
- 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할수 있는지 정해진다.
- SQL에 조인되어 있는 DB에 대해서만 탐색할 수 있다.
class MemberService{
public void process(){
Member member =memberDAO.find(memberId);
member.getTeam();
member.getOrder.getDelivery();
}
}
- 위의 주어진 코드만 가지고는 DAO에서 어떤 쿼리를 실행하는지 모르기 때문에 어디까지 탐색 가능한지 알 수 없다.
- 그러므로 직접 SQL을 보고 확인해야하므로 SQL의존적이게 된다.
JPA을 통한 해결
- JPA는 연관된 객체를 "사용하는 시점"에 적절한 SELECT SQL을 실행한다.
- 실제 객체를 사용하는 시점까지 데이터베이스 조회를 미룬다고 해서 지연로딩이라고 부른다.
class Member {
private Order order;
public Order getOrder(){
return order;
}
}
- 객체를 보면 어디까지 탐색가능한지 바로 알 수 있다.
1.2.4 비교
- 데이터베이스에서의 비교 : 기본키의 값으로 각 row를 구분
- 객체에서의 비교 : 동일성(주소값) 비교와 등등성(value) 비교 두가지가 있다.
- 이로인해, 같은 객체를 두 번 조회해도 다르다는 결과로 나온다(주소값 비교)
String memberId="100";
Member member1 = memberDao.getMember(memberId);
Member member2 = memberDao.getMember(memberId);
member1 == member2; //다르다고 나옴.
JPA이 없다면
- 같은 로우 조회할 때마다 같은 인스턴스를 반환하도록 구현해야한다.
- 구현이 어려움..!
JPA를 통한 해결
JPA는 같은 트랜잭션일때 같은 객체가 조회되는 것을 보장한다.
1.3 JPA란 무엇인가?
정의
JPA는 자바 진영의 ORM 기술 표준이다. JDBC API를 이용한다.
ORM
-
Object Relational Mapping
-
객체와 테이블의 패러다임 불일치 문제를 해결해준다.
-
각 언어마다 대표적인 ORM이 존재한다.
-
SQL을 대신 생성 & 전달, 패러다임 불일치 문제 해결
하이버네이트(Hibernate)
-
자바 언어를 위한 객체 관계 매핑 구현체이다.
-
Java EE server 없이도 동작한다.
1.3.2 JPA 사용의 이점
- 생산성 : 반복적인 SQL코드를 작성하지 않아도 된다.
- 객체지향 패러다임 : 데이터 베이스 설계 중심의 패러다임(SQL 중심)을 객체설계 중심으로 역전.
- 유지보수 : JPA없이는 요구사항의 작은 수정에 대해서도 많은 코드 변경이 필요 했으나, JPA를 사용하면 필요없으므로 유지보수에 용이하다.
- 패러다임 불일치 해결
- 성능 : DB와 어플리케이션 사이에서 성능 최적화 제공
- 데이터 접근 추상화와 벤더 독립성: 벤더(DB종류)에 독립적으로 코드 작성 가능. 종속적이지 않음.
02. JPA 시작
- 2.1 ~ 2.5 기본적인 jpa 프로젝트 생성 및 h2 연동에 대한 설명으로 주요 개념만 정리!
H2 데이터베이스
- H2는 자바로 작성된 관계형 데이터베이스 관리 시스템
- JVM 메모리 안의 임베디드 모드, 서버 띄워 동작하는 서버모드 존재
- 웹콘솔 제공, 용량을 적게 차지함
- 시퀀스 & AUTO INCREMENT 지원
MAVEN
- 아파치 소프트웨어 재단에서 개발하는 Java 기반 프로젝트의 라이프사이클 관리를 위한 빌드 도구
- 컴파일과 빌드를 동시에 수행
- 라이브러리 관리 기능도 내포(repo로부터 받아온다)
데이터베이스 방언
- SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능
Ex1) 가변문자 : MySQL은 VARCHAR, Oracle은 VARCHAR2
Ex2) 문자열 함수 : SQL표준은 SUBSTRING(), Oracle은 SUBSTR()
EX3) 페이징: MYSQL은 LIMIT, Oracle은 ROWNUM
2.6 어플리케이션 개발
Ex1) 가변문자 : MySQL은 VARCHAR, Oracle은 VARCHAR2
Ex2) 문자열 함수 : SQL표준은 SUBSTRING(), Oracle은 SUBSTR()
EX3) 페이징: MYSQL은 LIMIT, Oracle은 ROWNUM
2.6.1 엔티티 매니저 설정
엔티티 매니저 팩토리 생성
EntityManagerFactory emf= Persistence.createEntityManagerFactory("jpabook");
- persistence.xml에서 jpabook 영속성 유닛 찾아 생성
- DB 커넥션 풀도 실행 될 수 있으므로 자원소모가 크다.
- 그러므로, 엔티티 매니저 팩토리는 딱 한번만 생성하고 공유해서 사용해야 한다.
- 싱글톤패턴.
엔티티 매니저 생성 및 종료
EntityManager em = emf.createEntityManager();
- emf에서 엔티티 매니저를 생성한다.
- 일종의 가상의 데이터베이스 역할을 한다.
- DB커넥션과 밀접한 관계가 있으므로 스레드간의 공유 및 재사용이 금지되어 있다.
em.close();
emf.close();
2.6.2 트랙잭션 관리
트랙잭션 설명)
데이터베이스 트랜잭션은 일관성 있고 신뢰할 수 있는 방식으로 독립적이게 처리되는 작업 단위를 뜻한다.
데이터베이스 트랜잭션은 크게 두 가지의 목적을 가진다.
1. 예상치 못한 에러가 발생해도 데이터베이스를 신뢰성 있는 상태로 만들 수 있도록 신뢰할 수 있는 작업 단위를 제공한다.
- 데이터베이스에 동시에 접근하는 경우 프로그램 간에 격리를 제공하여 에러를 방지한다.
한 트랜잭션은 커밋되거나 롤백된다.
- Jpa를 사용하려면 항상 트랙잭션 안에서 데이터를 변경해야한다.
EntityTranscation tx = em.getTransaction();
try{
tx.begin();
logic(em);
tx.commit();
}catch(Exception e){
tx.rollback();
}
JPQL
- JPA에서 검색쿼리를 어떻게 효율적으로 처리할 수 있을까?
- JPQL(Java Persistence Query Language)라는 쿼리 언어를 통해 검색쿼리를 처리한다.
JPQL의 특징
- JPQL은 엔티티 객체를 대상으로 쿼리한다.(SQL은 테이블을 대상으로 쿼리한다.)
- JPQL은 SQL을 추사와한 객체지향 쿼리언어이다.
- 객체지향 SQL
- JPA는 JPQL을 분석해서 SQL을 만들어 DB에서 조회한다.
public static void typedQuery(EntityManager em) {
String jpql = "SELECT b FROM Book b ";
TypedQuery<Book> query = em.createQuery(jpql, Book.class);
List<Book> bookList = query.getResultList();
for( Book book : bookList) {
System.out.println(book.getTitle());
}
}
추가
1주차 의문점 및 개념
데이터베이스의 패러다임은 뭘까?
- 일반적으로, DB 패러다임이란 DB 를 저장하고 관리하는 방법을 의미함..!
- 책에서 말하는 패러다임 불일치에서의 db 패러다임은 데이터 중심의 구조화와 집합적인 사고를 뜻하는 걸로 추정.
객체의 참조라는건 주소를 말하는 것?
- object referenece(객체 참조)는 클래스로 만든 객체의 주소 또는 참조값
- 자바에서는 C언어와 다르게 메모리 상의 주소가 참조의 대상이 아니다. 자바에서는 객체의 주소 대신 참조값이라는 것을 할당받는다.
- 자바에서는 주소와 참조값이 다른의미..
SQL힌트란?
- SQL사용자가 SQL 구문에 작성하는 것을 뜻한다. 오라클이 항상 최적의 실행 경로를 만들어 내기는 불가능하기 때문에 직접 최적의 실행 경로를 작성해 주는 것이다
벤더 독립성
- 벤더와 벤더의 독립성은 데이터베이스를 만든 회사에 대한 내용
- 흔히 산업용어로 벤더는 생산회사를 의미함!
- 각 데이터베이스에 독립적이다 라는 말을 벤더 독립성을 표현함.
스레드 세이프
- 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음
- Not thread safe는 반대.
앤티티 매니저를 재사용하게 되면 어떤일이 벌어지나
Author And Source
이 문제에 관하여(자바 ORM 표준 JPA 프로그래밍 - 기본편 1주차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@xoqja055/자바-ORM-표준-JPA-프로그래밍-기본편-1주차저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)