SPRING/스프링부트 개념과 활용

[스프링부트 개념과 활용] JPA 연동

JUMP개발자 2021. 1. 11. 00:45

ORM

Object Relational Mapping의 약자. 

객체와 릴레이션을  mapping 할 때 발생하는 개념적인 불일치를 해결하는 프레임워크.

 

JPA

Java Persistence API의 약자.

여러가지 ORM 해결책들 중에서 자바에 대한 표준을 정한 것을 말한다. 

 

예제 

 

Pom.xml 의존성 추가 

<dependency>
  	<groupId>org.springframework.boot</groupId>
  	<artifactId>spring-boot-starter-data-jdbc</artifactId>
</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-web</artifactId>
</dependency>
<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

Entity 구현

package com.springstudy.jpa.account;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.util.Objects;

@Entity
public class Account {
    // Id : PRIMARY KEY
    // GeneratedValue : 자동증가값
    @Id @GeneratedValue
    private Long id;

    private String username;

    private String password;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Account account = (Account) o;
        return Objects.equals(id, account.id) &&
                Objects.equals(username, account.username) &&
                Objects.equals(password, account.password);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, username, password);
    }



}

Getter, Setter 외에 equals와 hashCode도 생성하는 것이 좋다.

package com.springstudy.jpa.account;

import org.springframework.data.jpa.repository.JpaRepository;

public interface AccountRepository extends JpaRepository<Account, Long> {
	// Username을 조건으로  Select하는 method
    Account findByUsername(String username);
}

JpaRepository를 extends하여 Respository interface를 생성한다.

(JpaRepository 상속시 @Repository 를 추가할 필요 없음)

JpaRespository<'entityType', 'id Type'>

또한 findByUsername과 같이 규칙에 맞는 메서드를 추가할 수 있다.

 

Application.properties

spring.datasource.hikari.maximum-pool-size=8
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/prj_m
spring.datasource.username=root
spring.datasource.password=

TestCASE

위 테스트케이스와 같이 슬라이스 테스트를 하려면 인메모리 데이터 베이스를 사용해야한다.

해당 케이스에서는 H2를 사용하였다.

 

로그를 보면 테이블 생성,  Insert, Select 등의 쿼리가 실행되는 것을 알 수 있다.

 

Runner를 이용한 JPA 로직 실행 (MYSQL)