본문 바로가기

MariaDB

java, spring, ibatis, mariadb 환경에서 Insert하고 Pk 가져오는 방법

반응형

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 설정 등도 도와드릴 수 있습니다.

반응형

'MariaDB' 카테고리의 다른 글

MariaDB의 View 설명  (0) 2025.06.02