컴퓨터 하드웨어 구성과 운영체제에 대해 공부를 했다면 프로그램의 힙 영역 메모리의 할당과 소멸은 큰 부담이 되는것을 알것이다.

결론적으로 말하자면 CPU 캐시 메모리와 주 메모리 간의 속도차이가 상당 하기 때문이다. 그렇기 때문에 가급적이면 메모리에 접근하는 일을 줄이는 것이 어떤 개발 환경을 막론하고 간에 퍼포먼스 향상에 큰 도움이 된다.

일반적으로 객체의 생성과 소멸이 빈번하지 않은 객체의 경우 큰 문제가 되지 않는다. 하지만 빈번하게 생성과 소멸이 이루어지는 객체의 경우, 어떻게 하면 퍼포먼스를 높힐 수 있을까? 이미 너무나도 잘 알려진 방법이지만 메모리에 올라간 객체들의 소멸시기에 소멸시키지 않고 재활용하는 오브젝트 풀링을 하면 된다. 나는 최근 구현하고 있는 게임에서 몹시 빈번하게 생성과 소멸이 이루어지는 객체들을 효율적으로 관리해야 하는 문제를 만났다.

특정 객체의 한해 풀링을 해주는 스크립트를 어렵지 않게 작성할 수 있었다. 구조는 이렇다.

특정 객체(Prefab)에 대한 오브젝트 풀을 만들고 생성 객체에게 관리자 객체(오브젝트 풀)의 정보를 전달하여 특정 객체의 생성을 위임(delegation) 한다.

하지만 얼마지나지 않아 객체의 종류에 대해 종속되지 않고 일반화 된 오브젝트 풀을 구현할 수 없을까라는 생각이 들었다.

이것에 대한 가장 큰 문제는 각각의 다른 특성들을 지닌 객체들을 어떻게 하나의 풀로 관리할 수 있을것인가 였다.

다만 정말 유용하게도 유니티처럼 모든 객체들이 컴포넌트들의 집합으로 구성되는 특성을 가지는 구조의 경우 생성과 접근이 굉장히 용이하다.

유니티의 경우 모든 오브젝트들은 GameObject를 상속받는다는 법칙이 있기 때문이다.

결과적으로 내가 바꾼 오브젝트 풀은 초기에 에디터를 통해 Prefab들의 정보를 설정할때 문자열이라는 고유의 키값을 통해 오브젝트들을 구분하고 관리한다.

프리팹을 통해 이미 구조화되어 있는 객체들을 키값(문자열)을 통해 일관되게(GameObject) 받아서 각 객체별로 가지고 있는 다형성(각각의 컴포넌트들)에 접근하여 원하는 처리를 하면 되는것이었다. (생성 객체의 경우 원활한 사용을 위해서는 이미 특정 객체의 정보를 알고 있어야하므로 여기서 생기는 종속성을 불가피하다고 생각한다. 혹시 이 조차도 제거할 수 있는 방법을 안다면 알려주시면 감사하겠습니다..(인터페이스를 활용한 방법 빼고))

유니티의 경우 생성 팩토리를 통한 생성 추상화 같은건 필요성을 느끼지 못했다. 그 이유는 유니티는 Prefab이라는 좋은 오브젝트 아카이빙?을 통해서 각각 프리팹에 대해 구체적(Concrete)으로 번잡한 소스코드 타이핑 없이 파일을 통해 객체들을 정의, 관리할 수 있기 때문이다. 물론 그 종류가 너무 다양하고 객체의 특성이 미래에 확장 가능성이 충분하다면 팩토리를 통해 프리팹을 스크립트화 생성하는것도 좋은 접근법일듯 하다... 하지만 당장 내가 처한 상황에서는 그렇게 다양하지 않았고 컴포넌트에 대한 접근을 인터페이스화 하면 종속성을 제거할 수 있겠으나 현재로서는 컴포넌트 구성이라는 좋은 특성을 두고 굳이 그럴 수고가 있는가는 생각이 든다.


요약하면 내가 변경한 오브젝트 풀의 장점은 두가지다

