[Database] 아우터 조인 응용

트러블 슛돌이·2023년 7월 26일

서론

사용자 프로필 정보를 보여줄 때 스크린에 프로필 사진과 밑에 유저의 닉네임이 함께 보여지도록 개발을 해야했다

하지만 현재 개발중인 프로젝트의 데이터베이스에 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 해서 넘겨주면 된다

0개의 댓글