Spring boot로 JPA-Hibernate 셋팅(1편)
이제 프로젝트를 진행하기 위해 수행하는 작업중에서 절반 정도 마쳤다.
이제 Backend 프로그래밍에서 가장 중요한 DB에서 데이터를 긁어오는 작업이 필요한 시점에 왔다.
기존에 DB에서 데이터를 가져오기 위해서 가장 많이 사용한 라이브러리로는 Mybatis일텐데 이번에는 좀 특별(?)히 JPA를 사용해보도록 하겠다.
왜 JPA를 사용하느냐 한다면 몇가지 이유가 있는데 spring-boot-starter-data-jpa 라이브러리를 프로젝트에 추가하면 JPA를 바로 사용할 수 있기 때문이기도 하고 귀찮은 설정작업을 그냥 Properties 파일에 속성을 조금(?) 추가하면 바로 사용이 가능하고 Mybatis를 이용하려면 꽤 많은 수고를 들여야하기도 하지만 Query Mapper를 손으로 일일이 작업해줘야하기 때문이다.(아, 귀찮아)
나도 과거엔 Mybatis를 주로 사용했고 사실 JPA-Hibernate를 이용해 프로젝트를 진행해본게 지난 프로젝트가 2번째에 불과해서 다루기가 꽤 까다로운 부분이 있지만 쓰다보니 느낀 점은 작업 생산속도로는 Mybatis가 JPA-Hibernate를 따라갈 수 없다는게 내 생각이다. 게다가 코딩작업을 진행함에 있어서 XML을 계속 왔다갔다 하면서 손실되는 시간의 양이 프로젝트 종단에 갔을 때 결코 무시할 수 있는 양이 아니라는 점에서 더더욱 JPA-Hibernate로 작업하는 것이 맞겠다고 생각하게 되었다.
물론 좀 더 깊이 설명을 하려면 ORM(Object Relational Mapping)에 대한 같은 근본적인 내용들에 대해서 설명이 들어가야하고 그러기 위해서는 너무 많은 설명이 필요하고 지금 이 포스트의 목적과는 결이 다른 내용이니 다음 기회에 하는 것으로 하고 코드를 좀 진행해보자.
일단 JPA를 사용할 수 있도록 환경을 만들어보자. 먼저 pom.xml에 dependency를 추가하자.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
이렇게 추가를 하고 서버를 재시동하면 아래와 같이 오류가 날 것이다.
뭐 단순하게 설명하자면 database 설정을 안해줬다고 나는 오류다.
그러고보면 Database에서 데이터를 들고 오겠다고 포스팅을 시작해놓고 DB를 준비하지 않았다니..
일단 급한대로 간단하게 MySQL이든 MariaDB든 대충 준비를 하고 적당하게 Schema를 추가하고 Table을 집어넣자. 어떻게 설치하고 만드는지 모른다면 Google에서 검색을 해보고 준비하도록. MySQL Workbench를 이용하면 아주 손쉽게 작업할 수 있다. 어디 보면 콘솔에서 막 Table 만드는 작업을 보여주는 곳도 있는데 우리가 DBA도 아니고 궂이 그런 고생할 필요없다. 어차피 연차 쌓이면 그런 Query 자연스럽게 알게 된다.
나는 아래의 환경으로 DB를 준비했다.
- DB 종류 : MySQL 5.x
- DB 주소 / 포트 : localhost / 3306
- DB 사용자 ID / PW : root / root
- 접속할 DB 명 : sample
그리고 샘플로 user 테이블도 만들어서 데이터도 넣어주었는데 그냥 Workbench 프로그램으로 넣었다.
스크린샷도 대충 찍어놓았으니 따라서 작업하던지 아니면 참고만 하던지.
uid란은 비워두고 나머지를 저렇게 타이핑해서 apply 버튼을 클릭하면 아래의 이미지처럼 창이 하나 등장한다.
그러면 저렇게 날짜가 들어가야하는 부분에 now라는 텍스트가 채워져 있는데 아래의 이미지 처럼 "now()"로 수정한다.
이렇게 수정을 마쳤으면 Apply 버튼을 클릭한다.
짜잔.
위의 작업을 순서대로 진행하면 저렇게 3개의 레코드가 있는 user 테이블을 얻을 수 있다.
이렇게 작업을 했다면 일단 DB도 준비되었고 라이브러리도 추가했으니 properties 파일에 설정 정보를 추가해보자.
properties 파일은 src/main/resource에 application.properties 파일이 있으니 거기에 아래의 내용을 추가한다.
내용이 상당하다. 그래서 타이핑하기 귀찮은 사람들을 위해서 따로 작업해주겠다.
# DataBase Setting
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.url=jdbc:mysql://localhost:3306/sample?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
이건 MySQL 을 위한 설정이다. 이런 설정 내용들이 어떤 의인지 궁금한 사람들이 있을 것 같아서 참고하라고 링크를 달아 놓을 테니 가서 확인해보면 도움이 될거다.(https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html)
과거 Spring boot를 사용하지 않았을 적에는 온갖 xml 설정 파일들을 만들고 ViewResolver부터 시작해서 모든 설정을 해줬어야했는데 Spring boot에서는 몇몇 특수한 경우를 제외하고 저 application.properties 파일에 셋팅을 하면 나머지 처리는 알아서 진행해준다.
이렇게 셋팅을 한 뒤에 다시 서버를 재시작해보면 정상적으로 서버가 기동되는 것을 확인 할 수 있다.
DB 셋팅하느라고 오늘은 시간을 다 보낸 듯 하다.
그러니 내일 마저 포스팅을 하도록 하겠다. 내일은 Repository를 만들고 Service를 만들고 Transaction을 만들어서 DB에서 데이터를 조회하고 입력하고 수정하는 것을 만들어보겠다.
오늘은 여기까지!!(와 힘들다)