Coding Note
JPA로 데이터베이스 다루기! 본문
스프링에서 JPA로 데이터베이스 다루기
1. domain 패키지 생성하고 posts 패키지 생성 후 클래스 인터페이스 생성
도메인(소프트웨어 요구사항)을 담을 패키지를 생성한다.
기존 MyBatis은 쿼리 매퍼를 사용하여 dto 패키지를 떠올리지만 다름.
- Posts 클래스 코드
package com.bs.book.springboot.domain.posts;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@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;
}
}
< 간략히 코드 공부하기 >
@Entity
- 테이블과 링크될 클래스임
- Setter 클래스를 만들지 않음
@Id
- 해당 테이블의 PK 필드를 나타냄
@GeneratedValue
- PK의 생성 규칙을 나타냄
@Column
- 테이블의 칼럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 칼럼이 됨
- 사용하는 이유는 기본 값
@NoArgsConstructor
- 기본 생성자 자동 추가
- public Posts() {}와 같은 효과
@Getter
- 클래스 내 모든 필드의 Getter 메소드를 자동 생성
@Builder
- 해당 클래스의 빌더 패턴 클래스를 생성
- 생성자 상단에 선언시 생성자에 포함된 빌드만 빌더에 포함
- PostsRepository 인터페이스
package com.bs.book.springboot.domain.posts;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {
@Autowired
PostsRepository postsRepository;
@After
public void cleanup(){
postsRepository.deleteAll();
}
@Test
public void 게시글저장_불러오기() {
//given
String title = "테스트게시글";
String content = "테스트본문";
postsRepository.save(Posts.builder()
.title(title)
.content(content)
.author("text@gmail.com")
.build());
//when
List<Posts> postsList = postsRepository.findAll();
//then
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}
}
- PostsRepositoryTest
아래 사진과 동일하게 패키지, 클래스를 생성한다.
package com.bs.book.springboot.domain.posts;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
@RunWith(SpringRunner.class)
//H2 데이터베이스를 자동으로 실행해줌
@SpringBootTest
public class PostsRepositoryTest {
@Autowired
PostsRepository postsRepository;
@After
public void cleanup(){
postsRepository.deleteAll();
}
@Test
public void 게시글저장_불러오기() {
//given
String title = "테스트게시글";
String content = "테스트본문";
postsRepository.save(Posts.builder()
.title(title)
.content(content)
.author("text@gmail.com")
.build());
//when
List<Posts> postsList = postsRepository.findAll();
//then
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}
}
< 간략히 코드 공부하기 >
@After
- Junit에서 단위테스트가 끝날 때마다 수행되는 메소드를 지정함
- 보통은 배포 전 전체 테스트를 수행할때 테스트 간 데이터 침범을 막기 위해 사용함.
- 여러 테스트가 동시에 수행되면 테스트용 데이터베이스인 H2에 데이터가 그대로 남아있어 다음 테스트 실행 시 테스트가 실패할 수 있음
postsRepository.save
- 테이블 posts에 insert/update 쿼리를 실행합니다.
- id 값이 있다면 update, 없으면 insert 쿼리가 실행됩니다.
postsRepository.findAll();
- 테이블 posts에 있는 모든 데이터를 조회
2. 결과
3. 실행된 쿼리는 어떤 형태일까?
src/main/java/resources 디렉토리 아래 파일 생성
spring.jpa.show-sql=true
콘솔에서 쿼리 로그를 확인할 수 있음!!
4. MySQL 쿼리 로그 확인
출력되는 쿼리 로그를 MySQL 버전으로 변경해보자!
application.properties 파일에 아래 코드 추가 후 테스트 코드를 수행하면 잘 적용된 걸 확인할 수 있다.
import org.springframework.boot.autoconfigure.SpringBootApplication;
완성!!
오류는 오답에서 발생했으나 무사히 해결 완성!
'SpringBoot > AWS_PJ' 카테고리의 다른 글
JPA Auditing으로 생성 시간/수정 시간 자동화하기! (0) | 2022.03.08 |
---|---|
등록,수정, 조회 API 만들기! (0) | 2022.03.08 |
JPA 소개하기 및 데이터 베이스 다루기 (0) | 2022.03.07 |
Lombok 설치하기 (0) | 2022.03.01 |
스프링 부트 - 테스트 코드 작성하기! (0) | 2022.02.28 |