본문 바로가기

ChatGPT로 천자문 게임 만들기(1)

by ㅇㅍㅍ 2023. 4. 2.
ChatGPT로 천자문 게임 만들기(1)
728x90

ChatGPT에 질문

 

데이터셋을 불러와서 카드에 보여주고 싶습니다. 데이터 셋은 이렇게 선언했습니다.let dataset = [ `Hello`, `Hello`, ... ];
json 파일에서 조회하고 싶습니다. 천자문 중 앞에 8글자를 json 형식으로 구현해주세요.

 

천자문의 첫 8자(천지현황 우주홍황)을 JSON 형식으로 구현하면 다음과 같이 작성할 수 있습니다.

[
  {
    "hanja": "天",
    "meaning": "천지(天地)의 천(天), 하늘",
    "pronunciation": "천"
  },
  {
    "hanja": "地",
    "meaning": "천지(天地)의 지(地), 땅",
    "pronunciation": "지"
  },
  {
    "hanja": "玄",
    "meaning": "신비로운, 깊은",
    "pronunciation": "현"
  },
  {
    "hanja": "洪",
    "meaning": "넓은 물",
    "pronunciation": "홍"
  },
  {
    "hanja": "黃",
    "meaning": "노란색",
    "pronunciation": "황"
  },
  {
    "hanja": "莊",
    "meaning": "커다란",
    "pronunciation": "장"
  },
  {
    "hanja": "敖",
    "meaning": "크게 흐르는",
    "pronunciation": "광"
  },
  {
    "hanja": "微",
    "meaning": "작은, 사소한",
    "pronunciation": "위"
  }
]

 

위 JSON 데이터에서 hanja는 한자, meaning은 의미, pronunciation은 발음을 나타냅니다. 이 데이터를 이용하여 천자문의 각 한자를 카드에 보여줄 수 있습니다.

 

방금 보여준 파일이 chunjamun.json이라면 javascript에서 이걸 dataset 변수에 어떻게 입력해주나요?

 

JSON 파일에서 데이터를 불러와서 JavaScript에서 사용하려면 fetch 함수를 사용하여 데이터를 가져와야 합니다. 아래는 fetch 함수를 사용하여 chunjamun.json 파일에서 데이터를 가져와서 dataset 변수에 입력하는 예시 코드입니다.

let dataset = [];

fetch('chunjamun.json')
  .then(response => response.json())
  .then(data => {
    data.forEach(pair => {
      dataset.push(pair[0]);
      dataset.push(pair[1]);
    });
  })
  .catch(error => {
    console.error('Error fetching dataset:', error);
  });

 

위 코드에서 fetch 함수로 chunjamun.json 파일을 불러와서 response를 받습니다. 이후 response.json()을 호출하여 JSON 데이터를 JavaScript 객체로 변환합니다. 변환된 데이터는 data 변수에 저장됩니다. forEach 함수를 사용하여 data 배열의 각 요소에서 한 쌍의 천자문 문자열을 가져와서 dataset 배열에 push합니다. 이렇게 하면 dataset 배열에 천자문 문자열 쌍이 들어갑니다.

 

또한, fetch 함수는 비동기 함수이므로 데이터가 로드되기 전에 dataset 변수를 사용하면 오류가 발생할 수 있습니다. 따라서 flipCard 함수 내에서 dataset 배열을 사용하기 전에 fetch 함수가 완료되었는지 확인하는 등의 처리가 필요합니다.

 

pair[0] 대신 pair.hanja로 해도 되는거죠?

 

네, 맞습니다. 만약 pair 객체가 다음과 같다면,

{
  hanja: "天",
  meaning: "천, 하늘"
}

 

pair.hanja와 pair.meaning은 각각 "天"과 "천, 하늘"을 반환합니다. 따라서 pair[0] 대신 pair.hanja를 사용해도 동일한 결과를 얻을 수 있습니다.

 

Access to fetch at 'file:///C:/Users/user/Documents/GitHub/chunjamun-game/chunjamun.json' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrome-extension, chrome-untrusted, http 에러가 납니다.

 

이 에러는 브라우저가 보안상의 이유로 로컬 파일 시스템에서 로드된 페이지에서 다른 도메인의 리소스를 가져오지 못하게 막는 것입니다. 즉, fetch 함수가 로컬 파일 시스템에서 로드된 index.html에서 chunjamun.json을 가져오지 못하도록 막고 있습니다.

 

728x90

 

웹서버없이 c드라이브의 html파일을 실행했습니다.

 

