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분리문제
정적리소스 폴더에 이미지 저장문제
따로 테이블을 사용하여 관리
'개인프로젝트 > MOMO' 카테고리의 다른 글
[내가 만든 프로젝트 코드 분석 | MOMO] SpringMVC와 Mybatis 접근방식 (2) | 2024.09.13 |
---|