들어가며
인프런 김영한 강사님의 자바 ORM 표준 JPA 프로그래밍 강의 수강을 시작했다. 기존에는 Mybatis를 사용했었는데 항해99 커리큘럼에서 JPA를 사용하기도 하고, JPA가 여러모로 개발하기에 편리할 듯 싶어 이번에는 Mybatis대신 JPA를 공부하고 사용하기로 했다.
오늘의 TIL은 JPA를 사용하는 이유와, 강의 내용을 따른 초기 세팅 방법을 정리해보고자 한다.
JPA를 사용하는 이유?
JAVA는 객체지향언어이고, JAVA를 사용하는 Spring 역시 객체지향적으로 이루어져있다. 그런데, Spring과 함께 주로 사용하는 DB는 관계형 데이터베이스이다(Oracle, MySQL 등. 이하 관계형 DB). 즉, 객체 지향 언어를 사용하고 있다면 객체 데이터를 관계형 DB를 사용해서 관리하게 된다.
MyBatis로 개발을 해본 사람이라면 공감할텐데 DB에 데이터를 매핑할 때, 일일히 SQL을 가지고 쿼리문을 짜줘야하는 매우 번거로운 과정을 거쳐야만했다. 거의 SQL짜는 기계처럼 말이다. 테이블이 많다면 일일히 테이블마다 SQL문을 짜주는 과정을 무한 반복했어야했다.
결국 개발자는 SQL 의존적인 개발을 피할 수 없다.
또, 객체지향적 프로그래밍과 관계형 DB의 패러다임이 불일치하는 문제도 있다. 객체지향으로 짜여진 데이터를 관계형 DB에 집어넣으려니 여러 문제점이 생긴다. 서로 다른 상속 방식, 연관 관계, 다른 데이터 타입 등 둘 간의 차이를 해결하기 위해 결국은 일일히 쿼리문을 짜줘야하는 것이다.
그럼 JPA를 사용할 때는 어떨까?
JPA는 Java Persistence API의 줄임말으로 객체 관계 매핑(ORM, Object-Relational Mapping) 기술에 대한 API 표준 명세이다. JPA를 이용하면 객체는 객체대로, 관계형 DB는 관계형 DB대로 설계할 수 있다. 데이터와 DB를 매핑할 때 일일히 SQL문을 짜주는 대신 넘어온 객체를 가지고 적절한 쿼리를 생성해서 DB에 보내준다. 개발자가 직접 SQL문을 짤 필요가 없다는 말이다(!)
말로만 들으면 JPA가 압도적으로 좋아보이는데 아직까지도 많은 곳에서 MyBatis를 사용하는 이유가 무엇일까?
우선 MyBatis를 사용하는 가장 큰 이유는 '복잡한 연산'을 수행할 수 있다는 점이다. 원하는 용도에 맞게 쿼리문을 직접 작성하므로 본인의 프로그램에 최적화된 쿼리를 구현할 수 있다. 또, JPA는 뒤로 갈 수록 성능을 높이기 위한 해결방안을 찾으려면 복잡한 내부로직을 이해해야지 사용할 수 있는 반면, MyBatis는 SQL문법만 알고있다면 JPA에 비해 상대적으로 손쉽게 쿼리문을 짤 수 있다.
위의 내용을 종합해봤을 때, 결론은 '지금은 내가 편한거 쓰자'가 되겠다. 두가지를 모두 써보고 내가 쓰기에 적절하다고 생각하는 기술을 사용하면 되겠다. 어느 곳에서는 두가지를 모두 사용하는 곳이 있다고 하니 알아두면 꼭 쓸 데가 있을 거다.
JPA 초기 세팅하기
강의에서는 H2 DB를 사용하고 있다. 실습용으로 사용하기 좋고, MySQL을 시뮬레이션 해볼 수도 있다고 하니 강의를 따라 H2 DB를 설치하고, 프로젝트에 JPA를 세팅해보자.
H2 설치
위의 링크를 타고 들어가면 H2를 설치할 수 있는 페이지가 나타난다. Download에서 Windows 사용자라면 Windows Installer를, Mac 사용자라면 All Platforms를 클릭해서 설치하자.
다운로드한 파일의 압축을 풀면 이런 파일들이 나온다.
여기서 bin > h2.sh 파일을 실행시켜 주면 되는데, Windows같은 경우는 바로 실행된다고 하지만 Mac은 약간의 권한 설정이 필요하다.
Mac 권한 추가
chmod 755 h2.sh
터미널에서 위 코드를 입력해 준 뒤 Windows와 똑같이 h2.sh 파일을 실행시켜주면 아래와 같은 창이 브라우저에 실행된다.
+
아래와 같은 에러가 뜰 때 해결법
Database "~/test" not found, and IFEXISTS=true, so we cant auto-create it [90146-199]
위의 JDBC URL을 아래의 이름으로 바꿔준다
jdbc:h2:tcp://localhost/~/test
이런 페이지가 뜬다면 H2 세팅 완료!
프로젝트 세팅
강의에서는 gradle대신 maven을 사용한다. maven과 gradle의 차이는 물론 많겠지만 gradle이 최근 기술이다보니 스펙상으로 maven보다 낫다. 그래도 강의를 따라가고 있으니 maven을 사용해서 프로젝트 세팅을 해보자
프로젝트 생성부분은 이미 많이 해봤으니 생략한다.
라이브러리 추가 - pom.xml
pom.xml에 아래 디펜던시를 추가해준다.
여기서 H2 DB의 version을 처음에 다운로드한 H2버전과 맞춰주는게 나중에 오류가 발생하는 상황을 막아준다고 한다.
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.3.10.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.212</version>
</dependency>
</dependencies>
JPA 설정 - persistence.xml
persistentce.xml 파일을 META-INF 폴더 안에 생성해준다.
persistentce.xml에 아래 코드를 추가해준다.
<?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>
이렇게까지 하면 기본 세팅이 완료되었다!
마치며
개발 과정을 통틀어 가장 싫은 초기 환경 세팅으로 JPA를 시작했다. 주특기 주차랑 함께 쭉쭉쭉 나가보자!
오늘의 한마디 by 윤교님 - 야옹
출처
'Study > TIL' 카테고리의 다른 글
[TIL] 06/03 항해99 26일차 - domain & DTO (0) | 2022.06.04 |
---|---|
[TIL] 06/02 항해99 25일차 - 트러블 슈팅 (1) | 2022.06.03 |
[TIL] 05/31 항해99 23일차 - CS 공부 가이드 (0) | 2022.06.01 |
[TIL] 05/30 항해99 22일차 - 동기 & 비동기 (0) | 2022.05.31 |
[TIL] 05/28 항해99 20일차 - 이진탐색 (0) | 2022.05.28 |