1. 하나는 객체를 생성해야 하는 객체들은 오브젝트 풀을 통해 실제로 할당이 일어났는지 일어나지 않았는지 확인할 필요가 없다. 그 책임은 오브젝트를 관리하는 풀에서 전담하기 때문이다. (이건 그냥 풀이 가지고 있는 장점중 하나인듯...), (그리고 퍼포먼스가 좋아지는건 기본적인 효과)

2. 런타임 중에 객체의 생성을 판단하는 생성 객체들은 자신이 생성하려는 객체가 무엇인지 알아야하고 그 접근을 위해서는 그 객체들을 관리하는 매니저 객체(오브젝트 풀)에 대해 알아야하는 한마디로 풀과 생성 객체간의 종속성이 생길 수 밖에 없다. 이 종속성을 효과적으로 해결할 수 있는 방법이 과연 있기나 한지 의문이 드는데 혹시 그 방법을 알고 있는 분은 연락주시면 감사 하겠습니다. 여튼, 생성 객체는 매니저 객체에 대해서 알아야하는데 매니저를 하나의 특수 객체(생성과 관리만을 담당하는)로 설정한다면 관리와 최소한의 종속으로 인한 관리가 편해진다.


사실 소스코드로 보자면 10줄도 안되는 정말 보잘것 없는 코드의 수정에 불과하다... 하지만 이 글을 쓰는 이유는 그런 사소한 변경일지라도 그에 대한 근거와 타당성을 고려 할 수 있는, 구체적인 장,단점을 생각하는 습관을 기르기 위해서이다.

비트코인, 이더리움에 대한 열기가 뜨겁다. 둘다 블록체인 개념을 활용한 가상화폐이지만 특히 요즘 비트코인만큼 뜨거운 녀석이 이더리움이다.
이더리움은 비트코인에 비해서 몇가지 특징을 가지고 있는데 내가 생각하는 가장 중요한 차이점은 비트코인과는 달리 최대 채굴량이 정해져 있지 않다는점이다.

현대의 화폐 자원은 거대한 기관(특히 정부)에서 관리, 운용되고 있다. 태초부터 이랬던 것은 아니다. 과거에는 귀금속이나 귀한 자원(비단, 상아, 소금 등)들이 화폐의 역할을 해왔다. 하지만 과거와 현재 우리가 사용하고 있는 화폐는 아주 큰 차이점이 있는데 과거의 화폐들은 정교하지는 않지만 그래도 어느 정도 실질적인 가치를 가지고 있는 재화들이 화폐의 역할을 대신했다는 점이다.

실질적인 가치라는건 이해가 그리 어렵지 않다. 내가 화폐라고 인식하고 있는 그 재화가 정말 가치를 가지고 있는 실재인가를 확인하면 된다. 예를들면 금화가 있다. 금이라는 금속은 사실 장신구와 몇 가지 특징을 제외하면 다른 금속에 비해서 금속으로서의 장점이 많지 않다. 그럼에도 불구하고 금화는 몇 천년동안 유럽, 아랍, 아시아 여러 국가에서 진귀한 것으로 여겨졌다.

사실 금화는 무겁고 불편하다 그런데 왜 금화를 화폐로 사람들이 인정했을까? 그건 금이라는 물질 자체가 희소하고 다른 어떤것으로 대체할 수 없다는 속성 만으로도 가치를 가지고 있기 때문이고 또한 과거의 국가는 현대처럼 고도로 중앙집중화 되지 못했고 정교한 행정처리를 하기 힘들었기 때문에 국가 주도 화폐 발행은 사실상 무의미한 것이었다.

하지만 현대의 화폐는 그 본질이 다르다. 현대의 화폐는 본질적으로 신용, 즉 내가 누군가에게 화폐를 지불하면 상대방은 나에게 그 화폐의 가치에 걸맞는 재화나 서비스를 제공해 줄 것이라는 약속에 기반을 두고 있다. 이런 '신용'만으로 화폐제도가 잘 굴러갈까?, 난 지금도 의아하지만 우리가 매일같이 사용하고 있는 천원, 만원짜리 지폐가 모두 그런 화폐이다. 이 신용화폐들은 실질적 구속력이 없다. 법적으로는 효력이 있지만 유사시에는 법이 무슨 소용이 있겠나? 결국 실질적인 가치는 가지고 있지 않고 해당 화폐를 사용하고 있는 시스템(원화, 달러화, 위안화 등.. 각각을 인정하고 있는 시스템)이 붕괴된다면 화폐의 가치는 종이조각 이상을 넘기 힘들것이다.

