필자는 마지막 프로젝트에서 문제(게시글)에 대한 조회수와 좋아요 수를 0으로 Default 값을 넣어줄 때 FrontEnd에서 Data를 넘겨 줄때 애초에 0으로 할당해서 넘겨주는 방식을 채택했습니다.
하지만 이 방식은 실수로 Data를 넘겨주지 않은 NullPointException을 초래하며, 개발자가 늘 신경을 써야한다는 단점이 있습니다.
그래서 어떻게 애초에 Server 단에서 Default 값을 할당하는 법이 없을까 고민해봤습니다.
JPA에서는 @ColumnDefault라는 어노테이션을 통해 Column의 Dafault 값을 할당해줄 수 있습니다. 필자는 이 어노테이션으로 Default값이 할당되는 줄 알았지만 실제로 Test를 진행하였을 때 Null로 들어가는 것을 확인 할 수 있었습니다.
위의 query를 보면 views, likes들이 Default가 아니라 새롭게 insert되는 것을 볼 수 있습니다.
왜 이런 결과가 나오는 건가??
- @ColumnDefault 어노테이션에 대해 조금 자세히 들여다보면 알 수 있었습니다. @ColumnDefault는 DDL 구문이 동작할 때 작동합니다. 즉 Create, Drop 등 Table 생성시에 해당 컬럼의 Default 값을 정해주는 것입니다.
- 우리는 Insert 구문으로 데이터를 넣기에 DDL구문이 아니기에 제대로 동작하지 않는 것입니다.
해답은 바로 @DynamicInsert로 해결할 수 있습니다.
@DynamicInsert는 Entity 인스턴스를 감지하며, insert 구문이 발생할때 변경된 필드만 insert 쿼리가 작성되게 끔 합니다.
그 외에 변경이 되지 않는 필드들은 Default값 or Null 값으로 채워집니다.
위의 쿼리를 확인해보시면 insert 쿼리에서 likes, views가 제외 되어있는 것을 확인 할 수 있습니다.
그리고 DB에는 제대로 Default값이 들어가는 것을 확인 할 수 있었습니다.
DymaicInsert를 활용해서 해결하는 과정을 보셨습니다.
- 이처럼 DynamicInsert는 불필요한 쿼리 작성을 방지할 수 있으므로, 쿼리에 대한 Traffic을 감소할 수 있습니다.
- 그리고 추가적으로 기본 프로필 이미지 등 다양한 Default 값을 셋팅 할 때 사용할 수 있습니다!!!
이번 글은 간단한 의구심으로 시작했는데요, Default 값을 어떻게 편하게 셋팅할까?라는 의문이죠. JPA는 이처럼 매우 편안한 기능들을 제공하며, 이 기능들은 Server의 불필요한 쿼리와 Traffic을 줄일 수 있습니다. 이것이 BackEnd의 개발자로서의 첫걸음 아닐까 싶습니다. 물론 당연히 알고 있어야하는 것이라고 느낄 수 있지만, 필자처럼 급하게 배워오신 분들은 한 번더 의문을 갖고 공부하셨으면 합니다!!!