스프링부트에서 JPA-MySQL 연동하기 1: 엔티티 설정

2020. 3. 23. 16:27SpringBoot

목차

1. perspective 설정

2. 새 프로젝트 생성

3. application.properties 작성

4. 엔티티 클래스 매핑

 

* Git Repository에 업로드

기존에 MyBatis로 DB를 사용했던 것을 JPA로 전환하려고 한다.

작업한 코드는 여기에 업로드하였다.

 

1. perspective 설정

Spring 선택

 

2. 새 프로젝트 생성

Spring Starter Project 선택

정보 입력

5가지 의존성 추가

 

3. application.properties 작성

# DataSource Setting
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/discountak?characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=사용자이름
spring.datasource.password=비밀번호

# JPA Setting
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.format_sql=true

# Logging Setting
logging.level.org.hibernate=info

참고로 본 프로젝트는 이 책을 참조하였다.

책은 H2를 사용했지만 나는 MySQL을 사용하니 DB 드라이버만 다르게 하고 거의 비슷하게 설정하였다.

여기서, 

spring.jpa.hibernate.ddl-auto=update

update로 설정해야 하는 이유는, 이미 저장해놓은 데이터들이 있는 스키마를 사용하기 때문에 create로 작성하면 테이블이 중복되는 오류가 발생한다.

스프링부트에서 JPA를 사용하기 위한 보다 자세한 설명은 여기에서 볼 수 있다.

@RunWith(SpringRunner.class)
@SpringBootTest
class DiscounbootApplicationTests {

	@Test
	void contextLoads() {
	}

}

src/test/java의 기본 테스트 클래스에 다음과 같이 작성한 후 실행하면 MySQL과 정상적으로 연결됨을 확인할 수 있다.

4. 엔티티 클래스 매핑

JPA는 DB의 테이블이 아닌 엔티티를 통해 데이터를 관리하기 때문에 테이블과 매핑할 엔티티 클래스를 작성해야 한다.

기존 MyBatis를 사용할 때 domain 패키지의 VO 클래스와 비슷한 개념이다.

@Getter
@Setter
@ToString
@Entity
public class User {

	@Id @GeneratedValue
	private String email;
	private String name;
	private String birth;
	private String password;
	@Transient
	private String passwordCheck;
	private String gender;
	@Temporal(value = TemporalType.TIMESTAMP)
	private Date createdAt;

}

@Entity는 User 클래스를 엔티티 처리한다.

@Id, @GenerateValue는 변수 email을 식별자로 처리한다.

@Transient는 특정 변수를 영속 필드에서 제외할 때 사용한다. 테이블에 존재하지 않는 변수이기 때문에 @Transient 처리하였다.

 

자바 애플리케이션으로 프로젝트를 실행하면 정상 작동한다.

 

더보기

에러

user 외의 다른 엔티티 클래스도 작성하고 JUnit 테스트를 실행했더니 갑자기 뜨는 

'no test found with test runner 'junit 5' 에러...

이럴 때에는 침착하게 이클립스를 종료하고 재실행하면 정상 작동된다.

이런 에러 나만 뜨나 ㅋ


지금까지의 작업을 MyBatis와 비교해보고자 한다. MyBatis로 작업을 했다면, 해야 하는 설정이 한두 가지가 아니다.

VO클래스는 공통적으로 작성하였지만, MyBatis 환경에서는 추가적인 작업이 더 필요하다.

먼저 VO의 알리아스를 설정해야 하며,

매퍼파일에 일일이 쿼리를 작성해주어야 하는 번거로움이 있다. 

반면, 프로젝트를 생성할 때 추가해주었던 JPA 의존성으로 인해 생성된 JPA 스타터는 JPA 연동에 필요한 라이브러리들과 복잡한 xml 설정을 자동으로 처리하는 효율성을 가지고 있다. 

 

다음 글에서는 DAO 단을 JPA환경에서 어떻게 작성하는지 알아보고자 한다.

 

* 번외: Git Repository 네이밍

작업한 것들을 Git에 하나씩 올리려다가 문득 레포지토리 네이밍에 대해 생각해보게 되었다.

1. 소문자 사용

2. _(밑줄)이 아닌 -(줄표) 사용

3. 구체적으로 명시하기

4. 일관되게 작성하기

참조한 사이트