그럼 왜 신용화폐 기반 사회에서는 이런일이 벌어질까? 그건 간단하다. 화폐 발행에 있어서 무언가를 담보로 잡지 않아도 발행할 수 있다는 특징 때문이다.
혹시 보드게임 브루마블을 해봤는가? 브루마블은 플레이어와 은행, 두 역할이 나눠져 있다. 만약 게임 진행 도중에 은행이 특정 플레이어에게 은행의 돈을 갑자기 주게 된다면 게임이 정상적으로 진행이 되겠나?

결국 여기에 가장 큰 맹점이 있다. 신용화폐 사회에서 가장 중요한 것은 화폐를 만들어내는 주체가 누구냐는 것이다. 불행중 다행히도 대부분의 국가는 국가 자체에서 화폐 생산&유통을 독점한다.
하지만 여기서 또 문제가 발생하는데 국가의 정책도 결국 사람들이 결정하는 것이고 그로 인해 실책이 나올 수 있다는 점이다.

말이 몹시 길어졌다. 위의 긴 부연설명은 국가 통제의 화폐 생산&유통이란것이 그만큼 몹시 난해한 과제라는 점이며 물리적 한계로 인해 결국 누군가에 의해 독점될 수 밖에 없는 시스템이라는 점이다. 만약 소수의 개인들에게 화폐 발행권을 넘겨준다고 해보자. 그들이 이상적인 중재자라면 더할나위 없다. 이상적인 상황이 펼쳐지겠지만 그렇지 못하고 엉뚱한 마음을 먹는 경우에는 해당 화폐를 사용하는 시스템에 속한 모든 사람들은 그 화폐 발행 집단에 의해 휘둘리고 조종 당할 가능성이 매우 높다.
그런데 21세기에 들어 기술의 발전으로 획기적인 블록체인이라는 개념이 도입되었고 그로인해 사람들은 정부의 통제를 받지 않고도 화폐를 만들어 낼 수 있게 되었다. 내가 생각하는 이 기술의 가장 큰 장점은 화폐 생산을 마음먹더라도 생산과정 자체의 어려움으로 인해 생산의 제약이 생겨 통화량이 점진적으로 증가한다는 점이다.

비유를 들어보자면 이런것이 될까?
1. 모든 사람들은 자신이 사용할 화폐를 만들어 낼 수가 있다.
2. 하지만 화폐를 만들어내는 과정은 몹시 많은 시간과 노력이 필요하다.
3. 하지만 진입장벽이 높은것은 아니기에 누구라도 시도를 통해서 화폐를 만들어 낼 수 있다.

그런 의미에서 보면 현대의 비트코인, 이더리움 채굴자들은 진정한 의미의 마이너라고 볼 수 있다. 마치 과거 골드러쉬 시대의 미국 광부들과 같이 말이다.

내가 가장 관심있어 하는건 가상화폐가 과연 안정적인 화폐의 역할을 할 수 있을것이냐는 점이다.
누구가는 이런 열기가 거품이고 반짝뜨고 지는 별로 생각해서 별 관심을 보이지 않을 수도 있겠지만 나는 이미 가상화폐들이 화폐로서의 조건을 모두 충족시키고 기능도 충실히 해내고 있다고 생각한다. 하지만 가상화폐가 안정적인 화폐의 역할을 앞으로도 해낼 수 있을까? 라는 생각을 해보면 해결해야 할 문제점들이 많다. 물론 개중에는 시스템적인것이 아닌 결국 인간의 욕심으로 인해 생기는 문제점들도 있다. 하지만 현재 생기는 가장 큰 문제점은 두 개의 시스템(현재 우리가 사용중인 화폐 시스템 - 가상 화폐 시스템)간의 불협화음으로 인해 발생한다고 생각하며 이는 점차 대중화를 통해 해결될 수 있을것이라고 생각한다.

