스프링부트에서 JPA로 데이터베이스 다뤄보기 (1)

박의진·2023년 6월 21일
0

스프링부트

목록 보기
4/7

JPA

  • 자바 표준 ORM(Object Relational Mapping)
  • 서로 지향하는 바가 다른 2개의 영역( 객체지향 프로그래밍 언어와 관계형 데이터베이스)을 중간에서 패러다임 일치를 시켜주기 위한 기술
  • sql에 종속적인 개발을 하지 않아도 됨

Spring Data JPA

  • Hivernate, Ecplise Link 등 JPA를 사용하기 위한 구현체들을 쉽게 사용하고자 추상화시킨 모듈
  • JPA <- Hibernate <- Spring data JPA
  • 구현체 교체의 용이성을 가짐
    • Hibaernate 외에 다른 구현체로 쉽게 교체하기 위함
  • 저장소 교체의 용이성을 가짐
    • 관계형 제이터베이스 외에 다른 저장소로 쉽게 교체하기 위함

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

1) 의존성 추가

compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('com.h2database:h2')

  • h2
    • 인메모리 관계형 데이터베이스
    • 애플리케이션을 재시작 할 때마다 초기화 되는 점을 이용해 테스트 용도로 많이 사용
    • 별도의 설치가 필요 없이 프로젝트 의존성만으로 관리 가능

2) Posts 클래스 생성

@Getter
@NoArgsConstructor
@Entity// 테이블과 링크될 클래스임을 나타낸다.
public class Posts extends BaseTimeEntity {

    @Id // 기본키
    @GeneratedValue(strategy = 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;
    }

    public void update(String title, String content) {
        this.title = title;
        this.content = content;
    }
}
  • @Entity

    • 테이블과 링크될 클래스임을 나타냄
    • 기본값으로 클래스의 카멜키이스 이름을 언더스코어 네이밍으로 테이블 이름을 매칭
    • Entity 클래스에서는 setter 메소드를 만들지 않아야 함
  • @Id

    • 해당 테이블 PK 필드를 나타냄
  • @GeneratedValue

    • PK 생성 규칙을 나타냄
  • @Column

    • 테이블의 컬럼을 나타냄
    • 문자열의 경우 VARCHAR(255)가 기본 값인데, 사이즈를 500으로 늘리고 싶거나, 타입을 TEXT로 변경하고 싶거나 등의 경우에 사용 가능
  • @NoArgsConstructor

    • 기본생성자 자동 추가
    • public Posts(){}와 같은 효과
  • @Builder

    • 해당 클래스의 빌더 패턴 클래스를 생성
    • 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함

3) @Repository 생성

  • DAO 라고 불리는 DB Layer 접근자
  • 인터페이스로 생성
  • JpaRepository<Entity 클래스, PK 타입> 를 상속하면 기본 CRUD 생성됨
  • entity 클래스와 기본 entity repository는 함께 위치해야 함
  • 도메인 패키지에서 함께 관리

Spring Data JPA 테스트코드 작성

1) 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("jojoldu@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 에서 단위 테스트가 끝날 때마다 수행되는 메소드를 지정
    • 배포 전 전체 테스트를 수행할 때 테스트간 데이터 침범을 막기위해 사용
  • postsRepository.save

    • 테이블 posts에 insert / update 쿼리를 실행
    • id값이 있다면 update, 없다면 insert 쿼리 실행
  • postsRepository.findAll

    • 테이블 posts에 있는 모든 데이터를 조회해오는 메소드
  • @SpringBootTest

    • 별다른 설정 없이 사용할 경우 H2 데이터베이스를 자동으로 실행

2) 작성된 테스트코드 실행 후 성공 확인

3) 실행된 쿼리 로그 확인

application.properties 파일 생성

옵션 추가

재 실행시 쿼리 실행 로그 확인 가능

profile
주니어 개발자의 개발일지

0개의 댓글