[스프링부트] 3. JPA 다뤄보기

Bummy·2022년 8월 13일
0

springboot

목록 보기
4/15

JPA란?
JPA는 인터페이스로서 자바 표준명세서이다.
자바에서 관계형 데이터베이스를 사용하는 방식을 정의하는 인터페이스
JPA를 사용하기 위해서는 구현체가 필요한데 대표적으로 Hibernate, Eclipse Lin 등이 있다.

1. 프로젝트에 Spring Data JPA 적용하기

먼저 build.gradle에 의존성들을 등록해야한다.

다음 두 코드를 작성해주어야한다.

  • spring-boot-starter-data-jpa: 스프링 부트용 Spring Data Jpa 추상화 라이브러리, 스프링 부트 버전에 맞춰 자동으로 JPA 관련 라이브러리들의 버전을 관리해준다.
  • h2 : 인메모리 관계형 데이터베이스, 애플리케이션이 재시작할 때마다 초기화되기 때문에 테스트, 로컬 환경에서 주로 사용한다.

JPA를 사용하기 위해서 Posts 클래스를 만들어주고 코드를 작성해준다.

@Getter //클래스 내 모든 필드의 getter 메소드를 자동생성
@NoArgsConstructor //기본 생성자 자동 추가
@Entity //테이블과 링크될 클래스임을 나타냄
public class Posts {

    @Id //해당 테이블의 PK필드를 나타냄
    @GeneratedValue(strategy = GenerationType.IDENTITY) //PK 생성 규칙을 나타냄, 스프링 2.0에서는 GenerationType.IDENTITY를 추가해야만 auto increment가 된다.
    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 : 테이블과 링크될 클래스임을 나타냄
  • @Id : 해당 테이블의 PK 필드를 나타냄
  • @GenratedValue : PK의 생성 규칙을 나타냄, 스프링 부트 2.0에서는 GenerationType.IDENTITY 옵션을 추가해야만 autoincrement가 된다.
  • @Columm : 테이블의 컬럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 컬럼이된다.
  • @NoArgsConstructor : 기본 생성자 자동 추가
  • @Getter : 클래스 내 모든 필드의 Getter 메소드를 자동 생성
  • @Builder : 해당 클래스의 빌더 패턴 클래스를 생성

Entity 클래스에서는 절대 Setter 메소드를 만들지 않아야한다.
-> 해당 필드의 값 변경이 필요하면 명확히 그 목적과 의도를 나타낼 수 있는 메소드를 추가

Setter가 없으면 어떻게?

그렇다면 setter 없이 어떻게 값을 삽입할 수 있을까?
해당 이벤트에 맞는 public 메소드를 호출
이번에는 생성자 대신 @builder를 통해 제공되는 클래스 사용

JpaRepository 생성하기

posts 클래스로 database를 접근하게 해줄 jpaRepository를 생성

public interface PostsRepository extends JpaRepository<Posts, Long> {
}

코드는 이렇게 작성해주고

해당 코드를 테스트하기 위해 PostsRepositoryTest란 이름의 클래스를 생성한다.

@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("dydqja4582@naver.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에서 단위 테스트가 끝날 때마다 수행되는 메소드를 지정
  • @postRepository.save : 테이블 posts에 insert/update 쿼리를 실행
  • @postRepository.findAll : 테이블 posts에 있는 모든 데이터를 조회해오는 메소드

사용되는 쿼리를 실제로 찍어보고 싶다면
resources 파일에 application.properties 파일을 만들어서

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

다음 코드를 확인하여 콘솔에서 확인할 수 있다.

0개의 댓글