ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • selectKey를 활용한 스케줄-멤버 연결 쿼리 정리
    웹 개발/Spring 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하여 자연스럽게 연결시킨다.

    '웹 개발 > Spring' 카테고리의 다른 글

    ResponseEntity  (0) 2025.05.14
    Spring @RequestParam, @RequestBody, @PathVariable  (1) 2025.04.27
    IoC와 DI  (2) 2025.04.16

    댓글

Designed by Tistory.