웹 개발/Spring
selectKey를 활용한 스케줄-멤버 연결 쿼리 정리
신정훈
2025. 4. 30. 00:10
프로젝트를 작업중
일정 작성시 그룹 멤버들중 몇몇과 함께 하는 일정을 등록할수 있는 쿼리를 작성하게되었다.
한마디로 일정에 해당하는 공유 멤버들을 연결해주어야 한다.
이를 위해서
TBL_SCHEDULE, TBL_SCHEDULE_GROUP_MEMBER 두개의 테이블을 연결해 주어야한다.
그러기 위해선 중간 다리 역할인 TBL_SCHEDULE_MEMBER_GROUP이라는 테이블이 하나 필요하다.
이제 TBL_SCHEDULE과 TBL_SCHEDULE_GROUP_MEMBER 는 TBL_SCHEDULE_MEMBER_GROUP의 PK를 통해 연결된 상태이다.
현재 구조는 다음과 같다.
- TBL_SCHEDULE
- TBL_SCHEDULE_GROUP_MEMBER
이 두 테이블은 TBL_SCHEDULE_MEMBER_GROUP의 PK를 통해 연결된 상태다.
쿼리 작성 흐름
쿼리 순서는 다음과 같다.
1. TBL_SCHEDULE_MEMBER_GROUP에 INSERT해서 PK 생성한다.
2. 생성한 PK를 사용해서 TBL_SCHEDULE을 INSERT한다.
<insert id="insertScheduleMemberGroup" parameterType="ScheduleMemberGroupVO">
<selectKey keyProperty="id" order="BEFORE" resultType="Long">
SELECT SEQ_SCHEDULE_MEMBER_GROUP.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO TBL_SCHEDULE_MEMBER_GROUP (
ID
) VALUES (
#{id}
)
</insert>
<!-- 일정 등록 -->
<insert id="insertSchedule" parameterType="ScheduleVO">
INSERT INTO TBL_SCHEDULE (
ID, SCHEDULE_TITLE, SCHEDULE_CONTENT, SCHEDULE_START_DATE, SCHEDULE_END_DATE,
SCHEDULE_CREATED_DATE, SCHEDULE_COLOR, SCHEDULE_CATEGORY, SCHEDULE_REPEAT, CALENDAR_ID,SCHEDULE_MEMBER_GROUP_ID
)
VALUES (
SEQ_SCHEDULE.NEXTVAL, #{scheduleTitle}, #{scheduleContent}, #{scheduleStartDate}, #{scheduleEndDate},
#{scheduleCreatedDate}, #{scheduleColor}, #{scheduleCategory}, #{scheduleRepeat}, #{calendarId}, #{scheduleMemberGroupId}
)
</insert>
여기서 selectkey를 쓴 이유는 insert전에 시퀀스 값을 미리 조회해서 Java 객체의 id필드에 매핑해주기 위해서다.
만약 selectkey를 쓰지않으면 insert후에 id값을 알수 없게된다.
scheduleMapper.insertScheduleMemberGroup(groupVO);
scheduleVO.setScheduleMemberGroupId(groupVO.getId());
scheduleMapper.insertSchedule(scheduleVO);
groupVO.getId()에서 null값이 생긴다.
결론적으로 selectKey를 사용함으로써 방금 생성된 그룹의 id를 바로 Java 객체에 세팅하고
그 id를 다른 테이블에 insert하여 자연스럽게 연결시킨다.