스프링 부트를 공부하려던 찰나에 JPA를 공부하게 되었다
객체 지향언어는 아이러니하게 관계DB 와 엮을 때에 객체답게 모델링 할 수록 매핑 작업이 늘어나게 된다.
지난번, mvc 프로젝트를 할 때에 느꼈다. mapper로 bean으로 받아와서 그 값을 꺼내서 다른 곳에 일일이 넣은 다음에 model 로 넘겨주던 일을...
하지만, 이것을 컬렉션에 넣듯이 진행할 수가 있다. sql문을 직접 입력하지 않아도 된다. 객체를 자바 컬렉션에 저장 하듯이 DB에 저장하는 것이다. JPA(Java Persistence API)를 통해서 말이다.
JPA는 자바 진영의 ORM 기술 표준이다. ORM 이란 Object Relational Mapping 으로 객체는 객체대로 설계를 하고, 관계형 DB는 관계형 DB대로 설계를 한다. ORM 프레임워크가 중간에서 매핑해준다. 어플리케이션과 JDBC 사이에서 동작한다.
먼저, 실습을 위해서 h2 데이터베이스를 설치하였다. www.h2database.com/
pom.xml에 다음과 같은 dependencies 들을 추가해주었다.
그리고 src/main/resources/META-INF 경로를 생성해주고,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<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"/> <!-- 옵션 --> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.use_sql_comments" value="true"/> <!--<property name="hibernate.hbm2ddl.auto" value="create" />--> </properties> </persistence-unit> </persistence> |
cs |
persistence.xml 를 다음과 같이 생성해 주었다.
대략적인 설정이 끝났다. 보통 DB당 한 개의 persistence-unit을 만들어 준다고 한다. 위에서는 그 이름을
'hello' 로 설정하였다.
필수속성에는 해당값을 본인에 맞춰 알맞게 삽입한다.
옵션값들은 위의 사진과 관련이 있는데,
show_sql 값 true 는 sql문이 보인다.
format_sql 은 위와 같이 모양을 예쁘게 세팅해준다.
use_sql_comments는 /**/ 주석 사이에 해당 sql이 왜 나오는지 정보를 알려준다.
JPA는 특정 데이터베이스에 종속되지 않는다.
데이터베이스마다 SQL문법과 함수가 다른데, JPA는 알맞게 맞춰준다.
persistence.xml 속성 주석의 마지막 값에 dialect 부분을 보면 value="org.hibernate.dialect.H2Dialect" 다음과 같이 되어있다. 이것은 h2 db를 사용하기에 H2Dialect 라고 쓴 것이다. 만약 Oracle 이면 Oracle12cDialect 이런식으로 작성을하면
되겠다. 40 종류를 지원하기 때문에 앵간하면 모든 DB를 다 커버할 수 있다.
JPA는 META-INF/persistence.xml 파일을 통해 설정 정보를 조회하고
EntityManagerFactory를 생성하고 EntityManager를 생성하여 구동을 한다.
객체와 테이블을 생성하고 매핑을 시켜보자.
@Entity 의 어노테이션은 JPA가 관리할 객체를 알려준다.
나는 db에 member 라는 테이블로 id bigint not null, name varchar(255), privary key (id) 를 생성하였다.
해당 컬럼에 맞춰서 id 와 name 변수를 만들고 getter setter를 선언해주었다.
만약 table name이 Member가 아니라면 @Entity 밑에 @Table(name="USER") 와 같이 두어서 USER라고 알려줄 수도 있다. 마찬가지로 컬럼명이 name이 아닐 때에 @Column(name="user_name") 를 사용해서 수정해 줄 수 있다.
위에서부터 insert, modify, remove, select 의 순이다.
엔티티 매니저 팩토리를 만들고 아까전에 설정에서 정한 'hello' 의 이름으로 가져온다.
persistence 관련은 import javax.persistence.Persistence; 다음을 import 하여서 사용해주자.
팩토리는 하나만 생성해서 어플리케이션 전체에서 공유를 한다.
엔티티 매니저는 쓰레드 간에 공유를 하면 안되고, 사용하고 버려야 한다. 쓰고 close를 꼭 해주자.
JPA의 모든 데이터 변경은 트랜잭션 안에서 실행이 된다.
insert를 보면 transaction을 시작하고 id 와 name 을 member 객체에 설정을하고 persist를 통해 실행하였다.
객체 컬렉션에 집어 넣듯이 db에 집어 넣은 것이다. exception이 안나왔다면 엔티티 매니저를 close 해준다.
modify 또한 신기하게 돌아간다. 그저 pk 값으로 2L을 줘서 member를 find 한 뒤에 setName으로 바꿔주면 끝이다.
이것은 값이 바뀌면 update를 자동으로 하기 때문에 다음과 같이 수행된다고 한다.
remove 또한 find로 찾아준 뒤에 remove 시키면 끝.
select은 find로 찾은 값을 print 하든지 하면 된다.
만약 나이가 18살 이상인 회원을 검색하고 싶다 등 여러 조인을 해서 수행해야 하는 경우에 JPQL을 사용한다.
JPQL은 select m from model as m 과 같이 객체를 sql문 수행하듯이 해버린다.
SQL은 데이터베이스 테이블을 대상으로 쿼리를 한다면,
JQPL은 엔티티 객체를 대상으로 쿼리를 한다.
한 마디로 말하자면, JPQL은 객체 지향 SQL인 것이다.
김영한 강사님의 JPA 프로그래밍 강의를 들으며 공부한 포스팅입니다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
JPA 공부에 들어갔다.
SSAFY를 떨어지고나서 개인 프로젝트를 하나 시작해야 겠다고 생각을 했다.
지원공고에서 내가 모르는 기술을 하자고 하던 찰나에 스프링 부트가 눈에 들어왔고 부트캠프랑 헷갈려서 찾다보니 JPA를 시작하게 되었다.
spring mvc 프로젝트를 할 때에 그냥 dynamic web pjt 를 생성한 다음에 configure를 통해 maven pjt로 바꿔주었었다. 이번에는 maven pjt로 바로 생성을 하는데 폴더가 살짝씩 달라서 조금씩 적응을 해야될 것 같다.
스프링 부트와 JPA 로드맵을 인프런을 통해서 공부하고 있는데, 이것을 수행한 뒤에 이전에 mvc 프로젝트의 mapper 부분을 JPA로 수정을 해보고 싶다. 화이팅!!
'공부 기록들' 카테고리의 다른 글
2020.06.17 JPA(3) (0) | 2020.06.17 |
---|---|
2020.06.16 JPA(2) (0) | 2020.06.17 |
2020.06.05 백준2352 반도체 설계, ssafy 준비... (0) | 2020.06.05 |
2020.06.01 - mvc 프로젝트 다시하기(完) (0) | 2020.06.01 |
2020.05.27 gsat 오답노트 (0) | 2020.05.27 |