JPA
Entity Bean 이라는 표준 ORM
자바 퍼시스턴스 API (Java Persistence API, JPA )
JPA를 쓰려면 자바 구현체 하이버네이트를 써야됨.
EJB 없이 해보자 하고 만든 것이 Spring Framework
하이버네이트 : EJB 엔티티빈 기술을 대체
JPA라는 새로운 표준 정의
데이터 저장은 마이바티스 쓴다.
zeroturnaround 통계
+ JRebel 만든 곳
+ 서버를 중단하지 않고 클래스 파일 대체, 프레임워크에 따라 수정이 많음
+ 전 세계 자바 사용자들이 어떤 프레임워크를 사용하는지 가장 민감한 회사
사실상 표준
Spring JPA Hibernate 사용
Spring Data 쓰면 하둡, 마이에스큐엘, 노드제이에스 등 모두 쓸 수 있다.
단순한 통합 그 이상
* CRUD+쿼리
* 페이징 처리
* 동일한 인터페이스
* 메서드 이름으로 쿼리 생성
* 스프링 mvc 에서 id 값만 넘겨도 도메인 클레스로 바인딩
[Spring Data JPA]
JDBC ( connection, statement ) -> Spring jdbc Template ( My batis ) -> Spring + JPA ( ORM )
-> Spring Data JPA ( 미리 crud가 다 만들어져 있음 )
인터페이스를 만들면 Spring Data JPA가 구현체를 만들어줌
메서드 이름으로 쿼리생성
메서드 이름으로 NamedQuery 호출
Specification 구현 (설명구현)
TDD : Test JUnit을 이용해 개발하는 것
DDD : VO짜고 구조 잡아야 하는것
DTO : Data Transfer Object
장점
* 코딩량이 줄음
* 도메인 클래스를 중요하게 다룸
* 비지니스 로직 이해 쉬움 ( 쿼리만 보고도 로직이 이해가 됨, 메소드명 만으로 쿼리를 짜기 때문에 )
* 더 많은 테스트 케이스 작성 가능
선행 공부되야 할 내용
영속성 컨텍스트
자동 변경 감지 ( VO에 Setter를 호출하는 순간 db에 업데이트 됨) 문제 : 트랜잭션 어떻게 하나?
언제 영속성 컨텍스트가 플러시 되는가 ( 따로 커밋되는 순간이 있음 )
엔티티매니저 = 영속성 컨텍스트
여러개의 엔티티 매니저가 하나의 영속성 컨텍스트에 접근함.
POJO 오로지 JDK로만 쓰여진것 순수 자바 (Plain Old Java Object)
영속성 컨텍스트의 이점
* 캡슐화로 계속 여러 layer로 감싸서 10개의 기능을 쓰기위해 10개 메소드 모두 호출하는 것이 아니라
하나의 메소드만 출력할 수 있도록 만들어준다.
* layer : 여러개의 추상화 클래스를 하나로 이어주는 것
* 캐싱 : 내가 가진 데이터를 다른이에게 공유하는 것
- 캐시 클러스터링 : 공유하는 것
* 동일성 보장
* 비영속 객체 : Entity 객체가 DB에 반영되지 않았고, Managed 상태가 아닌 상태를 말한다. 이 상태는 new 키워드를 사용해 생성한 Entity 객체를 말하고 영속화되지 않는다. ++ 데이터베이스에 들어가지 않은 데이터 캐시에만 있는 데이터
* 영속 객체 : Entity 객체가 영속 객체가 된 상황은 크게 2가지가 있다. New (비 영속 객체) 상태에서 persist 메소드를 이용해 저장한 경우와 DB 테이블에 저장돼 있는 데이터를 find 메소드 또는 query를 사용해 조회한 경우다. 이 상태는 Persistence Context가 관리하는 상태이며, 해당 객체를 수정했는지(자동 변경 감지) 알아낼 수 있다. ++ 데이터베이스에 들어간 데이터
지금만 필요할 때, 준 영속성 JPA 캐시에는 객체가 들어간다.
업데이트 쿼리
* 델타방식 : 바뀐 부분만 업데이트하는 방식
* 바이너리 방식 : 전체바꾸는 방식
dao라고 안씀 -> repository ( spring에서 쓰는말 )
지금만 필요할 때, 준 영속성
싱글톤 : biz, dao등 한번 만들어두면 다시만들 필요없이 다시 오는것
참고 도서 : JPA2, 하이버네이트
강연자 : 김영한
'Back-end > Spring' 카테고리의 다른 글
[Spring] 공부문제 (2) | 2016.05.31 |
---|---|
[JPA] 사용해보기 (2) | 2016.05.04 |
[HTML] 자동완성 기능 만들기 (0) | 2016.05.03 |
[HTML] 서버돌리지 않고 창 띄우기 (0) | 2016.05.02 |
[HTML5] WebSocket을 이용한 채팅 만들기 (0) | 2016.04.22 |