* 이동욱 저자의 스프링 부트와 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
8.2. DB 접속 및 Entity 객체와 매핑된 테이블 확인
* Junit 테스트 시 11번째 줄의 deleteAll()을 주석처리하면 posts 테이블에 데이터가 들어가는 것을 확인할 수 있음
'공부 > 스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 카테고리의 다른 글
[스프링 부트] 4. Argument Resolver란 / 예제 (0) | 2021.04.21 |
---|---|
[스프링 부트] 2. Lombok 설치 및 STS 연동, Controller & Dto 클래스 생성 및 Junit 테스트 (0) | 2021.04.15 |
[스프링 부트] 1. Gradle 프로젝트 생성 및 build.gradle 작성 (2) | 2021.04.14 |