Old Branch

Spring Project 스프링 프로젝트 시작하기 - Spring Boot JPA

woolbro 2019. 7. 13. 11:30
반응형

이번 포스팅은 Spring Boot 의 JPA에 관해서 적어보려고 합니다.

 

이전 포스팅들에서 Mybatic, JDBC 을 사용했었는데요, 이 JPA라는것이 무엇일까??? 라는 질문으로 포스팅을 시작해 보도록 하겠습니다!

 


JPA란 무엇인가?

JPA는 자바 진영의 ORM 기술 표준입니다. 애플리케이션과 JDBC 사이에서 동작 하는데요, 자바 퍼시스턴스 API(Java Persistence API,JPA)는 관계형 데이터베이스에 접근하기 위한 표준 ORM 기술을 제공합니다. 이를 구현한 구현체로는 Hibernate, OpenJPA, EclipseLink 와 같은것들이 있고 이에 따른 표준 인터페이스가 바로 JPA인 것 입니다!!

 

..... 그럼 ORM은..?

 

ORM

객체와 관계형 데이터베이스를 매핑합니다. 이전에 사용했었던 ibatis나 mybatis는 SQL 구문을 Mapping 하여 실행하는 매퍼이지 ORM이 아닙니다. ORM 기술 표준을 구현한  프레임워크는 위에 언급한 하이버네이트가 대표적이에요. 아래의 예제에서 하나씩 살펴보도록 하겠습니다.

 

 

WHY  JPA???

아래의 장점들이 JPA가 가진 장점들입니다!

생산성 : 반복적인 SQL을 작업과 CRUD 작업을 개발자가 직접안해도 됨

유지보수 : 객체의 수정에 따른 SQL 수정 작업을 개발자가 직접안해도 됨

패러다임 불일치 해결 : 객체와 관계형 데이터베이스를 매핑하는 과정에서 발생하는 문제를 개발자가 직접 안해도 됨

성능 : 캐싱을 지원하여 SQL이 여러번 수행되는것을 최적화 함

등이 있습니다.

 

 


 

이전 챕터에서 JDBC, Mybatis를 사용해 연결했던 프로젝트를 JPA로 수정하면서 구조를 알아보도록 하겠습니다.

아래는 이전포스팅입니다 :)

[Java/Spring-framework] - Spring Project 스프링 프로젝트 시작하기 - JDBC ,mysql,mybatis(1)

[Java/Spring-framework] - Spring Project 스프링 프로젝트 시작하기 - JDBC,mysql,mybatis(2)

 

Spring Project 스프링 프로젝트 시작하기 - JDBC,mysql,mybatis(2)

[Java/Spring-framework] - Spring Project 스프링 프로젝트 시작하기 - JDBC ,mysql,mybatis(1) Spring Project 스프링 프로젝트 시작하기 - JDBC ,mysql,mybatis(1) [Java/Spring-framework] - Spring Project..

woolbro.tistory.com

 


Spring JPA

Spring JPA를 사용하기 위해서는 우선, datasource와 dependency를 설정 해 주어야 합니다.

 

1. dependency 설정

pom.xml에 spring-boot-starter-data-jpa를 추가 해줍니다.

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

 

2. datasource 설정

JPA도 JDBC와 마찬가지로 datasource 설정을 통해 데이터베이스와 연결을 진행합니다.

application.properties를 수정 해 줍니다.

 

#datasource setting
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/wooldev?characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver

 

3. Entity 설정

ORM의 정의를 보면서, 우리가 사용 했었던 VO가 비슷한 역할을 했다는 것을 알 수 있습니다!!

VO가 데이터를 객체화 시켜 전달하는 역할을 해 주었었는데,  JPA에서는 VO처럼 Entity를 설정해서 최대한 정확히 매핑을 시켜 사용합니다. 어디한번 보시죠~~

 

이전의 VO클래스에서 선언했던 변수들을 한번 보겠습니다.

String title;
String contents;
String date;
String author;
String type;

위의 변수들을 JPA를 사용하여 Entity로 사용해보도록 하겠습니다.

Column Datatype
id INT
title VARCHAR(200)
contents VARCHAR(2000)
date DATETIME
author VARCHAR(50)
type VARCHAR(45)

 

아래는 JPA Entity를 적용한 News.java 파일입니다.

News.java

 

package com.woolbro.dev.vo;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity

@Table(name="T_NEWS")
public class News {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @Column(length = 200, nullable = false)
    private String title;
    @Column(length = 2000, nullable = false)
    private String contents;
    @Column(nullable = false)
    private Date date;
    @Column(length = 50, nullable = false)
    private String author;
    @Column(length = 45, nullable = false)
    private String type;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContents() {
		return contents;
	}
	public void setContents(String contents) {
		this.contents = contents;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
 
}

 

위의 Getter/Setter 를 컬럼 값 마다 모두 지정 해 주었는데요, 소스코드가 지저분하고 길어지는 이유가 되기도 합니다.

물론 이 VO를 오래 보지는 않을 것이지만, Getter/Setter를 간단하게 설정 해 주는 기능이 있습니다.

 

바로, Lombok 을 이용하는 것인데요, pom.xmllombok을 적용 하고 코드를 수정 해 보겠습니다.

pom.xml

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

News.java

package com.woolbro.dev.vo;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;

@Entity
@Table(name="T_NEWS")
@Data
public class News {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @Column(length = 200, nullable = false)
    private String title;
    @Column(length = 2000, nullable = false)
    private String contents;
    @Column(nullable = false)
    private Date date;
    @Column(length = 50, nullable = false)
    private String author;
    @Column(length = 45, nullable = false)
    private String type;
	
  
}

위의  Getter/Setter가 있었던 코드보다, lombok을 추가 한 후 사용 해준 코드가 훨씬 보기 간결하고 깔끔하죠~~

 

4. DAO, Service 설정

JDBC를 사용 할 때에는 JDBC, SqlSession Template를 사용하여 SQL을 직접 실행 시켰었습니다.

그러나 JPA를 사용 할 때에는, 위의 Entity 설정 단계만 진행 해 주면, findById, findAll, save 등의 기본적인 메서드형 데이터 처리가 가능하며 원하는 메서드 또한 추가가 가능합니다.

 

NewsDao.java를 수정 해 보겠습니다.

이전의 NewsDao.java는 아래와 같습니다.

public interface NewsDao {
	
	public List<News> getNews();
	
	public void setNews();
	
}

이 NewsDao에 JpaRepository를 확장하여 구현 해 보도록 하겠습니다.

 

public interface NewsDao extends JpaRepository<News, Integer> {

    List<News> findByType(String type);

    @Query("select n from News n where n.type = :type")
    List<News> findCategoryNews(String type);

}

 

 

 

위와같이 JPA를 사용하여 JDBC 설정보다 좀더 간편하고 객체화시켜서 데이터베이스에서 원하는 데이터들을 잘 조회한것을 확인 할 수 있습니다. 새로운 메서드를 작성하고 싶을때는 Sql을 작성하는것처럼 메소드 이름에 키워드를 조합하여 원하는 데이터 관리가 가능하며, SQL처럼 사용 가능한 JPQL 쿼리문을 사용하여 데이터관리도 가능합니다.