끄적끄적 코딩일지

[Spring 기초] JPA 사용하기 본문

Spring

[Spring 기초] JPA 사용하기

BaekGyuHyeon 2022. 6. 1. 13:17

JPA란?

Java Persistance API의 약자로 ORM(Object-Relational-Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. Java를 사용해서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스로써 SQL를 사용하지 않아도 Database의 CRUD가 가능하다는 특징이 있다. 

ORM(Object-Relational Mapping)

일반적으로 알고 있는 Class와 database의 Table을 연결한다는 의미이며, Java의 Class를 RDB(Relational Database)의 

Table으로, 해당 Class가 가지고 있는 속성을 Column으로, 객체 들을 Table의 Row으로 연결해준다. JPA를 구현한 ORM 프레임워크중 대표적으로 Hibernate가 있다.


JPA 장점

  • SQL문을 몰라도 Method조작으로 CRUD를 수행할 수 있다. -> 개발자는 비즈니스 로직에만 집중하면 된다.
  • Mapping 정보가 Class으로 되어있기 때문에 설계도를 보는 의존도를 낮출 수 있고 유지보수와 재설계에 유리하다.. -> Table에 변경이 있어도 Query문등을 사용할 필요 없이 Class에서 수정만 해주면 된다.
  • 자체적인 SQL문을 사용하여 Database들 간의 SQL의 형식 차이와 상관없이 사용 가능하다. -> MySQL과 PostgreSQL간의 SQL 형식 차이가 있지만 설정정보만 수정하면 다른 Database으로 연결해도 문제없이 작동한다.
  • Query와 같이 필요한 선언문, 할당등의 부수적인 코드가 줄어들어, 각종 객체에 대한 코드를 별도로 작성하여 가독성은 높인다.

JPA 단점

  • 설계가 잘못될 경우 속도 저하 및 일관성을 무너뜨릴수 있다.
  • 복잡한 Query는 Method단위에서 처리를 하지 못하기 때문에 결국 SQL문을 써야할수도 있다.

Spring에서 JPA 사용하기

Spring 프레임워크를 사용할때 Database등에 연결을 해서 사용할 일이 많다. 때문에 JPA를 사용해서 개발하는 경우가 많은데 Spring에서는 이를 쉽게 사용할 수 있는 Spring Data JPA 모듈을 개발하여 JPA를 쉽게 쓸수 있도록 해주고 있다.

 


사용 예시에서 Step1, Step2등의 JPA를 사용하기 위한 설정정보는 Spring Boot 기준으로 설명합니다.


Step 1. 필요한 라이브러리 추가하기

Spring JPA를 사용하기 위해서는 최소한 2가지 모듈이 필요하다.

1. spring-boot-starter-data-jpa (JPA 라이브러리가 내장되어 있다.)

2. 사용하고자 하는 Database의 JDBC driver

※ spring-boot-starter-.... 라이브러리는 자동으로 해당 spring boot 버전에 맞는 버전의 라이브러리를 제공해준다. 

 

Maven을 사용하는 프로젝트라면 최상위 폴더에 있는 pom.xml 수정

...
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
<dependency>
<!-- MySQL driver -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>
<!-- PostgreSQL driver -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.3.3</version>
</dependency>

Gradle을 사용하고 있으면 build.gradle 수정

dependencies{
	...
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    // mysql
    implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.28'
    // postgresql 
    implementation group: 'org.postgresql', name: 'postgresql', version: '42.3.3'
}

※ spring boot initializer을 사용해서 JDBC driver을 선택했다면 자동으로 버전을 선택해 주겠지만 위처럼 본인이 스스로 버전을 선택한 경우 Spring boot 버전과 JDBC driver 버전이 서로 호완되는지 확인해야 한다. 버전은 아래 사이트에서 {Database} JDBC으로 검색하여 확인하면 된다.

https://mvnrepository.com/artifact/com.oracle.jdbc

 

Maven Repository: com.oracle.jdbc

OJDBC7 Last Release on May 21, 2019

mvnrepository.com

 

Step 2. database 연결 정보 추가하기

그다음 application.properties, application.yml 등의 spring 프로젝트 설정 파일에 연결할 database 정보를 추가한다. application.properties 기준으로 설명을 하면,

spring.datasource.driver-class-name={사용하는 Datbase jdbc driver 이름}
spring.datasource.url={Database URL} 
// ↑ ex) jdbc:mysql://localhost:3306/testdb -> 본인 컴퓨의 mysql의 testdb라는 db에 연결 
spring.datasource.username={database 계정 이름}
spring.datasource.password={database 계정의 비밀번호}

 

그 밖에도 여러가지 설정이 있지만 JPA를 사용하기 위한 최소한의 설정은 위와 같다.

※ h2 database를 사용할경우 spring.datasource.url만 있어도 된다.

 

Step 3. Entity 설계하기

다음으로 Database Table과 메핑될 Class를 설계하면 된다.

※ Entity란 업무상 관리가 필요하고 저장이 되는 사람, 장소, 물건, 사건, 개념등과 같은 명사를 지칭한다. 단순히 말하자면 Database에 저장이 될 정보를 의미하는것.

 

@Entity
@Getter // Getter, Setter은 Lombok 라이브러리이다. 각 변수의 Getter, Setter Method를 만들어준다.
@Setter
public class Person{
    @ID
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;
    
    @Column
    private String name;
    
    @Column
    private int age;
    
    @Column
    private boolean isMale;
}

 

@ID으로 해당 변수가 PK(Primary key)라는것을 지정하고 

@GeneratedValue를 통해 자동생성, 생성전략은 IDENTITY, 고유키 생성전략을 사용한다. 이는 MySQL의 AUTO_INCRESEMENT와 같은 역할을 한다.

 

그다음 Table의 Column과 연결할 변수들을  @Column을 사용하여 선언을 해주면 된다.

 

Step 4. Repository 만들기

@Repository
public interface PersonRepo extends JpaRepository<Person,Long>{ // 사용할 Entity, PK(ID) 데이터 타입
    @Query("Select this from Person this where this.isMale=:isMale") // 쿼리문을 정의해서 쓸수도 있다.
    public List<Person> getPersons(@Param("isMale")boolean isMale);
    
    //규칙에 맞게 Method이름을 만들면 자동으로 Query문을 정의하지 않아도 된다.
    public List<Person> findAllByIsMale(boolean isMale);
}

@Repository를 선언해서 직접적인 CRUD를 하는 Bean임을 선언언후 JpaRepository를 extends하는 interface를 만들기만 하면된다. save, delete, find등 기본적인 CRUD는 따로 정의하지 않아도 쓸 수 있으므로 그 외 필요한 method나 query를 정의하기만 하면 된다.

여기까지 만들었다면 해당 Bean을 불러서 사용하기만 하면 끝. 

Bean을 등록하고 사용하는 방법은 아래 글을 참고하면 된다.

2022.05.30 - [Spring] - [Spring 기초] Bean 등록 및 사용하기(Autowired)

 

[Spring 기초] Bean 등록 및 사용하기(Autowired)

Bean 등록방법 Spring에서 Bean을 등록하는 방법은 크게 xml 파일을 사용하는 방법과 Annotation을 사용하는방법 2가지로 나뉜다.(최근에는 Annotation을 사용하는 방법이 주로 쓰인다.) xml 파일으로 등록하

blablacoding.tistory.com