티스토리 뷰
이전 강의에서 느낀점
JPA는 인터페이스, hibernate는 구현체
db위주로 코드를 짠다면... 하.... 복잡 그자체일 것이다. -> JPA로 객체 중심의 코드를 짜자
- ORM
: Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재
내 환경은 이렇게 설정되었다
윈도우10
jdk 11
maven
hibernate 5.3.10.Final
h2: 1.4.200
persistence.xml
: JPA에서 사용할 DB에 관련된 정보(db 아이디, 비번, db종류...)과 옵션들
why? db종류는 왜 필요?
- JPA는 특정 DB종류에 종속되지 않으므로, 특정 DB 문법에만 국한되지 않는다. == DB 방언
첫째줄의 persistence-unit name=""으로 사용할 디비의 별칭을 지정
마지막줄의 <property name="hibernate.dialect" value="">값에 h2 대신 oracle, mysql을 넣으면 그에 맞게 JPA가 쿼리값을 변경해줌
<persistence-unit name="hello">
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
JPA 구동방식
1. resource/META-INF/persistence.xml 파일에서 설정 정보를 조회한다.
2. EntityManagerFactory를 생성(Persistence)
_약간 클래스 느낌
_하나만 생성해서 애플리케이션 전체에서 공유해야
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
3. 수많은 EntityManager 값을 생성해서 사용한다.
_객체 느낌
_1개의 db connection 개념과 유사
_쓰레드 간 공유는 x. 사용하고 버려야
EntityManager em = emf.createEntityManager();
*JPA가 매핑정보를 보고 알아서 쿼리를 생성
@Entity
- db 테이블에 매핑되는 클래스
- @Entity로 명시하면, 로딩 시 JPA가 인식해서 관리해줌
- primary key에 대응하는 값을 알려줄 때는 해당 변수에 @Id를 붙임
cf-1) db의 테이블명, 컬럼명과 설정한 클래스, 변수 명이 다를 경우에는 @Table(name="디비 테이블명"), @Column(name="디비 컬럼명")을 붙이면 JPA가 알아서 처리해줌
cf-2) 이 때 import되는 파일의 시작은 javax.persistence.~로 시작해야
트랜잭션
- JPA의 모든 데이터 변경(등록, 수정, 삭제)은 각각 한 트랜잭션 안에서 실행되어야
- commit후에 디비에 데이터 변경 사항이 반영됨
- JPA를 통해 가져온 엔티티는 JPA가 관리. 변경된 시점을 확인해서 update 등의 쿼리를 날려줌
EntityTransaction tx = em.getTransaction(); //트랜잭션 생성
tx.begin();
//저장
try{
Member member = new Member();
member.setId(2L);
member.setName("helloName");
em.persist(member);
tx.commit(); //트랜잭션 끝
}catch (Exception e){
tx.rollback();
}finally {
em.close(); //사용을 다하면 꼭 닫아야!
}
저장: .persist(저장할 객체);
조회: .find(타입, 값);
수정: 조회한 데이터에서 set~();
_수정한 후 다시 저장(persist)할 필요 없음. JPA가 자바 컬렉션을 다루는 것처럼 처리해주므로
삭제: .remove(삭제할 객체);
JPQL
- JPA는 테이블 대상이 아니라 멤버 객체(엔티티)를 대상으로 쿼리를 짬(=조회)
-> 테이블 대상으로 한다면 db종류에 종속될 수 밖에 없음
- 가장 단순한 조회방법
- 디비에서 데이터를 검색할 때가 문제
List<Member> result = em.createQuery("select m from Member m", Member.class).getResultList();
- createQuery("쿼리문", 엔티티 타입);
_SELECT, FROM, WHERE문 다 가능
_쿼리 조회값을 리턴해줌
_WHERE대신 .setFirstrResult(idx), .setMaxResult(idx) 등과 같이 대응되는 함수들이 있다
*https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84#curriculum
이 강의를 들으면서 발생한 에러는 아래(pom.xml)
2021.06.30 - [스프링+JPA/JPA] - [에러] 2. JPA시작하기
출처: 인프런, 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편
'스프링+JPA > JPA' 카테고리의 다른 글
[에러] 2. JPA시작하기 (0) | 2021.06.30 |
---|