나만의 작은 도서관

[TIL] 240517 캠프 33일차: Node.js 첫번째 개인과제 종료 본문

Today I Learn

[TIL] 240517 캠프 33일차: Node.js 첫번째 개인과제 종료

pledge24 2024. 5. 17. 20:35
오늘의 한 마디: 짠 코드를 클린하게 바꾸고 싶지만, 이미 적은 코드를 다시 짜는 것은 여간 귀찮은 일이 아니다.

오늘 배운 내용                                     

env파일 사용법

API키나 DB 관리자 계정과 같은 민감한 정보들을 밖으로 노출시키고 싶지 않을 때가 있다. 이 때 env확장자 파일과 dotenv패키지를 사용하면 간단하게 노출을 막을 수 있다. 여기서 조심해야 할 점은 다음과 같다.

  • .env파일에서 변수이름="저장하고자 하는 데이터"에서 '=' 연산자 양쪽으로 공백 금지.
  • 저장하고자 하는 데이터는 문자열로 저장
  • dotenv.config() 구문이 있어야 변수를 가져올 수 있음.
// -------- cmd ---------------

// cmd에서 dotenv 패키지 설치
yarn add dotenv  

// --------schemas.index.js---------

import dotenv from 'dotenv'; // dotenv 패키지 임포트(모듈 시스템 사용)
.
.
dotenv.config(); // 가져온 dotenv 사용
.
.
process.env.변수이름	// .env파일에 있는 변수를 가져온다.

// ---------.env 파일---------
변수이름="저장하고자 하는 데이터"

 

우분투에서 CLI를 통한 파일 편집기: nano

서버에서 코딩을 하다보면 GUI가 없는 경우가 종종 있다. 이럴 때는 파일 편집마저 CLI로 해야하는데 이 때, 우분투에서 사용할 수 있는 파일 편집기로 nano가 있다. nano를 사용하는 방법은 아주 간단하다.

nano "편집하고자 하는 파일 이름"

// ex) nano package.json

위의 코드를 CLI에 치면 텍스트로 이쁘게 만들어진 인터페이스가 하나 등장하는데 여기서 파일 편집 및 저장을 하면 된다. 

대충 요런식이다.

gitignore.io

깃헙에 내가 만든 코드를 올릴 때, 굳이 올릴 필요가 없거나 올리면 안되는 파일들은 gitignore에 해당 파일 이름들을 추가하는 방식으로 올리고자 하는 파일들을 걸러서 올릴 수가 있다. 이 때, 내가 만든 코드가 아닌 설치된 패키지가 생성한 파일들이 쓸데없이 같이 올라가는 경우가 있는데, 올리는 파일들을 줄이겠다고 하나하나 찾는다는게 여간 귀찮은 일이 아니다. 

그래서, 미리 각각의 패키지 또는 환경 파일에 대해서 gitignore에 추가할 항목들을 정리해놓은 사이트가 있다. 바로 gitignore.io이다. 여기서 내가 설치한 패키지와 환경을 검색하고, 검색결과로 나온 gitignore 포함 항목들을 그대로 복사해서 가져오면 된다.

https://www.toptal.com/developers/gitignore

 

gitignore.io

Create useful .gitignore files for your project

www.toptal.com

 

?? 연산자

|| 연산자와 비슷하게 사용되지만 역할이 조금 다르다. ||연산자와 ??연산자는 다음과 같이 작동한다.

  • || 연산자: 첫 번째 truthy 값을 반환합니다.
  • ?? 연산자:  첫 번째 정의된(defined) 값을 반환합니다.

따라서 0과 같은 값을 true로 취급하고 싶다면 ||연산자대신 ??연산자를 사용해야한다.

 

오늘의 Trouble Shooting                  

Problem 1. 아이템 스텟 패치 시, 아이템을 장착한 캐릭터의 스텟 변경이 되지 않는 문제

지금까지 짠 코드는 아이템을 장착하거나 탈착할 때만 캐릭터의 스텟이 아이템 스텟만큼 변경되었다. 하지만, 기존에 있던 아이템 스텟 수정 코드는 캐릭터의 스텟을 변경하는 코드가 없기 때문에, 아이템 스텟이 변경되더라도 아이템을 장착하고 있던 캐릭터들의 스텟이 이전 아이템 스텟으로 유지되는 문제가 발생했다. 

