목차
[내일배움캠프_2025JUL11]TextRPG 과제 제출
오늘은 과제를 제출하는 날이다!
과제 제출 후 알고리즘 문제도 몇개 풀었다.
[프로그래머스]최댓값과 최솟값 (C#)
https://school.programmers.co.kr/learn/courses/30/lessons/12939 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 더보기더보기 Problem Description문
j000.tistory.com
JSON 역직렬화 시 ID 충돌
모든 내용을 잘 로드하는데, 아이템 착용 여부가 제대로 적용되지 않는 경우가 발생했다.
모두 착용이 해제된 상태로 보이는 것이다.
근데 장착을 시도하려니.. 아래와 같은 반응이 왔다. 내가 무언가를 착용하고 있기는 했다는 뜻이다.
어쩐지 상태창에 가보니까 상승치는 그대로 적용이 되고 있더라.

id 값의 문제인 것 같아서 json을 확인해보니 inventory에 있는 item과 equipment에 들어있는 item이 다 똑같은데 id가 달랐다.
- Item 클래스 생성자에서 다음 생성되는 아이템의 id를 자동 증가하도록 하여 중복 id가 생성되지 않도록 방지했었다.
- 그런데 역직렬화를 하는 과정에서도 생성자를 거치기 때문에 새로운 id가 또 부여되었다.
- 그 결과 inventory와 equipment가 동일한 아이템을 가리키지 않게 되었고
- 장착 여부 판단 로직이 제대로 작동하지 않게되었다.
JSON로 데이터를 주도하게 설계가 바뀌었고, 게임 내에서 새로운 아이템이 생성되지 않는 만큼, NextId는 삭제하기로 했다.
JSON enum 멤버 역직렬화
프로그램을 껐다가 켜면 이름을 입력했을 때 전에 생성한 플레이어가 존재하면 해당 내용을 보관한 json 파일을 역직렬화(deserialize)하여 정보를 불러온다.
이 과정에서 JSON 파일을 역직렬화 시에도 생성자가 호출되면서 id 값이 증가했고, 그로 인해 발생한 문제였다.
지금은 해결했지만, 문제를 맞닥뜨렸을 때는 enum 데이터의 직렬화, 역직렬화 때문인 줄 알았다.
생성자 구현을 변경하면서 해결했지만 기왕 학습한 것, 사용해보고 정리했다.
Enum이 저장될 때는 숫자로 저장된다. 첫번째 값은 0, 두번째 값은 1 이런식으로 증가한다.
마치 SQL의 lookup table과 비슷한 개념이다.
이 경우 숫자로 관리하기 때문에 파일 용량이 작아지고, 비교나 검색도 빨라진다.
다만, 아이템 리스트 같은 건 따로 프로그램을 만들지 않는 이상 사람이 직접 json 파일을 관리하고 추가하거나 수정하게 될 것이다.
이 경우에는 사람이 읽고 수정하고 디버깅하기 편하게 문자열 그대로 저장할 수 도 있다.
[JsonConverter(typeof(StringEnumConverter))] ////enum을 json 직렬화시 문자열로 변환하도록 정의
public enum EquipSlot
{
Helmet,
Armor,
Weapon,
Gloves,
Boots,
Accessory,
Shield
}
//JsonUtility.cs
public static class JsonUtility
{
public static JsonSerializerSettings GetJsonSetting()
{
JsonSerializerSettings setting = new JsonSerializerSettings();
setting.Converters.Add(new StringEnumConverter()); //enum => 문자열로 반환
return setting;
}
}
//SceneManager.cs SavePlayer()
JsonSerializerSettings setting = JsonUtility.GetJsonSetting();
// 파일 생성 후 쓰기
File.WriteAllText(path + $@"\\player_{player.Name}.json", JsonConvert.SerializeObject(player,setting));
이제 다음과 같이 저장된다! 참고로 LoadPlayer()에도 같이 setting 옵션을 넣어줘야한다.
"equipment": {
"Boots": {
"Id": 10,
"Name": "낡은 신발",
"Price": 400,
"Description": "불편하지만 발을 보호합니다.",
"Enhancement": { "Defence": 1 },
"EquipSlot": "Boots"
},
"Armor": {
"Id": 1,
"Name": "수련자갑옷",
"Price": 1000,
"Description": "수련에 도움을 주는 갑옷입니다.",
"Enhancement": { "Defence": 5 },
"EquipSlot": "Armor"
}
https://medium.com/@nerudaj/tuesday-coding-tip-28-de-serializing-json-string-enum-in-c-b144f982be95
Tuesday Coding Tip 28 — (de)serializing JSON string enum in C#
Tuesday coding tips are short posts about various tidbits mainly from C++, but also from other programming languages I use. You can also…
medium.com
https://hiperzstudio.tistory.com/23
[C#] JSON Serialization 할 때 enum 타입을 문자열 형태로 변환시키기
보통 JSON Serialization 후 텍스트 파일 형태로 저장하거나 DB에 저장하거나 하는데, enum 값이 숫자 형태로 저장되어서 JSON 문자열을 열어볼 때 readbility가 떨어집니다. 그래서 enum 타입 변수의 값이 문
hiperzstudio.tistory.com
https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonSerializerSettings_Formatting.htm
JsonSerializerSettings.Formatting Property
JsonSerializerSettingsFormatting Property
www.newtonsoft.com
다이어그램 업데이트

다이어그램을 업데이트 해보려고 했는데, 생각보다 규모가 커지는 것 같아서 결국엔 원하는 항목들의 리스트를 작성해서 생성형AI에게 mermaid 문법에 맞게 작성해달라고 부탁했다. (이유: mermaid 너무 느리고 작성하기 불편함)
그마저도 한 Diagram으로 보려니까 너무 번잡해서 아래와 같이 세 개로 쪼갰다.



- 제일 왼쪽에 위치한 다이어그램은 프로젝트 전체 Overview
- 중간에 위치한 다이어그램은 주요 Model 클래스들의 관계도.
- private 필드에 접근하기 위한 public property들은 제외하고 작성했다.
- 제일 오른쪽에 위치한 다이어그램은 Scene 들의 관계도.
이렇게 보니까.. 인터페이스 왜 구현했지..? 와 같은 생각이 든다.
JSON 참조 path
팀원분에게 테스트를 부탁드렸는데 이름 입력하자마자 에러가 뜨는 경우가 발생...
아 이건 json이다.
static string path = "D:\\CampWorkspace\\Week2TextRPG\\Week2TextRPG\\Jsons";
위와 같이 하드 코딩한 절대 경로인 path를 사용했었다.
이럴 경우 다른 컴퓨터에서는 위와 같은 경로가 존재하지 않기 때문에 (root가 다름)
AppDomain.CurrentDomain.BaseDirectory를 이용하여 현재 path를 상대 경로로 받아올 수 있다.
다만! 이 경우에는 현재 실행 중인 프로그램 기준으로 path를 받아오기 때문에
D:\CampWorkspace\Week2TextRPG\Week2TextRPG\bin\Debug\net8.0\Jsons\StoreItems.json
과 같이, bin\Debug\net8.0\까지 포함해버린다.
bin은 gitignore가 무시해버리므로, 깃을 통해 프로젝트를 공유할 경우 상대방에게는 Json 폴더가 공유되지 않아 에러가 뜨게 된다.
이 경우 bin을 벗어나기 위해 3번 상위 폴더로 이동해야하는데, 다음과 같이 패스를 더해주면 된다.
command prompt에서 \.. 을 통해 뒤로가기 해본 적이 있다면 익숙할 것이다.
public static string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\") + "\\Jsons";
Console App Build
빌드는 생각보다 간단하다!
Project - (Project Name) Properties 에서 빌드와 관련된 설정을 해주고 (icon만 넣었음)
Build - Batch Build에서 Debug가 아니라 Release만 체크한 뒤 Build를 눌러주면 된다.
JSON 파일 또한 exe에 임베딩해서 넣을 수 있는데,
원하는 파일 property에서 Build Action - Embedded Resources 로 설정하면 된다.
StoreItems.json은 이렇게 내장할 수 있다!
다만 계속해서 생성되는 player json 파일들은 임베드할 수 없다ㅣ...

느낀점
어제 낮에 개인 과제를 완성했고, 저녁 먹고 마지막으로 테스트해보고 제출하려 했다.
하지만 저녁 먹고 테스트 하는 과정에서 나온 무수한 오류들...
저장이 제대로 되지 않는 것부터 해서 단순 + - 연산자를 잘 못 넣은 것들까지...
수정할때마다 발견되어서 난감했다.
개발할 때 한 기능에만 집중해서 개발하는 버릇을 들이고, 기능 단위로 구현이 끝나면 테스트를 충분히 해보고 넘어가는 것이 좋을 것 같다.
작은 발표회 후기
괴물 몇 분이 계셔서 살짝 의기소침해졌다.
나정도면... 전공자니까 에이스가 될 줄 알았는데 전혀 아니었음... 자만이었다...
발표회에서 얻은 아이디어들을 정리해보자면,
방향키 조작 (메뉴 선택 시 숫자가 아니라 위 아래로 이동하며 화살표 표시)
테두리 컬러 등 화면 꾸미기
아이템 테이블 페이지화, 리플렉시블
씬을 순환 연결 리스트로 생성
캐릭터 스킬, 스킬트리
턴제 쿨타임 적용
히든으로 블랙잭 게임 추가
레벨 5 진입 시 전직
직업 구분 및 직업별 무기 선택
판매불가아이템
게임 종료
타이핑효과
등등이 있었다.
팀 프로젝트 힌트는 "전투 요소"가 들어간 TextRPG.
가볍게 팀원들끼리 브레인스토밍을 하고 끝냈다.
그리고 프로젝트를 진행하면서 "협업" 요소들 중에 하고 싶은 질문들을 리스트업 해둘 생각이다.
내일 학습 할 것은 무엇인지
다음주 월요일에 팀 프로젝트가 발제되고 그 다음주 월요일에 발표니까 다음주 주말은 프로젝트 하느라 못 쉴 것 같으니 이번 주말은 조금 여유롭게 보내지 않을까 싶다.
'부트캠프 > 본캠프' 카테고리의 다른 글
| [내일배움캠프_2025JUL14]팀 과제 시작! (0) | 2025.07.14 |
|---|---|
| [내일배움캠프_2025JUL13]TextRPG 팀 과제 구조 설계 & Today I Reflected... (0) | 2025.07.13 |
| [내일배움캠프_2025JUL10]TextRPG 던전/레벨/저장 구현 (0) | 2025.07.10 |
| [내일배움캠프_2025JUL09] 알고리즘, TextRPG SceneManager 구현 (0) | 2025.07.09 |
| [내일배움캠프_2025JUL08] 알고리즘, TextRPG 구현 (0) | 2025.07.08 |