-
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