사용자 프로필 정보를 보여줄 때 스크린에 프로필 사진과 밑에 유저의 닉네임이 함께 보여지도록 개발을 해야했다
하지만 현재 개발중인 프로젝트의 데이터베이스에 user 테이블과 profile 테이블이 각각 존재한다
그렇기 때문에 XML Mapper에 쿼리문을 작성할 때 이를 고려하여 user 테이블과 profile 테이블의 적절한 조인이 필요했다
본격적으로 오늘 다룰 주제인 이너 조인과 아우터 조인에 대해 설명하겠다
우선 조인은 간단히 말하면 서로 다른 테이블을 하나로 합치는 것이다
이너 조인은 조인의 한 종류이다
예를 들어 테이블 A와 테이블 B 사이에 이너조인이 일어난다면 A와 B의 교집합이 결과로 나온다

아우터 조인은 테이블 A와 B의 합집합이 결과로 나온다

<select id="findImageById" resultType="ProfileImageDto">
SELECT user.nickname as user_name,
profile_img
FROM user LEFT OUTER JOIN profile
ON profile.user_id = user.id
WHERE user.id = #{user_id}
</select>
서론에서 말했던 프로필 이미지와 유저 닉네임을 함께 보여주는 xml mapper이다
쿼리문의 FROM 절에서 user LEFT OUTER JOIN profile을 사용한 것을 볼 수 있다
위에서 아우터 조인에 대해 두 테이블의 합집합이라는 것을 배웠다
하지만 아우터 조인과 함께 사용할 수 있는 대표적인 옵션 두 가지가 있다
바로 LEFT와 RIGHT이다
먼저 LEFT OUTER JOIN을 예시를 통해 알아 보자
user 테이블에는 id, email, password, nickname, name등이 있고
profile 테이블에는 id, profile_img 가 있다
쿼리문에서 사용된 아이디어를 다시 한번 리마인드 해보겠다
나는 user 테이블의 id와 profile의 id에 매치되는 user 테이블의 nickname과 profile 테이블의 profile_img 정보가 필요하다
만약에 어떤 유저들이 프로필 이미지를 설정해 놓지 않았다고 해도 유저의 닉네임 데이터는 꼭 필요하기 때문에 profile_img가 null인 유저들의 user 테이블 데이터를 가져오기 위해서 LEFT OUTER JOIN이 쓰인 것이다
본격적으로 LEFT OUTER JOIN에 대해서 설명하자면 이렇다
왼쪽 테이블의 모든 열 + 두 테이블의 공통부분
다시 말하면, 왼쪽 테이블에 해당하는 속성들은 NULL값을 포함해 모두 출력해주는 것이다
그 결과는 이렇다

오른쪽을 보면 profile_img열이 NULL값인 유저들의 정보도 전부 출력된 것을 알 수 있다
이렇게 조인된 데이터에서 nickname과 profile_img만 SELECT 해서 넘겨주면 된다