본문 바로가기

개인프로젝트/MOMO

[내가 만든 프로젝트 코드 분석 | MOMO] SpringMVC와 Mybatis 기능설명

https://www.youtube.com/watch?v=4XYwyjGraDk&t=7s

 

이슈

반복되는 행의 문제

public Mmaker getForPrintMmaker(int id);
<select id="getForPrintMmaker" resultType="Mmaker">
		SELECT A.id,
				A.*, 
				M.name AS writerName,
				P.joinStatus, 
        		P.memberId AS participantMemberId
			FROM SB_AM.mmaker AS A
			INNER JOIN SB_AM.member AS M
			ON A.memberId = M.id
			LEFT JOIN SB_AM.participation AS P
			ON A.id = P.moimId
			WHERE A.id = #{id}
			GROUP BY A.id	
</select>
  • A.id: mmaker 테이블에서 모임 ID를 가져온다.
  • A.*: mmaker 테이블의 모든 컬럼을 선택한다. 즉, 모임에 대한 모든 정보를 가져온다.
  • M.name AS writerName: 모임을 작성한 사람의 이름(member 테이블의 name 컬럼)을 가져와서 writerName이라는 별칭으로 설정한다.
  • P.joinStatus: 참여자의 참가 상태(participation 테이블의 joinStatus 컬럼)를 가져온다.
  • P.memberId AS participantMemberId: 모임에 참여한 참여자의 ID(participation 테이블의 memberId 컬럼)를 가져온다.
  • mmaker 테이블(A)과 member 테이블(M)을 조인한다. 이때, mmaker 테이블의 memberId와 member 테이블의 id를 기준으로 INNER JOIN을 수행한다. 즉, 모임을 만든 사람의 정보와 함께 모임 정보를 가져온다.
  • mmaker 테이블(A)과 participation 테이블(P)을 조인한다. A.id(모임 ID)와 P.moimId(참여 정보의 모임 ID)를 기준으로 조인한다.
  • LEFT JOIN이므로, 모임에 참여한 사람이 없어도 모임 정보는 가져오게 된다. 즉, 모임에는 참여자가 없어도 모임 정보는 반환된다.

GROUP BY의 역할

  • 그룹화: GROUP BY A.id는 mmaker 테이블의 id(모임 ID)를 기준으로 데이터를 그룹화한다. 이때, 동일한 모임 ID를 가진 여러 행(참여자가 여러 명인 경우 참여자 정보는 여러 개일 수 있음)이 하나의 그룹으로 묶인다.
  • 중복 제거: LEFT JOIN으로 인해 하나의 모임에 여러 참여자가 있을 경우, participation 테이블에서 여러 개의 레코드가 반환될 수 있다. 하지만 GROUP BY A.id로 그룹화함으로써, 모임 정보는 한 번만 반환되도록 중복을 제거한다.
  • 집계 함수 없이 GROUP BY 사용: 일반적으로 GROUP BY는 집계 함수와 함께 사용된다. 하지만 이 쿼리에서는 집계 함수 없이 단순 그룹화를 한다. 이를 통해 중복된 데이터를 제거하면서도, 모임 정보가 정확히 한 번만 반환되도록 한다.

예시 시나리오:

  • 모임 A에 3명의 참여자가 있는 경우, LEFT JOIN을 통해 mmaker와 participation 테이블을 조인하면 3개의 행이 반환될 수 있다.
  • 그러나 GROUP BY A.id를 사용하면 모임 A에 대해 한 번만 정보가 반환된다. 이를 통해 중복된 모임 정보 출력이 방지된다.

model분리문제

정적리소스 폴더에 이미지 저장문제

따로 테이블을 사용하여 관리