다국어 관리 페이지

This commit is contained in:
kjs
2025-08-25 15:12:31 +09:00
parent 6cac3dfa3f
commit 96c601a0cf
8 changed files with 1900 additions and 393 deletions

View File

@@ -65,7 +65,7 @@ export default function MultiLangPage() {
const fetchCompanies = async () => {
try {
console.log("회사 목록 조회 시작");
const response = await apiClient.get("/api/admin/companies");
const response = await apiClient.get("/admin/companies");
console.log("회사 목록 응답 데이터:", response.data);
const data = response.data;
@@ -87,7 +87,7 @@ export default function MultiLangPage() {
// 언어 목록 조회
const fetchLanguages = async () => {
try {
const response = await apiClient.get("/api/admin/multilang/languages");
const response = await apiClient.get("/multilang/languages");
const data = response.data;
if (data.success) {
setLanguages(data.data);
@@ -100,7 +100,7 @@ export default function MultiLangPage() {
// 다국어 키 목록 조회
const fetchLangKeys = async () => {
try {
const response = await apiClient.get("/api/admin/multilang/keys");
const response = await apiClient.get("/multilang/keys");
const data = response.data;
if (data.success) {
console.log("✅ 전체 키 목록 로드:", data.data.length, "개");
@@ -147,7 +147,7 @@ export default function MultiLangPage() {
const fetchLangTexts = async (keyId: number) => {
try {
console.log("다국어 텍스트 조회 시작: keyId =", keyId);
const response = await apiClient.get(`/api/admin/multilang/keys/${keyId}/texts`);
const response = await apiClient.get(`/multilang/keys/${keyId}/texts`);
const data = response.data;
console.log("다국어 텍스트 조회 응답:", data);
if (data.success) {
@@ -203,7 +203,18 @@ export default function MultiLangPage() {
if (!selectedKey) return;
try {
const response = await apiClient.post(`/api/admin/multilang/keys/${selectedKey.keyId}/texts`, editingTexts);
// 백엔드가 기대하는 형식으로 데이터 변환
const requestData = {
texts: editingTexts.map((text) => ({
langCode: text.langCode,
langText: text.langText,
isActive: text.isActive || "Y",
createdBy: user?.userId || "system",
updatedBy: user?.userId || "system",
})),
};
const response = await apiClient.post(`/multilang/keys/${selectedKey.keyId}/texts`, requestData);
const data = response.data;
if (data.success) {
alert("저장되었습니다.");
@@ -245,9 +256,9 @@ export default function MultiLangPage() {
let response;
if (editingLanguage) {
response = await apiClient.put(`/api/admin/multilang/languages/${editingLanguage.langCode}`, requestData);
response = await apiClient.put(`/multilang/languages/${editingLanguage.langCode}`, requestData);
} else {
response = await apiClient.post("/api/admin/multilang/languages", requestData);
response = await apiClient.post("/multilang/languages", requestData);
}
const result = response.data;
@@ -282,17 +293,11 @@ export default function MultiLangPage() {
try {
const deletePromises = Array.from(selectedLanguages).map((langCode) =>
fetch(`${API_BASE_URL}/multilang/languages/${langCode}`, {
method: "DELETE",
credentials: "include",
headers: {
"Content-Type": "application/json",
},
}),
apiClient.delete(`/admin/multilang/languages/${langCode}`),
);
const responses = await Promise.all(deletePromises);
const failedDeletes = responses.filter((response) => !response.ok);
const failedDeletes = responses.filter((response) => !response.data.success);
if (failedDeletes.length === 0) {
alert("선택된 언어가 삭제되었습니다.");
@@ -344,9 +349,9 @@ export default function MultiLangPage() {
let response;
if (editingKey) {
response = await apiClient.put(`/api/admin/multilang/keys/${editingKey.keyId}`, requestData);
response = await apiClient.put(`/multilang/keys/${editingKey.keyId}`, requestData);
} else {
response = await apiClient.post("/api/admin/multilang/keys", requestData);
response = await apiClient.post("/multilang/keys", requestData);
}
const data = response.data;
@@ -383,7 +388,7 @@ export default function MultiLangPage() {
// 키 상태 토글
const handleToggleStatus = async (keyId: number) => {
try {
const response = await apiClient.put(`/api/admin/multilang/keys/${keyId}/toggle`);
const response = await apiClient.put(`/multilang/keys/${keyId}/toggle`);
const data = response.data;
if (data.success) {
alert(`키가 ${data.data}되었습니다.`);
@@ -400,7 +405,7 @@ export default function MultiLangPage() {
// 언어 상태 토글
const handleToggleLanguageStatus = async (langCode: string) => {
try {
const response = await apiClient.put(`/api/admin/multilang/languages/${langCode}/toggle`);
const response = await apiClient.put(`/multilang/languages/${langCode}/toggle`);
const data = response.data;
if (data.success) {
alert(`언어가 ${data.data}되었습니다.`);
@@ -440,9 +445,7 @@ export default function MultiLangPage() {
}
try {
const deletePromises = Array.from(selectedKeys).map((keyId) =>
apiClient.delete(`/api/admin/multilang/keys/${keyId}`),
);
const deletePromises = Array.from(selectedKeys).map((keyId) => apiClient.delete(`/multilang/keys/${keyId}`));
const responses = await Promise.all(deletePromises);
const allSuccess = responses.every((response) => response.data.success);
@@ -472,7 +475,7 @@ export default function MultiLangPage() {
}
try {
const response = await apiClient.delete(`/api/admin/multilang/keys/${keyId}`);
const response = await apiClient.delete(`/multilang/keys/${keyId}`);
const data = response.data;
if (data.success) {
alert("언어 키가 영구적으로 삭제되었습니다.");

View File

@@ -1,7 +1,7 @@
import axios, { AxiosResponse, AxiosError } from "axios";
// API 기본 URL 설정
export const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8080";
export const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8080/api";
// JWT 토큰 관리 유틸리티
const TokenManager = {