우아한테크코스 프롤로그의 댓글 기능을 개발하고 코드 리뷰를 받았는데 아래와 같은 리뷰를 받았다.
해당 JPQL은 내가 짠 것은 아니지만(루키가 짰다.) 내가 JPQL을 제대로 모를 뿐더러 기본적인 개념인 아우터 조인과 이너 조인에 대해서도 정확히 모른다는 것을 깨닫게 해주는 리뷰였다. 따라서 학습을 해보고자 이 글을 쓴다.
우선 inner, outer join에 대해 알아보기 전에 join에 대해 간략하게 알아보자.
여러 테이블에 흩어져 있는 정보 중 사용자가 필요한 정보만 가져오고자 할 때, 관련 테이블들을 조합해서 하나의 열로 표현하는 것이다.
키 값이 있는 테이블의 칼럼 값을 비교 후, 조건에 맞는 값을 가져오는 것이다. 간단히 말하면 기준 테이블과 조인 테이블 모두 데이터가 존재해야 조회된다.(교집합 개념)
SELECT * FROM COACH INNER JOIN RESERVATION ON COACH.ID = RESERVATION.CoachId
조인하는 여러 테이블에서 한 쪽에는 데이터가 있고 한 쪽에는 데이터가 없는 경우, 데이터가 있는 쪽 테이블의 내용을 전부 출력하는 방법이다. 즉, 조인 조건에 만족하지 않아도 해당 행을 출력하고 싶을 때 사용할 수 있다. (기준 테이블은 NULL값을 포함한다.)
Inner Join과의 차이점은 Inner join은 일치하지 않는 레코드는 모두 버리지만, Outer Join은 일치하지 않더라도 버리지 않고고 NULL로 채워서 결과를 응답한다. 이렇게 보면 두 조인 방법에 성능 차이가 있다는 생각이 들지만 실제로 엄청난 성능차가 발생하지는 않는다고 한다.
Outer Join은 Left Outer Join과 Right Outer Join으로 나눠 진다. Outer Join에서 Left와 Right는 기준 테이블을 지정하는 것이다.
왼쪽에 있는 테이블의 모든 결과를 가져온 후, 오른쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL을 표시한다.
SELECT * FROM COACH LEFT OUTER JOIN RESERVATION ON COACH.ID = RESERVATION.CoachId
Left Outer Join을 이해했다면, Right Outer Join을 이해했다고 해도 무방하다.
오른쪽에 있는 테이블의 모든 결과를 가져온 후, 왼쪽의 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL을 표시한다.
SELECT * FROM COACH Right OUTER JOIN RESERVATION ON COACH.ID = RESERVATION.CoachId
Inner join과 Outer join에 대해 알아봤다. 학습을 하고 그럼 어떤 상황에서 Inner를 쓰고 어떤 상황에서 Outer를 써야 하는 지 생각해 보았다. 아직 잘은 모르겠지만 null 값이 확실하게 들어가지 않는 테이블들을 join할 때는 inner가 적절하고 그렇지 않다면 outer가 적절할 것이나는 생각이 든다.(굳이 outer를 할 필요는 없다고 느껴짐) 하지만 어플리케이션 영역에서는 not null 제약 조건이 있어도 스키마 상에는 not null이 빠져 있는 경우도 있다고 한다. 이런 상황에서는 left를 쓰는 게 적절해 보인다.(데이터가 누락될 확률이 있으므로)
결론은 어떤 것을 쓸 지는 그때의 자기가 직면한 상황에 따라 달라 질 수 있다는 것이다. 오늘 Inner와 Outer Join에 대해 알았으니 앞으로 써야 하는 상황이 왔을 때, 적절한 판단력으로 잘 선택해서 쓰자!