MariaDB
java, spring, ibatis, mariadb 환경에서 Insert하고 Pk 가져오는 방법
오아름 샘
2025. 6. 4. 16:33
반응형
Java + Spring + iBatis + MariaDB 환경에서 다음 요구사항을 만족하는 예제를 만들어드리겠습니다:
✅ activity 테이블에 데이터를 INSERT하고, 자동 생성된 activity_id(PK)를 반환받아
✅ 그 값을 이용해 activity_detail 테이블에 데이터를 저장
✅ 1. 테이블 구조 예시
-- activity 테이블
CREATE TABLE activity (
activity_id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- activity_detail 테이블
CREATE TABLE activity_detail (
detail_id BIGINT AUTO_INCREMENT PRIMARY KEY,
activity_id BIGINT,
description TEXT,
FOREIGN KEY (activity_id) REFERENCES activity(activity_id)
);
✅ 2. iBatis SQL Mapper 구성 (ActivityMapper.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ActivityMapper">
<!-- 1. activity insert -->
<insert id="insertActivity" parameterType="Activity" useGeneratedKeys="true" keyProperty="activityId">
INSERT INTO activity (name)
VALUES (#{name})
</insert>
<!-- 2. activity_detail insert -->
<insert id="insertActivityDetail" parameterType="ActivityDetail">
INSERT INTO activity_detail (activity_id, description)
VALUES (#{activityId}, #{description})
</insert>
</mapper>
useGeneratedKeys="true"와 keyProperty="activityId"를 사용하여 Activity 객체의 activityId 필드에 자동 증가 키를 저장합니다.
✅ 3. Java DTO 클래스
// Activity.java
public class Activity {
private Long activityId;
private String name;
// getter/setter
public Long getActivityId() { return activityId; }
public void setActivityId(Long activityId) { this.activityId = activityId; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
// ActivityDetail.java
public class ActivityDetail {
private Long detailId;
private Long activityId;
private String description;
// getter/setter
public Long getDetailId() { return detailId; }
public void setDetailId(Long detailId) { this.detailId = detailId; }
public Long getActivityId() { return activityId; }
public void setActivityId(Long activityId) { this.activityId = activityId; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
}
✅ 4. DAO Interface
public interface ActivityMapper {
void insertActivity(Activity activity);
void insertActivityDetail(ActivityDetail activityDetail);
}
✅ 5. Service 클래스
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
@Service
public class ActivityService {
@Resource
private ActivityMapper activityMapper;
@Transactional
public void createActivityWithDetail(String activityName, String description) {
// 1. Activity 생성
Activity activity = new Activity();
activity.setName(activityName);
activityMapper.insertActivity(activity);
// 2. 생성된 PK(activityId)를 활용한 Detail 저장
ActivityDetail detail = new ActivityDetail();
detail.setActivityId(activity.getActivityId());
detail.setDescription(description);
activityMapper.insertActivityDetail(detail);
}
}
✅ 6. Controller 예시
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/activity")
public class ActivityController {
private final ActivityService activityService;
public ActivityController(ActivityService activityService) {
this.activityService = activityService;
}
@PostMapping
public String create(@RequestParam String name, @RequestParam String description) {
activityService.createActivityWithDetail(name, description);
return "저장 완료";
}
}
✅ 정리
- @Transactional 로 두 insert를 하나의 트랜잭션으로 묶어 처리합니다.
- useGeneratedKeys를 통해 activity_id 자동 반환받음
- 반환된 PK를 기반으로 activity_detail에 저장
필요하시면 MyBatis Config, Spring Boot 설정 등도 도와드릴 수 있습니다.
반응형