본문 바로가기
Spring

Spring boot + JPA (1)

by 하르싼 2022. 9. 26.
반응형

목적

JPA 개념정리 및 사용법

 

정리하게된 계기

기존에는 Mybatis 를 사용하였는데 새프로젝트에서 JPA 를 사용하게되어 정리

 

 

JPA (Java Persistence API)

자바 ORM 을 위한 표준기술로 Hibernate, Spring JPA 와 같은 구현체가 있고 이것의 표준인터페이스

 

장점으로는 Mybatis 프로젝트와 비교하면 코드량이 줄고 객체위주 코드가 작성됨으로 가독성이 좋아지고

특정 데이터베이스에 종속되지 않는다.

 

단점으로는 복잡한 쿼리처리,성능저하위험,학습시간등 이있는데 복잡한 쿼리는 QueryDSL로 처리가 가능한거 같다.

개발환경
OS 윈도우10
Jdk 1.8
Framework Spring Boot 2.7.0
DB mysql 8.0

패키지 구조

 

의존성추가

1
2
3
4
5
6
7
8
9
10
11
12
13
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
cs

application.properties (Mysql 없이 H2를 이용하여 진행하여도 무관)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#JMX
spring.jmx.enabled=false
 
#mysql
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/dev
spring.datasource.username=lhj
spring.datasource.password=aaaa
 
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.hibernate.ddl-auto=update
 
cs

Member Entity (여기서는 Lombok을 활용하였음)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.healthofficer.domain.member;
 
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;
import org.springframework.util.Assert;
 
import javax.persistence.*;
 
@Entity
@Getter
@NoArgsConstructor
public class Member {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
 
    @Builder
    public Member(int id,String name){
        Assert.notNull(name, "name must not be null");
 
        this.id = id;
        this.name = name;
    }
}
cs

@Builder : JPA를 이용하면 Entity는 BUilder 기반으로 생성하는게 안전한 객체를 생성하는 방법

 

MemberRepository

1
2
3
4
5
import com.healthofficer.domain.member.Member;
import org.springframework.data.jpa.repository.JpaRepository;
 
public interface MemberRepository extends JpaRepository<Member, Integer> {
}
cs

JpaRepository를 상속하여 Spring Data Jpa 에서 제공하는 JPA 구현을 위한 인터페이스이며

사전에 정의된 여러메소드를 통해 CRUD 쿼리를 수행

 

DataJpaTest

테스트코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.healthofficer;
 
import com.healthofficer.dao.MemberRepository;
import com.healthofficer.domain.member.Member;
 
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
 
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.annotation.Commit;
import org.springframework.test.context.junit.jupiter.SpringExtension;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
 
import java.util.List;
 
@ExtendWith(SpringExtension.class)
@DataJpaTest
@Commit
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class 맴버등록_TEST {
 
    @Autowired
    MemberRepository memberRepository;
 
    @BeforeEach
    void 맴버등록(){
        for(int i = 0; i < 5; i++){
            Member m = Member.builder().name("name_"+i).build();
            memberRepository.save(m);
        }
    }
 
    @Test
    void 맴버확인(){
        List<Member> result = memberRepository.findAll();
 
        assertEquals(result.size(), 5);
    }
 
    //@AfterEach
    //void 맴버삭제(){
    //    memberRepository.deleteAll();
    //}
}
cs

실행결과 DB 확인

반응형

댓글