je개발 일지

[ je 개발 일지 ] 353일차, "LEFT JOIN 의 함정"

Je-chan 2023. 1. 5. 01:01


[ 오늘의 한 일]

  1. 개인 공부) 자바 / 스프링 학습 
    - 생성자
    - 접근 지시자

https://github.com/Je-chan/OOP-Study

 

GitHub - Je-chan/OOP-Study

Contribute to Je-chan/OOP-Study development by creating an account on GitHub.

github.com


[ 오늘의 회고 ]

1. LEFT JOIN 의 함정에 빠지다

   브라우저에서 차트를 렌더링하기 위해 필요한 데이터를 제공하는 API 에서 LEFT JOIN 을 쓰면서 발생한 문제였다. 그 차트에서 보여줘야할 데이터는 A, B, C 테이블 총 세 개에 있었다. 코드를 작성할 당시에 나는 아무 생각 없이 "A" LEFT JOIN "B" LEFT JOIN "C" 를 했고, 이게 문제를 발생했다.

 

  지금 쓰면서도 내가 왜 그렇게 작성했나 싶을 정도로 문제는 뻔하게 보였다. 저렇게 코드를 짰을 때 만약, 12시에 A 테이블에 있는 데이터가 없다면, B 와 C 에 있는 데이터도 12시에 데이터가 있다 하더라도 값을 가져올 수 없다. 왜냐하면 기준이 되는 테이블이 A 테이블이기 때문에 이 데이터에 row 데이터가 없다면 당연히 오른쪽에 있는 테이블의 데이터도 가져오지 않는 것이다. 하지만 차트에서 12시에 여러 데이터 중 하나의 데이터가 없다고 해서 모든 데이터가 없는 것으로 간주해 화면에 그리지 않으면 안 된다. 하나의 데이터가 값이 없다면 그것만 보여주지 않고 나머지 값이 있는 데이터는 보여줘야 한다. 지금 LEFT JOIN 으로 작성한 코드는 각각의 데이터를 독립적으로 가져오지 않다 보니 A 테이블에서 구멍이 나면 다른 테이블도 다 구멍이 난 것처럼 데이터를 보여주게 되었다

 

  덕분에 LEFT JOIN 을 사용할 때와 사용하지 않을 때에 대한 구분을 명확하게 알게 된 것 같다. 값을 가져오는데 기준이 되는 데이터가 존재한다면, 그러니까 A 테이블의 데이터가 없다면 나머지 모든 데이터들도 다 보여주지 않게 해야 한다면 A 테이블을 기준으로 LEFT JOIN 하면 되고 만약 모든 데이터가 각각 동일한 Level 로 취급해서 보여줘야 한다면 LEFT JOIN 이 아니라 각각 따로 SELECT 해서 java 에서합치든 UNION 이든 FULL OUTER JOIN 이든 해야겠다는 생각을 했다.