본문 바로가기

 

 

스프링 부트 ( Spring boot ) JPA를 이용하여 DB에 접근하여 데이터를 활용해보자

 

스프링

 

오늘은 JPA를 이용하여 DB에 접근하여 데이터를 가져오는 방법에 대해서 알아보도록 하겠습니다.

스프링 부트에서는 JPA 를 이용하여 DB에 접근하는 방법을 권유하고 있습니다. 

JPA를 이용하기 위해서는 maven (메이븐) 을 이용하거나 gradle(그레들) 을 이용하여 패키지를 관리합니다

여기서는 maven을 이용하여 패키지를 관리하도록 하갰습니다.

아래에 보이는 spring-boot-starter-jdbc, spring-boot-starter-data-jpa 를 추가합니다.

https://postgresql.kr/docs/ 공식한글문서

https://postgresql.kr/docs/

또한 이번에는 PostgreSQL 포스트그레스큐엘을 사용해 보도록 하겠습니다.

프로젝트를 생성합니다.

2018/08/09 - [IT/Spring Boot] - 스프링 부트 ( Spring boot ) 프로젝트 생성하기 부터 실행하기

 

스프링 부트 ( Spring boot ) 프로젝트 생성하기 부터 실행하기

첫 Spring boot 프로젝트 생성하기 부터 실행하기 Spring boot 카테고리가 생성되었습니다!!! 그런 의미에서 몇 단계로 나누워 스프링 부트를 사용하면서 알게된 정보들과 사용법들을 남기고자 카테고리를 생성하..

kingname.tistory.com

이후에 pom,xml에 postgresql dependency를 아래와 같이 추가해 줍니다.

현재 디렉토리 구조는 아래와 같습니다.

디렉토리 초기 구조

pom.xml

	<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>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

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

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>

 

이후 application.properties 파일에 들어가서 서버에 대한 설정을 진행합니다.

# 데이터베이스 주소
spring.datasource.url=jdbc:postgresql://localhost:5433/springboot
# 데이터베이스 아이디
spring.datasource.username=kingname
# 데이터베이스 비밀번호
spring.datasource.password=1234

# jpa 설정
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false

 

설정에 대해서 하나씩 알아보도록 하겠습니다.

우선 데이터베이스주소는 연결할 데이터베이스의 URL 값을 넣어주셔야합니다.

2020/04/01 - [분류 전체보기] - 각 데이터베이스(DB) 별 드라이버명과 URL 주소 모음

불러오는 중입니다...

DDL generation

Spring은 EntityScan을 통해 @Entity 애노테이션을 사용한 클래스를 찾습니다.

spring.jpa.generate-ddl=true 옵션을 true로 설정하면 해당 데이터를 근거로 서버 시작 시점에 DDL문을 생성하여 DB에 적용됩니다.

대부분 구현체로 Hibernate를 사용하기 때문에 spring.jpa.hibernate.ddl-auto 옵션을 통해서 보다 상세한 데이터베이스 초기화 전략을 설정할 수 있습니다.

다음 목록중 하나를 spring.jpa.hibernate.ddl-auto 을 설정할 수 있는 값은 아래와 같습니다.

  • none: 아무것도 실행하지 않는다 (대부분의 DB에서 기본값이다)
  • create-drop: SessionFactory가 시작될 때 drop및 생성을 실행하고, SessionFactory가 종료될 때 drop을 실행한다 (in-memory DB의 경우 기본값이다)
  • create: SessionFactory가 시작될 때 데이터베이스 drop을 실행하고 생성된 DDL을 실행한다
  • update: 변경된 스키마를 적용한다
  • validate: 변경된 스키마가 있다면 변경점을 출력하고 애플리케이션을 종료한다

 

spring.jpa.generate-ddl

다음으로는 spring.jpa.generate-ddl 을 true로 사용했을 경우입니다.

이 경우에는 @Entity 어노테이션이 붙은 클래스를 찾아서 ddl을 생성하고 실행합니다.

 

spring.jpa.show-sql

해당 설정은 사용되는 SQL문을 로그에서 확인할 수 있습니다.

참고하기위한 링크또한 남겨두겠습니다.

https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/#boot-features-jpa-and-spring-data

 

Spring Boot Reference Guide

This section dives into the details of Spring Boot. Here you can learn about the key features that you may want to use and customize. If you have not already done so, you might want to read the "Part II, “Getting Started”" and "Part III, “Using Spring Boot

docs.spring.io

 

 

설정을 모두 정상적으로 마칠 경우 스프링 부트가 정상적으로 실행됩니다.

이후 아래와 같이 account 라는 폴더하나를 만들고 Account 클래스와 AccountRepository 라는 인터페이스를 만들어 보겠습니다.

 

Account.java

package com.kingname.springbootjpa.account;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Data
public class Account {

    @Id
    @GeneratedValue
    private Long id;

    private String username;

    private String password;

    private boolean isActive;

    private String email;

}

위에서 옵션을 보면 어떤 어노테이션을 사용해야하는지 감이 잡혔을 겁니다.

이후 간단한 변수를 생성해줍니다.

@Id 어노테이션으로 PK 값을 성정합니다.

 

AccountRepository.java

package com.kingname.springbootjpa.account;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {

    //@Query(nativeQuery = true, value = "select * from account where username = '{0}'")
    Account findByUsername(String username);
}

JPA 를 사용하기 위해서 AccountRepository 를 꼭 만들어 주어야합니다.

@Repository 어노테이션을 추가한뒤에 JpaRepository<Account, Long> 을 상속받아서 사용하면 됩니다.

<> 안에 Account 클래스와 사용되는 PK의 자료형을 넣어줍니다.

지원 가능한 오버라이팅 함수들

JPA 에서는 각 이름에 맞는 기능을 지원하고 있습니다.

또한 Account findByUsername(String username) 의 변수명을 작성합니다.

메소드 명의 작성방법은 아래에 표에 나와있습니다.

위 방법은 username을 통해서 account 테이블에 있는 데이터를 찾는 방법입니다.

 

KeywordSampleJPQL

And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = 1?
Between findByStartDateBetween … where x.startDate between 1? and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age ⇐ ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1(parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1(parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1(parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> age) … where x.age not in ?1
True findByActiveTrue() … where x.active = true
False findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

 

 

 

 

이후 DB에서 데이터를 확인하거나 Main 함수애서 로그를 추가하여 데이터를 확인해 보고 데이터가 잘 찾아와 졌다면

정상적으로 데이터를 불러와 사용할 수 있게 되었습니다.

 

그럼 다음 포스팅에서 또 만나도록 하겠습니다.

이 글이 도움이 되었다면 아래에 공감과 +a 꾹!

엉망진창

개인 블로그 입니다. 코딩, 맛집, 정부정책, 서비스, ~방법 등 다양한 정보를 소개합니다