서비스 접속

테스형 - 자기사유 테스트 플랫폼

https://github.com/seoseuo/tst-BE

https://github.com/seoseuo/tst-FE

시리즈 | 테스형 - seuo.log

<aside> 📄 테스형 산출물

</aside>

개요

테스형 표지 (2).png

테스형 소개 (1).png

테스형 소개 (2).png

테스형 소개.png

테스형 소개.png

주요기능

레디스를 이용한 테스트 세션 캐싱

테스트 진행 시 세션 데이터 레디스를 이용하여 캐싱

테스형 레디스 캐싱.png

    public void selectChoice(int testId, SelectUtil selectUtil) {
        log.info("testId: {}, selectUtil: {}", testId, selectUtil);

        SelectedBox selectedBox = new SelectedBox();
        selectedBox.setStyleId1(selectUtil.getStyleId1());
        selectedBox.setStyleId2(selectUtil.getStyleId2());

        AnswerSession answerSession = redisService.getAnswerSession(selectUtil.getUserCode());
        answerSession.getSelectedBoxesMap().put(selectUtil.getQuestionId(), selectedBox);
        redisService.setAnswerSession(selectUtil.getUserCode(), answerSession, 1800000);

        log.info("레디스에 저장된 선택지: {}", redisService.getAnswerSession(selectUtil.getUserCode()));
    }

테스트 결과 추출 알고리즘 구현

한개의 선택지 당 2가지의 결과 유형(Style)에 매핑이 가능하므로 style1,2 구분 및 카운트

결과 검출 알고리즘.png

public int findMostSelectedStyle() {
        // 스타일의 등장 횟수를 기록할 맵
        Map<Integer, Integer> countMap = new HashMap<>();

        // 선택된 박스들에서 style1, style2를 각각 카운트       
        for (SelectedBox box : this.selectedBoxesMap.values()) {
            // style1 등장 횟수 +1
            countMap.put(box.getStyleId1(), countMap.getOrDefault(box.getStyleId1(), 0) + 1);
            // style2 등장 횟수 +1
            countMap.put(box.getStyleId2(), countMap.getOrDefault(box.getStyleId2(), 0) + 1);
        }

        // 가장 많이 등장한 styleId 찾기
        return countMap.entrySet().stream()
                .max(Map.Entry.comparingByValue()) // 값 기준으로 최대값 찾기
                .map(Map.Entry::getKey) // 그 최대값을 가진 key 반환
                .orElse(0); // 아무것도 없으면 기본값 1
    }

테스트 유형 매핑 프로세스 설계