웹 개발/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하여 자연스럽게 연결시킨다.