[척척학사] 트러블슈팅: 포털 연동 시 이수 구분 오류 & 재수강 중복 문제 해결

박상민·2025년 8월 21일
0

척척학사

목록 보기
15/15
post-thumbnail

학사 관리 서비스(척척학사)를 운영하면서, 포털 데이터를 연동하는 과정에서 크게 두 가지 문제가 발생했습니다.
1. 이수 구분(facultyDivisionName) 매핑 오류
2. 재수강 과목 중복 적재 문제

이 글은 해당 문제를 어떻게 분석하고 해결했는지 기록한 트러블슈팅 사례입니다.


1. 이수 구분 문제

문제 원인

  • 기존 로직에서는 (과목 코드, 연도, 학기, 교수명, 분반)까지만 비교했음
  • 동일 과목이라도 이수 구분(facultyDivisionName) 이 다른 경우가 존재
  • → 이수 구분이 잘못 연결되는 문제가 발생

발생 사례

  • 사용자 A: ICT 개론일선 과목으로 수강
  • 사용자 B: 동일한 ICT 개론전핵 과목으로 수강
  • DB에는 먼저 연동한 A의 데이터(일선)만 남아 B도 잘못 매핑됨

✅ 해결 방법

  • 과목 정보 생성 시 facultyDivisionName을 비교 기준에 추가
  • findByCourseIdAndYearAndSemesterAndClassSectionAndProfessorId
    findByCourseIdAndYearAndSemesterAndClassSectionAndProfessorIdAndFacultyDivisionName 으로 수정
  • 포털 재연동 시 정상 동작 확인 완료

2. 재수강 문제 (초기 대응)

문제 원인

  • 초기에는 재수강 여부(is_retake) 필드를 고려하지 않음
  • 포털 데이터에 재수강 이전 과목 + 재수강 과목이 모두 넘어와 중복 적재 발생

케이스

연동 일시: 2025-02-24
studentId: '보안상 삭제'
course_offerings: num1, num2
-> courseId = num3 (화학및실험2)

재수강 과목인 '화학및실험2'가 중복 적재되어 있음

✅ 초기 해결 방법

  • is_retake 값이 true인 과목만 남기고, 이전 과목은 삭제
  • 재연동 시에도 is_retake=false 과목은 제거 → 중복 방지

3. 8.17 기준 변경 사항 (최종 개선)

재수강 문제는 특수 케이스(과목 코드 변경, 수기 처리된 데이터 등)까지 고려해야 했습니다.

특수 케이스

  • 상황:
    • 과목 폐설로 인해 재수강 과목의 과목 코드가 변경됨
    • → 과목 코드가 다르기 때문에 재수강으로 인식되지 않음
    • → 또한 재수강 관련 필드인 is_retake true(재수강 O)가 아닌 false(재수강 x)로 넘어옴
  • 원인:
    • is_retake = false로 들어오는 것으로 보아,
    • 학적과 또는 과사무실에서 수기로 처리된 데이터일 가능성 존재

이를 해결하기 위해 DB 스키마와 로직을 전면 개편했습니다.

변경점

  • 크롤링 데이터 추가
    • 포털 데이터 중 '재수강 삭제' 필드를 추가로 크롤링 하도록 변경
  • 재수강 관리 필드 변경
    • isRetakeisRetakeDeleted
    • 의미: 재수강으로 인해 삭제된 과목인지 여부
  • 졸업 요건 분석 로직 수정
    • isRetakeDeleted = true인 과목은 졸업 요건에서 제외
  • 학기별 세부 성적 조회
    • isRetakeDeleted 필드를 반환 → 사용자에게도 "재수강으로 제외된 과목"임을 표시 가능
  • 특수 케이스의 경우
    • 특수 케이스의 경우에도 '재수강 삭제' 된 과목의 경우 'isRetakeDeleted' 필드가 true로 데이터가 넘어오는 것을 확인
    • 특수 케이스 처리 가능

🛠️ PROD 서버 DB 변경 SQL

1) student_courses 테이블

ALTER TABLE student_courses
ADD COLUMN IF NOT EXISTS is_retake_deleted BOOLEAN NOT NULL DEFAULT FALSE;

2) students 테이블

ALTER TABLE students
ADD COLUMN IF NOT EXISTS reconnection_required BOOLEAN NOT NULL DEFAULT TRUE;

3) course_offerings 테이블 유니크 제약 조건 확인

SELECT con.conname AS constraint_name,
       pg_get_constraintdef(con.oid) AS definition
FROM pg_constraint con
JOIN pg_class rel ON rel.oid = con.conrelid
JOIN pg_namespace nsp ON nsp.oid = rel.relnamespace
WHERE rel.relname = 'course_offerings'
  AND con.contype = 'u';

4) course_offerings 테이블 유니크 제약 조건 재설정

-- 기존 유니크 제약조건 삭제 (제약 이름 확인 필요)
ALTER TABLE course_offerings
DROP CONSTRAINT IF EXISTS uq_course_offering;

-- 새로운 유니크 제약조건 추가
ALTER TABLE course_offerings
ADD CONSTRAINT uq_course_offering UNIQUE (
    course_id,
    year,
    semester,
    class_section,
    professor_id,
    faculty_division_name,
    host_department
);

4. 사용자 재연동 문제 해결 방안

  • 모든 사용자는 포털 재연동을 통해 데이터가 정상화되도록 함
  • students.reconnection_required 필드를 추가하여,
    재연동이 필요한 경우 자동으로 포털 재연동 페이지로 리다이렉트

✅ 정리

문제원인해결
이수 구분 오류facultyDivisionName 미고려비교 로직에 facultyDivisionName 추가
재수강 중복is_retake 미고려is_retake → isRetakeDeleted 필드 도입, 이전 과목 soft-delete 처리
특수 케이스과목 코드 변경, 수기 처리isRetakeDeleted 로직으로 일괄 처리 가능
재연동 필요기존 사용자 데이터 오류reconnection_required 필드 추가 → 재연동 유도

이번 개선으로 모든 사용자 데이터가 일관성 있게 관리되며,
이수 구분/재수강 문제도 안정적으로 해결되었습니다.
앞으로는 포털 재연동만 진행하면 문제가 자동으로 처리됩니다.

0개의 댓글