본문 바로가기

우아한테크코스/코드 리뷰

체스 게임 3

이번 주는 이어서 체스 게임 미션에 SpringBoot와 Spring Data JDBC를 적용해보는 미션을 진행하였다.

Sptring Data JDBC는 2018년에 나온 기술로 인터넷에 자료가 매우 부족했다.
특히 한글로된 자료가 거의 없어서 영어로된 문서를 읽는 연습을 하고있다.

필요한 정보를 대부분 공식 문서에서 찾아내고 있는데, 해야지..하면서 미루던 공식 문서 읽는 연습을 시작하게되었다. 페어와 함께 Reference를 읽고, 정보를 찾아내고, 적용하는 과정은 매우 즐거웠다.


체스 미션을 하면서 배우고 느낀 내용을 정리해보자!

Spring Data JDBC 객체구조와 테이블 구조의 불일치

객체의 구조와 테이블의 구조의 불일치를 해결하기 위한 방법

  1. 객체와 엔티티를 따로 설계
    • 엔티티 클래스를 DTO처럼 사용
    • 기존에 구현한 객체 클래스와 repository를 통해 db에 저장할 엔티티 클래스를 별도로 생성
  2. 객체와 엔티티를 하나의 클래스로 설계

체스 게임 미션에서는 도메인을 미리 짜놓고 Spring Data JDBC를 적용한 것이기 때문에 객체와 엔티티를 따로 설계했다.

하지만 Spring Data JDBC의 취지와 맞는 것은 객체와 엔티티를 하나의 클래스로 설계하는 방법인 것 같다.

엔티티와 객체를 따로 생성하게 되면 엔티티에는 매핑하기 위한 필드들과 getter/setter만 있을 것이다. mapping만을 위한 무의미한 클래스를 만들기보다는 객체와 엔티티를 하나의 클래스로 만들어서 책임을 가지게 해주는 것이 좋다고 생각한다.

Spring Data JDBC와 복합키

테이블에서 복합키를 사용하는게 맞다고 판단하고 JDBC에서 복합키로 mapping을 시켜주려고 했었다. 하지만, JDBC에는 복합키를 mapping시켜줄 에노테이션이나 기능이 만들어지지 않은 것 같았다. Spring Data JDBC 저장소의 PR에는 있었으나 merge가 되있지 않은 상태였다.

나온지 얼마 안된 기술이라 구현되지 않은 기능이 많은 것 같았다. query creation from method names 도 공식문서에는 있지만 실험해보니 아직 구현되지 않은 기능 같았다.

비효율성?

Spring Data JDBC는 쿼리를 비효율적으로 많이 날리는 것 같다.

save를 통한 수정의 경우에는 객체가 참조하는 모든 객체를 삭제 후에 수정된 객체를 포함하여 다시 저장한다.

참조하는 객체중 한 객체를 삭제할 경우에는 모든 객체를 삭제 후에 삭제된 객체를 제외한 객체들을 다시 저장한다.

이렇게 비효율적으로 쿼리를 많이 날려도 괜찮은가 하는 의문이 들었다. 관련된 내용을 Spring Data JDBC 공식 문서에서 찾아볼 수 있었다.

This approach has some obvious downsides. If only few of the referenced entities have been actually changed, the deletion and insertion is wasteful. While this process could and probably will be improved, there are certain limitations to what Spring Data JDBC can offer. It does not know the previous state of an aggregate. So any update process always has to take whatever it finds in the database and make sure it converts it to whatever is the state of the entity passed to the save method.

공식문서에서 효율적이지 못하다는 걸 인정하고 있다는 것이 신기했다. 결론적으로 Spring Data JDBC는 이전의 상태를 기술적으로 알 수 없으므로 모든 객체를 삭제하고 다시 저장할 수 밖에 없었던 것이다.


체스에 Spring과 Spring Data JDBC를 적용하면서 알아야 하는것과 알게 된 것들이 너무 많아서 머릿속을 정리하는데 어려움을 겪고 있다.

레벨 2, 레벨 3를 차차 해나가면서 완벽히 정리하고, 제대로 알고 사용하는게 목표이다. 이번 주에는 처음 접해보는 Spring Data JDBC를 열심히 탐구하는데 시간을 많이 보냈다. 코드에 잘 적용했는지는 모르겠다..

하지만 확실한 건 아직 공부해야할 내용이 엄청 많다는 것이다. 천천히 다 정복하고 싶다!

'우아한테크코스 > 코드 리뷰' 카테고리의 다른 글

지하철 2  (0) 2020.05.13
지하철 1  (0) 2020.05.10
체스 게임 2  (0) 2020.04.25
체스 게임 1  (2) 2020.04.17
블랙잭 2  (0) 2020.03.30