내가 생각하는 가상화폐의 문제점은 다음과 같다.
1. (과도기적 시점에서, 즉 현재)다른 시스템간의 빈번하고 큰 폭의 시세차이로 인한 투기성 자본을 억제하기 힘들다. (하지만 이 부분은 가상화폐가 대중화된다면 많이 줄어들 것이라고 생각한다. 대중화를 통해 많은 사람들이 가상화폐가 실질적인 가치가 있는 재화임을 인식할 것이기 때문이고 그로인해 가격이 안정될 것이다.)
2. 역시 통화량 독점을 막기 힘들다. 특정 가상화폐 시스템에서 소수가 대부분의 가상화폐를 독점한다면 역시 수요-공급에 의해 소수가 가지고 있는 가상화폐의 가치가 평가절상 될것은 자명하기 때문이다. 이를 효과적으로 막을 수 있는 방법이 필요하다.
3. 통화량이 점진적으로 증가할 수 밖에 없는 특성으로 인해 화폐 대체재로서의 변환 속도가 느리다. 결국 이 문제로 인해 1번의 문제를 야기시킬 것이다.
4. 가상화폐 생태계 후발주자의 경우 진입이 더 힘들어진다. 이런 변화는 자동화와 높은 컴퓨팅 파워를 가지고 있는 국가에 제한되기 때문에 산업 낙후로 늦게 진입할 수 밖에 없는 후발주자들은 이 혜택을 누릴 수 없게 된다.

하지만 2번, 4번 문제의 경우 고민해보았는데 해결책이 있을것 같다.
바로 화폐 풀(Currency Pool)을 만드는 것이다. 여러 가상화폐들을 묶어 하나의 화폐로 인식하는것이랄까..? 하지만 이 방법은 아이러니 하게도 1번의 문제점을 야기시킬 수 밖에 없다. 양날의 검과 같다고 생각한다.

과연 누군가(정부)의 컨트롤 없이 순수한 '시장'만의 작용으로, 그 안에 가득차 있는 선한 욕심들로 인해 가상화폐의 가치가 안정적으로 조절이 될지 몹시 몹시 몹시 궁금하다.
근미래에 어떻게 변할지 상상해보면 정말 흥분되는 일이 아닐 수 없다. 😆

'가볍게 읽는 시리즈' 카테고리의 다른 글

가상화폐에 대한 내 생각  (0) 2017.06.28
통신료가 사라진 세상  (0) 2017.06.22

통신료 없는 세상이 왔으면 좋겠다.
돈이 없어서 스마트폰을 살 수 없는 사람이 얼마나 있겠냐만은 그래도 통신 함에 있어서 금전적인 문제로 인해 제약이 없어야 한다고 믿고 있다.
표현을 하건 하지 않건 간에 소통할 수 있는 수단이 제공되어야 하고 그것이 기본 권리에 속한다고 생각하기 때문이다.

혹시 왜 통신료를 내야 할까라는 생각을 해본 적이 있는가? 그걸 알기 위해서는 우리가 매일같이 사용하는 네트워크가 어떻게 구성되어 있는지 살펴봐야 할 것이다. 컴퓨터 네트워크란 컴퓨터들의 집합이다.



위 그림과 같은 형태이다.
하지만 우리는 저런 컴퓨터들을 본 적이 없다. 왜냐하면 저런 통신용 컴퓨팅 장비들은 통신사라고 불리는 회사들에 의해 운영&유지되기 때문이다. 장비는 시간이 지나면 고장도 날 수 있고 구식이 되기 때문에 지속적인 업그레이드가 필요하다. 저것들을 관리하기 위한 전문 인력도 필요하고 말이다. 우리는 그것을 위해 다달이 통신료를 지불하는 것이다.

저런 식으로 구성된, 현재 우리가 사용하고 있는 네트워크 망의 형태는 Infrastructure 형태라고 부른다. 통신 만을 위해 항시 대기 중인 장치들이 즐비한 구조이다. 우리나라뿐만 아니라 전 세계에서 이런 형태의 망을 구축하고 사용하고 있다. 이 망은 Access-Point라고 불리는 통신을 위한 거점이 필요한데 네트워크로 진입하기 위한 거점이라고 생각하면 된다.
Access-Point는 별게 아니다. 우리가 매일같이 사용하고 있는 유무선 공유기가 될 수도 있고 혹은 통신사로부터 제공된 회선에 연결된 컴퓨터 일수도 있다.

