From 7a271e2a216d96fe01808f2f83fb305ffcb442ff Mon Sep 17 00:00:00 2001
From: Oh YoungJe <139232765+GulSauce@users.noreply.github.com>
Date: Sun, 18 Jan 2026 15:30:51 +0900
Subject: [PATCH 1/3] v 1.4.0 (#116)
---
src/pages/MakeQuiz/ui/RecentChanges/index.jsx | 49 +++++++++++++++----
1 file changed, 39 insertions(+), 10 deletions(-)
diff --git a/src/pages/MakeQuiz/ui/RecentChanges/index.jsx b/src/pages/MakeQuiz/ui/RecentChanges/index.jsx
index 6854983..2484389 100644
--- a/src/pages/MakeQuiz/ui/RecentChanges/index.jsx
+++ b/src/pages/MakeQuiz/ui/RecentChanges/index.jsx
@@ -1,22 +1,51 @@
+import { useEffect, useState } from "react";
import { useTranslation } from "i18nexus";
+import axiosInstance from "#shared/api";
import "./index.css";
const RecentChanges = () => {
const { t } = useTranslation();
+ const [changes, setChanges] = useState([]);
+
+ useEffect(() => {
+ const fetchUpdates = async () => {
+ try {
+ const res = await axiosInstance.get("/updateLog");
+
+ const data = res.data;
+
+ setChanges(data.updateLogs || []);
+ } catch (err) {
+ console.error("변경사항 로드 실패:", err);
+ }
+ };
+
+ fetchUpdates();
+ }, []);
+
+ const formatDate = (isoString) => {
+ const date = new Date(isoString);
+ return new Intl.DateTimeFormat("ko-KR", {
+ timeZone: "Asia/Seoul",
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ })
+ .format(date)
+ .replace(/\. /g, ".")
+ .replace(/\.$/, "");
+ };
+
return (
{t("최근 변경사항")}
- -
- 2025.12.17
- {t("문제 가독성 개선")}
-
- -
- 2025.12.14
-
- {t("페이지 제한 100pages → 150pages 변경")}
-
-
+ {changes.map((log, index) => (
+ -
+ {formatDate(log.dateTime)}
+ {t(log.updateText)}
+
+ ))}
);
From 9034b0e8a140b704845de274befbdf55bec82869 Mon Sep 17 00:00:00 2001
From: Oh YoungJe <139232765+GulSauce@users.noreply.github.com>
Date: Mon, 19 Jan 2026 04:45:44 +0900
Subject: [PATCH 2/3] v 1.4.1 (#118)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* [ICC-55] 모바일 화면깨짐 조정정
* 미세조정정
* [ICC-60] 헤더 이미지, vite 이미지 교체 및 페이지 범위 설정
* [ICC-61] pdf 관련 코드 추가
* [ICC-59] 퀴즈 결과 페이지 디자인 수정
* [ICC-62] Quiz 만들 시 레벨 선택 가능 및 퀴즈 결과 페이지 수정
* google analytics 분석 기능 추가
* 도움말 페이지 및 그에 맞는 분석 기능 추가
* generation 페이지 사용자 지정 명세 수정
* [ICC-75] 구현 완료
* [ICC-75] 리베이스 머지 전 커밋
* [ICC-75] 파일 제한 안내 문구, 파일 크기 오류 메시지 추가
* [ICC-75] 파일 크기 제한을 전역변수로
* page지정 int 값으로
* 참조하는 데이터 변경
* 연락처 추가
* [ICC-82] 환경 설정 완료
* [ICC-82] 불필요 옵션 제거
* dialog보이기 및 footer 수정
* [ICC-82] 누락본 추가
* [ICC-84] 참조 페이지 추가
* 퀴즈 기록 로컬 스테이트를 통해 확인
* [ICC-83] dev_deploy.yml 작성
* [ICC-83] dev_deploy.yml 작성
* [ICC-83] 객체 삭제 후 커밋
* [ICC-83] 두번째 시도
* [ICC-83] 세번째 시도
* [ICC-83] 구현 완료
* [ICC-83] 수정
* [ICC-83] 네번째 시도
* [ICC-83] 다섯번째 시도
* [ICC-83] 구현완료
* [ICC-83] 구현완료
* 테스트 중
* modified: src/pages/MakeQuiz.jsx
* test용용
* test2
* test22
* 테스트했던거 수정
* 선지박스 늘리기 및 글씨 간격, 파일 업로드 수정
* 검토부분 최종 수정
* 틀린문제 문제번호 박스 표시
* [ICC-91] history 페이지 개선 추가
* [ICC-90] 개선 완료
* [ICC-90] 통계 원위치
* [ICC-90] setProbelmId 복구
* [ICC-90] 퀴즈 기록 볼드체
* 오답만 보기 처리 기능 및 사용자 선지선택 안한거 처리
* [ICC-91] history 페이지 개선 추가
* 다이어로그로 사용자 문제 최종 점검
* 다이어로그로 사용자 문제 최종 점검
* 설문 다이어로그 주석처리
* [ICC-93] s3 url 에러 코드 추가
* [ICC-93] 에러 메세지 수정
* [ICC-93] 에러 메세지 수정
* [ICC-93] 수정사항 반영
* 도움말 페이지에 퀴즈 기록 설명 추가 및 퀴즈 기록에서 다시풀기 기능 추가, 퀴즈 기록페이지 이벤트 추적 추가
* 퀴즈기록만 틔는거 수정
* quiz select 변경
* 메세지 수정
* 확대기능 추가
* 상세해설보기 기능 추가
* 모바일 사이즈 수정
* MakeQuiz 버튼 text 수정정
* 스피너 돌고 명칭수정
* [ICC-102] css 스타일변경으로 공백출력하도록함
* 문제 난이도 -> 문제 단계
* [ICC-104] 링크 태그로 변경 완료
* [ICC-104] 푸터 조정
* [ICC-107] SEO 구성 완료
* [ICC-107] 구조 확정, 텍스트 수정 남음
* [ICC-105] 상세 해설 url 설정
* [ICC-107] 구조 작성, 텍스트 수정 중
* [ICC-107] 작성 완료
* [ICC-107] 파일 제한 수정
* [ICC-107] 파일 이름 변경
* [ICC-107] 기본값을 숨기기로
* [ICC-116] 퀴즈 히스토리 클래스명 수정 (#48)
* [ICC-109] 개발용 S3 cicd (#50)
* [ICC-109] 첫번째 시도
* [ICC-109] 구현 완료
* [ICC-113] 출처 url + OCR url
* [ICC-113] 리팩터링
* [ICC-110] 작성 완료
* [ICC-110] 첫번째 시도
* [ICC-110] 구현 완료
* [ICC-110] github action에 로그인으로 수정
* [ICC-110] 두번째 시도
* [ICC-110] 세번째 시도
* [ICC-110] 네번째 시도
* [ICC-110] 네번째 시도
* [ICC-110] 다섯번째 시도
* [ICC-110] 여섯번째 시도
* [ICC-110] 일곱번째 시도
* [ICC-110] 여덟번째 시도
* [ICC-110] 아홉번째 시도
* [ICC-110] 열번째 시도
* [ICC-110] 열한번째 시도
* [ICC-110] 열두번째 시도
* [ICC-110] 열세번째 시도
* [ICC-110] 열네번째 시도
* [ICC-110] 구현 완료
* [ICC-110] 코드 1번 연속 테스트 1
* [ICC-110] 코드 1번 연속 테스트 2
* [ICC-110] 재시도
* [ICC-110] S3 업로드만 테스트
* [ICC-110] Cloudfront 초기화도 같이
* [ICC-110] S3 업로드만 테스트
* [ICC-110] S3 업로드만 테스트
* [ICC-110] echo로 확인
* [ICC-110] code 1 S3 상태 확인
* [ICC-110] 재확인
* [ICC-110] 구현완료
* [ICC-121] 첫번째 시도
* [ICC-121] 첫번째 시도
* [ICC-121 두번째 시도
* [ICC-121 세번째 시도
* [ICC-121] 네번째 시도
* [ICC-121] 테스트가 끝났으니 올바른 브랜치명으로 복원
* [ICC-120] 커서로 로우 데이터 완성, 수정 시작
* [ICC-120] MakeQuiz 로드되면 애널리틱스가 트래킹하게 수정
* [ICC-120] package.json 수정
* [ICC-120] 동적 사이트맵 생성 코드 제거
* [ICC-120] robots.txt 변경
* [ICC-120] 여러 아이콘 이미지 도입
* [ICC_120] 전부 헤드 태그로 이전
* [ICC-120] helmet을 사용하지 않으므로 다시 리액트 업그레이드
* [ICC-120] ppt 허용
* [ICC-120] 수정
* [ICC-124] CICD 수정:
* [ICC-124] 첫번째 시도
* [ICC-124] 브랜치 이름 복원
* [ICC-125] 발견된 문제점들 수정
* [ICC-127] 디자인 변경 완료
* [ICC-127] 태그 타입 수정
* [ICC-127] 코드 작성 완료
* [ICC-115] OX API 구현 완료
* [ICC-126] 지연 로딩
* [ICC-126] 2.5초에 50페이지
* [ICC-126] 공통 값 변수화
* [ICC-126] 백그라운드 이미지 추가
* [ICC-126] 사진 추가
* [ICC-126] 지연 로딩
* [ICC-126] 2.5초에 50페이지
* [ICC-126] 공통 값 변수화
* [ICC-126] 백그라운드 이미지 추가
* [ICC-126] 사진 추가
* [ICC-126] background 변경
* [ICC-126] conflicts 해결
* [ICC-126] background 삭제
* [ICC-126] background 추가
* [ICC-131] 이미지 변경 완료
* [ICC-131] 위치 조정 완료
* [ICC-157] 2차 배포전 프론트 변경
* [ICC-157] 내부 파일로 변경
* [ICC-158] 중간 저장
* [ICC-158] 768px 미만 버튼 배열 방식 변경
* [ICC-158] 도움말 버튼 위치 이동
* [ICC-158] 언어 버튼 추가
* [ICC-158] 변경 완료
* [ICC-162] 문제 유형, 난이도 통일
* [ICC-162] 기본값 수정
* [ICC-162] 유형배치, 설명 변경
* [ICC-161] 퀴즈 풀이 영역 개선
* [ICC-161] 해설보기 화면 조정 중
* [ICC-161] 중복 스타일 제거
* [ICC-161] 해설 스타일 변경 완료
* [ICC-161] 해설 스타일 변경 완료
* [ICC-161] 다국어 번역 추가
* v 1.3.0 (#81)
* first commit
* Delete .env
* s3 url 받아오기기
* docker작업
* 안푼 문제 있을 시 번호 생성 및 이동
* solvequiz 화면 수정 및 quizresult화면
* modified: .gitignore
modified: src/pages/MakeQuiz.css
modified: src/pages/MakeQuiz.jsx
* Delete FastAPI directory
* Delete docker-compose.yml
* 문제 button 배치 수정
* 필요한 모든 화면 작업
* className 수정정
* [ICC-54] 구현 완료
* [ICC-54] 참조 환경 변수 이름 변경
* [ICC-55] 모바일 화면깨짐 조정정
* 미세조정정
* [ICC-60] 헤더 이미지, vite 이미지 교체 및 페이지 범위 설정
* [ICC-61] pdf 관련 코드 추가
* [ICC-59] 퀴즈 결과 페이지 디자인 수정
* [ICC-62] Quiz 만들 시 레벨 선택 가능 및 퀴즈 결과 페이지 수정
* google analytics 분석 기능 추가
* 도움말 페이지 및 그에 맞는 분석 기능 추가
* generation 페이지 사용자 지정 명세 수정
* [ICC-75] 구현 완료
* [ICC-75] 리베이스 머지 전 커밋
* [ICC-75] 파일 제한 안내 문구, 파일 크기 오류 메시지 추가
* [ICC-75] 파일 크기 제한을 전역변수로
* page지정 int 값으로
* 참조하는 데이터 변경
* 연락처 추가
* [ICC-82] 환경 설정 완료
* [ICC-82] 불필요 옵션 제거
* dialog보이기 및 footer 수정
* [ICC-82] 누락본 추가
* [ICC-84] 참조 페이지 추가
* 퀴즈 기록 로컬 스테이트를 통해 확인
* [ICC-83] dev_deploy.yml 작성
* [ICC-83] dev_deploy.yml 작성
* [ICC-83] 객체 삭제 후 커밋
* [ICC-83] 두번째 시도
* [ICC-83] 세번째 시도
* [ICC-83] 구현 완료
* [ICC-83] 수정
* [ICC-83] 네번째 시도
* [ICC-83] 다섯번째 시도
* [ICC-83] 구현완료
* [ICC-83] 구현완료
* 테스트 중
* modified: src/pages/MakeQuiz.jsx
* test용용
* test2
* test22
* 테스트했던거 수정
* 선지박스 늘리기 및 글씨 간격, 파일 업로드 수정
* 검토부분 최종 수정
* 틀린문제 문제번호 박스 표시
* [ICC-91] history 페이지 개선 추가
* [ICC-90] 개선 완료
* [ICC-90] 통계 원위치
* [ICC-90] setProbelmId 복구
* [ICC-90] 퀴즈 기록 볼드체
* 오답만 보기 처리 기능 및 사용자 선지선택 안한거 처리
* [ICC-91] history 페이지 개선 추가
* 다이어로그로 사용자 문제 최종 점검
* 다이어로그로 사용자 문제 최종 점검
* 설문 다이어로그 주석처리
* [ICC-93] s3 url 에러 코드 추가
* [ICC-93] 에러 메세지 수정
* [ICC-93] 에러 메세지 수정
* [ICC-93] 수정사항 반영
* 도움말 페이지에 퀴즈 기록 설명 추가 및 퀴즈 기록에서 다시풀기 기능 추가, 퀴즈 기록페이지 이벤트 추적 추가
* 퀴즈기록만 틔는거 수정
* quiz select 변경
* 메세지 수정
* 확대기능 추가
* 상세해설보기 기능 추가
* 모바일 사이즈 수정
* MakeQuiz 버튼 text 수정정
* 스피너 돌고 명칭수정
* [ICC-102] css 스타일변경으로 공백출력하도록함
* 문제 난이도 -> 문제 단계
* [ICC-104] 링크 태그로 변경 완료
* [ICC-104] 푸터 조정
* [ICC-107] SEO 구성 완료
* [ICC-107] 구조 확정, 텍스트 수정 남음
* [ICC-105] 상세 해설 url 설정
* [ICC-107] 구조 작성, 텍스트 수정 중
* [ICC-107] 작성 완료
* [ICC-107] 파일 제한 수정
* [ICC-107] 파일 이름 변경
* [ICC-107] 기본값을 숨기기로
* [ICC-116] 퀴즈 히스토리 클래스명 수정 (#48)
* [ICC-109] 개발용 S3 cicd (#50)
* [ICC-109] 첫번째 시도
* [ICC-109] 구현 완료
* [ICC-113] 출처 url + OCR url
* [ICC-113] 리팩터링
* [ICC-110] 작성 완료
* [ICC-110] 첫번째 시도
* [ICC-110] 구현 완료
* [ICC-110] github action에 로그인으로 수정
* [ICC-110] 두번째 시도
* [ICC-110] 세번째 시도
* [ICC-110] 네번째 시도
* [ICC-110] 네번째 시도
* [ICC-110] 다섯번째 시도
* [ICC-110] 여섯번째 시도
* [ICC-110] 일곱번째 시도
* [ICC-110] 여덟번째 시도
* [ICC-110] 아홉번째 시도
* [ICC-110] 열번째 시도
* [ICC-110] 열한번째 시도
* [ICC-110] 열두번째 시도
* [ICC-110] 열세번째 시도
* [ICC-110] 열네번째 시도
* [ICC-110] 구현 완료
* [ICC-110] 코드 1번 연속 테스트 1
* [ICC-110] 코드 1번 연속 테스트 2
* [ICC-110] 재시도
* [ICC-110] S3 업로드만 테스트
* [ICC-110] Cloudfront 초기화도 같이
* [ICC-110] S3 업로드만 테스트
* [ICC-110] S3 업로드만 테스트
* [ICC-110] echo로 확인
* [ICC-110] code 1 S3 상태 확인
* [ICC-110] 재확인
* [ICC-110] 구현완료
* [ICC-121] 첫번째 시도
* [ICC-121] 첫번째 시도
* [ICC-121 두번째 시도
* [ICC-121 세번째 시도
* [ICC-121] 네번째 시도
* [ICC-121] 테스트가 끝났으니 올바른 브랜치명으로 복원
* [ICC-120] 커서로 로우 데이터 완성, 수정 시작
* [ICC-120] MakeQuiz 로드되면 애널리틱스가 트래킹하게 수정
* [ICC-120] package.json 수정
* [ICC-120] 동적 사이트맵 생성 코드 제거
* [ICC-120] robots.txt 변경
* [ICC-120] 여러 아이콘 이미지 도입
* [ICC_120] 전부 헤드 태그로 이전
* [ICC-120] helmet을 사용하지 않으므로 다시 리액트 업그레이드
* [ICC-120] ppt 허용
* [ICC-120] 수정
* [ICC-124] CICD 수정:
* [ICC-124] 첫번째 시도
* [ICC-124] 브랜치 이름 복원
* [ICC-125] 발견된 문제점들 수정
* [ICC-127] 디자인 변경 완료
* [ICC-127] 태그 타입 수정
* [ICC-127] 코드 작성 완료
* [ICC-115] OX API 구현 완료
* [ICC-126] 지연 로딩
* [ICC-126] 2.5초에 50페이지
* [ICC-126] 공통 값 변수화
* [ICC-126] 백그라운드 이미지 추가
* [ICC-126] 사진 추가
* [ICC-126] 지연 로딩
* [ICC-126] 2.5초에 50페이지
* [ICC-126] 공통 값 변수화
* [ICC-126] 백그라운드 이미지 추가
* [ICC-126] 사진 추가
* [ICC-126] background 변경
* [ICC-126] conflicts 해결
* [ICC-126] background 삭제
* [ICC-126] background 추가
* [ICC-131] 이미지 변경 완료
* [ICC-131] 위치 조정 완료
* [ICC-157] 2차 배포전 프론트 변경
* [ICC-157] 내부 파일로 변경
* [ICC-158] 중간 저장
* [ICC-158] 768px 미만 버튼 배열 방식 변경
* [ICC-158] 도움말 버튼 위치 이동
* [ICC-158] 언어 버튼 추가
* [ICC-158] 변경 완료
* [ICC-162] 문제 유형, 난이도 통일
* [ICC-162] 기본값 수정
* [ICC-162] 유형배치, 설명 변경
* [ICC-161] 퀴즈 풀이 영역 개선
* [ICC-161] 해설보기 화면 조정 중
* [ICC-161] 중복 스타일 제거
* [ICC-161] 해설 스타일 변경 완료
* [ICC-161] 해설 스타일 변경 완료
* [ICC-161] 다국어 번역 추가
---------
Co-authored-by: jaewon
Co-authored-by: nech1234 <145868124+nech1234@users.noreply.github.com>
Co-authored-by: lhoju0158
Co-authored-by: 이찬우 <105221020+ChanJinYeon@users.noreply.github.com>
* [ICC-165] 작성완료
* v 1.3.1 (#83)
* first commit
* Delete .env
* s3 url 받아오기기
* docker작업
* 안푼 문제 있을 시 번호 생성 및 이동
* solvequiz 화면 수정 및 quizresult화면
* modified: .gitignore
modified: src/pages/MakeQuiz.css
modified: src/pages/MakeQuiz.jsx
* Delete FastAPI directory
* Delete docker-compose.yml
* 문제 button 배치 수정
* 필요한 모든 화면 작업
* className 수정정
* [ICC-54] 구현 완료
* [ICC-54] 참조 환경 변수 이름 변경
* [ICC-55] 모바일 화면깨짐 조정정
* 미세조정정
* [ICC-60] 헤더 이미지, vite 이미지 교체 및 페이지 범위 설정
* [ICC-61] pdf 관련 코드 추가
* [ICC-59] 퀴즈 결과 페이지 디자인 수정
* [ICC-62] Quiz 만들 시 레벨 선택 가능 및 퀴즈 결과 페이지 수정
* google analytics 분석 기능 추가
* 도움말 페이지 및 그에 맞는 분석 기능 추가
* generation 페이지 사용자 지정 명세 수정
* [ICC-75] 구현 완료
* [ICC-75] 리베이스 머지 전 커밋
* [ICC-75] 파일 제한 안내 문구, 파일 크기 오류 메시지 추가
* [ICC-75] 파일 크기 제한을 전역변수로
* page지정 int 값으로
* 참조하는 데이터 변경
* 연락처 추가
* [ICC-82] 환경 설정 완료
* [ICC-82] 불필요 옵션 제거
* dialog보이기 및 footer 수정
* [ICC-82] 누락본 추가
* [ICC-84] 참조 페이지 추가
* 퀴즈 기록 로컬 스테이트를 통해 확인
* [ICC-83] dev_deploy.yml 작성
* [ICC-83] dev_deploy.yml 작성
* [ICC-83] 객체 삭제 후 커밋
* [ICC-83] 두번째 시도
* [ICC-83] 세번째 시도
* [ICC-83] 구현 완료
* [ICC-83] 수정
* [ICC-83] 네번째 시도
* [ICC-83] 다섯번째 시도
* [ICC-83] 구현완료
* [ICC-83] 구현완료
* 테스트 중
* modified: src/pages/MakeQuiz.jsx
* test용용
* test2
* test22
* 테스트했던거 수정
* 선지박스 늘리기 및 글씨 간격, 파일 업로드 수정
* 검토부분 최종 수정
* 틀린문제 문제번호 박스 표시
* [ICC-91] history 페이지 개선 추가
* [ICC-90] 개선 완료
* [ICC-90] 통계 원위치
* [ICC-90] setProbelmId 복구
* [ICC-90] 퀴즈 기록 볼드체
* 오답만 보기 처리 기능 및 사용자 선지선택 안한거 처리
* [ICC-91] history 페이지 개선 추가
* 다이어로그로 사용자 문제 최종 점검
* 다이어로그로 사용자 문제 최종 점검
* 설문 다이어로그 주석처리
* [ICC-93] s3 url 에러 코드 추가
* [ICC-93] 에러 메세지 수정
* [ICC-93] 에러 메세지 수정
* [ICC-93] 수정사항 반영
* 도움말 페이지에 퀴즈 기록 설명 추가 및 퀴즈 기록에서 다시풀기 기능 추가, 퀴즈 기록페이지 이벤트 추적 추가
* 퀴즈기록만 틔는거 수정
* quiz select 변경
* 메세지 수정
* 확대기능 추가
* 상세해설보기 기능 추가
* 모바일 사이즈 수정
* MakeQuiz 버튼 text 수정정
* 스피너 돌고 명칭수정
* [ICC-102] css 스타일변경으로 공백출력하도록함
* 문제 난이도 -> 문제 단계
* [ICC-104] 링크 태그로 변경 완료
* [ICC-104] 푸터 조정
* [ICC-107] SEO 구성 완료
* [ICC-107] 구조 확정, 텍스트 수정 남음
* [ICC-105] 상세 해설 url 설정
* [ICC-107] 구조 작성, 텍스트 수정 중
* [ICC-107] 작성 완료
* [ICC-107] 파일 제한 수정
* [ICC-107] 파일 이름 변경
* [ICC-107] 기본값을 숨기기로
* [ICC-116] 퀴즈 히스토리 클래스명 수정 (#48)
* [ICC-109] 개발용 S3 cicd (#50)
* [ICC-109] 첫번째 시도
* [ICC-109] 구현 완료
* [ICC-113] 출처 url + OCR url
* [ICC-113] 리팩터링
* [ICC-110] 작성 완료
* [ICC-110] 첫번째 시도
* [ICC-110] 구현 완료
* [ICC-110] github action에 로그인으로 수정
* [ICC-110] 두번째 시도
* [ICC-110] 세번째 시도
* [ICC-110] 네번째 시도
* [ICC-110] 네번째 시도
* [ICC-110] 다섯번째 시도
* [ICC-110] 여섯번째 시도
* [ICC-110] 일곱번째 시도
* [ICC-110] 여덟번째 시도
* [ICC-110] 아홉번째 시도
* [ICC-110] 열번째 시도
* [ICC-110] 열한번째 시도
* [ICC-110] 열두번째 시도
* [ICC-110] 열세번째 시도
* [ICC-110] 열네번째 시도
* [ICC-110] 구현 완료
* [ICC-110] 코드 1번 연속 테스트 1
* [ICC-110] 코드 1번 연속 테스트 2
* [ICC-110] 재시도
* [ICC-110] S3 업로드만 테스트
* [ICC-110] Cloudfront 초기화도 같이
* [ICC-110] S3 업로드만 테스트
* [ICC-110] S3 업로드만 테스트
* [ICC-110] echo로 확인
* [ICC-110] code 1 S3 상태 확인
* [ICC-110] 재확인
* [ICC-110] 구현완료
* [ICC-121] 첫번째 시도
* [ICC-121] 첫번째 시도
* [ICC-121 두번째 시도
* [ICC-121 세번째 시도
* [ICC-121] 네번째 시도
* [ICC-121] 테스트가 끝났으니 올바른 브랜치명으로 복원
* [ICC-120] 커서로 로우 데이터 완성, 수정 시작
* [ICC-120] MakeQuiz 로드되면 애널리틱스가 트래킹하게 수정
* [ICC-120] package.json 수정
* [ICC-120] 동적 사이트맵 생성 코드 제거
* [ICC-120] robots.txt 변경
* [ICC-120] 여러 아이콘 이미지 도입
* [ICC_120] 전부 헤드 태그로 이전
* [ICC-120] helmet을 사용하지 않으므로 다시 리액트 업그레이드
* [ICC-120] ppt 허용
* [ICC-120] 수정
* [ICC-124] CICD 수정:
* [ICC-124] 첫번째 시도
* [ICC-124] 브랜치 이름 복원
* [ICC-125] 발견된 문제점들 수정
* [ICC-127] 디자인 변경 완료
* [ICC-127] 태그 타입 수정
* [ICC-127] 코드 작성 완료
* [ICC-115] OX API 구현 완료
* [ICC-126] 지연 로딩
* [ICC-126] 2.5초에 50페이지
* [ICC-126] 공통 값 변수화
* [ICC-126] 백그라운드 이미지 추가
* [ICC-126] 사진 추가
* [ICC-126] 지연 로딩
* [ICC-126] 2.5초에 50페이지
* [ICC-126] 공통 값 변수화
* [ICC-126] 백그라운드 이미지 추가
* [ICC-126] 사진 추가
* [ICC-126] background 변경
* [ICC-126] conflicts 해결
* [ICC-126] background 삭제
* [ICC-126] background 추가
* [ICC-131] 이미지 변경 완료
* [ICC-131] 위치 조정 완료
* [ICC-157] 2차 배포전 프론트 변경
* [ICC-157] 내부 파일로 변경
* [ICC-158] 중간 저장
* [ICC-158] 768px 미만 버튼 배열 방식 변경
* [ICC-158] 도움말 버튼 위치 이동
* [ICC-158] 언어 버튼 추가
* [ICC-158] 변경 완료
* [ICC-162] 문제 유형, 난이도 통일
* [ICC-162] 기본값 수정
* [ICC-162] 유형배치, 설명 변경
* [ICC-161] 퀴즈 풀이 영역 개선
* [ICC-161] 해설보기 화면 조정 중
* [ICC-161] 중복 스타일 제거
* [ICC-161] 해설 스타일 변경 완료
* [ICC-161] 해설 스타일 변경 완료
* [ICC-161] 다국어 번역 추가
* [ICC-165] 작성완료
---------
Co-authored-by: jaewon
Co-authored-by: nech1234 <145868124+nech1234@users.noreply.github.com>
Co-authored-by: lhoju0158
Co-authored-by: 이찬우 <105221020+ChanJinYeon@users.noreply.github.com>
* [ICC-161] 불필요한 패딩옵션 제거, 옵션 축소 0
* v 1.3.2 (#85)
* first commit
* Delete .env
* s3 url 받아오기기
* docker작업
* 안푼 문제 있을 시 번호 생성 및 이동
* solvequiz 화면 수정 및 quizresult화면
* modified: .gitignore
modified: src/pages/MakeQuiz.css
modified: src/pages/MakeQuiz.jsx
* Delete FastAPI directory
* Delete docker-compose.yml
* 문제 button 배치 수정
* 필요한 모든 화면 작업
* className 수정정
* [ICC-54] 구현 완료
* [ICC-54] 참조 환경 변수 이름 변경
* [ICC-55] 모바일 화면깨짐 조정정
* 미세조정정
* [ICC-60] 헤더 이미지, vite 이미지 교체 및 페이지 범위 설정
* [ICC-61] pdf 관련 코드 추가
* [ICC-59] 퀴즈 결과 페이지 디자인 수정
* [ICC-62] Quiz 만들 시 레벨 선택 가능 및 퀴즈 결과 페이지 수정
* google analytics 분석 기능 추가
* 도움말 페이지 및 그에 맞는 분석 기능 추가
* generation 페이지 사용자 지정 명세 수정
* [ICC-75] 구현 완료
* [ICC-75] 리베이스 머지 전 커밋
* [ICC-75] 파일 제한 안내 문구, 파일 크기 오류 메시지 추가
* [ICC-75] 파일 크기 제한을 전역변수로
* page지정 int 값으로
* 참조하는 데이터 변경
* 연락처 추가
* [ICC-82] 환경 설정 완료
* [ICC-82] 불필요 옵션 제거
* dialog보이기 및 footer 수정
* [ICC-82] 누락본 추가
* [ICC-84] 참조 페이지 추가
* 퀴즈 기록 로컬 스테이트를 통해 확인
* [ICC-83] dev_deploy.yml 작성
* [ICC-83] dev_deploy.yml 작성
* [ICC-83] 객체 삭제 후 커밋
* [ICC-83] 두번째 시도
* [ICC-83] 세번째 시도
* [ICC-83] 구현 완료
* [ICC-83] 수정
* [ICC-83] 네번째 시도
* [ICC-83] 다섯번째 시도
* [ICC-83] 구현완료
* [ICC-83] 구현완료
* 테스트 중
* modified: src/pages/MakeQuiz.jsx
* test용용
* test2
* test22
* 테스트했던거 수정
* 선지박스 늘리기 및 글씨 간격, 파일 업로드 수정
* 검토부분 최종 수정
* 틀린문제 문제번호 박스 표시
* [ICC-91] history 페이지 개선 추가
* [ICC-90] 개선 완료
* [ICC-90] 통계 원위치
* [ICC-90] setProbelmId 복구
* [ICC-90] 퀴즈 기록 볼드체
* 오답만 보기 처리 기능 및 사용자 선지선택 안한거 처리
* [ICC-91] history 페이지 개선 추가
* 다이어로그로 사용자 문제 최종 점검
* 다이어로그로 사용자 문제 최종 점검
* 설문 다이어로그 주석처리
* [ICC-93] s3 url 에러 코드 추가
* [ICC-93] 에러 메세지 수정
* [ICC-93] 에러 메세지 수정
* [ICC-93] 수정사항 반영
* 도움말 페이지에 퀴즈 기록 설명 추가 및 퀴즈 기록에서 다시풀기 기능 추가, 퀴즈 기록페이지 이벤트 추적 추가
* 퀴즈기록만 틔는거 수정
* quiz select 변경
* 메세지 수정
* 확대기능 추가
* 상세해설보기 기능 추가
* 모바일 사이즈 수정
* MakeQuiz 버튼 text 수정정
* 스피너 돌고 명칭수정
* [ICC-102] css 스타일변경으로 공백출력하도록함
* 문제 난이도 -> 문제 단계
* [ICC-104] 링크 태그로 변경 완료
* [ICC-104] 푸터 조정
* [ICC-107] SEO 구성 완료
* [ICC-107] 구조 확정, 텍스트 수정 남음
* [ICC-105] 상세 해설 url 설정
* [ICC-107] 구조 작성, 텍스트 수정 중
* [ICC-107] 작성 완료
* [ICC-107] 파일 제한 수정
* [ICC-107] 파일 이름 변경
* [ICC-107] 기본값을 숨기기로
* [ICC-116] 퀴즈 히스토리 클래스명 수정 (#48)
* [ICC-109] 개발용 S3 cicd (#50)
* [ICC-109] 첫번째 시도
* [ICC-109] 구현 완료
* [ICC-113] 출처 url + OCR url
* [ICC-113] 리팩터링
* [ICC-110] 작성 완료
* [ICC-110] 첫번째 시도
* [ICC-110] 구현 완료
* [ICC-110] github action에 로그인으로 수정
* [ICC-110] 두번째 시도
* [ICC-110] 세번째 시도
* [ICC-110] 네번째 시도
* [ICC-110] 네번째 시도
* [ICC-110] 다섯번째 시도
* [ICC-110] 여섯번째 시도
* [ICC-110] 일곱번째 시도
* [ICC-110] 여덟번째 시도
* [ICC-110] 아홉번째 시도
* [ICC-110] 열번째 시도
* [ICC-110] 열한번째 시도
* [ICC-110] 열두번째 시도
* [ICC-110] 열세번째 시도
* [ICC-110] 열네번째 시도
* [ICC-110] 구현 완료
* [ICC-110] 코드 1번 연속 테스트 1
* [ICC-110] 코드 1번 연속 테스트 2
* [ICC-110] 재시도
* [ICC-110] S3 업로드만 테스트
* [ICC-110] Cloudfront 초기화도 같이
* [ICC-110] S3 업로드만 테스트
* [ICC-110] S3 업로드만 테스트
* [ICC-110] echo로 확인
* [ICC-110] code 1 S3 상태 확인
* [ICC-110] 재확인
* [ICC-110] 구현완료
* [ICC-121] 첫번째 시도
* [ICC-121] 첫번째 시도
* [ICC-121 두번째 시도
* [ICC-121 세번째 시도
* [ICC-121] 네번째 시도
* [ICC-121] 테스트가 끝났으니 올바른 브랜치명으로 복원
* [ICC-120] 커서로 로우 데이터 완성, 수정 시작
* [ICC-120] MakeQuiz 로드되면 애널리틱스가 트래킹하게 수정
* [ICC-120] package.json 수정
* [ICC-120] 동적 사이트맵 생성 코드 제거
* [ICC-120] robots.txt 변경
* [ICC-120] 여러 아이콘 이미지 도입
* [ICC_120] 전부 헤드 태그로 이전
* [ICC-120] helmet을 사용하지 않으므로 다시 리액트 업그레이드
* [ICC-120] ppt 허용
* [ICC-120] 수정
* [ICC-124] CICD 수정:
* [ICC-124] 첫번째 시도
* [ICC-124] 브랜치 이름 복원
* [ICC-125] 발견된 문제점들 수정
* [ICC-127] 디자인 변경 완료
* [ICC-127] 태그 타입 수정
* [ICC-127] 코드 작성 완료
* [ICC-115] OX API 구현 완료
* [ICC-126] 지연 로딩
* [ICC-126] 2.5초에 50페이지
* [ICC-126] 공통 값 변수화
* [ICC-126] 백그라운드 이미지 추가
* [ICC-126] 사진 추가
* [ICC-126] 지연 로딩
* [ICC-126] 2.5초에 50페이지
* [ICC-126] 공통 값 변수화
* [ICC-126] 백그라운드 이미지 추가
* [ICC-126] 사진 추가
* [ICC-126] background 변경
* [ICC-126] conflicts 해결
* [ICC-126] background 삭제
* [ICC-126] background 추가
* [ICC-131] 이미지 변경 완료
* [ICC-131] 위치 조정 완료
* [ICC-157] 2차 배포전 프론트 변경
* [ICC-157] 내부 파일로 변경
* [ICC-158] 중간 저장
* [ICC-158] 768px 미만 버튼 배열 방식 변경
* [ICC-158] 도움말 버튼 위치 이동
* [ICC-158] 언어 버튼 추가
* [ICC-158] 변경 완료
* [ICC-162] 문제 유형, 난이도 통일
* [ICC-162] 기본값 수정
* [ICC-162] 유형배치, 설명 변경
* [ICC-161] 퀴즈 풀이 영역 개선
* [ICC-161] 해설보기 화면 조정 중
* [ICC-161] 중복 스타일 제거
* [ICC-161] 해설 스타일 변경 완료
* [ICC-161] 해설 스타일 변경 완료
* [ICC-161] 다국어 번역 추가
* [ICC-165] 작성완료
* [ICC-161] 불필요한 패딩옵션 제거, 옵션 축소 0
---------
Co-authored-by: jaewon
Co-authored-by: nech1234 <145868124+nech1234@users.noreply.github.com>
Co-authored-by: lhoju0158
Co-authored-by: 이찬우 <105221020+ChanJinYeon@users.noreply.github.com>
* [ICC-166] 식별된 문제 해결
* v 1.3.3 (#87)
* [ICC-166] 식별된 문제해결
* v 1.4.4 (#89)
* [ICC-166] 퀴즈 기록 너비 변경 (#90)
* v 1.3.5 (#91)
* [ICC-166] 내용 변경
* [ICC-166] 번역 추가
* [ICC-166] 디자인 변경 (#94)
* [ICC-166] 오답만보기시 참조페이지 버그 수정
* [ICC-166] 오답만 보기 시 참조페이지 버그 수정 (#99)
* [ICC-166] 선택 타입 저장
* [ICC-166] 문구 추가 (#103)
* [ICC-166] 문구 추가
* [ICC-166] 문구 추가
* [ICC-203] 첫번째 시도
* [ICC-203] 첫번째 시도
* [ICC-203] 첫번째 시도
* [ICC-203] 세번번째 시도
* [ICC-203] 세번번째 시도
* [ICC-203] 브랜치명 롤백
* [ICC-203] 다섯번째 시도
* 여섯번째 시도
* [ICC-203] 브랜치명 롤백
* [ICC-207] 페이지 150페이지로 상향, 최근 변경 사항 컴포넌트 추가
* [ICC-213] 안내 문구 추가
* [ICC-206] 최신 반영 사항 수정
* [ICC-255] 구현 완료
---------
Co-authored-by: nech1234 <145868124+nech1234@users.noreply.github.com>
Co-authored-by: jaewon
Co-authored-by: lhoju0158
Co-authored-by: 이찬우 <105221020+ChanJinYeon@users.noreply.github.com>
---
src/pages/MakeQuiz/index.jsx | 36 +++++++++++++--------
src/pages/MakeQuiz/util/fileUploader.js | 43 +++++++++++++++++++++++++
2 files changed, 65 insertions(+), 14 deletions(-)
create mode 100644 src/pages/MakeQuiz/util/fileUploader.js
diff --git a/src/pages/MakeQuiz/index.jsx b/src/pages/MakeQuiz/index.jsx
index 1deb6f2..7ab5001 100644
--- a/src/pages/MakeQuiz/index.jsx
+++ b/src/pages/MakeQuiz/index.jsx
@@ -12,19 +12,25 @@ import "react-pdf/dist/Page/TextLayer.css";
import { useNavigate } from "react-router-dom";
import "./index.css";
import { OcrButton, RecentChanges } from "./ui";
+import { uploadFileToServer } from "./util/fileUploader";
const levelDescriptions = {
RECALL: `순수 암기나 단순 이해를 묻는 문제
- 예) "명제의 _______는 모든 가능한 경우에서 항상 참(True)이 되는 명제를 의미한다."`,
+ 예) "대한민국의 수도는 _______이다."`,
SKILLS: `옳고 그름을 판별하는 문제
- 예) "명제 p → q의 대우(contrapositive)와 역(converse)이 모두 참일 때, 반드시 원래의 명제 p → q도 참이 된다." (O/X)`,
+ 예) "지구는 태양 주위를 돈다. (O/X)"`,
STRATEGIC: `추론, 문제 해결, 자료 해석을 요구하는 문제
- 예) "교수님이 학생들에게 기말고사에서 100점을 받으면 A를 주겠다"라고 약속했습니다. 다음 중 이 논리적 함의(p → q)가 거짓(False)이 되는 경우는?"`,
+ 예) [전제] 물가가 오르면 화폐 가치는 떨어진다. 현재 물가가 급등했다.
+ [질문] 이 경우 화폐 가치의 변화로 가장 적절한 것은?
+ 1. 하락한다
+ 2. 상승한다
+ 3. 변함없다
+ 4. 알 수 없다`,
};
const MAX_FILE_SIZE = 30 * 1024 * 1024;
@@ -87,15 +93,7 @@ const MakeQuiz = () => {
[]
);
- async function uploadFileToServer(file) {
- const formData = new FormData();
- // 백엔드 @RequestPart("file") 과 동일한 키
- formData.append("file", file);
- const res = await axiosInstance.post(`/s3/upload`, formData, {
- isMultipart: true,
- });
- return res.data;
- }
+
// questionType 변경 시 quizLevel 자동으로 변경 및 localStorage에 저장
useEffect(() => {
setQuizLevel(levelMapping[questionType]);
@@ -178,7 +176,7 @@ const MakeQuiz = () => {
setFileExtension(ext);
setIsProcessing(true);
try {
- const { uploadedUrl } = await uploadFileToServer(f);
+ const uploadedUrl = await uploadFileToServer(f);
setUploadedUrl(uploadedUrl);
setFile(f);
@@ -190,7 +188,17 @@ const MakeQuiz = () => {
if (uploadTimerRef.current) {
uploadTimerRef.current.stop();
}
- throw error;
+
+ const message =
+ error?.message === "변환 시간 초과"
+ ? t("파일 변환이 지연되고 있어요. 잠시 후 다시 시도해주세요.")
+ : error?.response?.data?.message ||
+ error?.message ||
+ t("파일 업로드 중 오류가 발생했습니다. 다시 시도해주세요.");
+
+ CustomToast.error(message);
+ console.error("파일 업로드 실패:", error);
+ return;
} finally {
setFileExtension(null);
setIsProcessing(false);
diff --git a/src/pages/MakeQuiz/util/fileUploader.js b/src/pages/MakeQuiz/util/fileUploader.js
new file mode 100644
index 0000000..e12abeb
--- /dev/null
+++ b/src/pages/MakeQuiz/util/fileUploader.js
@@ -0,0 +1,43 @@
+import axiosInstance from "#shared/api";
+
+export async function uploadFileToServer(file) {
+ const initResponse = await axiosInstance.post("/s3/request-presign", {
+ originalFileName: file.name,
+ contentType: file.type,
+ fileSize: file.size,
+ });
+
+ const { uploadUrl, finalUrl, isPdf } = initResponse.data;
+
+ const encodedFileName = encodeURIComponent(file.name);
+
+ await axiosInstance.put(uploadUrl, file, {
+ headers: {
+ "Content-Type": file.type,
+ "x-amz-meta-original-filename": encodedFileName,
+ },
+ });
+
+ if (!isPdf) {
+ await pollForFile(finalUrl);
+ }
+
+ return finalUrl;
+}
+
+// ---------------------------------------------------------
+// Helper: DB 없이 파일 생성 여부 확인하기 (S3 직접 조회)
+// ---------------------------------------------------------
+async function pollForFile(url, timeout = 60000) {
+ const startTime = Date.now();
+
+ const encodedUrl = encodeURIComponent(url);
+ while (Date.now() - startTime < timeout) {
+ const res = await axiosInstance.get(`/s3/check-file-exist?url=${encodedUrl}`);
+ if (res.data.status === "EXIST") {
+ return true;
+ }
+ await new Promise((resolve) => setTimeout(resolve, 2000));
+ }
+ throw new Error("변환 시간 초과");
+}
\ No newline at end of file
From 2a4b8ea137c41e9b8a5a4eb669ed5dc92d3dcaa3 Mon Sep 17 00:00:00 2001
From: Oh YoungJe <139232765+GulSauce@users.noreply.github.com>
Date: Thu, 22 Jan 2026 00:21:00 +0900
Subject: [PATCH 3/3] v 1.5.0 (#120)
---
src/App.jsx | 2 +-
src/index.css | 42 +++++++++++++++++++++++++++++++++++----
src/shared/toast/index.js | 2 +-
3 files changed, 40 insertions(+), 6 deletions(-)
diff --git a/src/App.jsx b/src/App.jsx
index 3cdff47..be0c3f4 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -63,7 +63,7 @@ const App = () => {
-
+
} />
} />
diff --git a/src/index.css b/src/index.css
index 39664f0..7687e96 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,7 +1,41 @@
-div {
- white-space: pre-line;
+@font-face {
+ font-family: 'Pretendard';
+ src: url('/fonts/Pretendard-Regular.otf') format('opentype');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
}
-p {
- white-space: pre-line;
+@font-face {
+ font-family: 'Pretendard';
+ src: url('/fonts/Pretendard-Medium.otf') format('opentype');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Pretendard';
+ src: url('/fonts/Pretendard-Bold.otf') format('opentype');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+/* 전역 폰트 적용 */
+* {
+ font-family: 'Pretendard', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+}
+
+body {
+ font-family: 'Pretendard', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+input, textarea, select, button {
+ font-family: 'Pretendard', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
}
diff --git a/src/shared/toast/index.js b/src/shared/toast/index.js
index 34f74db..f094778 100644
--- a/src/shared/toast/index.js
+++ b/src/shared/toast/index.js
@@ -2,7 +2,7 @@ import { Slide, toast } from "react-toastify";
import "react-toastify/dist/ReactToastify.css";
const options = {
- position: "top-right",
+ position: "top-center",
autoClose: 3000,
hideProgressBar: true,
closeOnClick: true,