-
8. 스프링부트와 AWS - JPA 시작하기실습/AWS 2021. 5. 5. 09:00
프로젝트에 Spring Data JPA 적용하기
우선 build.gradle에 의존성을 등록한다.
- spring-boot-starter-data-jpa:
스프링부트용 Spring Data Jpa 추상화 라이브러리.
스프링부트 버전에 맞춰 자동으로 JPA 관련 라이브러리들의 버전을 관리해준다.
- h2:
인메모리 관계형 데이터 베이스.
별도의 설치가 필요없이 프로젝트 의존성만으로 관리할 수 있음.
메모리에서 실행되므로 애플리케이션 재시작때마다 초기화되므로 테스트에 많이 이용됨.
해당 실습에선 JPA 테스트, 로컬환경 구동에서 사용 예정
domain 패키지 생성
해당 경로에 우선 domain 패키지를 생성한다.
해당 패키지는 도메인을 담을 패키지로서 사용된다.
이때 도메인은 myBatis의 dao와 비슷한 역할을 하는데 이보다 조금 더 확장된 개념이라 보면 편하다.
Posts 패지키 및 클래스 생성
domain패키지를 생성했다면 다음은 위와 같은 경로로 domain패키지 안에 posts 패키지를 생성한다.
그리고나서 그 안에 Posts 클래스를 생성한다.
해당 클래스는 실제 DB의 테이블과 매칭되는 클래스이며 보통 Entity 클래스라고도 한다.
JPA를 사용하면 DB데이터를 조작할 때 쿼리를 사용하는게 아니라 이 Entity클래스 수정을 통해 작업한다.
이제 본격적으로 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클래스라고 보면 된다.
간단히 어노테이션에 대해 설명하면 다음과 같다.
우선 JPA를 통해 제공되는 어노테이션은 다음과 같다
- @Entity: 테이블과 연결되는 클래스임을 나타냄.
기본값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍( _ )으로 테이블 이름을 매칭함.
예를 들어 SaleManager.java => sales_manger table.
- @Id: 해당 테이블의 pk(PRIMARY KEY) 필드를 나타냄.
- @GeneratedValue: PK 생성 규칙을 나타냄.
스프링부트 2.0에선 GenerationType.IDENTITY 옵션을 추가해야 auto_increment(자동 숫자 증가)가 적용됨.
- @Column: 테이블의 칼럼을 나타냄
다만 이를 굳이 선언하지 않아도 해당 클래스의 필드는 모두 칼럼이 됨.
이 어노테이션을 사용하는 이유는 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용함.
문자열의 경우 VARCHAR(255)가 기본값인데, 사이즈를 늘리고 싶거나 타입을 바꾸고 싶을 때 사용함.
참고로 Entity의 PK(Primary Key)는 Long타입의 Auto_increment가 좋다.
다음은 롬복(Lombok)에서 제공하는 어노테이션이다.
- @NoArgsContsructor: 기본 생성자 자동 추가
- @Getter: 클래스 내 모든 필드의 Getter 메소드를 자동 생성
- @Builder: 해당 클래스의 빌더 패턴 클래스를 생성
생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함
참고로 Setter는 없는데, Setter 대신 생성자를 이용해서 값을 입력하는 것이다.
그리고 이는 빌더 패턴을 통해 더 명확하게 어떤 필드에 어떤 값을 입력해야하는지 인지가 가능하다.
PostsRepository 인터페이스 생성하기
Posts 클래스를 완성했으면 다음은 PostsRepository 인터페이스를 생성한다.
PostRepository는 JpaRepository를 상속한 인터페이스로서 Posts 클래스와 데이터 베이스를 매핑한다.
즉 Posts는 데이터베이스의 매핑 대상이 되는 클래스고 이를 실제로 매핑하는건 JpaRepository다.
작성은 위처럼 간단하게 해주면 된다.
JpaRepository<Entity클래스, PK타입>을 상속해주면 기본적인 CRUD메서드가 자동 생성된다.
어노테이션 추가할 필요도 없고 위와 같이 쓰면 끝이다.
단, 이때 주의할 점은 Entity 클래스와 Entity에 대한 Repository는 함께 위치해야 한다.
둘은 아주 밀접한 관계이고 Entity 클래스는 Repository없이 역할을 할 수 없다.
Spring Data JPA 테스트 코드 작성하기
다음은 JPA를 테스트하기로 하자.
위와 같은 경로로 패키지를 생성한다.
패키지를 생성하고 위와 같이 Test용 클래스를 만들고 아래와 같이 작성한다.
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.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest public class PostsRepositoryTest { @Autowired PostsRepository postsRepository; @After public void cleanup(){ postsRepository.deleteAll(); } @Test public void post_save(){ String title = "테스트 게시글"; String content = "테스트 본문"; postsRepository.save( Posts.builder() .title(title) .content(content) .author("1234@naver.com") .build() ); List<Posts> postsList = postsRepository.findAll(); Posts posts = postsList.get(0); assertThat(posts.getTitle()).isEqualTo(title); assertThat(posts.getContent()).isEqualTo(content); } }
해당 테스트는 save, findAll 기능을 테스트하는 것으로 해당 메서드는 jpa에서 자동으로 제공하는 것이다.
해당 메서드가 제대로 작동한다면 jpa가 잘 적용되고 있다는 뜻이다.
코드에 대해 설명하자면 다음과 같다.
- @After: Junit 단위 테스트가 끝나면 수행되는 메서드.
- postsRepository.save: 해당 객체를 통해 posts 테이블에 insert/update 쿼리를 실행함
id값이 있따면 update가 진행된다. 만약 없다면 insert가 실행됨.
- postsRepository.findAll: posts테이블에 있는 모든 데이터를 조회하는 메소드.
전체적인 작동 방식을 설명하면 다음과 같다.
우선 PostsRepository 객체를 생성한다.
생성된 객체에 save 메서드를 이용해서 posts테이블에 데이터를 삽입해준다.
데이터를 삽입 후 findAll 메서드를 이용해서 posts 테이블의 모든 자료를 불러온다.
불러온 자료를 바탕으로 이전에 삽입한 자료와 동일한지 확인한다.
이후에 @After가 실행되면서 해당 posts 테이블의 모든 자료가 삭제된다.
이대로 실행하면 아래와 같이 성공 화면을 확인할 수 있다.
실제로 실행된 쿼리 확인해보기
JPA를 이용하면 위와 같이 쿼리 없이도 데이터 베이스 제어가 가능하다.
다만 이렇게 실행된 쿼리가 어떤 형태인지 궁금할 수 있다.
이럴 때는 간단하게 파일 하나만 생성해주면 된다.
우선 위와 같이 'src/main/resources'에 파일을 생성해준다.
파일명은 위와 같이 application.properties로 입력한다.
파일을 생성한 뒤 위와 같은 코드를 입력한다.
입력한 뒤 테스트를 하면 아래와 같이 입력된 쿼리 확인이 가능하다.
'실습 > AWS' 카테고리의 다른 글
10. 스프링부트와 AWS - 게시글 등록 API 만들기 (0) 2021.05.07 9. 스프링부트와 AWS - 트랜잭션 스크립트, 도메인 모델 (0) 2021.05.05 7. 스프링부트와 AWS - ORM&JPA 필요성 (0) 2021.04.28 6. 스프링부트와 AWS - 롬복 활용하기 2 (0) 2021.04.28 5. 스프링부트와 AWS - 롬복 활용하기 (0) 2021.04.28