스프링 부트 ( Spring boot ) JPA를 이용하여 DB에 접근하여 데이터를 활용해보자
오늘은 JPA를 이용하여 DB에 접근하여 데이터를 가져오는 방법에 대해서 알아보도록 하겠습니다.
스프링 부트에서는 JPA 를 이용하여 DB에 접근하는 방법을 권유하고 있습니다.
JPA를 이용하기 위해서는 maven (메이븐) 을 이용하거나 gradle(그레들) 을 이용하여 패키지를 관리합니다
여기서는 maven을 이용하여 패키지를 관리하도록 하갰습니다.
아래에 보이는 spring-boot-starter-jdbc, spring-boot-starter-data-jpa 를 추가합니다.
또한 이번에는 PostgreSQL 포스트그레스큐엘을 사용해 보도록 하겠습니다.
프로젝트를 생성합니다.
2018/08/09 - [IT/Spring Boot] - 스프링 부트 ( Spring boot ) 프로젝트 생성하기 부터 실행하기
이후에 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문을 로그에서 확인할 수 있습니다.
참고하기위한 링크또한 남겨두겠습니다.
설정을 모두 정상적으로 마칠 경우 스프링 부트가 정상적으로 실행됩니다.
이후 아래와 같이 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 꾹!