최신 공지사항 7개를 조회해오는 구문에서 쿼리메소드 findTop7ByBoardStatusOrderByBoardWriteDateDesc()
로 boardStatus가 "Y"이고 boardWriteDate 역순으로 조회하고자 했으나, 빈 배열로 넘어오는 문제 발생
쿼리메소드 문제라고 생각되어 계속 수정하여 시도했지만 Failed to create query for method public abstract java.util.List ... 등의 오류가 발생하며 서버가 실행조차 되지않음
Top N 부분의 문제인지 확인하기 위해 boardStatus 조건을 제외한 findTop7ByOrderByBoardWriteDateDesc()
로 실행한 결과, 정상적으로 공지사항이 넘어오는 것을 확인할 수 있었음
이전 생각과는 달리 boardStatus의 문제라는 것을 인지한 후, DB에 선언되어있는 타입은 char
인데 서버에서는 String
으로 다루는 것이 문제였던 것인지 확인하기 위해 Entity, DTO를 포함한 클래스 모두 char
로 변경한 뒤 테스트
=> 변동 X
계속 고민하다가 전에 이와 비슷한(?) 문제를 해결했었던 경험에서 아이디어를 얻어 DB에서의 "Y"가 설마 공백을 포함하고 있어서 인식을 못 했던 것인가? 생각이 들어 곧바로 Controller에서 boardStatus를 trim()
했으나 변동 X
=> 번뜩 생각이 들자마자 바로 실행에 옮긴 탓에 실행 결과를 보고 이것은 의미가 없다는 것을 바로 깨달음
DB에서 BOARD_STATUS의 data type은 char(10 byte)
였고, 실제 할당된 값의 행을 클릭해서 확인하니, "Y "
이런식의 공백을 포함한 값이 존재
=> 기본값을 저장할 때, 지정한 data type의 크기만큼의 공간을 할당했던 것이 원인 .. 🫠
해당 컬럼의 data type을 char(1 byte)
로 변경하여 해결
사실 DB를 구축할 때 data type은 어떠한 변수가 생길지 모르니 약간 여유있게 할당하자 라는 생각을 가지고 있었는데, 정말 이번 이슈를 겪고 많은 생각이 들었고 깨달음이 있었다. 더욱 data type을 꼼꼼히 작성하고 알맞은 크기를 할당해야겠다.
Y/N 과 같은 여부를 저장하는 컬럼은 꼭
char(1 byte)
로 할 것 !!