Solve. 아이템 수정 시 이전 아이템을 탈착 후, 수정된 아이템을 장착하는 로직 추가

가장 naive하게 생각한 방식이었다. 이전 아이템은 탈착하고 수정된 아이템을 장착시켜주면 될 거라고 생각했다. 그래서 아래와 같이 짰고, 수정할 아이템을 가지고 있는 모든 캐릭터의 스텟을 변경해야하니 아이템 장착여부에 대한 데이터를 저장하고 있는 Equipments모델을 활용하였다.

// 해당 아이템을 가지고 있던 캐릭터의 ID들을 Equipments모델에서 가져옵니다.
  const itemOwners = await Equipments.find(
    { equipment_list: itemsCode },
    'character_id'
  ).exec();
  //console.log(itemOwners);

  // 해당 아이템을 가지고 있던 캐릭터의 스텟을 맞게 수정합니다.
  for (let Owner of itemOwners) {
    const owner_character = await Characters.findOne({
      character_id: Owner.character_id,
    }).exec();
    //console.log(owner_character);

    // 캐릭터의 스텟을 수정합니다.
    owner_character.health =
      (owner_character.health || 0) -
      (currentItem.item_stat.health || 0) +
      (item_stat.health || 0);
    owner_character.power =
      (owner_character.power || 0) -
      (currentItem.item_stat.power || 0) +
      (item_stat.power || 0);

    // 변경된 스텟을 DB에 저장합니다.
    owner_character.save();
  }

  // 아이템 정보를 수정합니다.
  currentItem.item_name = item_name;
  currentItem.item_stat = item_stat;

  // 수정한 아이템 정보를 DB에 저장합니다.
  await currentItem.save();

naive한 방식이었기 때문에 훨씬 좋은 방법들이 있을거라 확신한다. 다만, for...of반복문을 사용했다는 점, ||연산자를 활용했다는 점에서 나름 똑똑한 방식으로 해결한 방식이라 생각한다.


 

오늘 하루는?                                       

  • 개인 과제가 마무리 되었다. 아직 개선해야 하기 때문에 완전히 끝난건 아니지만 제출까지 끝냈기 때문에 끝났다고 볼 수 있다. 참 험난한 과제였다. 강의를 월요일부터 보기 시작해, 수요일 약속으로 수요일 통으로 빠지고, 금요일인 오늘 제출하는 말도 안되는 스케쥴을 소화해야 했기 때문에 개발 및 공부 시간이 턱없이 부족했다. 실제로 개발한 날은 화요일, 목요일 이틀 밖에 없었다. 그럼에도 어찌됐든 선택 사항까지 다 구현했다는 점( 코드가 구리긴 하지만 )에서 나에게 칭찬해주고 싶다.
  • 내 개발 스타일은 정말 특이하다. 큰 단위의 개발 계획은 차질이 없도록 매우 치밀하고 짜고, 작은 단위의 개발 계획은 전혀 짜지 않는다. 그냥 잡히는 대로 개발하고, 잘 안되면 될 때까지 찔러보는 식으로 개발한다. 이렇다보니 기능 구현 속도는 나름 빠른 편인데, 전체적인 구조는 하나로 정돈되지 않은 경우가 많다.(정리는 열심히 했지만 정리된 느낌을 받지 못하는 방 같은?)
    항상 과제를 받으면 기능 구현을 마무리하는 시기가 제출 2~3일 전인 경우가 많은 것도 이런 이유에서인데(시간에 쫓긴 이번 과제도 하루가 남았다.), 이렇게 매번 의식의 흐름기법 마냥 잡히는 대로 개발하면 끝끝내 구조를 못짜는 개발자가 되지는 않을까 걱정된다.

 

오늘 한 일은?                                       

더보기
  • 아이템 수정 시, 해당 아이템을 장착한 모든 캐릭터 스텟 변경
  • 선택 요구사항 업데이트 내용 깃헙에 푸시
  • AWS에 git pull origin 및 코드 정상 작동 확인
  • dotenv 패키지 설치
  • .env파일에서 DB_URL을 불러오는 방식으로 변경(보안)
  • 과제 질문 답변 적어서 최종 제출하기
  • 아이템 탈착 시 발생하는 버그 픽스
  • API 명세서 깃헙에 추가
  • 개인과제 해설 강의 듣기 -완-