개인취향 JPA 사용기 1편 — SpringBoot + JPA + Gradle

안녕하세요? gemini 입니다.

저는 레저큐 라는 스타트업에서 가자고라는 서비스를 개발 및 운영하고있습니다.

가자고 서비스는 Spring Boot + JPA/Hibernate 기반으로 개발이 되어있습니다.

저의 경우는 약 2년 정도 JPA와 함께하고 있기에, 그 과정에서 여러가지 생각과 경험을 했습니다.

그 생각들과 경험 + 제 개인의 취향대로 JPA를 사용하여 작은 프로젝트를 만들어 보려 합니다.

먼저 오늘은 Spring Boot + JPA + Gradle 프로젝트 설정을 해볼 것입니다.

Spring Boot 프로젝트 생성을 진행합니다.

프로젝트 설명은 편하게 작성합니다. 저는 개인적으로 Maven 보다는 Gradle 을 선호합니다.

프로젝트 생성 후 필요에 따라 추가하면 되기 때문에 무시하셔도 됩니다만, 전 그냥 눈에 들어오는 것만 체크하였습니다.

자 이제 프로젝트가 생성되었습니다. 시작이 반인데 벌써 끝나갑니다.

프로젝트 생성 후 build.gradle 을 확인해봅니다. 조금 길고 뭐가 필요한지도 모르겠습니다.
그래서 저는 아래와 같이 수정하였습니다. 모르는 건 일단 지우고 필요할 때 추가하면 될 것 같습니다.

buildscript {
ext {
springBootVersion = '1.4.0.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'spring-boot'
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
runtime('mysql:mysql-connector-java')
testCompile('org.springframework.boot:spring-boot-starter-test')
}

필요에 따라 부가적인 의존성을 추가합니다, Boot 1.4가 릴리즈 되고 Hibernate 버전이 5.0.9.Final 으로 올라왔습니다.
Boot 1.3.x로 설정할 때에는 Hibernate 버전을 강제로 올려줬습니다만, 버전 명시를 생각 없이 늘리다 보면 Boot를 사용한 의미가 퇴색되는 것 같기에 가능한 지양합니다.

application.properties 을 설정합니다, 일단 저는 최소한의 설정을 넣어봤습니다.

spring.datasource.username=sample
spring.datasource.password=sample
spring.datasource.schema=sample
spring.datasource.url=jdbc:mysql://localhost/${spring.datasource.schema}
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.format_sql=true

Spring Context가 잘 load 되는지 contextLoads 테스트를 돌려봅시다.

별문제 없이 테스트가 통과하였네요. JPA를 올바르게 쓰는 과정에서 테스트가 중요하다 생각합니다.

앞으로 어떤 것을 만들지 잘 모르겠으나, 장바구니고객 객체가 존재한다고 생각해보겠습니다.
대략 이런 형태로 존재하겠지요.

@Entity
public class Cart {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
        @Column(length = 50, nullable = false)
private String title;
        public Long getId() {
return id;
}
        public String getTitle() {
return title;
}
        public void setTitle(String title) {
this.title = title;
}
}
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
        @Column(length = 20, nullable = false)
private String name;
        @Column(length = 20, nullable = false, unique = true)
private String phone;
        public Long getId() {
return id;
}
        public String getName() {
return name;
}
        public void setName(String name) {
this.name = name;
}
        public String getPhone() {
return phone;
}
        public void setPhone(String phone) {
this.phone = phone;
}
}

왜 `id` 필드는 `getter` 만 만들었는지, `lombok`은 몰라서 안 쓰는 건지 궁금하실 수도 있으실 겁니다만

해당 내용은 다음 편에 적도록 하겠습니다.

그럼 이제 Boot를 `Run` 시켜봅니다.

정상적으로 동작한 것처럼 보이네요, 다행입니다.

충분히 예상 가능하지만 무슨 일이 벌어졌나 DB Tool을 실행시켜 테이블 목록을 한번 확인해봅니다.

CREATE TABLE `cart` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`phone` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UK_du5v5sr43g5bfnji4vb8hg5s3` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

객체만 만들었을 뿐인데 상응하는 테이블이 잘 만들어졌습니다.

몇몇 설정들도 제가 원하는 대로 적용된 것 같네요, 다음 편에서는 이러한 JPA 설정과 객체 설계에 대한 생각을 공유해보겠습니다.
피드백은 언제나 환영합니다. geminikims@gmail.com

두서없는 글 읽어주셔서 감사합니다.

Originally published at gemini.zone on August 30, 2016.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.