본문 바로가기

테스트 플렛폼

java에서 하위 목록을 같은 행으로 순서로 배열하는 로직

반응형
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

/**
 * iBatis를 사용하여 테스트 관리 데이터를 조회하는 DAO 클래스입니다.
 * 이 클래스는 데이터베이스에서 가져온 결과를 가공하여 요청된 형식으로 반환합니다.
 */
public class TestManagementDAO extends SqlMapClientDaoSupport {

    /**
     * 조회 조건에 따라 테스트 관리 데이터를 데이터베이스에서 가져옵니다.
     * SQL 쿼리 결과를 가공하여, 각 테스트 케이스의 액티비티를 단일 맵에 포함시킵니다.
     *
     * @param params 조회 조건을 담고 있는 맵 (testId는 필수, scenarioName, testCaseName은 선택 사항).
     * @return 각 테스트 케이스가 액티비티를 포함하는 맵 형태로 변환된 데이터 리스트를 반환합니다.
     */
    public List<Map<String, Object>> getTestManagementData(Map<String, Object> params) {
        // 1. 데이터베이스에서 원본 데이터를 조회합니다.
        List<Map<String, Object>> rawData = (List<Map<String, Object>>) getSqlMapClientTemplate().queryForList("TestManagement.getTestManagementData", params);

        // 2. testCaseId를 기준으로 데이터를 그룹화합니다.
        Map<String, List<Map<String, Object>>> groupedByTestCaseId = rawData.stream()
                .filter(row -> row.get("testCaseId") != null) // testCaseId가 null이 아닌 경우만 필터링
                .collect(Collectors.groupingBy(row -> (String) row.get("testCaseId")));

        // 3. 그룹화된 데이터를 요청 형식으로 변환합니다.
        List<Map<String, Object>> resultData = new ArrayList<>();
        groupedByTestCaseId.forEach((testCaseId, activities) -> {
            // 각 테스트 케이스에 대한 맵을 생성합니다.
            Map<String, Object> testCaseMap = new HashMap<>();
            
            // 공통 필드를 설정합니다.
            // 첫 번째 액티비티의 데이터를 기준으로 공통 정보를 가져옵니다.
            if (!activities.isEmpty()) {
                Map<String, Object> firstActivity = activities.get(0);
                testCaseMap.put("testId", firstActivity.get("testId"));
                testCaseMap.put("testName", firstActivity.get("testName"));
                testCaseMap.put("scenarioId", firstActivity.get("scenarioId"));
                testCaseMap.put("scenarioName", firstActivity.get("scenarioName"));
                testCaseMap.put("testCaseId", firstActivity.get("testCaseId"));
                testCaseMap.put("testCaseName", firstActivity.get("testCaseName"));
                testCaseMap.put("type", firstActivity.get("type"));
                testCaseMap.put("description", firstActivity.get("description"));
            }

            // 액티비티 정보를 동적으로 추가합니다.
            for (int i = 0; i < activities.size(); i++) {
                Map<String, Object> activity = activities.get(i);
                int activityNumber = i + 1;
                testCaseMap.put("activityName" + activityNumber, activity.get("activityName"));
                testCaseMap.put("activityResult" + activityNumber, activity.get("result"));
            }
            resultData.add(testCaseMap);
        });

        return resultData;
    }
}
반응형