이 글은 Velog에서 이전한 글입니다. Velog 원문 보기
학사 관리 서비스(척척학사)를 운영하면서, 포털 데이터를 연동하는 과정에서 크게 두 가지 문제가 발생했습니다.
- 이수 구분(facultyDivisionName) 매핑 오류
- 재수강 과목 중복 적재 문제
이 글은 해당 문제를 어떻게 분석하고 해결했는지 기록한 트러블슈팅 사례입니다.
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_retaketrue(재수강 O)가 아닌 false(재수강 x)로 넘어옴
- 과목 폐설로 인해 재수강 과목의
- 원인:
is_retake = false로 들어오는 것으로 보아,- 학적과 또는 과사무실에서 수기로 처리된 데이터일 가능성 존재
이를 해결하기 위해 DB 스키마와 로직을 전면 개편했습니다.
변경점
- 크롤링 데이터 추가
- 포털 데이터 중 '재수강 삭제' 필드를 추가로 크롤링 하도록 변경
- 재수강 관리 필드 변경
isRetake→isRetakeDeleted- 의미: 재수강으로 인해 삭제된 과목인지 여부
- 졸업 요건 분석 로직 수정
isRetakeDeleted = true인 과목은 졸업 요건에서 제외
- 학기별 세부 성적 조회
isRetakeDeleted필드를 반환 → 사용자에게도 "재수강으로 제외된 과목"임을 표시 가능
- 특수 케이스의 경우
- 특수 케이스의 경우에도 '재수강 삭제' 된 과목의 경우 'isRetakeDeleted' 필드가
true로 데이터가 넘어오는 것을 확인 - 특수 케이스 처리 가능
- 특수 케이스의 경우에도 '재수강 삭제' 된 과목의 경우 'isRetakeDeleted' 필드가
🛠️ 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 필드 추가 → 재연동 유도 |
이번 개선으로 모든 사용자 데이터가 일관성 있게 관리되며,
이수 구분/재수강 문제도 안정적으로 해결되었습니다.
앞으로는 포털 재연동만 진행하면 문제가 자동으로 처리됩니다.
'Project > 척척학사' 카테고리의 다른 글
| [척척학사] 소셜 로그인 정보 변경으로 인한 중복 계정 생성 문제, 어떻게 해결했을까? (0) | 2026.08.03 |
|---|---|
| [척척학사] API 성능 튜닝: P6Spy 쿼리 분석부터 인덱싱 & 캐싱까지 (0) | 2026.08.03 |
| [척척학사] 🚨 PostgreSQL: duplicate key value violates unique constraint 에러 해결하기 (0) | 2026.08.02 |
| [척척학사] CI/CD 적용 과정 With GitHub Actions (0) | 2026.08.02 |
| [척척학사] 디스크 용량 부족으로 인한 JVM 실행 실패 해결기 (0) | 2026.08.02 |