JPA란
- ORM(객체 - 관계 자동매핑)중 하나이자 Java Persistence API의 약자로 자바 플랫폼에서 객체와 관계형
데이터베이스를 매핑하고, 객체 지향적인 방식으로 데이터를 영속화 하는 기술이다. - 보통 JPA 프레임워크로는 Hibernate를 사용해서 구현한다.
※Hibernate: 자바 언어를 위한 ORM 프레임워크이다. 자바 객체를 통해 데이터베이스가 Oracle, MySql, MSSQL등에
상관없이 다룰수있게 해준다. 이를 통해 개발자는 SQL을 사용하지 않고 메서드 호출만으로 쿼리가 수행된다.
JPA구동방식
- 먼저 persistenc.xml 파일을 조회해서 설정에 맞게 DB를 구상한다.
- DB에 접근할때 매번 커넥션을 생성해주는 EntityManagerFactory를 생성합니다. Factory는 각 DB당
하나만 생성해서 Application 전체에서 공유해야 한다. - 각 커넥션(액세스)마다 EntityManger가 생성되어 트랜잭션을 처리한 후 소멸된다. 이유는 쓰레드 간에
공유가 되면 안되기때문에 생성후에 사용완료하면 버려야한다.
JPA사용 이유
- SQL 중심적인 개발에서 객체 중심적인 개발을 지향한다.
- CRUD작업이 많이 간결화가 되었다.
- Create: jpa.persist(member)
- Read: Member member = jpa.find(memberId)
- Update: member.setName("변경할 이름")
- Delete: jpa.remove(member)
JPA 기본 세팅
JPA설정 정보
- 어떻게 JPA를 사용할지를 persistence.xml 파일에 적어줘야 한다.
위 파일은 /META-INF/ 경로에 위치해야한다.
- persistence-unit 유닛의 이름은 name 속성으로 설정해준다. transaction-type을 설정해줘야하는데 JTA와 RESOURCE_LOCAL 이렇게 2가지가 존재한다. 일단은 로컬에서만 사용할거기때문에 RESOURCE_LOCAL로 설정해주고 추후에 JTA공부하고 내용수정예정이다.
- properties 속성값을 넣어주는데 이제 필수적으로 들어가야하는 값들이 있다.(5가지)
- property로 사용할 DB와 드라이버 정보를 설정한다.
- 사용할 유저 내임을 설정해준다.
- 사용하는 DB의 비밀번호를 입력해준다. 전에 maria db를 통해서 세션을 만들어놓고 비번을 설정해놨다면 그 비번을 저기에 입력하면된다.
추가로 얘기할 내용으로는 2개의 프로젝트를 사용하는 경우 포트번호를 다르게해서 DB를 사용하는 방법도 있지만 같은 세션에서 테이블 이름만 겹치지 않게 해서 사용하는경우도 있으니 참고하길 바란다. - url을 보통은 로컬호스트 3306하면 된다. url로 오류가 뜬다면 DB의 포트가 잘못 설정되어있는 경우가 있는데 이 경우에는 연결되어있는 포트번호를 보고 그 번호를 받아오면 된다. 근데 웬만해서 3306으로 DB 포트를 설정하고 사용하자.
- dialect(방언)을 하이버네이트로 맞춰놨는데 이러면 하이버네이트가 알아서 쿼리를 짜준다.
- 밑에 hibernate.show_sql과 hibernate.fromat_sql 필요한 코드는 아니지만 쿼리문이 알맞게 들어온걸 확인하고자
작성했다.
<persistence-unit name="basicjpa" transaction-type="RESOURCE_LOCAL"> <!--아래 속성을 사용하는 하나의 persistence단위라고 생각하면 편함-->
<properties>
<!-- 필수 속성 시작 -->
<property name="javax.persistence.jdbc.driver" value="org.mariadb.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="yourDbPassword"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mariadb://localhost:3306/basic_jpa"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MariaDB103Dialect"/>
<!-- 필수 속성 끝 -->
<!-- 애플리케이션이 실행되면서 데이터베이스에 테이블 자동 생성 -->
<!-- create, update, validate, create-drop, none -->
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.show_sql" value="true"/> <!--쿼리문 보기 -->
<property name="hibernate.format_sql" value="true"/> <!--쿼리문 이쁘게 보기 -->
</properties>
- EntityManagerFactory 작성
- EntityManager를 생성하는 팩토리 객체로, JPA의 핵심 인터페이스 중 하나이다.
- 위에 작성한 persistence.xml 파일을 기반으로 EntityManagerFactory를 생성한다.
아래코드처럼 작성하면 Spring Boot가 EntityMangerFactory를 자동으로 생성하여 주입한다. - 애플리케이션이 종료될 때, EntityManagerFactory를 닫아 자원을 정리한다.
- 참고할점은 순수 JPA환경에서는 persistence.xml과 따로 EntityManagerFactory를 만드는반면에
SpringBoot에서는 application.properties 또는 application.yml 파일에 설정을 작성하는것이 일반적이다.
아래는 SpringBoot 에서 일반적으로 사용하는 EntityMangerFactory 생성 방법이다.
@Service
public class MyService {
private final EntityManagerFactory entityManagerFactory;
@Autowired
public MyService(EntityManagerFactory entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
}
public void someMethod() {
// EntityManager를 생성할 수 있다.
EntityManager entityManager = entityManagerFactory.createEntityManager();
// EntityManager를 사용하여 데이터베이스와 상호작용할 수 있습니다.
//...
//사용한 작업이 끝나면 닫아줘야한다.
entityManager.close();
}
}
기본편은 이것으로 끝이고 이후에 Entity 설명과 CRUD 사용법으로 돌아오겠다.
내용은 처음 공부하는 내용이다보니 수정할게 많아서 추후에 더 공부하면서 수정할 예정이다.
참조
- JPA기본편정리
https://velog.io/@tmdgh0221/JPA-%EA%B8%B0%EB%B3%B8%ED%8E%B8-%EC%A0%95%EB%A6%AC - JPA기초 강의
https://www.youtube.com/watch?v=5DAW3CCZ_rU&list=PLlTylS8uB2fAnOge-kDI0ZQxgj78bdTOO