반응형

* 이동욱 저자의 스프링 부트와 AWS로 혼자 구현하는 웹서비스 교재 참고

1. 개요

 - JPA란?

 - H2란?

 - JPA 및 H2 설정 및 연동

 - Junit을 사용한 JPA CRUD 테스트

 

2. JPA란?

 - DB 처리를 쿼리 매핑(ex: ibatis, mybatis)이 아닌 객체 매핑으로 처리할 수 있도록 하는 기술

 - ORM (Object Relational Mapping) 기반

 - 기본적인 CRUD(Create, Read, Update, Delete) 메서드 자동 생성

 

3. H2란?

 - 인메모리 관계형 데이터베이스

 - 별도의 설치가 필요 없이 프로젝트 의존성만으로 관리가 가능

 - 메모리에서 실행되기 때문에 애플리케이션을 재시작할 때마다 초기화됨 (테스트용으로 많이 사용)

 

4. JPA 및 H2 의존성 설정 (build.gradle)

1
2
compile('org.springframework.boot:spring-boot-starter-data-jpa'//스프링 부트용 Spring Data Jpa 라이브러리
compile('com.h2database:h2'//h2 라이브러리
cs

 

5. JPA 설정 및 예제

 5.1. 도메인 설정 (Posts.java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Getter
@NoArgsConstructor
@Entity
public class Posts{
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(length = 500, nullable = false)
    private String title;
    
    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;
    
    private String author;
    
    @Builder
    public Posts(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }
}
cs

- @NoArgsConstructor : 클래스에 대한 기본 생성자 메서드 생성

- @Entity : 테이블과 링크될 클래스를 지정하는 어노테이션이며, 언더스코어 네이밍으로 테이블 이름을 매칭

  (ex : PostsManager > posts_manager table)

 

- @Id : PK 필드

 

- @GenerateValue(strategy = GenerationType.IDENTITY) : 자동 인덱스 생성 설정

 

- @Column : 테이블의 컬럼을 나타내며 필요 옵션 추가 시 length, nullable, columnDefinition 등을 사용

  > null을 허용하지 않고 길이가 500인 title 컬럼을 생성 

  > null을 허용하지 않고 TEXT 타입인 content 컬럼을 생성

  > 필드에 Column 어노테이션을 붙이지 않아도 기본적으로 컬럼이 생성됨

 

- @Builder : 해당 클래스의 빌더 패턴 클래스 생성

  > build 패턴 사용시 보다 명시적인 객체 생성이 가능 (PostTestRepository.java 코드의 21번째 줄 참고)

 

 5.2. JpaRepository 설정 (PostsRepository.java)

1
2
3
public interface PostsRepository extends JpaRepository<Posts, Long>//Entity 클래스, PK 타입
 
}
cs

- extends JpaRepository<Entity.class, PK Type> : 기본적인 CRUD 메서드를 지원하는 Repository 인터페이스 생성

 > JpaRepository : DB Layer 접근자를 의미

 > Entity 클래스와 해당 Entity Repository는 같은 패키지에 위치해야함.

 

6. H2 설정 (src/main/resources/application.properties)

1
2
3
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.h2.console.enabled=true
cs

- spring.jpa.show-sql=true : 콘솔 내에서 쿼리 로그를 확인할 수 있도록 하는 설정

- spring.jpa.properties.hibernate.dialect : H2 형태의 쿼리 로그를 MySQL 버전으로 변경

- spring.h2.console.enabled=true : h2 웹 콘솔 사용 허용 (localhost:port/h2-console 으로 접속 가능)

 

7. Junit 테스트 (PostsRepositoryTest.java)

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
@RunWith(SpringRunner.class)
@SpringBootTest //별다른 설정없이 SpringBootTest를 사용할 경우 H2 데이터 베이스를 자동으로 실행
public class PostsRepositoryTest {
 
    @Autowired
    PostsRepository postsRepository;
    
    //After : 테스트 단위가 끝날때마다 수행되는 메서드를 지정하는 어노테이션
    @After
    public void cleanup() {
        postsRepository.deleteAll();
    }
    
    @Test
    public void 게시글저장_불러오기() {
        
        String title = "테스트 게시글";
        String content = "테스트 본문";
        
        //builder 클래스를 통해 생성자 생성 후 save (insert/update)
        postsRepository.save(Posts.builder()
                                .title(title)
                                .content(content)
                                .author("sksim@gmail.com")
                                .build());
        
        List<Posts> postsList = postsRepository.findAll();
        Posts posts = postsList.get(0);
        assertThat(posts.getTitle()).isEqualTo(title);
        assertThat(posts.getContent()).isEqualTo(content);
    }
}
cs

- @SpringBootTest : H2 데이터 베이스 자동 실행 

 

- postsRepository.save() : posts 테이블에 insert/update 쿼리 실행

  > id 값이 있다면 update, 없다면 insert

 

- postsRepository.findAll() : posts 테이블에 있는 모든 데이터를 조회

 

- assertThat, isEqualTo : assertJ에서 지원하는 테스트 메서드

 

8. H2 콘솔 접속 방법

 8.1. localhost:port/h2-console 을 입력하여 H2 웹 콘솔 접속 및 JDBC URL 입력 후 Connect

H2 웹 콘솔 접속 정보 입력

 

 8.2. DB 접속 및 Entity 객체와 매핑된 테이블 확인

H2 웹 콘솔 접속 성공

  * Junit 테스트 시 11번째 줄의 deleteAll()을 주석처리하면 posts 테이블에 데이터가 들어가는 것을 확인할 수 있음

반응형

+ Recent posts