본문 바로가기

기술자료

Java, Spring, iBatis, MariaDB 환경에서 테스트 액티비티 테이블에 SQL 문장을 입력하고 해당 테스트 액티비티를 실행하여 결과를 저장하는 프로그램

반응형
Java, Spring, iBatis, MariaDB 환경에서 테스트 액티비티 테이블에 SQL 문장을 입력하고 해당 테스트 액티비티를 실행하여 결과를 저장하는 프로그램을 만들어보겠습니다. 이 프로그램은 테스트 액티비티에 있는 업체 정보 및 다른 파라미터를 입력받아 실행합니다. iBatis 설정은 XML 파일로 분리하여 구현합니다.

1. 프로젝트 설정

1.1. build.gradle 설정

plugins {
    id 'org.springframework.boot' version '2.7.5'
    id 'io.spring.dependency-management' version '1.0.13.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

2. 데이터베이스 설정

2.1. application.properties 설정

spring.datasource.url=jdbc:mariadb://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

mybatis.mapper-locations=classpath:mappers/*.xml
 

 

3. 데이터베이스 테이블 생성

CREATE TABLE TestActivity (
    id INT AUTO_INCREMENT PRIMARY KEY,
    testCaseId INT,
    sqlQuery TEXT,
    executionResult TEXT,
    companyId INT,
    parameters JSON
);

 

 

4. 도메인 클래스

4.1. TestActivity.java

package com.example.demo.domain;

public class TestActivity {
    private Integer id;
    private Integer testCaseId;
    private String sqlQuery;
    private String executionResult;
    private Integer companyId;
    private String parameters; // JSON 형식의 문자열로 저장

    // Getters and Setters
}

 

5. 매퍼 인터페이스 및 XML

5.1. TestActivityMapper.java

package com.example.demo.mapper;

import com.example.demo.domain.TestActivity;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface TestActivityMapper {

    @Select("SELECT * FROM TestActivity WHERE id = #{id}")
    TestActivity findById(int id);

    @Select("SELECT * FROM TestActivity")
    List<TestActivity> findAll();

    @Insert("INSERT INTO TestActivity(testCaseId, sqlQuery, executionResult, companyId, parameters) VALUES(#{testCaseId}, #{sqlQuery}, #{executionResult}, #{companyId}, #{parameters})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(TestActivity testActivity);

    @Update("UPDATE TestActivity SET executionResult = #{executionResult} WHERE id = #{id}")
    void update(TestActivity testActivity);
}

 

 

5.2. TestActivityMapper.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="com.example.demo.mapper.TestActivityMapper">

    <select id="findById" parameterType="int" resultType="com.example.demo.domain.TestActivity">
        SELECT * FROM TestActivity WHERE id = #{id}
    </select>

    <select id="findAll" resultType="com.example.demo.domain.TestActivity">
        SELECT * FROM TestActivity
    </select>

    <insert id="insert" parameterType="com.example.demo.domain.TestActivity" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO TestActivity(testCaseId, sqlQuery, executionResult, companyId, parameters)
        VALUES(#{testCaseId}, #{sqlQuery}, #{executionResult}, #{companyId}, #{parameters})
    </insert>

    <update id="update" parameterType="com.example.demo.domain.TestActivity">
        UPDATE TestActivity SET executionResult = #{executionResult} WHERE id = #{id}
    </update>

</mapper>

 

 

6. 서비스 클래스

6.1. TestActivityService.java

package com.example.demo.service;

import com.example.demo.domain.TestActivity;
import com.example.demo.mapper.TestActivityMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Service
public class TestActivityService {

    @Autowired
    private TestActivityMapper testActivityMapper;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<TestActivity> getAllTestActivities() {
        return testActivityMapper.findAll();
    }

    public void executeTestActivity(int id, Map<String, Object> parameters) {
        TestActivity testActivity = testActivityMapper.findById(id);
        if (testActivity != null) {
            try {
                // SQL 문에 파라미터를 적용하여 실행
                String sql = testActivity.getSqlQuery();
                String result = jdbcTemplate.queryForObject(sql, parameters, String.class);
                testActivity.setExecutionResult(result);
            } catch (Exception e) {
                testActivity.setExecutionResult(e.getMessage());
            }
            testActivityMapper.update(testActivity);
        }
    }
}

 

7. 컨트롤러 클래스

7.1. TestActivityController.java

package com.example.demo.controller;

import com.example.demo.domain.TestActivity;
import com.example.demo.service.TestActivityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/test-activities")
public class TestActivityController {

    @Autowired
    private TestActivityService testActivityService;

    @GetMapping
    public List<TestActivity> getAllTestActivities() {
        return testActivityService.getAllTestActivities();
    }

    @PostMapping("/execute/{id}")
    public void executeTestActivity(@PathVariable int id, @RequestBody Map<String, Object> parameters) {
        testActivityService.executeTestActivity(id, parameters);
    }
}

 

8. 실행 및 테스트

프로젝트를 실행하고, Postman 또는 다른 REST 클라이언트를 사용하여 다음과 같은 요청을 보낼 수 있습니다:
  • 모든 테스트 액티비티 조회: GET http://localhost:8080/test-activities
  • 특정 테스트 액티비티 실행: POST http://localhost:8080/test-activities/execute/{id}
이 프로그램은 테스트 액티비티 테이블에 저장된 SQL 문장을 실행하고, 결과를 해당 테스트 액티비티의 executionResult 필드에 저장합니다. SQL 문장 실행 시 필요한 파라미터는 JSON 형식으로 입력받아 실행합니다
반응형