간단히 비유를 들면 우리가 보내는 데이터들을 전달해주기 위해서 24시간 한순간도 쉬지 않고 일해주는 우체국 아저씨가 존재하는 것이고 Access-Point는 수하물을 보내기 위한 창구라고 생각하면 이해가 편하다.

그럼 Infrastructure 구조 말고 다른 망은 없을까? 통신은 본질적으로 특정 상대에게 무언가를 전달해주는 것을 의미한다. Infrastructures는 재차 언급하지만 통신만을 위한 전문적인 서비스(택배, 물류 회사)라고 생각할 수 있다. 하지만 물건을 보내기 위해서는 다른 방법도 존재한다. 서비스를 활용하지 않고 직접 손에서 손으로 전달하는 것이다. 내 손에서 철수 손으로 철수 손에서 영희 손으로 최종적으로는 내가 보내고자 했던 영구에게까지 전달될 수 있도록 말이다.

이런 네트워크 형태를 Ad-hoc 네트워크라고 한다. 통신 전문 장비를 활용하지 않고 단말기기(컴퓨터, 스마트폰 등)의 통신능력을 활용해서 통신하는 방식이다.
과거에는 컴퓨터를 들고 다닐 수 없었고 무선 통신 기능이 탑재되지 않았지만 현재는 거의 대부분의 사람들이 범용적으로 사용할 수 있는 스마트폰을 쓰고 있으며 스마트폰은 100% 통신 기능을 탑재하고 있기 때문에 특정 조건(사실 무수히 많음)을 만족하면 Ad-hoc 네트워크로도 구성될 수 있다고 생각한다.


이런 망이 일반화된다면 통신료가 많이 줄어들 텐데 기존처럼 망을 유지하는데 필요했던 비용이 사라지기 때문이다. 단말기들이 통신 기능을 대신해주므로 통신용 컴퓨터는 사라질 것이며 망의 업그레이드는 사용자들에 의해 자발적으로 진행된다. (많은 사람들이 2~3년에 한 번씩 스마트폰을 바꾸는 것을 상상하면 불가능하지도 않을듯하다.)

하지만 이 장점을 상쇄할 만큼 크고 다양한 문제들이 즐비한데 대충 생각해도 짚이는 단점들로는 다음과 같다.

1. 기기별 사양이 균일하지 않으므로 통신 표준이 필요하다. 
2. 상대 단말기를 찾기가 아주 복잡해지며 속도가 많이 느리다.
3. 망이 무지막지하게 복잡해지고 기존의 프로토콜로는 해결할 수 없는 문제(흐름제어)가 생긴다.
4. 단말기 주파수 제한으로 통신 범위가 짧다.
5. 여러 단말기를 거치므로 보안에 문제가 발생할 수 있다.
6. 빈번한 패킷 손실이 발생할 수 있다.
7. 단말기들이 백그라운드에서 전달자 역할을 해주어야 하므로 전력소모가 커진다.
8. 물리적 제약을 크게 받으므로 국제적인 네트워크가 되기는 힘들고 국소적인 네트워크가 된다.
9. 이 네트워크는 자발적으로 구성되는 것이며 단말기는 개별적으로 통신을 거부할 수 있어 강제성이 없기 때문에 망이 쉽게 와해될 수 있으며 망의 안전성을 보장하지 못한다.

문제가 참 많지 않은가? 저 문제들을 만족스럽게 해결할 수 있다면 Infrastructure와 함께 Ad-hoc 네트워크도 활발하게 사용되어 통신 비용도 많이 줄일 수 있을 텐데 말이다… 아쉽다.
하지만 가능성은 있으므로 긍정적으로 생각한다. 언젠가는 그런 날이 올 거라고 상상해본다.


'가볍게 읽는 시리즈' 카테고리의 다른 글

가상화폐에 대한 내 생각  (0) 2017.06.28
통신료가 사라진 세상  (0) 2017.06.22

+ Recent posts