[Spring Data] Spring Data JDBC를 이용한 DB 연동 (응용편)

반응형

지난 글에서 우리는 Spring Data JDBC를 이용해 간단한 쿼리를 조회하고 이를 테스트 코드로 만드는 시간을 가져봤습니다. 

이번 글에서는 두 개의 테이블이 서로 관계를 가진 경우에 어떻게 데이터를 가져올 수 있는지에 대해 알아보겠습니다.

 

 

Entity

이번 글에서 사용할 테이블 구조는 아래와 같습니다.

 

블로그에서 흔히 볼 수 있는 포스트와 코멘트입니다. 포스트에 블로그의 게시글이 달리면 그 댓글을 달 수 있는 형태로 하나의 글을 조회했을 때 댓글을 같이 부를 수 있는 예시를 담아보도록 하겠습니다.

 

 

 

SQL script

flyway에 아래의 SQL script를 입력해줍니다.

 

지난 글에서와는 달리 PRIMARY KEY의 생성 방법이 조금 다른데, CONSTRAINT 쿼리를 이용하면 자신이 직접 해당 키에 대한 이름을 정의할 수 있습니다. 

 

기본적으로 컬럼에 PRIMARY KEY를 주게 되면 각 서버마다 랜덤한 이름의 PRIMARY KEY 이름을 생성하게 되며,
차후 마이그레이션 할 때 모든 애플리케이션의 경우의 수를 고려해 줄 수 없으므로 Flyway와 같은 마이그레이션 스크립트에 CONSTRAINT를 정의하는 경우 반드시 이름을 정해놓고 사용하는 걸 추천합니다. (PostgreSQL)

 

스크립트를 만들고 애플리케이션을 실행했을 때, 위와 같이 테이블이 만들어지면 성공입니다.

 

 

 

모델 정의

이제 모델을 정의하고 Repository를 만들어보겠습니다. 

 

이전 포스트에서 만들었던 그대로 domain과 repository 패키지를 사용해 각각의 모델을 만들어줍시다.

 

Comment는 지난 포스트와 거의 동일하게 만들어주면 되지만 Post의 경우 이에 입력된 댓글까지 모두 보여줘야 합니다. JPA에서는 이를 OneToMany 등으로 사용했다면 Spring Data JDBC에서는 MappedCollection이라는 어노테이션을 가지고 영속과 읽기에 사용할 수 있습니다.

 

Mapped Collection에 들어가는 idColumn은 자식 엔티티가 가지는 외래키를 입력하고, keyColumn에는 자식 엔티티의 기본키를 입력하면 됩니다.

 

 

 

테스트 코드

이제 기본적인 코드 작성은 끝났습니다. 우리가 구성한대로 잘 동작하는지 테스트 코드를 작성해보도록 하겠습니다.

 

Post 모델에 댓글 모델을 같이 생성하고 넣어줬을 때 영속이 잘 되는지 확인하는 테스트 코드를 작성합니다.

 

테스트 코드를 돌려보면 영속은 잘되는 느낌이지만 경고 표시가 나타납니다. JDBC에서 ResultSet으 조회했을 때 ID 컬럼이 여러개 걸려있다는 경고문인데, 이것이 왜 문제가 되는지는 공교롭게도 찾지 못했습니다. ㅠㅠ 차후 다음 글에서 이 문제에 대한 것을 좀 더 글로 상세하게 적어보도록 하겠습니다.

 

데이터베이스를 조회해보면 영속은 잘되어 있습니다. 따라서 영속과 조회 모두 문제 없이 잘 동작하는 것을 확인할 수 있습니다.

 

 

 

마치며...

아주 간단한 예제를 통해 관계가 있는 테이블에서 데이터를 영속하고 조회하는 것을 Spring Data JDBC를 이용해 살펴봤습니다. 한글 문서가 아직 많이 부족하고, Spring Data JPA로 충분히 사용 가능한 부분이 많아 학습을 해야 할 동기 또한 부족합니다. 

 

하지만 기본에 충실하고 성능 개선에 초점을 두며 간단하게 사용하기 좋아 보입니다. 별도의 Entity를 생성하거나 DTO를 만들지 않고도 NoSQL처럼 바로 이용 가능하며 다만 관계형 데이터베이스이기 때문에 여전히 Jackson이나 Gson 같은 JsonEncoder는 좀 더 필요해 보입니다.

 

아직 Spring 진영에서 비동기 처리를 지원하는 ORM은 나오지 않았는데, Spring Data R2DBC 사용을 고려하고 있다면 Spring Data JDBC는 이를 사전 공부해보는 데 도움이 되지 않을까 조심스레 남겨봅니다.

반응형