fetch API는 보안상의 이유로 웹 서버가 없는 로컬 파일에서 동작하지 않습니다. 보안 정책으로 인해 JavaScript는 다른 도메인에서 데이터를 가져올 수 없기 때문에, 로컬 파일에서 fetch API를 호출하면 브라우저에서 보안 오류를 발생시킵니다.

 

따라서 로컬 파일에서 fetch API를 사용하려면 웹 서버를 띄워서 접근해야 합니다. 로컬에서 웹 서버를 띄우는 방법으로는 npm 패키지인 http-server를 이용하는 방법이 있습니다.

 

1. npm을 이용해 http-server를 설치합니다.

npm install -g http-server

 

2. html 파일이 있는 디렉토리로 이동합니다.

cd /path/to/your/directory

 

3. http-server를 실행합니다.

http-server

 

4. 브라우저에서 http://localhost:8080으로 접속합니다.

 

이렇게 하면 로컬에서 웹 서버를 띄우고, fetch API를 사용하여 데이터를 가져올 수 있습니다.

 

웹서버 띄운 상태에서 소스 수정하면 소스가 반영안되더라구요.

 

웹서버를 띄운 상태에서 소스를 수정했을 때, 수정된 내용이 반영되지 않는 경우가 발생할 수 있습니다. 이는 브라우저 캐시(cache)에 의해 발생하는 문제입니다.

 

브라우저는 HTML, CSS, JavaScript, 이미지 등의 파일을 다운로드한 후, 캐시에 저장합니다. 이후에 해당 파일을 요청하면, 브라우저는 로컬 캐시에 저장된 파일을 사용하므로 서버로부터 파일을 다시 다운로드하지 않습니다. 이로 인해 수정된 파일이 반영되지 않을 수 있습니다.

 

이러한 경우, 브라우저의 캐시를 지워주면 됩니다. 보통 캐시는 브라우저를 재시작하면 지워지지만, 개발 중에는 자주 수정하므로 수동으로 지워주는 것이 좋습니다.

 

크롬 브라우저에서는 Ctrl + Shift + R을 누르면 캐시를 강제로 지워서 새로고침 할 수 있습니다. 또는 개발자 도구에서 Disable cache 옵션을 선택하면 캐시를 사용하지 않도록 설정할 수 있습니다. 다른 브라우저에서도 비슷한 방법으로 캐시를 지우거나 사용하지 않도록 설정할 수 있습니다.

 

index.html?fileName=chunjamun&num=1 이렇게 한 경우 javascript에서 fileName을 어떻게 가져오나요? java는 사용하지 않습니다. javascript로 가져올 수 있나요?

 

네, JavaScript에서는 URL의 매개변수를 가져올 수 있습니다. URLSearchParams API를 사용하면 간단하게 가져올 수 있습니다. 아래는 예시 코드입니다.

const urlParams = new URLSearchParams(window.location.search);
const fileName = urlParams.get('fileName');
const num = urlParams.get('num');

 

위 코드에서 window.location.search는 현재 URL에서 쿼리스트링을 의미합니다. new URLSearchParams(window.location.search)로 URLSearchParams 객체를 생성하고 get() 메소드로 매개변수 값을 가져올 수 있습니다. fileName과 num은 매개변수 이름입니다. 매개변수 이름은 실제 URL에 적용된 이름과 동일해야 합니다.

 

location.href = `index.html?fileName=chunjamun&num=${parseInt(num)+1}`; num은 1입니다. 이렇게 하니까 num=11이 됩니다.

 

문제는 parseInt(num)+1에서 발생하는 것 같습니다. parseInt(num)으로 해석된 값에 1을 더하면서 문자열로 다시 변환됩니다. 예를 들어, num 값이 "1"일 경우 parseInt(num)은 숫자 1이 됩니다. 여기에 1을 더한 값은 2이며, 이 값을 문자열로 다시 변환하면 "2"가 됩니다. 즉, num=11이 되는 것입니다.

 

따라서, 다음과 같이 코드를 수정해야 합니다.

location.href = `index.html?fileName=chunjamun&num=${parseInt(num, 10)+1}`;

 

여기서 parseInt(num, 10)은 10진수로 num을 해석하도록 지정한 것입니다. 이를 통해 01, 02, 03과 같은 8진수나 16진수로 해석되는 문제를 방지할 수 있습니다.

 

 

반응형

'코딩 > 천자문 게임' 카테고리의 다른 글

ChatGPT로 천자문 게임 만들기(3)  (0) 2023.04.03
ChatGPT로 천자문 게임 만들기(2)  (0) 2023.04.02

댓글