From 5e6da2b8ddd998aaf1ae8a628e629a51aff8002b Mon Sep 17 00:00:00 2001 From: woowahan-neo Date: Wed, 7 May 2025 17:25:20 +0900 Subject: [PATCH 1/2] fix: Use global Axios client in InterviewPage components - Replaced local Axios instances in InterviewSetup and InterviewSession with the shared 'client' from src/apis. - This improves maintainability and consistency in API requests. --- .../pages/InterviewPage/InterviewSession.tsx | 12 ++-- .../pages/InterviewPage/InterviewSetup.tsx | 55 ++++++++----------- 2 files changed, 28 insertions(+), 39 deletions(-) diff --git a/frontend/src/pages/InterviewPage/InterviewSession.tsx b/frontend/src/pages/InterviewPage/InterviewSession.tsx index b1c858eaf..3b30cd9c0 100644 --- a/frontend/src/pages/InterviewPage/InterviewSession.tsx +++ b/frontend/src/pages/InterviewPage/InterviewSession.tsx @@ -1,10 +1,6 @@ import React, { useState, useRef, useEffect } from 'react'; import styled from '@emotion/styled'; -import axios from 'axios'; - -const api = axios.create({ - baseURL: 'http://localhost:8080', -}); +import { client } from '../../apis'; const Container = styled.div` display: flex; @@ -200,7 +196,7 @@ const InterviewSession = ({ try { const accessToken = localStorage.getItem('accessToken'); - const response = await api.post( + const response = await client.post( `/interviews/${session.id}/answers`, { answer: newMessage.content }, { @@ -224,7 +220,7 @@ const InterviewSession = ({ try { const accessToken = localStorage.getItem('accessToken'); - const response = await api.post( + const response = await client.post( `/interviews/${session.id}/restart`, {}, { @@ -244,7 +240,7 @@ const InterviewSession = ({ try { const accessToken = localStorage.getItem('accessToken'); - await api.post( + await client.post( `/interviews/${session.id}/quit`, {}, { diff --git a/frontend/src/pages/InterviewPage/InterviewSetup.tsx b/frontend/src/pages/InterviewPage/InterviewSetup.tsx index b5d821c59..ca3d5645f 100644 --- a/frontend/src/pages/InterviewPage/InterviewSetup.tsx +++ b/frontend/src/pages/InterviewPage/InterviewSetup.tsx @@ -1,10 +1,6 @@ import React, { useEffect, useState } from 'react'; import styled from '@emotion/styled'; -import axios from 'axios'; - -const api = axios.create({ - baseURL: 'http://localhost:8080', -}); +import { client } from '../../apis'; const Container = styled.div` display: flex; @@ -58,7 +54,7 @@ const SelectionContent = styled.div` flex: 1; min-height: 0; overflow-y: auto; - + &::-webkit-scrollbar { width: 8px; } @@ -93,7 +89,7 @@ const Select = styled.select` font-size: 1rem; background-color: white; cursor: pointer; - + &:disabled { background-color: #f8f9fa; cursor: not-allowed; @@ -198,7 +194,7 @@ const InterviewSetup = ({ onSessionStart, session }: InterviewSetupProps) => { const fetchSessions = async () => { try { const accessToken = localStorage.getItem('accessToken'); - const response = await api.get('/sessions/mine', { + const response = await client.get('/sessions/mine', { headers: { Authorization: `Bearer ${accessToken}`, }, @@ -214,14 +210,10 @@ const InterviewSetup = ({ onSessionStart, session }: InterviewSetupProps) => { useEffect(() => { const fetchMissions = async () => { - if (!selectedSession) { - setMissions([]); - return; - } - + if (!selectedSession) return; try { const accessToken = localStorage.getItem('accessToken'); - const response = await api.get(`/missions/mine`, { + const response = await client.get(`/missions?sessionId=${selectedSession}`, { headers: { Authorization: `Bearer ${accessToken}`, }, @@ -237,27 +229,23 @@ const InterviewSetup = ({ onSessionStart, session }: InterviewSetupProps) => { useEffect(() => { const fetchQuestions = async () => { - if (!selectedMission) { - setQuestions([]); - return; - } - + if (!selectedMission) return; try { const accessToken = localStorage.getItem('accessToken'); - const response = await api.get(`/questions?missionId=${selectedMission}`, { + const response = await client.get(`/questions?missionId=${selectedMission}`, { headers: { Authorization: `Bearer ${accessToken}`, }, }); console.log('Questions API response:', response.data); - + // API 응답 데이터 구조 확인 및 변환 const questionList = response.data.questions || response.data || []; const formattedQuestions = questionList.map((q: any) => ({ id: q.id, content: q.content || q.question || q.text || '', })); - + setQuestions(formattedQuestions); } catch (error) { console.error('Failed to fetch questions:', error); @@ -269,21 +257,26 @@ const InterviewSetup = ({ onSessionStart, session }: InterviewSetupProps) => { }, [selectedMission]); const handleStartInterview = async () => { - if (!selectedQuestion) return; + if (!selectedSession || !selectedMission || !selectedQuestion) return; - setIsLoading(true); try { + setIsLoading(true); const accessToken = localStorage.getItem('accessToken'); - const response = await api.post('/interviews', { - questionId: selectedQuestion, - }, { - headers: { - Authorization: `Bearer ${accessToken}`, + const response = await client.post( + '/interviews', + { + questionId: selectedQuestion, }, - }); + { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + } + ); onSessionStart(response.data); } catch (error) { console.error('Failed to start interview:', error); + alert('인터뷰 시작에 실패했습니다.'); } finally { setIsLoading(false); } @@ -398,4 +391,4 @@ const InterviewSetup = ({ onSessionStart, session }: InterviewSetupProps) => { ); }; -export default InterviewSetup; \ No newline at end of file +export default InterviewSetup; From ceed1fb548a548424d7ded518250213bf4fef297 Mon Sep 17 00:00:00 2001 From: woowahan-neo Date: Wed, 7 May 2025 17:31:44 +0900 Subject: [PATCH 2/2] build(ci): upgrade actions/cache version from 1 to 3 --- .github/workflows/sonar-build.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/sonar-build.yml b/.github/workflows/sonar-build.yml index 9b323ff3c..5d885438d 100644 --- a/.github/workflows/sonar-build.yml +++ b/.github/workflows/sonar-build.yml @@ -31,17 +31,20 @@ jobs: distribution: 'corretto' java-version: 21 - name: Cache SonarCloud packages - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.sonar/cache key: ${{ runner.os }}-sonar - restore-keys: ${{ runner.os }}-sonar + restore-keys: | + ${{ runner.os }}-sonar + - name: Cache Gradle packages - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.gradle/caches key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} - restore-keys: ${{ runner.os }}-gradle + restore-keys: | + ${{ runner.os }}-gradle- - name: Build run: ./backend/gradlew flywayClean flywayBaseline flywayMigrate build -Dflyway.baselineVersion=0 - name: Analyze