DevJong12

[refactor]MyBatis에서의 Enum활용기 (By.boolean) - 1편 본문

프로젝트/NoobLoL

[refactor]MyBatis에서의 Enum활용기 (By.boolean) - 1편

Jong12 2022. 9. 30. 17:22
728x90

포스트를 작성하게 된 계기(?)

기존에 사용하던 코드에 대해서 수정을 하고자 많은 소스들을 찾아 봤으나

예제가 없었다. 검색을 하는데 없다. 어..진짜없었다. 

 

그래서, 기록이 필요해 보여 작성해보게 되었다.


기술스택

  • Spring Boot 2.7
  • MariaDB
  • MyBatis 2.2.2

해당 내용이 들어간 Gradle은 아래 사진 참고바랍니다.


왜? 참고할만한 Reference가 없었는지?

먼저 DB에서 해당 Type에 대해서는 TinyInt라는 타입으로 사용을 하고 있다.

즉 0과 1로 저장이 되지만 매칭이 True와 False로 0또는 1을 저장하는 Type의 컬럼이었다.

 

True, False를 통한 사용이 가능하다보니, 기존에 데이터를 주고 받을 때 사용한 DTO는 아래에 첨부하였지만, likeType이라는 항목에 대해서, boolean으로 사용을 하고 있었다.

 

사용자가 해당 게시물을 추천, 비추천이 하는 기능으로 사용을 하다보니 True, False로의 구분이면 충분했다.

이후 해당 부분에 대해서 리뷰를 받게 되었는데, 아래와 같은 리뷰내용을 받았다.

이떄 MyBatis로 Enum설정이 가능한걸 처음알았다...

 

 

이후 자료를 찾아봤지만, 자료들은 대부분 Column의 타입은 String또는 Integer였으며,  Maria, Mysql의 TinyInt를 활용한 Handler예제는 전멸하다싶이 하였다.


리팩토링 과정(1)

  1.  먼저 Enum을 선언하고, Dto를 변경하였다.
    또한 True, False를 담을 변수와 값을 통해 어떤 EnumType을 반환할지 찾는 메소드가 필요했다.
  2. 해당 Type에 대해서 사용을 할 수 있도록 ArticleLikeStatusEnum을 받아 사용하는 TypeHandler를 생성하였다
  3. Insert의 경우 TypeHandler가 필요하여 직접 Handler를 기입해줬다.

리팩토링 결과(1)

최초의 리팩토링은 다음과 같이 이뤄졌고 기능실행의 결과는 아래의 사진과 같았다. 

Enum.java에서 문구에 대한 오류를 제작하고 있어서 쉽게 찾을 수 있었다.

Class는 정상적으로 찾는거 같고, name을 집중했다.

name부분에 0이 들어왔고, enum에는 0이라는게 없다. LIKE와 NOT_LIKE만 존재한다.

 

즉 TypeHandler가 정상적으로 읽히지 않는 다는 느낌을 받았다.


리팩토링 과정(2)

이후 Reference를 찾아본 결과 Configure로 MyBatis에 아래처럼 설정을 하는걸 알게되었다.

<typeHandlers>
  <typeHandler handler="blah.blah.TestEnumTypeHandler "/>
</typeHandlers>

어..? 근데 난 따로 mybatis.xml같은걸 만들지 않았는데?

 

좀 당황했었다. 근데 생각해보니 MyBatis 설정이면 application에서 가능하지 않을까? 생각을 했고, 그생각은 맞았다.

Intellij에서 자동완성으로 Configuration영역에 존재했고, TypeHandler를 상속받은 클래스 타입을 지정하고 있었다.

 

바로 다음과 같이 TypeHandler를 지정해주고 다시 진행을 해봤다.

 

 

리팩토링 결과(2)

설정을 한 이후 테스트를 진행해봤다. resultCode에 200으로 Return받은 경우 정상적으로 기능을 실행한 건데.. 이뤄졌었다..


리팩토링 과정(3)

사실 해당부분에 대해서는 필요가 없었다.
이미 기능이 되니까..? 하지만 해당기능을 작성할때 설정을 잡기전에 왜안되지 하고 있었고, 모각코를 하고 있다가, 옆에 사람이 있었다.

같이 공부하는 분이셨는데 왜안될까요 하아 하면서 얘기를 하다가, 들은 내용은 굳이 Bool타입으로 진행을 해야 하나요? 였다.
그분의 말은 자기가 봤던 자료에 의하면 차라리 Int타입으로 정리하는게 조금더 성능향상에 좋다. 고 하였었고, 안되고 있던 상황에서 아 그러면 그냥 많은 Reference가 있는 Int타입으로 변형해 진행할까? 라는 생각을 하고 있었다.

그리고 문제가 해결된 뒤에 생각해보니 리팩토링 결과(1)에서 알 듯 이미 숫자로 오고있지않은가? 라는 생각을 하게 되었다.

 

1. Int Value에 맞춰서 반환을 해야 할 메소드를 제작했다.

아래의 findLikeStatusByInt메소드가 해당 부분이다.

 

2. TypeHandler에 대해서 기존에 boolean타입으로 조회하던 기능을 int로 변형한고, enum에서 조회하는 메소드 역시 boolean타입이 아닌 int타입을 매개변수로 받는 메소드로 수정한다..

 

리팩토링 결과(3)

추가적인 이미지는 올리지 않을 예정이다. 그래봐야 리팩토링 결과(2)랑 같은 결과가 나오고 있고, 똑같은 이미지를 올리는것이기 떄문이다.

 

해당 방식으로도 되는 걸 알면 좋을 듯 하다.


 

해당 작업을 진행 할 때 Type을 위 한개만 진행하다 보니,  공통소스를 만드는 등의 작업은 진행을 하지 않았다.

아마..나중에 더 많은 Type을 제작해야 하면 필요하지 않을 까 싶지만.. 지금은 이정도로도 괜찮은 것 같다.

 

 

혹시나 TinyInt와 boolean을 사용하는 분이 있다면, 해당 글이 도움이 되지 않을까 싶다.

 

After로 진행한 소스에 대해서는 해당 Gist를 참고하면 좋을듯하다.

https://gist.github.com/donsonioc2010/030209c0f7c5b3661166220bfda021d5

 

After-ArticleLikeStatusEnum.java

GitHub Gist: instantly share code, notes, and snippets.

gist.github.com


22. 10. 21 추가

해당 포스트에서의 문제점을 알게 되어 추가적으로 작성한 포스트가 있다.

한개의 Enum밖에 사용을 못한다는 점이며, 해당 부분을 보완한 포스트이다.

 

https://devjong12.tistory.com/81

 

[Issue] MyBatis에서의 Enum활용기 - 2편

이전 포스트 [refactor]MyBatis에서의 Enum활용기 (By.boolean) 포스트를 작성하게 된 계기(?) 기존에 사용하던 코드에 대해서 수정을 하고자 많은 소스들을 찾아 봤으나 예제가 없었다. 검색을 하는데 없

devjong12.tistory.com

 

728x90
Comments