티스토리

담
검색하기

블로그 홈

담

dadam2204.tistory.com/m

다담2 님의 블로그입니다.

구독자
1
방명록 방문하기

주요 글 목록

  • [최종 프로젝트] 서버와 기획에 맞게 클라이언트 수정하기 오, 아름다운 나의 상상 코드팀원들의 작업 속도는 예상보다 빨랐고, 서버는 추가 기획된 부분까지 하나 둘 구현되기 시작했다. 문제는 추가 기획된 부분을 테스트하려면 기본 클라이언트를 수정해야 한다는 것이었다. 프로젝트를 위해서도, 후에 유니티 담당자분들과 협업할지도 모르는 미래의 나를 위해서도 일단 클라이언트 수정 작업에 도전해봐야겠다는 생각에 일단 작은 것부터 시작해보기로 했다.   실전으로 배우는 유니티작업자마다 다르겠지만, 개인적으로 유니티에서 UI를 먼저 세팅하고 스크립트를 연결하는 것이 가장 작업 속도가 빨랐다. 유니티에서 밑그림을 그리고, 그에 맞는 스크립트를 짜서 채색하는 느낌이었다.  // 속성 아이콘이 출력될 위치[SerializeField] private Image imgElement;.. 공감수 1 댓글수 1 2024. 12. 16.
  • [최종 프로젝트] 트러블 슈팅 - 1118 채팅이 왜 여러번 나올까?채팅이 왜 여러번 나올까? 위의 이미지처럼 던전에 다녀온 캐릭터가 채팅을 치면 2번, 3번씩 올라오는 버그가 발견되었다. 던전에 다녀온 횟수 만큼 채팅이 올라오는 것으로 미루어보아, townSession에 user 데이터가 중첩되어 쌓이고 있는 것 같다는 생각이 들었다.  townSession에 user 데이터를 쌓는 것은 cEnterHandler가 호출될 때 뿐이므로, 해당 핸들러에서 기존 유저가 세션에 추가되는 로직을 다시 검토해보기로 했다.   let newUser; // 닉네임 중복 확인 const existingPlayer = await findUserNickname(nickname); if (existingPlayer) { // 존재하는 유저일 경우, .. 공감수 0 댓글수 0 2024. 11. 18.
  • [최종 프로젝트] 트러블 슈팅 - 1115 기본 클라이언트를 파일을 받아, 기획에 맞게 수정하기 전에 일단 서버를 붙여보기로 했다. 기본적인 패킷 설명서가 있었기 때문에, 하나씩 분석하고 기능을 구현하던 중 코드가 너무 길고 비효율적이라는 생각에 정리를 해보자는 의견이 나왔다. 위치만 바꿨을 뿐인데, 사라져버린 캐릭터 최초 입장 시, 클라이언트에서 보내주는 C_Enter 패킷의 Response로 S_Enter 패킷을 보내주는 기능만 핸들러에 우선적으로 구현해둔 상태였다. 플레이어가 여러명 접속해도 서로의 모습이 보이는 부분까지 문제가 없는 것을 확인했기에, 위와 같이 주르륵 나열된 부분을 뜯어 utils 폴더에서 따로 관리할 수 있게 수정하는 것은 쉬운 일이라고 생각했다. 이전 프로젝트에서도 같은 작업을 해봤기에, 자신있게 시작했으나... 캐릭터.. 공감수 0 댓글수 4 2024. 11. 15.
  • [알고리즘 코드카타] 바탕화면 정리 예시를 보고 더 혼란스러웠던 문제이다. (x, y) 순서대로 result가 나와야 할 것 같은데 (y, x) 순서대로 result가 나와야 해서 괜히 더 헷갈렸던 것 같다.  이중for문으로 좌표를 구하고, x의 최대/최소값과 y의 최대/최소값만 구한 뒤 순서대로 넣으면 될 것 같아서 코드를 짜기 시작했다.function solution(wallpaper) { let point = []; for (let i = 0; i  문득, 굳이 (x, y) 형태로 하나의 배열에 좌표값을 밀어넣을 필요가 있나? result를 뽑아내려면 너무 복잡해지지 않나? 라는 생각이 들어 x값과 y값을 따로 모아주는 형태로 바꾸기로 했다. function solution(wallpaper) { let X = []; let.. 공감수 0 댓글수 0 2024. 11. 9.
  • [CH6] 타워 디펜스 리마스터 프로젝트 - 트러블슈팅110 특정 영역에 랜덤하게 길 만들기이전에 타워 디펜스 게임을 제작할 때, 팀원분이 sin 함수를 사용하여 화려하게 랜덤한 길을 그렸었다. 멀티 플레이 게임이 매칭되는 순간, 랜덤하게 길을 그려주고 시작해야 하기 때문에 해당 코드를 참고해보기로 했다.const path = []; let currentX = 0; const amplitude = height / 3; // 진폭으로 상하 폭 결정 const frequency = 0.025; // 주파수로 곡률 결정 const phase = Math.random() * Math.PI * 2; // 위상으로 파형 결정 (시작 지점 변동) while (currentX height) { currentY = height; .. 공감수 2 댓글수 2 2024. 11. 8.
  • CH5_멀티 플레이 과제 - 트러블슈팅 🚨 유저를 찾을 수 없습니다 게임 접속과 동시에 밀려드는 로그 속, 시선을 사로잡는 User not found. TCP 멀티 플레이 강의 중에 만들었던 코드를 참고해보기도 하고, 오타가 있는 것인가 싶어 한참을 뜯어봐도 문제가 해결되지 않았다. user가 users 배열에서 사라지는 것은 접속을 종료할 때에만 기능하도록 구현해두었는데, 관련 파일들을 처음부터 끝까지 아무리 살펴봐도 문제가 없었다. // userSession.jsexport const removeUser = async (socket) => { const index = userSessions.findIndex((user) => user.socket === socket); if (index != -1) { const user = u.. 공감수 1 댓글수 1 2024. 11. 1.
  • 전송계층 프로토콜, 대칭키/비대칭키 암호화 방식 그리고 로드밸런싱에 대하여 1. 전송 계층 프로토콜이란?전송 계층의 대표적인 프로토콜은 TCP와 UDP가 있습니다.  TCP는 메일이나 파일 전송과 같이 신뢰성이 중요한 경우에 주로 사용되는 연결 지향적 프로토콜입니다. 3 way handshaking 과정을 통해 서버와 클라이이언트 모두 데이터를 주고받을 준비가 되었다는 것을 확인한 뒤 논리적인 경로를 배정하여 데이터를 안정적으로/순서대로/에러 없이 교환할 수 있게 합니다. 데이터 전송 과정에 신뢰성이 중요하기 때문에, 3 way handshaking 과정에 흐름제어나 혼잡제어 등의 기능도 수행하는 만큼 CPU를 사용하게 되어 UDP에 비해 속도가 느리다는 특징이 있습니다. UDP는 신뢰성보다는 연속성이 중요한 스트리밍 서비스 같은 경우에 주로 사용되는 비연결형 프로토콜입니다. .. 공감수 1 댓글수 0 2024. 10. 31.
  • Protocol Buffers란? npm install protobufjs Node.js(java script) 환경에서 유니티(c#)에 연결하려면 데이터 구조가 다르기 때문에, 데이터 직렬화 작업은 필수라고 할 수 있다. 이 작업을 위해 사용하는 것이 바로 Protocol Buffers(프로토콜 버퍼), protobufjs 라이브러리이다. *데이터 직렬화: 메모리를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 형식으로 변환하는 것을 말한다.   1. Protocol Buffers 란? 프로토콜 버퍼는 언어와 플랫폼에 구애받지 않고, 통신 프로토콜, 데이터 저장 등에서 구조화된 데이터를 이진수로 직렬화하는 확장 가능한 방식이다. Google에서 설계되었으며, '.proto' 파일과 함께 사용할 수 있다. (직렬화 데이터 구조의 예:.. 공감수 4 댓글수 0 2024. 10. 25.
  • 소켓, 웹소켓 그리고 TCP 웹소켓을 활용하는 프로젝트에 이어, TCP를 활용한 프로젝트를 시작하려고 하니 개념이 헷갈리기 시작했다. 이 소켓이 그 소켓인가. 이 양방향 통신과 저 양방향 통신은 무엇이 다른가. 따로따로 정리한 글들을 봐도 이게 그거 같고, 저게 그거 같았다. 이 소켓이 그 소켓인가요?프로그램이 네트워크 상에서 데이터를 송신과 수신을 하기 위한 연결부를 소켓이라고 한다. 서버와 클라이언트의 IP 주소, 포트 번호, 연결 상태 등을 기록해놓은 하나의 파일이기도 하다. 일반적으로 TCP/IP 프로토콜을 이용하거나 WebScoket을 이용한다. 웹소켓 프로젝트에서 socket.io를 사용하며 질리도록 봤던 socket.on의 소켓과 TCP 프로젝트에서 다시 만나게 된 socket.on의 소켓은 같지만 다른 방식으로 구현되.. 공감수 0 댓글수 0 2024. 10. 21.
  • [CH 4 타워 디펜스 게임 프로젝트] 트러블슈팅 1016 ⛓️ 클라이언트와 서버 간의 연결고리 만들기서버에서 검증된 데이터를 기반으로 클라이언트에서 타워를 그려내야 했지만, 앞선 트러블슈팅에서 언급했듯 웹소켓에 대한 이해도가 많이 부족한 상황이었다. 클라이언트와 게임 서버의 역할 그 자체에 대한 이해도가 많이 부족했다고도 할 수 있을 것 같다. 그래서 클라이언트에서 우선 구현한 기능들을 서버와 어떻게 주고받아야 할지 연결고리를 이해하고 만드는 것까지 도전의 연속이었다. 주말 내내 github에 'tower defense'를 검색해서 비슷한 프로젝트들의 코드를 뜯어보고, 팀원분들이 먼저 구현한 몬스터나 스테이지 관련 코드들을 뜯어보고 나서야 기본적인 구조가 이해되기 시작했다. 이전 개인 프로젝트를 진행할 당시, 스켈레톤 코드에서 이미 거의 완성되어 있어 건드릴 .. 공감수 2 댓글수 0 2024. 10. 16.
  • [CH 4 타워 디펜스 게임 프로젝트] 트러블슈팅 1014 🖥️ 일단, 클라이언트에서 시작해보기개인 프로젝트에서 웹소켓을 다뤄보기는 했지만, 이해도가 낮은 상태였기 때문에 클라이언트와 서버 간에 데이터를 주고 받는 로직을 처음부터 짜보려고 하니, 오류 메세지가 터미널에 도배되기 일쑤였다. 어떻게 데이터를 보내고, 받아야 하는지도 헷갈릴 정도로 내실이 부족한 상태임을 인정해야만 했다. 그래도 타워 디펜스 게임에서 '타워'를 담당하게 된 만큼, 클라이언트에서라도 기능이 돌아갈 수 있도록 코드를 짜보기로 했다.  function placeNewTower() { if (towers.length >= 10) { alert('타워는 10개까지만 건설할 수 있습니다.'); } else if (userGold = towerCost) { const { x, y .. 공감수 2 댓글수 0 2024. 10. 15.
  • [CH 4 리얼 타임 과제] 트러블슈팅 - 1007 ⛔ 애타게 JSON 파일을 불러보다과제 초반에 주어진 스테이지 관련 코드를 보고 하드코딩을 진행한 뒤, 유지보수 및 기능 확장이 가능하도록 수정하는 작업을 반복했다. 각 스테이지 별로 아이템이 해금되고, 생성된 아이템에 따라 다른 점수를 획득하는 것이 기본 조건이기 때문에 스테이지에 대한 정보를 받아오는 것이 1차 과제였다.  문제는 아이템, 스테이지, 아이템 해금 정보가 담긴 json 파일들을 import 하는 과정이 쉽지 않았다. import items from '../assets/item.json' with {type: "json"} 위와 같은 형태로 Score.js 파일에 import를 시도했으나, 게임이 먹통이 되거나 undefined 오류가 발생하기 일쑤였다. init 폴더의assets.js처.. 공감수 1 댓글수 0 2024. 10. 7.
  • [CH 4 리얼 타임 과제] 트러블슈팅 - 1002 🗺️ 아이템에 맞는 점수 부여하기item.json 파일에 정의한 데이터를 사용하기 위해, 에셋 정보를 불러오는 코드를 활용하고자 했다.export const loadGameAssets = async () => { try { const [stages, items, itemUnlocks] = await Promise.all([ readFileAsync('stage.json'), readFileAsync('item.json'), readFileAsync('item_unlock.json'), ]); gameAssets = { stages, items, itemUnlocks }; return gameAssets; } catch (error) { throw.. 공감수 2 댓글수 1 2024. 10. 2.
  • [CH 4 리얼 타임 과제] 트러블슈팅 - 1001 🗂️ 숨은 코드 찾기제공받은 프론트엔드 파일과 강의에서 빠르게 지나간 스켈레톤 코드들의 분량이 많다보니, 확인하고 싶은 코드가 어디에 있는지 찾는 것부터 쉽지 않았다. 예를 들어, 각 아이템 id에 매칭되는 이미지 파일을 연결해주는 코드가 item.js나 itemController.js에 있을 것이라 예상하고 처음부터 끝까지 훑어보다가 포기할 때 즈음 index.js에서 찾아낸 일이 있었다. 다른 사람이 미리 짜둔 코드를 베이스로 원하는 결과물을 내기 위해서는 1) 전체 파일의 구조를 이해하고, 2) 어떤 방식으로 어디에 구현되어 있는지 인지하는 게 중요하다는 것을 이렇게 또 배우는 것 같다.  📀 아이템을 먹었습니다. 그냥 먹었습니다.보통 장애물을 피해서 달리는 게임에서 코인이나 아이템을 먹으면 스.. 공감수 4 댓글수 3 2024. 10. 1.
  • socket.io 사용해보기 1. Socket.io란? Socket.io는 Node.js를 이용해 웹 어플리케이션에서 실시간 통신을 구현하기 위한 라이브러리입니다. 클라이언트와 서버 간의 저지연(low-latency), 양방향(bidirectional), 이벤트 기반(event-based) 통신을 가능하게 합니다. 웹소켓(WebSocket)을 기반으로 동작하며, 웹소켓이 지원되지 않는 브라우저에서는 HTTP long-polling 방식을 사용하여 실시간 통신을 구현합니다.  2. Socket.io 설치하기다른 라이브러리들과 동일하게, 터미널을 통해 간편하게 다운로드 받을 수 있습니다.npm install socket.io  3. Socket.io 세팅하기app.js나 index.js 등 메인 파일에 2가지 방법으로 세팅할 수 있습니.. 공감수 1 댓글수 1 2024. 9. 30.
  • [개념정리] 웹소켓이란? ▶ 웹소켓(WebSocket) 프로토콜이란?웹소켓(WebSocket)은 클라이언트(브라우저)와 서버를 연결하고 실시간으로 통신이 가능하도록 하는 첨단 통신 프로토콜이다. 웹소켓은 하나의 TCP 접속에 전이중(duplex) 통신 채널을 제공한다. 쉽게 말해, 웹소켓은 Socket Connection을 유지한 채로 실시간으로 양방향 통신 혹은 데이터 전송이 가능한 프로토콜이다. 채팅 어플리케이션과 같이 실시간 통신이 필요한 경우 주로 사용된다. ▶ 웹소켓의 주요 특징실시간 통신웹소켓은 연결이 활성화된 상태에서 빠르고 지속적인 메시지 교환을 허용한다. 이로 인해 애플리케이션은 사용자에게 지연 없는 인터랙션을 제공할 수 있다.양방향 통신 (Full-Duplex)클라이언트와 서버가 동시에 서로에게 메시지를 보낼 .. 공감수 1 댓글수 0 2024. 9. 27.
  • CH 3 풋살 온라인 프로젝트 - 마무리 🎯 직관적으로, 매력적으로 소개하기짧고도 길었던 팀 프로젝트가 끝났다. 거북하지 않은 코딩(18)조 만의 매력을 소개하기 위해 어떤 방법이 효과적일까, 어떻게 접근해야 할까 고민했던 것 같다. 코드 자체를 보여주고 Insomnia 등을 통한 시연도 중요하지만, 사실 같은 주제로 수많은 팀이 프로젝트를 소개하는 자리에서 코드의 디테일들이 보일까? 라는 생각이 들었다. 이에 더해 7분이라는 제한 시간을 생각해보면 거래처에 상품을 소개하듯이 직관적으로, 매력적으로 도식화 된 슬라이드로 어필해야겠다는 결론에 이르렀다. 내가 담당한 코드에 집중하느라 다른 코드들을 리뷰할 시간이 부족했기에, 발표자료를 팀원들과 함께 정리하며 스스로도 정리하는 데에도 큰 도움이 되었다.  🎲 도파민의 꽃, 가챠 우선 직접 만들었.. 공감수 2 댓글수 2 2024. 9. 25.
  • [SQL 코드카타] 가격대 별 상품 개수 구하기(MySQL) PRODUCT 테이블에서 만원 단위로 구간을 나눠, 상품 개수를 출력해야 하는 문제이다. 답안 예시를 보면 만원 단위로 절삭하여 그루핑을 한 것을 알 수 있다. 예를 들어, 9000원은 PRICE_GROUP 0에 해당하고 22000원은 PRICE_GROUP 20000에 해당되게 해야 하는 것이다. BETWEEN으로 구간 별 분리를 해야하나? 그러면 모든 경우의 수를 다 지정해주어야 하는데, 그게 맞는 방법일까? 100만원짜리 상품이 있으면 어떻게 하지? 아무리 생각해도 만원 단위로 뒷자리를 절삭해주는 등의 방법이 있을 것 같았다. 그리고 정말 TRUNCATE( 테이블 명, - 절삭하려는 자릿수) 라는 간편한 방법이 있었다. 본 문제에서 4번째 자릿수까지 절삭해야 하기 때문에, TRUNCATE( PRICE.. 공감수 1 댓글수 1 2024. 9. 24.
  • CH 3 풋살 온라인 프로젝트 - 트러블 슈팅 0923 🎲 한장씩, 랜덤하게 인벤토리에 넣어주기 위의 사진과 같이 normal 타입의 카드팩을 구매하면, 인벤토리에 각각 랜덤 확률로 뽑힌 플레이어 카드가 들어가야 했다. 그러나 이상하게 랜덤하게 뽑힌 카드 한장이 count 만큼 인벤토리에 반복해서 들어가고 있었다. 반복문만 test 파일에서 돌려보면 이상이 없었기 때문에, 개인과제에서 뜯어온 await userDataClient.inventory.createMany 코드를 완전히 이해하지 못하고 가공하고 있는 문제 같았다. 랜덤값과 인벤토리에 넣는 코드를 연결하는 것이 도저히 이해되지 않아, 강의도 계속 돌려보고 튜터님도 여러번 찾아가야만 했다. 튜터님의 피드백을 받아보니 문제점이 명확해졌다. 인벤토리에 아이템(플레이어 카드)을 넣어주는 코드가 애초에 지정.. 공감수 0 댓글수 1 2024. 9. 23.
  • CH 3 풋살 온라인 프로젝트 - 트러블 슈팅 0919 🧧 플레이어를 뽑으려면, 일단 카드팩을 사야하는데기존에 배웠던 아이템 구매 API는 정해진 품목을 장바구니에 담는 것처럼 품목과 수량을 정해서 req를 보내면 인게임 머니를 차감하고 인벤토리에 아이템을 추가하는 방식이었다. 이번에는 확률형 아이템을 구매하도록 만들어야 하는데, 기존에 구성한 DB의 player 테이블은 구매한 아이템의 결과값일 뿐 정작 구매해야 할 플레이어 카드팩 관련 정보를 불러올 곳이 없었다. 풋살 게임을 진행하기 위해 사용되는 player 데이터만 고려하고, 그 player를 구매하고 inventory에 넣는 과정에 사용될 데이터를 고려하지 못한 것이다.  가챠 게임들을 보면 다양한 카드팩을 시즌별로 판매한다. 풋살 온라인 프로젝트에서도 플레이어 카드의 종류나 확률에 따라 다양한 .. 공감수 0 댓글수 0 2024. 9. 19.
  • CH 3 풋살 온라인 프로젝트 - 트러블 슈팅 0913 🎒 인벤토리란 무엇인가jwt 토큰 인증 이슈로 인해 이전 개인과제에서 인벤토리 구현을 해보지 못했기 때문에, 실제로 데이터베이스에 어떻게 데이터가 쌓이는지 감이 오지 않았다. 당연히 가방처럼 플레이어당 하나의 인벤토리가 생성되고, 그 안에 아이템의 id와 갯수(count)가 쌓인다고 생각했다. 그러나 팀원들과 이야기를 나누다보니, 인벤토리의 슬롯 하나로 이해하는 경우도 있었다. 그러면 DB가 너무 더러워져서 관리하기 어렵지 않은가? 로그처럼 데이터를 계속 누적하는 건데... 아이템을 사고 팔거나 장착할 때 꼬이지 않는 것인가? 라는 의문이 들었지만... 사실 해당 기능을 제대로 구현했던 적이 있는 사람은 없었기에 다같이 공부한 뒤 다시 모여야 했다. 해설 영상을 참고해보니, 하나의 아이템이 인벤토리에 .. 공감수 2 댓글수 1 2024. 9. 13.
  • CH3 아이템 시뮬레이터 과제 - 트러블슈팅 0911 JWT를 헤더에서만 사용하는 것 때문에 수정과 테스트를 반복하다가 정신을 차려보니 이미 11일이 지나있었다. 조금 늦었지만, 트러블슈팅 관련 기록을 남겨두기로 했다. ▶ 쿠키 대신 헤더에 토큰 부여하기JWT로 ACCESS TOKEN을 쿠키에 부여하는 방법만 배웠는데, 헤더에서만 사용되어야 한다고 하니 난관이 예상되었다. 관련 다행히도 res.cookies였던 토큰 관련 코드를 res.setHeader나 res.header로 변경하니 헤더에 들어가기는 했다.   그러나 헤더에 부여된 이 정보가 /api/characters 같은 다른 API까지 연결되지 않아, 인증 로직 구현이 불가능했다. user_id 기반으로 ACCESS TOKEN이 생성되지 않아, 유저가 body 입력하는 account 기준으로 생성했.. 공감수 1 댓글수 0 2024. 9. 12.
  • CH 3 아이템 시뮬레이터 과제 - 트러블슈팅 0910 🚧 회원가입 유효성 검사회원가입 관련, 과제에서 주어진 유효성 검사 기준은 2가지였다. 아이디가 '영어 소문자 + 숫자 조합' 일 것, 패스워드가 6글자 이상일 것. 해당 기능은 어제 테스트 해 본 결과, Prisma에서 구현은 불가능하며 router의 회원가입 API에서 조건을 걸어줘야 했다. 패스워드는 입력받은 값의 길이만 확인하면 간단하게 검사할 수 있었다.if (password.length  문제는 아이디였다. 'js 영문+숫자 조합' 등의 검색어로 찾아보니, 정규식이라는 것이 있었다. 회원가입 관련 로직에서 많이 사용한다고 하여, 코드에 적용해보았다.  regex로 조건을 선언해주고, 해당 조건의 테스트를 입력받은 account 값이 통과하지 못하면 error message가 반환되는 로직을 .. 공감수 1 댓글수 1 2024. 9. 10.
  • CH 3 아이템 시뮬레이터 과제 - 트러블슈팅 0909 개인과제 안내 페이지를 들어간 순간, 익숙한 애증의 향이 진하게 풍기는 이미지가 보였다. 옛날에 한참 보던 장비 시뮬레이터를 (다운그레이드 버전이지만) 구현해보게 되다니... 데이터베이스 모델링 부분에서 실수하면 머리가 꽤 아플 것 같다. 기본적으로 구현해야 하는 테이블은 하기와 같다.아이템 테이블계정 테이블캐릭터 테이블 (계정 당 여러개의 캐릭터 보유 가능)캐릭터-인벤토리 테이블 (캐릭터가 보유는 하고있으나, 장착하고 있지 않은 아이템 정보)캐릭터-아이템 테이블 (실제로 캐릭터가 장착한 아이템 정보) 각 테이블의 특성에 따라 관계를 설정해주어야 하기 때문에, 도식화를 먼저 해보기로 했다.   ▶ 아이템 status를 한번에 호출하기 다이어그램으로 정리하다보니, 데이터 타입을 정하는 것부터 혼란스러웠다... 공감수 0 댓글수 0 2024. 9. 9.
  • AWS에서 사라진 EC2 찾기 AWS에서 EC2와 RDS를 처음 만들어보게 된 날인 만큼, 요금 폭탄의 괴담을 떠올리며 인스턴스가 중지 상태인지 여러번 확인하고 나서야 식사 시간을 가질 수 있었다. 그러나 다시 강의를 틀고 MySQL 연결 작업을 하는데, 이상하게 'Error: connect ETIMEDOUT' 메세지가 뜨며 RDS에 연결되지 않는 현상이 발생했다. 인스턴스를 중지해둔 상태라 그런가? 연결은 딱히 안해놨지만, 다 켜놓고 테스트 해보자- 라는 마음으로 EC2 인스턴스 창으로 넘어갔다. 뭐야 내 EC2 돌려줘요  아무리 새로고침을 해도, 세팅했던 것이 꿈인 것처럼 인스턴스가 사라져 있었다. 보안그룹은 분명히 남아있는데, 그 보안그룹을 사용하고 있는 인스턴스가 대체 어디로 사라진 것인지 솜사탕 씻은 너구리처럼 AWS 사이트.. 공감수 2 댓글수 1 2024. 9. 6.
  • [프로그래머스] 푸드 파이트 대회(JavaScript) ◈ 고민 시작알고리즘 문제를 풀면서 문제가 이해되지 않아 여러번 읽게 된 건 이번이 처음인 것 같다. 캡쳐에는 보이지 않지만, food의 첫번째 요소는 물이기 때문에 "1"이 고정이며, result의 중앙에 "0"으로 return 되어야 한다. 예시에서 유추할 수 있듯, food의 각 요소는 음식의 갯수이며, index값이 곧 칼로리에 따른 음식의 고유 넘버이다. 문제를 풀기 위한 주의점을 간단하게 정리하자면 하기와 같다.food[0] = 물, result 중앙에 "0"으로 return 되어야 함food[n] = 음식의 갯수, n은 칼로리 순으로 정렬된 음식의 고유 넘버선수가 1:1로 매칭되며, 동일한 음식이 제공되어야 하므로 2개 미만으로 준비된 음식은 사용할 수 없다.홀수로 준비된 음식은 선수들에게 .. 공감수 2 댓글수 1 2024. 9. 5.
  • [Node.js] 미들웨어와 라이브러리 훑어보기 ▶미들웨어 (Middleware)서버의 요청(Request) - 응답(Response) 과정 중간에서 특정 기능을 수행하는 함수라고 할 수 있다. 보통 웹 서버에서 요청을 받을때, 모든 요청에 대한 공통적인 처리를 하고 싶을 때 사용한다. 모든 요청에 대한 로그를 남기거나, 특정 사용자만 접근할 수 있게 하는 등의 처리가 필요한 상황 등을 예로 들 수 있다. 또한 사용자가 웹 페이지에서 Form을 통해 전송한 데이터를 서버에서 쉽게 파싱(Body Parser)하여 사용할 수 있게 해주는 미들웨어도 존재한다. Node.js는 Express.js라는 웹 애플리케이션 프레임워크를 통해 미들웨어를 지원한다. 자주 쓰이는 미들웨어의 형태는 하기와 같다.app.use(express.urlencoded({ exten.. 공감수 1 댓글수 0 2024. 9. 4.
  • [알고리즘 코드카타] 두 개 뽑아서 더하기(JavaScript) ◈ 고민 시작서로 다른 인덱스에 있는 두 개의 수를 뽑아서 더했을 때 나오는 수의 모든 경우의 수를 구하는 문제이다. numbers에서 0번째 인덱스에 있는 수를 뽑았다면, 두번째로 뽑을 수는 1번째~n번째 수를 뽑아야 한다. 오름차순으로 정리함과 동시에 중복 제거 처리도 해야한다. function solution(numbers) { let answer = []; for(let i=0; i 위와 같은 구조로 코드를 짜보기로 했다. 오름차순은 이전에 썼던 sort((a,b) => (a-b))를 사용하되, for문 안에서 돌면 불필요한 처리를 반복하게 되므로 밖에서 한번에 정리해주기로 했다. 중복 제거는 해본 적이 없는 것 같아서, 구글링의 힘을 빌렸다. forEach, filter 등 다.. 공감수 0 댓글수 0 2024. 9. 3.
  • [Node.js_6기] 본캠프 TIL_0902 ▶ 알고리즘 코드카타_K번째수(JavaScript) ◈ 고민 시작 commands 안에 들어있는 요소 하나하나가 return값을 위한 key값으로 사용되기 때문에, 모든 key를 사용하려면 for문으로 돌려야 했다. 그런데 이 key값들을 사용하기 위해 또 for문을 써야하나? 싶어, 코드를 작성하기 시작했다.function solution(array, commands) { let answer = []; for(let i=0; i 쓰다보니 for문을 2중 3중으로 써서 되는 문제가 아닌 것 같았다. arrKey값을 한번 사용하고 바로 return 하면 끝나는데 굳이 반복문을 또 쓸 필요가 없었다. 그래서 arrKey 값을 대괄호로 순서대로 호출하기로 했다. 이후 slice()로 기존의 .. 공감수 0 댓글수 0 2024. 9. 2.
  • [Node.js_6기] 본캠프 TIL_0830 ▶  Node.js에서 사용하는 모듈(Module)이란?특정한 기능을 가진 여러 개의 함수와 변수들을 모아놓은 Javascript를 파일을 말하며, 그 자체로 하나의 프로그램이자 부품으로 사용할 수 있다. 보통 하나의 모듈만 사용하지는 않으며, 하나의 모듈에서 다른 모듈을 호출하여 사용할 수 있다. 코드의 재사용성과 유지보수성을 증가시킨다는 특징이 있다. - 모듈을 사용하는 이유?1) 코드 베이스를 분리할 수 있는 만큼, 전체 코드를 구조적으로 관리할 수 있다.2) 모듈화(modularize): 자주 사용하는 코드들을 재사용 가능하게 만들어준다. 3) 정보은닉 구현: 코드의 일부만 외부에 노출시킬 수 있다.4) 해당 모듈이 참조하고 있는 다른 모듈에 대한 종속성을 관리할 수 있다.  ▶  모듈 시스템 알.. 공감수 0 댓글수 0 2024. 8. 30.
    문의안내
    • 티스토리
    • 로그인
    • 고객센터

    티스토리는 카카오에서 사랑을 담아 만듭니다.

    © Kakao Corp.