개발일지6 Application.persistentDataPath에 대한 고찰 취미로 게임을 하나 만들고 있다.세이브 파일에 대한 경로를 관리해야 하는데, 읽기 쓰기가 가능한 Application.persistentDataPath를 사용하였다. 처음 프롤로그 씬을 불러올 때 세이브파일의 존재 유무에 따른 조건이 필요해서 씬을 불러오는 역할을 하는 함수에서 세이브파일 경로를 직접 지정해주었었다.하지만 파일 경로와 같은 것들은 게임의 전반적인 세팅이나 상태를 관리하는 GameManager만 알고 있어야 한다고 생각해서 GameManager 내부에서 세이브파일 경로를 프로퍼티로 관리하고 필요한 경우 외부에서 접근 가능하도록 하면 어떨까 했다.이 과정에서 알게된 Application.persistentDataPath의 특성에 대해 살펴보고자 한다. GamaManager에서 프로퍼티 변수로.. 2024. 7. 29. [Django Channels] api가 호출될 때마다 소켓에 broadcasting하기 필자가 몇개월 전에 진행한 프로젝트가 있다. 웹 어플리케이션으로 보드게임을 구축하는 프로젝트였다. Django Rest Framework(DRF)로 게임 진행에 필요한 api를 우선 짜둔 상태였고, 멀티플레이가 가능해야 했기 때문에 소켓을 사용해보기로 했던 기억이 난다. 하지만 소켓을 사용하는 방식이 좀 괴랄했다. api 호출은 http 프로토콜로 이루어지는데, 이 api 호출에 대한 응답을 실시간으로 양쪽 플레이어가 전송받아야 양 플레이어의 화면에 반영이 되기 때문에, 소켓 프로토콜로도 api 호출에 대한 응답이 전송되어야 한다. 우리는 이 과정을 클라이언트가 직접 클라이언트 측 소켓에서 api를 요청하면 해당 소켓으로 api 응답을 전송해주는 방식으로 구현해버리고 만다(....) 클라이언트 측 소켓에.. 2024. 2. 8. [Django/Nginx] swagger 설정 삽질하기 gunicorn으로 wsgi 처리를 해주고 nginx로 서버를 켜보니 http://서버주소/swagger/로 접근할 때 not found (404) 에러가 떴다. swagger는 기본적으로 ui를 로딩할 때 정적 파일을 사용하게 되어있다. 그러나 이 정적 파일의 주소를 몰라 헤메고 있던 와중에 django는 정적 파일을 한 군데로 모아주는 명령어를 지원한 다는 것을 알게 되었다. 물론 명령어를 사용하기 전에 settings.py에서 정적 파일을 모아둘 경로를 지정해놓아야 한다. # settings.py import os # .. 생략 STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static') # .. 생략 그리고 명령어를 실행한다 $ p.. 2024. 1. 14. [Python] Call-by-value vs Call-by-reference c언어에서는 포인터를 통해 변수에 직접 접근하여 값을 변경할 수 있다. void swap(int *x1, int *x2) { int temp = *x1; *x1 = *x2; *x2 = temp; } int main(void) { int arr[2] = {0, 3}; swap(&arr[0], &arr[1]); return 0; } python은 명시적으로 call-by-reference와 call-by-value를 구분하지 않는다. 대신에, mutable한 객체와 immutable한 객체에 따라 동작이 달라진다. int, string과 같은 immutable한 객체는 call-by-value를, list와 같은 mutable한 객체는 call-by-reference 처럼 동작하게 된다. 따라서 위 swap.. 2023. 11. 16. [Linux] Linux에서 dotenv 사용하기 윈도우 환경에서는 직접 .env 파일을 만들어서 환경변수를 저장했다. Ubuntu에서 동일한 방식을 사용해서 python의 os.environ.get() 메소드를 사용했더니 환경변수가 인식되지 않았다. 찾아보니 리눅스에서는 따로 환경변수로 저장하는 명령어가 있었다. export KEY=VALUE 삭제 명령어는 다음과 같다 unset KEY 2023. 1. 13. [PyMongo] 기본 transaction 정리 [용어 정리] pymongo의 db는 RDBMS의 db와 동일하다. collection은 RDBMS의 table에 대응된다. document는 RDBMS의 row에 대응된다. 기본 transaction(insert, find, update, delete)을 사용하기 위해서 db와의 연결이 필요하다. 이 때 사용되는 것이 client 객체이다. 객체 생성에 필요한 인자들은 따로 정의되어 있으니 api 문서를 살펴보면 되겠다. import pymongo client = pymongo.MongoClient() client 객체를 생성했으면 원하는 db에 접속한다. 두 가지 방법이 있다. db = client.test_db db = client['test_db'] test_db라는 이름을 갖는 db가 있으면 변.. 2023. 1. 6. 이전 1 다음