바이너리의 단점

마지막 업데이트: 2022년 3월 26일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
출처: https://yoongrammer.tistory.com/71

슭의 개발 블로그

지난 4개월 동안 Go로 2개의 프로젝트를 진행하게 되었다.
한 프로젝트는 비동기적인 웹 서버를 작성하는데, 실행파일이 네이티브 바이너리로 나올 필요가 있었다. C나 C++은 웹서버를 만드는 것도, 비동기적인 작업을 하는 것도 간단하게 되지 않기에 Rust와 Go 중에서 고민하다가 Go를 사용하기로 했다.
다른 한 프로젝트는 큰 바이너리의 단점 파일을 다운받아서 라인 파싱하고, rest API로 데이터를 요청하고, 그래프를 만들어 자료를 분석하여야 했다. 워낙 큰 파일을 파싱해야 해서 JavaScript는 사용하기 싫었고, 며칠을 밤낮으로 돌아가야 하는 코드인데 별도의 검증을 할 수 없는 Python으로는 실행 중 버그가 발생했을 때 손실되는 시간이 크기 때문에 사용하기는 싫어서 Java, Scala, Go 중에서 고민하다가 Go를 쓰기로 했다.
이번 글에서는 바이너리의 단점 Go를 사용하면서 느꼈던 장단점에 대해서 간단히 써보도록 하겠다.

학습 속도가 빠르다.

Go는 공식 튜토리얼만 읽으면 다른 사람이 쓴 코드를 읽고 쓰는데 아무런 문제가 없다. 물론 Go의 튜토리얼 문서가 잘 돼 있기는 하지만, 다른 언어에 비해 크게 뛰어난 것은 아니다. 그냥 Go에는 프로그램을 작성하는데 필수적인 최소 기능들만 들어가 있기 때문이다.

Channel 기반 언어

Go는 대표적인 바이너리의 단점 채널 기반 언어이다. 스레드라는 것을 명시적으로 주지 않고 goroutine을 생성하면 알아서 스레드를 생성해주고 적절한 스레드에 goroutine을 할당한다. goroutine 사이의 커뮤니케이션을 전부 채널을 통해서 한다면, 귀찮은 동기화 문제를 신경 쓰지 않아도 된다.

네이티브 바이너리가 나온다.

결과를 배포하는 입장에서 네이티브 바이너리가 나온다는 것은 매우 큰 장점이다. 요즘은 대부분 서버에 파이썬이나 JVM이 설치되어 있지만, 역시 배포는 네이티브 바이너리로 하는 것이 가장 편하다.

컨벤션이 통일되어 있다.

Go는 컨벤션에 대한 논쟁이 전혀 없다. go에는 컨벤션에 맞춰서 코드를 수정해주는 go fmt라는 기능이 내장되어 있다. 개발자는 그저 go fmt을 돌리기만 하면 되기 때문에, 별도로 스타일 논쟁이 발생할 일이 없다. 코드를 올리기 전에 go fmt을 돌리는 것조차 귀찮은 사람을 위해서 vim-go 같은 플러그인이 있어서 개발자는 스타일을 신경 쓰지 않고 코드를 작성하기만 해도 컨벤션에 맞출 수 있다.

인터페이스 기반의 폴리모피즘

Go에서 폴리모픽한 코드를 작성하는 유일한 방법은 인터페이스를 인자로 넘기는 것이다. 이 덕분에 인터페이스 단위의 추상화가 자연스럽게 이루어진다.

verbose 한 코드

Go는 템플릿도 매크로도 없다. 이는 Go의 코드를 단순하게 만들어주는 장점도 있다. 하지만 템플릿도 매크로도 없어서 단순한 코드가 반복해서 등장한다.

type introspection

모든 폴리모피즘이 인터페이스를 기반으로 돌아가기 때문에 구체적인 구조체 타입별로 다른 동작을 하기 위해서는 type introspection을 통해서 타입을 체크해야한다. 그래서 Go는 정적 타입 언어임에도 불구하고 아래처럼 동적 언어에서나 볼법한 코드가 나온다.

interface<>

게다가 표준 라이브러리는 interface<>의 사용을 적극적으로 권장한다. 예를 들어 list 같은 자료 구조의 경우 템플릿이 존재하지 않기 때문에 특정 타입의 값을 담는 자료구조를 만들 수 없어서 interface<> 타입의 값을 추가하고 interface<> 타입의 값을 리턴하는 자료구조를 만들 수밖에 없다. 이러한 자료구조 때문에 type introspection을 자주 사용할 수밖에 없고, 동적 타입 언어에서나 볼법한 코드가 나오게 된다.

어설픈 최적화

Go는 함수를 inline 시키는 최적화를 하지 않는다. 다른 언어라면 별문제 없을 수도 있다. 하지만 Go는 함수를 사용할 일이 많다.
예를 들면 자원 관리나, recover 등을 위해서 defer를 사용할 일이 많은데 defer는 함수 단위로 호출된다. 따라서 특정 시점에서 자원을 해제시키고 싶다면 새로운 함수를 만들어 새 안에서 defer 함수를 호출해야 한다. 이 모든 함수가 인라이닝 되지 않기 때문에 실제로 스택 프레임을 변경시켜가며 함수를 호출했다 해제하는 일을 한다.

라이브러리 버전 관리

Go는 언제나 하나의 실행파일을 컴파일한다. 정적 라이브러리나 동적 라이브러리를 배포할 수 없고, 소스를 가져와서 컴파일하는 방식을 사용한다. 이는 딱히 나쁜 방식이 아니다. 현대의 패키지 매니저 중 많은 것들이 이런 방식을 취한다.
문제는 Go에는 라이브러리의 버전을 명시할 방법이 없다는 것이다. 만약 사용하고 있던 라이브러리가 버전업을 해서 인터페이스가 변경되거나 버그가 발생하거나 해서 옛 버전을 사용해야 할 경우 문제가 되는 라이브러리뿐 아니라 모든 라이브러리의 버전업을 할 수 없다.

변화에 민감한 스타일과 문법

Go는 컨벤션이 정해져 있는 것이 장점이라고 위에서 말했다. 컨벤션이 정해져 있다는 사실은 꽤 편하다. 하지만 몇몇 부분에서 잘못된 스타일을 사용한다.
예를 들면 Go는 필드의 타입 부분을 인덴트를 맞춘다. 따라서 아래와 같이 짧은 이름의 필드만 있던 구조체에 긴 이름의 필드가 추가되면 긴 이름에 맞춰서인덴트를 바꾼다. 이런 바이너리의 단점 컨벤션은 보기 좋아 보일 수도 있다. 하지만 이런 스타일은 이력을 더럽히기 때문에 좋지 않다. 위와 같은 변경이 있으면 실제로는 필드가 한 개 추가된 것이지만, 버전 관리 도구에서는 한 개의 필드를 지우고 2개의 필드를 추가한 것처럼 나오게 된다. 지난번 포스트에서도 말했듯이 코드의 스타일은 사용하는 도구를 따라가야 하고, 개발에서 버전 관리 도구는 때놓을 바이너리의 단점 수 없으므로 버전 관리 도구에 친화적인 스타일을 사용하는 것은 중요하다.

Go는 장점이 분명하다. 러닝 커브가 완만하므로 팀원에 누가 들어오더라도 쉽게 적응할 수 있다. 하지만 이 점을 제외하면 단점이 장점보다 많다. 다만, 지금까지 썼던 네이티브 바이너리가 나오는 언어 중에서 가장 학습하는데 걸리는 시간이 짧았다는 점은 중요하다고 생각한다. 네이티브 바이너리가 나오는 것이 가장 중요한 요구 사항이라면 Go를 고려해볼 만 하겠지만, 그 외의 상황에서 Go를 사용하지는 않을 것 같다.

  • 공유 링크 만들기
  • Facebook
  • Twitter
  • Pinterest
  • 이메일
  • 기타 앱

장단점을 잘 정리해주신, 진짜 제대로 사용하고 쓴 글로 느껴지네요.
잘 읽었습니다. 많은 참고가 되었습니다.

댓글 쓰기

이 블로그의 인기 게시물

[C++] enum class - 안전하고 쓰기 쉬운 enum

C++ 03 까지의 enum 은 여러 가지 문제를 가지고 있었다. 그래서 그 문제들을 해결하기 위해 C++ 11은 enum class 라는 것을 새로 만들었다. 이제부터 기존의 enum 에 어떤 문제가 있었고, 이것을 enum class 에서 어떻게 해결하였는지 살펴볼 것이다. 우선 기존의 enum 은 전방 선언할 수 없었다. 그 이유는 enumerator에 어떤 값이 들어있을지 알 수 없으면 그 크기를 정할 수 없기 때문 이다. 하지만 enum class 는 underlying type을 명시하지 않으면 int 타입과 같은 크기의 변수로 선언되고, int 값 안에 들어가지 못할 값을 지정하면 컴파일 에러를 발생시킨다. 만약 int 를 벗어난 범위의 값을 사용하고 싶다면, underlying type을 명시해주어야 한다. 기존 enum 의 또 다른 문제는 enumerator의 이름의 범위가 한정되지 않는다는 것이다. 예를 들어 아래와 같은 코드를 보자. IO 함수의 결과와 Parse 함수의 결과를 enum 으로 표현해 보았다. 하지만 이 코드는 컴파일되지 않는다. IOResult 의 Error , Ok 가 ParseResult 의 Error , Ok 와 겹치기 때문이다. 이를 해결하기 위해서는 다음과 같이 enumerator의 이름을 다르게 하거나 아래와 같이 namespace를 이용해야 했다. 하지만 enum class 는 enumerator의 이름이 enum class 안으로 한정되기 때문에 이런 복잡한 과정이 필요 없이 그저 enum class 를 선언하여 사용하면 된다. 무엇보다 기존 enum 의 가장 큰 문제는 정수형 변수로 암시적으로 변환되는 약 타입(weak type) 변수라는 것이다. 하지만 enum class 는 정수형 변수로 암시적 변환이 되지 않는다. enum class 를 정수형 변수처럼 사용하려고 하면 컴파일 에러를 바이너리의 단점 발생시킨다. 만약 정수형 변수로 사용하고 싶으면 static_cas

[MongoDB] ObjectId에 대해서

지난번에 shard key를 설명한 글 을 썼을 때 댓글 로 ObjectId 에 관한 얘기가 나왔었다. 그래서 sharding과 큰 연관은 없지만, 이번 기회에 ObjectId에 관해서 먼저 설명하고 가는 게 좋을 것 같아서 sharding에 관한 것은 뒤로 미루고 이번에는 ObjectId에 대해 먼저 설명하고 가도록 하겠다. ObjectId란 무엇인가 ObjectId는 같은 document 내에서 유일함이 보장되는 12 byte binary data다. 전통적인 centralized 되어 있는 시스템이라면 한 collection 내에서 유일함을 보장하는 것을 쉽게 할 수 있다. 하지만 sharding을 하는 MongoDB에서 유일함을 보장하는 것은 기존과는 다른 솔루션이 필요하다. 그리고 이 방법을 설명하는 게 사실상 ObjectId의 모든 것을 설명하는 것이다. 왜 ObjectId를 사용하는가 전통적인 RDBMS 에서 Primary key 를 만들 때는 DB 서버로 data를 보내서 중복되지 않는 key를 골라서 1) 그 값을 key로 저장하는 방식을 이용한다. 하지만 MongoDB와 같은 분산 database에서는 key를 서버에서 만들지 않고 클라이언트에서 만든다. 그 이유는 MongoDB가 query를 날릴 shard를 결정하는 방식 을 보면 알 수 있다. MongoDB는 자신이 필요한 shard에게만 query를 요청한다. 다시 말해서 client에 해당하는 mongos 2) 가 config server 의 data를 토대로 어떤 shard가 어느 범위의 값을 가졌는지를 저장하고 있다가 query를 요청할 때 자신이 필요로 하는 shard에게만 요청한다. 따라서 shard key 에 해당하는 data가 미완성인 상태로 서버에 저장하도록 요청할 수 없고, client가 ObjectId를 생성하여 값을 저장하도록 요청한다. 3) ObjectId의 구성 ObjectId는 크게 4부분으로 구성되어 있다. Ob

RAII는 무엇인가

RAII 는 C++에서 자주 쓰이는 idiom으로 자원의 안전한 사용을 위해 객체가 쓰이는 스코프를 벗어나면 자원을 해제해주는 기법이다. C++에서 heap에 할당된 자원은 명시적으로 해제하지 않으면 해제되지 않지만, stack에 할당된 자원은 자신의 scope가 끝나면 메모리가 해제되며 destructor가 불린다는 원리를 이용한 것이다. 원래는 exception 등으로 control flow가 예상치 못하게 변경될 때를 대비하기 위해서 쓰이던 기법이다. 아래의 예제를 보자. 첫 번째 코드는 위험하다. thisFunctionCanThrowException() 함수에서 exception을 발생시킨다면 resource를 해제하지 못한다. 두 번째 코드는 일단은 resource를 해제하고 있다. 하지만 보기에 좋은 코드는 아니다. 그리고 유지하기도 어려워진다. 세 번째 코드는 RAII를 위해 c++ 11의 스마트 포인터인 unique_ptr을 이용하는 방법이다. unique_ptr은 소멸할 때 자신이 들고 있는 메모리를 해제시켜주기 때문에 함수 밖으로 나가면 resource가 해제되는 것이 보장된다. 여기서 말하는 자원은 단순히 heap 메모리만을 말하는 것이 아니다. heap 메모리 이외에도 파일이나 db와 같은 것들도 전부 RAII를 이용해 안전하게 사용할 수 있다. 여기에 더 나아가서 특정 scope를 벗어나면 반드시 실행돼야 하는 코드들도 RAII를 이용해 처리할 수 있다. 즉, 다른 언어에서 finally에 해당하는 구문을 RAII를 이용해서 처리할 수 있다. 실제로 C++의 아버지이자 RAII라는 용어를 처음 만든 Bjarne Stroustrub는 c++에 finally를 집어넣지 않는 이유를 "RAII가 있는데 굳이 있을 필요가 없다." 라고 말하고 있다.

KR20070007527A - 바이너리 씨디엠에이 무선 통신을 이용한 통화 시스템 및방법 - Google Patents

Publication number KR20070007527A KR20070007527A KR20050062202A KR20050062202A KR20070007527A KR 20070007527 A KR20070007527 A KR 20070007527A KR 20050062202 A KR20050062202 A KR 20050062202A KR 20050062202 A KR20050062202 A KR 20050062202A KR 20070007527 A KR20070007527 A KR 20070007527A Authority KR South Korea Prior art keywords cdma terminal call module binary Prior art date 2005-07-11 Application number KR20050062202A Other languages English ( en ) Inventor 김주한 Original Assignee 원텍이앤씨 Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.) 2005-07-11 Filing date 2005-07-11 Publication date 2007-01-16 2005-07-11 Application filed by 원텍이앤씨 filed Critical 원텍이앤씨 2005-07-11 Priority to KR20050062202A priority Critical patent/KR20070007527A/ko 2007-01-16 Publication of KR20070007527A publication 바이너리의 단점 Critical patent/KR20070007527A/ko

Links

  • Espacenet
  • Global Dossier
  • Discuss
  • 238000004891 communication Methods 0.000 title claims abstract description 27
  • 101700064519 PSTN Proteins 0.000 claims abstract description 11
  • 230000000875 corresponding Effects 0.000 claims description 6
  • 238000000034 method Methods 0.000 description 13
  • 238000005516 engineering process Methods 0.000 description 5
  • 230000005540 biological transmission Effects 0.000 description 4
  • 238000010586 diagram Methods 0.000 description 4
  • 230000001360 synchronised Effects 0.000 description 2
  • 230000000051 modifying Effects 0.000 description 1
  • 230000004044 response Effects 0.000 description 1

Images

Abstract

본 발명은 Binary CDMA 모듈(이하 'B-CDMA 모듈'이라 한다.)을 장착한 무선 단말기(이하 'B-CDMA 단말기'라 한다.)에서 유선통화를 하기 위한 통화 시스템 및 방법을 제공한다. 이를 위한 본 발명은 B-CDMA 모듈을 장착한 B-CDMA 단말기와 B-CDMA 무선 접속 장치(엑세스 포인트, 이하 'B-CDMA AP'라 한다.) 및 유선망을 구비하는 통화 시스템에서 B-CDMA 단말기가 유선망을 통해 유선 통화를 수행하기 위한 방법에 있어서, 사용자가 상기 B-CDMA AP에 B-CDMA 단말기의 B-CDMA ID를 등록하고, B-CDMA 단말기로부터 유선 통화 요청이 있으면, B-CDMA AP는 등록여부를 확인하여 등록되어 있으면 B-CDMA 단말기와 유선망을 연결하는 과정으로 이루어짐을 특징으로 한다.

Figure 112005037362156-PAT00001

Description

본 발명은 Binary CDMA 무선 통신을 이용한 통화 시스템 및 방법에 관한 것으로, 특히 Binary CDMA 모듈을 장착한 B-CDMA 단말기가 유선통화를 하기 위한 통화 시스템 및 방법에 관한 것이다.

현재 세계적으로 무선 단말기의 사용이 보편화 되면서 통화품질, 통화거리, 부가서비스 등 사용자들의 다양한 요구를 충족시키기 위해 46/ 49MHz 무선 전화기, 900MHz 무선 전화기, 블루투스 무선 전화기 등 많은 무선 단말기들이 시장에 출시되어 있다.

무선 단말기가 사용되기 시작한 초기에는 46/ 49MHz의 무선 대역을 사용하는 무선 단말기들이 사용되었으나, 통화거리가 짧고, 혼선이 심한 단점이 있어서 이를 보완하기 위해서 900MHz 무선 대역을 사용하는 무선 단말기들이 출시되었다. 실내에서 무선 제품들이 그리 많이 사용되지 않았을 때는 900MHz 대역의 무선 단말기들이 우수한 성능을 제공하지만, 무선 단말기들이 많이 사용되는 사무실과 같은 곳에서는 상호간의 간섭으로 인해서 통화 품질이 나빠진다. 그리고 사용자의 다양한 요구를 아날로그 방식으로는 더 이상 지원할 수 없는 문제로 인해서 디지털 방식으로 전환되고 있는 추세이다.

디지털 방식의 무선 단말기에는 블루투스 무선 전화기가 있다. 블루투스 무선 전화기는 2.4GHz 대역을 사용하며 주파수 도약 방식으로 채널을 선택하므로 어느 정도 혼선에 강하며, 블루투스 모듈이 탑재된 다른 기기들과 근거리 무선 통신이 가능한 장점이 있다. 그러나 주파수 도약을 할 때 랜덤 호핑 방식을 사용하므로 주변에 다른 무선기기들이 많을 경우 간섭에 약하다는 단점이 있다. 따라서 무선 랜이나 그 밖의 동일 주파수 대역의 다른 무선기기들이 주위에 많은 경우 통화 품질이 저하되게 된다.

최근 개인용 휴대 전화기의 사용이 보편화 되면서, 사용자들은 휴대 전화기의 기능인 문자 메시지 전송, 전화번호 저장기능 등과 편리한 인터페이스 때문에 일반 유선전화기가 있는 가정 또는 사무실 등의 실내공간에서도 유선전화기를 사용하지 않고 휴대 전화기를 사용하여 통화를 하는 것을 선호하게 되었다. 이에 따라 사용자는 유선전화보다 과중한 통화요금을 부담하게 되었는데, 상기한 기존의 유선망을 사용하는 단말기들은 이러한 사용자들의 요구 반영이 미흡한 실정이다.

따라서, 본 발명은 상기한 종래 기술의 문제점을 해결하고, 사용자의 다양한 요구를 반영하는 통화 시스템을 구축하기 위해서 제안된 것으로서, 본 발명의 목적은 Binary CDMA 무선 통신을 이용하여, B-CDMA 모듈을 장착한 B-CDMA 단말기가 유선통화를 하기 위한 통화 시스템 및 방법을 제공함에 있다.

본 발명의 다른 목적은 대부분의 사용자가 자신의 집이나 사무실 등에서 유선전화가 있음에도 불구하고, 사용의 편리성 때문에 개인용 휴대 전화기를 이용하여 무선 통신을 사용함에 따른 비싼 통신요금을 부담하고 있는데, 이러한 통화 요금을 절감하기 위해 B-CDMA 단말기에서 휴대 전화기와 같은 편리한 인터페이스와 기능 등을 구비하여, 통화 요금을 절감하기 위한 통화 시스템 바이너리의 단점 및 방법을 제공함에 있다.

상기한 목적들을 달성하기 위한 본 발명은 Binary CDMA 무선 통신을 이용한 통화 시스템에 있어서, B-CDMA 모듈 및 Binary CDMA 무선 통신에 의해 B-CDMA AP로 유선 통화 서비스를 요청하기 위한 식별키를 구비하고, 식별키가 입력되면 상기 B-CDMA 모듈을 통해 B-CDMA AP로 유선 통화를 요청하는 B-CDMA 단말기와, B-CDMA 모듈을 구비하며 상기 B-CDMA 단말기로부터 전송된 유선 통화 요청에 의해 B-CDMA 단말기와 유선망을 연결하는 B-CDMA AP로 구성되는 것을 특징으로 한다.

또한, 상기 B-CDMA 단말기가 유선망을 통해 유선 통화를 수행하기 위한 방법에 있어서, 사용자가 B-CDMA AP에 B-CDMA 단말기의 ID를 등록하는 제 1과정과, B-CDMA 단말기로부터 통화 요청이 있으면, B-CDMA AP는 통화를 요청한 B-CDMA 단말기의 등록여부를 확인하여 등록되어 있는 경우에 B-CDMA 단말기와 유선망을 연결하는 제 2과정으로 이루어짐을 특징으로 한다.

먼저, 본 발명에서 사용되는 Binary CDMA 무선 통신 기술은 2.4GHz ISM 대역을 사용하는 근거리 무선통신기술로 외국 로열티가 필요 없는 순수 국내 기술이다. 이 기술은 멀티레벨의 전송신호파형을 이진파형으로 변조시켜서 전송하게 되는데, 파형이 이진파형이기 때문에 동기 알고리즘, RF 회로 등이 간단해져서 시스템의 가격이 저렴하고, 증폭기로의 입력신호 레벨이 고정되어 있어서 전력소모가 적은 장점이 있다. 또한 주파수 충돌을 막는 Othogonal Hopping 기법을 통하여 동일지역에서 16개의 서로 다른 B-CDMA 단말기간의 통신이 가능하며 다른 무선기기들의 간섭에 강하다. 그리고 time/frequency 다이버시티 기법을 적용하여 전송 품질이 뛰어나므로 우수한 통화 품질을 얻을 수 있다.

도 1은 본 발명의 실시 예에 따른 B-CDMA 단말기가 B-CDMA AP를 통해 일반 유선통화를 수행하기 위한 통화 시스템의 구성도이다. 이와 같은 통화 시스템은 마스터(master)인 B-CDMA AP(101)와 슬레이브(slave)인 B-CDMA 단말기들(102~105)로 구성된다. 도 1에서는 4개의 B-CDMA 단말기들을 도시하고 있지만, B-CDMA AP 한 대에 최대 15개의 B-CDMA 단말기가 연결될 수 있다. 본 발명에서 Binary CDMA 서비스 영역(Cell)(110)이란, B-CDMA AP가 설치되어 있는 특정 영역에서 B-CDMA 모듈이 장착된 B-CDMA 단말기가 B-CDMA AP와 Binary CDMA 무선 통신으로 접속하여 B-CDMA AP의 유선망을 통해 유선 통화를 할 수 있는 영역을 말한다.

상기의 B-CDMA 단말기는 안테나(301), B-CDMA 모듈(302), 메모리(303), CPU 블록(304), 키 입력부(305), 전원부(306), 음성부(307), 표시부(308) 등으로 구성된다. CPU 블록은 전화 통화나 메시지 전송, 데이터 통신 등의 B-CDMA 단말기의 전반적인 동작을 처리하며, 사용자의 키 입력을 통해서 유선 통화서비스를 제공받기 위한 번호가 입력되면, B-CDMA AP에 입력된 전화번호를 전송하여 유선망과 통화를 시도하는 역할을 한다. 이 때, 전송되는 신호는 안테나를 통해서 송수신 되는데, B-CDMA 모듈이 주파수 대역의 무선 채널로 수신되는 이러한 신호를 적절히 변환하고, 데이터의 종류를 구별하여 CPU 블록으로 넘겨준다. 메모리는 CPU 블록에서 수행되는 프로그램들을 저장하거나, 프로그램에 의해서 처리된 데이터를 임시로 저장하는 역할을 한다. 키 입력부는 1~0의 숫자키들, *, #, 메뉴, 통화, 종료, 메뉴, 확인, 볼륨, 리모컨, B-CDMA, 메시지, 전화번호부, 나만의 메뉴 등으로 구성되며, 사용자가 이러한 키들을 누르면 해당 키에 대응하는 키 입력 데이터를 CPU 블록에 제공한다. 표시부는 CPU 블록의 제어에 의해서 유선 통화 서비스나 그 밖의 다양한 기능들이 수행되는 과정을 화면상에 나타낸다. 전원부는 B-CDMA의 단말기에 전력이 공급되는 부분이며, 음성부는 사용자의 음성을 CPU 블록을 통해서 B-CDMA 모듈로 전송하는 역할을 한다.

한편, B-CDMA AP는 안테나(201), B-CDMA 모듈(202), 범용 비동기화 송수신기(UART)(203, 204), CPU 블록(205), 바이너리의 단점 RS-232 인터페이스(206), 메모리(207), 망층 접속 인터페이스[codec(208), DAA(209), RJ-11 커넥터(210)] 등으로 구성되어 있다. 이와 같이 구성된 B-CDMA AP를 통신이 이루어지는 과정을 통해서 세부적으로 설명하도록 한다. Binary CDMA 프로토콜 규약인 Retaw 프로토콜(Protocol)에서는 그룹을 형성하여 네트워킹을 하기 위해서 동기 유지를 위한 스캔(Scan Code)와 네트워킹을 위한 그룹(Group Code)를 공유하고 있어야 하며, 그룹 내의 단말간의 어드레싱(Addressing)을 위해서 Retaw_ID를 사용한다. 따라서 B-CDMA 단말기가 B-CDMA AP에 접속해서 유선 통화를 하기 위해서는 우선 B-CDMA 단말기들의 Retaw_ID를 B-CDMA AP에 등록하는 절차가 필요하다.

도 4는 본 발명의 실시 예에 따라 B-CDMA 단말기가 B-CDMA AP를 통해서 유선 통화를 이용하기 위해서 B-CDMA 단말기의 정보를 B-CDMA AP에 등록하는 과정을 나타내는 흐름도이다. 사용자가 처음 B-CDMA 단말기(102)와 B-CDMA AP(101)를 구입하였거나, Binary CDMA 서비스 영역(Cell)(110)에서 B-CDMA 단말기의 사용자가 B-CDMA AP(101)에 자신의 Retaw-ID를 등록시키고자 한다면 도4와 같은 등록절차를 따른다. 사용자가 B-CDMA AP에 B-CDMA 단말기의 정보를 입력하려면 우선 Retaw_ID를 등록하는 단계(401)를 수행하게 된다. Retaw_ID가 올바르게 입력되었으면 해당 B-CDMA 단말기를 검색하는 단계(404)가 수행되고, 동기절차(405)가 완료되면 등록과정이 종료(406)된다. 그러나 Retaw_ID가 올바르게 입력되지 않으면 B-CDMA 단말기의 Retaw_ID를 입력하라는 화면이 계속 나타나게 되며, B-CDMA 단말기를 검색했을 때 해당 단말기와 동기가 맞지 않으면 B-CDMA 단말기를 검색하는 단계가 반복해서 수행된다.

상기한 도 4와 같이 B-CDMA 단말기(102~105)가 유선 통화를 하기 위해 B-CDMA AP(101)에 등록하는 절차가 완료되면, Binary CDMA 서비스 영역(110) 내부에 위치한 B-CDMA 단말기는 B-CDMA AP를 통해서 유선 통화가 가능하게 된다. 발신의 경우, 사용자가 B-CDMA 단말기를 이용하여 외부와 통화를 하기 위해서 B-CDMA AP에 신호를 보내게 되면 도2에 도시한 안테나(201)를 통해서 신호가 내부로 들어가게 되는데, B-CDMA 모듈(202)을 거쳐서 CPU 블록(205)이 메모리(207)에 입력된 Retaw_ID를 비교하여 등록된 단말기에 한해서 PSTN(100)망에 연결시켜 주게 된다. 이 때, PSTN(100)망과 B-CDMA AP(101)는 유선으로 연결되어 있고, B-CDMA AP(101)와 B-CDMA 단말기(102~105)들은 Binary CDMA 무선 통신을 이용하여 음성 신호를 주고받게 된다. 수신의 경우, PSTN(100)망을 통해서 대기 상태에 있던 B-CDMA AP(101)에 착신호가 수신되면, CPU 블록(205)은 메모리(207)에 저장되어 있는 모든 B-CDMA 단말기들의 Retaw-ID를 읽어 와서 해당 Retaw_ID를 갖는 B-CDMA 단말기(102~105)들이 B-CDMA AP(101)의 서비스 영역(110)에 존재하는지 스캔을 하여, 존재하는 모든 B-CDMA 단말기들에게 착신호를 전송한다. 이후 B-CDMA 단말기(102~105)들 중에서 가장 먼저 착신호에 대한 응답을 보내온 B-CDMA 단말기에게 호를 연결하여 통화를 수행하게 된다. 이 때, 통화를 수행하고 있는 B-CDMA 단말기 외의 다른 B-CDMA 단말기가 B-CDMA AP에 통화를 요청하는 경우에는 해당 B-CDMA 단말기에 통화중 신호를 발신한다. 즉, B-CDMA AP(101)로 착신되는 전화는 Binary CDMA 서비스 영역(110)에서 B-CDMA AP(101)에 등록된 모든 B-CDMA 단말기(102~105)들로 착신호가 전송되고, 처음 응답한 B-CDMA 단말기와 통화 연결한다.

도 5는 본 발명의 실시 예에 따라 한 B-CDMA 단말기(501)가 B-CDMA AP(502)의 제어를 받아서 다른 B-CDMA 단말기(503)와 인터컴 서비스를 이용하는 흐름도이다. 인터컴 서비스란 Binary CDMA 서비스 영역(110)에 존재하는 B-CDMA 단말기가 B-CDMA AP의 제어를 받아서 PSTN(100)망에 연결되지 않고도 다른 B-CDMA 단말기와 Binary CDMA 무선 통신 기술을 이용하여 사용료 없이 통화를 할 수 있는 것을 이야기한다. 사용자가 가정 또는 회사 내부에 존재하는 다른 사람과 통화하기 위해서 요청하면(504) B-CDMA AP는 요청한 B-CDMA 단말기(501)의 Retaw_ID를 확인(505)하여 등록되어 있는 경우에 한하여, 사용자가 통화를 요구하는 다른 B-CDMA 단말기(503)에 신호음을 발신하게 되고(506), B-CDMA 단말기(503)가 통화 버튼을 누르면 두 단말기 사이에 채널이 형성되어 통화가 이루어지게 된다.

상기에서 설명한 바와 같이, 본 발명에서는 집 또는 회사와 같은 실내 공간에서 B-CDMA 모듈을 내장하고 있는 B-CDMA 단말기로 B-CDMA AP에 내장된 B-CDMA 모듈과 접속하여 유선 통화를 수행할 수 있으며, 주변의 다른 무선기기들의 간섭에 영향을 받지 않고 무선으로 자유롭게 통화할 수 있게 됨으로써 사용자의 편의가 증대된다. 이에 따라, B-CDMA 단말기의 사용자는 자신의 단말기로 집 또는 회사와 같은 실내 공간에서 휴대 전화기와 같은 편리한 인터페이스로 유선 통화를 할 수 있게 되어 불필요한 무선 통화 요금이 줄어들게 되고, 사용자는 B-CDMA 단말기를 보다 편리하게 이용할 수 있게 된다. 또한, 사용자가 속해 있는 실내 공간에 존재하는 다른 사용자와 B-CDMA 단말기로 통화를 하는 인터컴 서비스를 이용하는 경우에는 PSTN(100)망을 이용하지 않으므로 통화 요금 없이 무료로 통화를 할 수 있다.

Claims ( 5 )

B-CDMA 모듈(302) 및 Binary CDMA 통신에 의해 B-CDMA AP(101)로 유선 통화를 요청하기 위한 Retaw-ID를 구비하고, 상기 Retaw_ID가 입력되면 B-CDMA 모듈(301)을 통해 B-CDMA AP(101)로 통화를 요청하는 B-CDMA 단말기(102)와,

B-CDMA 모듈(202)을 구비하며 B-CDMA 단말기(102)로부터 상기 전송된 유선 통화 요청에 의해 B-CDMA 단말기(102)와 PSTN(100)망을 연결하는 B-CDMA AP(101)를 구비함을 특징으로 하는 Binary CDMA 무선 통신을 이용한 통화 시스템

B-CDMA AP(101)에 접속하여 유선 통화를 요청하기 위한 .식별번호에 대응되는 키를 구비하는 키입력부(305)와, 사용자에 의해 식별번호가 입력되면, B-CDMA 모듈(302)을 통해 B-CDMA AP(101)로 상기 유선 통화를 요청하는 신호를 송출하는 CPU 블록(304)과 안테나(301), B-CDMA 모듈(302), 메모리(303), 전원부(306), 음성부(307), 표시부(308)를 구비함을 특징으로 하는 B-CDMA 모듈을 장착한 무선 단말기

상기 B-CDMA 단말기(102)로부터 유선 통화 요청이 있는 경우, 서비스를 요청하는 B-CDMA 단말기(102)가 등록되어있는지 확인하여, B-CDMA 단말기(102)와 PSTN(100)망을 연결하여 유선 통화를 제공하는 CPU 블록(205)과 안테나(201), B-CDMA 모듈(202), 범용 비동기화 송수신기(UART)(203, 204), RS-232 인터페이스(206), 메모리(207), 망층 접속 인터페이스[codec(208), DAA(209), RJ-11 커넥터(210)]를 구비함을 특징으로 하는 Binary CDMA 무선 엑세스 포인트

명한 B-CDMA 단말기(102)가 B-CDMA AP(101)에게 Binary CDMA 서비스 영역(100)에 존재하는 다른 사용자와의 통화를 요구하는 있는 경우, B-CDMA AP(101)가 상기 B-CDMA 단말기(102)의 Retaw-ID를 확인하여 Retaw_ID가 미리 등록되어 있으면 다른 B-CDMA 단말기(103)에게 호를 연결하여 두 B-CDMA 단말기가 Binary CDMA 무선 통신을 이용하여 통화 요금 없이 통화를 가능하게 하는 통화 방법 및 시스템

B-CDMA 모듈(302)을 장착한 B-CDMA 단말기(102)와 B-CDMA AP(101) 및 PSTN(100)망을 구비하는 통화 시스템에서 상기 B-CDMA 단말기(102)가 유선 통화를 수행하기 위한 방법에 있어서,

사용자가 상기 B-CDMA AP(101)에 상기 B-CDMA 단말기(102)의 Retaw_ID를 등록하는 제 1과정과, B-CDMA 단말기(102)로부터 유선 통화 요청이 있으면, B-CDMA AP(101)는 B-CDMA 단말기(102)가 미리 등록되어 있는지를 확인하여, 미리 등록되어 있는 경우에 한하여 B-CDMA 단말기(102)와 PSTN(100)망을 연결하는 제 2과정으로 이루어짐을 특징으로 하는 Binary CDMA 무선 통신을 이용한 통화 방법

바이너리의 단점

Binary Search Tree(BST)는 효율적인 탐색을 위한 데이터 저장 방법 이다.

👉 규칙

  • 노드에 저장되는 키는 유일하다.
  • 부모의 키 값이 왼쪽 자식 노드의 키 값보다 크다.
  • 부모의 키 값이 오른쪽 자식 노드의 키 값보다 작다.
  • 왼쪽과 오른쪽 서브트리도 BST이다.

👉 장단점

장점
탐색 연산 시간복잡도가 O(log N)이다. (명확히 말하면 O(h))

단점
편향 트리의 경우 저장 순서에 따라서 한 쪽으로만 노드가 추가되는 경우가 발생한다.
최악의 경우는 탐색 시간복잡도가 O(N)이다.
배열보다 많은 메모리를 사용한다.

바이너리의 단점 출처: https://yoongrammer.tistory.com/71

Leetcode 문제를 통한 BST 구현

BST를 직접 구현하는 것이 도움이 될 것이라 생각하여 아래 문제를 풀어보았다.

Search in a Binary Search Tree - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

Insert into a Binary Search Tree - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

Delete Node in a BST - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

Code Playground

트리(Tree)는 이름 그대로 나무를 거꾸로 뒤집어 놓은듯한 형태이다. 자료구조가 하나의 뿌리에서 뻗어나가는 형상을 하고 있다. 트리 구조는 우리 일상에서 흔히 볼 수 있는 계층적인 구조(Hierarchical Structure)를 컴퓨터에서 표현한 구조이다. 한 가족의 족보나 회사의 조직도 등이 바로 트리 구조이다. 족보같은 경우 조상으로부터 자식, 자식의 자식, 자식의 자식의 자식 형태로 이루어져있기 때문이다.

컴퓨터의 파일 시스템이나 웹 페이지의 DOM 구조도 트리 구조이다.

트리 구조는 대개 위 그림과 같은 구조이다.

트리의 각 요소들은 Node라고 부르고 가장 상위의 노드를 Root Node라고 부른다. 반대로 최하위 노드는 Leaf Node 혹은 Terminal Node라고 한다. Leaf Node는 자식 노드가 없는 트리 구조의 가장 하단에 있는 노드들을 말한다.

한 노드에 연결된 서브 트리의 개수를 차수라고 한다. 예를 들어서 B 노드의 차수는 2개이다. 만약에 한 트리 내의 차수가 모두 2개 이하라면 그 트리를 이진 트리(Binary Tree)라고 부른다.

현재 노드에 연결되어있는 상위 노드는 Parent Node이고 그 하위의 자식 노드는 Child Node이다. 같은 부모 노드를 갖는 노드는 형제 노드, 즉 Sibling Node이다. 이렇게 트리 구조의 용어는 정말로 가계도와 비슷하다.

Level은 루트 노드부터 해당 노드까지 경로를 찾는 데 방문한 총 노드의 수를 말한다. 트리의 최대 레벨 수는 트리의 height(높이) 혹은 depth(깊이)라고 한다. 위 그림의 트리 구조는 Level 1부터 Level 3까지 있고 트리의 바이너리의 단점 높이는 3이다.

Binary Search Tree

트리는 종류가 매우 많지만 그 중에서도 가장 유명한 구조 중 하나다 Binary Search Tree(이진 탐색 트리)이다.

Binary Search Tree는 이진 트리이기때문에 모든 노드의 차수는 2개 이하여야만 한다.

그리고 모든 왼쪽 자식 노드는 부모의 값보다 작은 값을 가져야하고

모든 오른쪽 자식 노드는 부모의 값보다 큰 값을 가져야한다는 특징이 있다.

Tree structure in which a node can have zero, one, or two subtrees.
Every node in the left has a smaller value than its parent node.
Every node in the right has a larger value than its parent node.

즉, 6, 2, 9, 5, 8, 3, 1이란 데이터를 이진 탐색 트리로 만들면 위의 그림처럼 된다.

가장 먼저 들어간 6이 Root Node가 된다.

2는 6보다 작기 때문에 6의 왼쪽 자식 노드가 된다.

9는 6보다 크기 때문에 6의 오른쪽 자식 노드가 된다.

5는 6보다 작고 2보다 크기 때문에 2의 오른쪽 자식 노드가 된다.

8은 6보다 크고 9보다 작기 때문에 9의 왼쪽 자식 노드가 된다.

이런 규칙으로 이루어져있기 때문에 이진 탐색 트리는 평균적으로 이진 탐색과 똑같이 빠른 시간 복잡도를 가진다.

Big O - average

  • Insertion: O(log n)
  • Deletion: O(log n)
  • Search: O(log n)

만약 로그 시간이 이해가 안간다면 아래 링크를 참조해보자.

What does the time complexity O(log n) actually mean? - By

Knowing the complexity 바이너리의 단점 of algorithms beforehand is one thing, and other thing is knowing the reason behind it being like that. Whether you’re a CS graduate or someone who wants to deal with optimization problems effectively, this is something that you must

Big O - worst case

  • Insertion: O(n)
  • Deletion: O(n)
  • Search: O(n)

이진 탐색 트리는 대개의 경우 빠른 속도를 자랑하지만 몇 가지 단점이 있는데, 하나는 데이터를 임의 접근(random access)할 수 없다는 것이다. 예를 들어서 이 트리의 6번째 원소를 찾고싶다고 말 할 수 없다.

또한 트리가 균형이 맞지 않는 최악의 경우에는 데이터의 삽입과 삭제, 검색이 모두 O(n)만큼 소요된다. 이진 탐색 트리의 성능이 떨어지는 경우는 다음 그림과 같은 경우이다.

이렇게 데이터가 한쪽으로 치우쳐있으면 연결 리스트와 별 차이가 없는 구조가 되어 이진 트리의 장점이 사라진다. 이러한 이진 탐색 트리의 단점을 해결하기 위해 AVL 트리, 레드-블랙 트리, 2-3 트리 등 여러 가지 트리 구조가 존재한다.

Go 언어의 장점과 단점

본 글은 특정 언어를 지지하거나 GO를 폄하할 의도로 작성한 글이 아닙니다. 웹 상의 의견과 제가 Go를 사용하면서 느낀점을 첨언하였습니다. GO언어를 선택할까 고민하는, 궁금한 분들에게 도움이 되기를 바랍니다.

  • 09년 구글의 로버트 그리즈머, 홉 파이크, 켄 톰슨이 개발하였습니다.
  • 고루틴이 있습니다.
    • 멀티쓰레드 메커니즘이지만 자체적인 스케줄러에 의해 관리되는 경량 쓰레드이며, OS 에서 관리하는 경량 쓰레드보다 더 경량입니다.
    • 일급객체로 정수와 실수와 같은 데이터 타입과 동급으로 취급
    • channel을 통해 동시성을 지원합니다.
    • 함수형 언어라고 하기에는 함수의 순수성(Purity), 불변성(Immutability)을 보장하지 않습니다.

    GO 언어 장점

    • 매우 간단한 문법으로 배우기 쉬습니다.
      • loop 문법으로 while이 없고 오직 for만 있습니다.
      • class 문법이 없습니다.
      • 컴파일 속도가 빨라서 인터프리터 언어처럼 쓸 수 있습니다.
      • 여러분이 Go로 알고리즘 문제를 해결한다면 다른 언어와 비교할 수 없는 빠른 속도로 해결할 수 있습니다.
      • 고루틴은 쓰레드보다 매우 가볍고 쉽게 이용이 가능합니다.
      • 자체 제공하는 패키지들이 강력해서 별도의 웹 프레임워크를 사용하지 않아도 웹을 개발할 수 있습니다. 파이썬으로 순수 웹 개발이 힘들기에 장고, 플라스크 프레임워크를 사용하는 것에 대조됩니다.
      • 구글이 만들었고 YouTube 개발에 사용하는 언어입니다. 해외에는 우버, 넷플릭스, BBC 가 사용하고 있으며 도커 또한 Go로 개발하였습니다. 국내는 카카오엔터프라이즈, 당근마켓, 왓차, 버즈빌 등 대기업, 스타트업이 사용하는 언어입니다.
      • 컨벤션에 맞추어 코드를 수정해주는 go fmt 기능이 있다.
      • VS Code에서 저장을 누르는 순간 formatter가 포멧을 바로 맞추어줍니다.
      • Go는 대표적인 채널 기반 언어입니다. 스레드라는 것을 명시적으로 주지 않고 고루틴을 생성하면 알아서 스레드를 생성해주고 적절한 스레드에 고루틴을 할당합니다. goroutine 사이의 커뮤니케이션을 전부 채널을 통해서 한다면 동기화 문제를 신경 쓰지 않아도 된됩니.
      • 결과를 배포하는 입장에서 네이티브 바이너리가 나온다는 것은 매우 큰 장점입니다. 요즘은 대부분 서버에 파이썬이나 JVM이 설치되어 있지만, 역시 배포는 네이티브 바이너리로 하는 것이 가장 편합니다.
      • 그러나 바이트 코드를 생성하는 언어가 아니므로 바이너리만 배포하는 경우 (C와 C++처럼) 타겟 머신에 맞추어 각각 컴파일을 해야해야합니다.
      • Go에서 폴리모픽한 코드를 작성하는 유일한 방법은 인터페이스를 인자로 넘기는 것입니다. 이 덕분에 인터페이스 단위의 추상화가 자연스럽게 이루어집니다.

      GO언어 단점

      • 없는게 산더미입니다.
        • 제네릭 문법 없음. 클래스 문법 없음(OOP 안녕~), 예외 처리 문법 없음, Public, Private 키워드 없음, this 문법 없음
        • 메서드를 만들 수 있으며 인터페이스를 이용해서 다형성을 구현할 수 있습니다. Composition으로 상속을 대신할 수 있습니다.
        • 덱과 같은 자료형이 제공되지 않습니다. (알고리즘 풀때 눈물. )
        • 예외 처리 문법이 없기에 if 문이 상당히 많이 사용됩니다. 읽기 힘든 지저분한 코드가 생깁니다.
        • C는 DEV C++, Visual Studio 등등, Java의 이클립스가 있지만 Go는 VS Code, Goland 말고 별다른 선택지가 없습니다.
        • Go는 템플릿도 매크로도 없습니다. 이는 Go의 코드를 단순하게 만들어주는 장점도 있지만, 하지만 템플릿도 매크로도 없어서 단순한 코드가 반복해서 등장합니다.
        • Go에서는 깃헙 등의 원격 저장소에 올라온 패키지를 go get 명령어로 다운로드 및 설치해서 사용합니다.
        • GORM 등 있지만 뭔가 아쉽습니다. 자바 진형의 강력한 JPA가 그립습니다.
        • 파이썬의 Django, Flask와 같이 지배적인 라이브러리가 있는 것이 아니라 고만고만한 Echo, Gin, Beego 프레임워크가 있습니다.
        • 코드를 작성하면 formatter가 코드를 수정하는데 단순히 공백이 추가된 것을 git에서 수정된 라인으로 잡을 때가 있습니다. 커밋의 호읍이 길다면 실제 수정된 로직을 파악하기는 힘들어집니다.
        • 자바 진형이 대세인 우리나라에서는 타 언어에 비해서 인럭풀이 많지 않습니다.
        • 하지만 Go의 빠른성능, 빅쿼리 등등의 이유로 도입하는 회사가 있습니다.

        'Web' 카테고리의 다른 글

        REST란? REST API 디자인 가이드 (18) 2021.05.09
        org.apache.coyote.http11.HeadersTooLargeException 에러 해결 (2) 2021.03.19
        Go 언어의 장점과 단점 (15) 2020.09.18
        GO 언어로 JWT 인증서버 만들기 (32) 2020.09.17

        - public, private -> 앞글자 대문자 소문자로 노출여부 결정가능
        - IDE는 저정도면 충분한 것 같습니다.
        - 요즘엔 go get 보단 go module을 사용하죠 엄청 편합니다.

        - 코드량이 길어지면 접근제어자 없이 대소문자로 제어하는걸 보면 헷갈리죠 ㅎㅎ 접근 제어자가 있었다면 하나만 바꾸어주면 되지만 대소문자를 변경해야해서 수정할 범위도 바이너리의 단점 늘어나고고요!
        - 비싸서 Go land를 사용해보지는 않았고 VS Code을 사용했고요 gin과 같은 웹 프레임웤 디버깅, 테스트의 편의성은 확 떨어지죠.
        - go mod를 저도 씁니다! 말씀하신 것처럼 url만 있으면 큰 문제는 없고요! spring boot처럼 호환성 있는 버전을 맞추어주지는 않는게 아쉽죠 ㅎㅎ

        저도 한때 go를 썼어서 주저리주저리 남겨보았습니다 :) 읽어주셔서 감사합니다!

        좋은 글 잘 읽었습니다! OOP가 없지는 않고 golang 만의 방식으로 지원을 해주지요~

        Java와 같은 OOP 언어와 다른 Go방식이 웹 개발할때 코드 중복을 줄여주는데 한계가 있더라고요,, 한참 API스팩 변경되어서 중복코드와 싸우다가 잠깐 썼던 기억이 있네요!

        GO의 SOLID에 'SOLID in Go in 8 minutes (5m Friday #5)' https://youtu.be/AKdvlr-RzEA 짧은 영상인데 재밋네요!

        Private, Public 키워드는 없어도 대소문자로 자동으로 처리 됩니다
        예외 처리 됩니다.
        전처리 됩니다.
        코드 깔끔하게 됩니다.(개발자 역량)
        그리고 작성자 님은 GO로 된 오픈소스를 얼마나 보셨는지 모르겠지만
        GO 오픈소스를 보면 코드의 간결함과 잛은 코드로 많은 것들을 할 수 있다는 걸 알게 될 것입니다.

        오픈소스를 많이 보시고 참고 하시기 바랍니다.

        언급하신 항목에 대해 알고있습니다. go 기본문법이죠.
        길진 않지만 go 스택으로 일하였습니다.

        글의 장단점 항목은 https://github.com/ksimka/go-is-not-good를 참고하였으며 제가 직접 개발하면서 공감하는 장단점으로 구성하였습니다.
        - 접근지시자가 없지만 말씀하신대로 외부 접근 여부를 대소문자로 지정할 수 있습니다. 그러나 대소문자로 접근지시를 설정하기에 변수 convention을 언어적 특성으로 유지하기 힘듭니다. 이는 code generater(특히 object mapper)를 사용하면 더욱 문제가 발생합니다. go에 대해서 배경지식이 있을것이라 생각하기에 이유는 아실것이라 생각합니다.
        - 예외 처리하지않으면 panic이 발생합니다. 예외처리 위임 로직에서 조건 if와 exception 로직이 혼재되어 관심사 분리가 안됩니다. Java처럼 exception 타입이 아니기에 네이밍 충돌을 막고자 err, err1 변수명도 보았습니다.
        - 전처리는 본문에 없는데 어떤 말씀이신지 질문드립니다.
        - go뿐만 아니라 모든 언어가 개발 역량에 따라서 간결해질 수 있겠습니다.

        오픈소스 go 프로젝트 도입 검토 및 연동작업 또한 하였으며
        https://github.com/brave-people/Awesome-Dev-Contents/blob/master/3.%EB%B2%A1%EC%97%94%EB%93%9C/go.md#gin-go
        제가 Go 기반 오픈소스에서 (web 기반) 참조할만한 프로젝트 모아둔 저장소입니다.

        Go 프로젝트인 github CIL 뿐만 아니라 인프라 클라우드 분야 오픈소스로 보았을때는 분명한 장점이 있다고 생각합니다. 또한 go 루틴을 십분 활용할 수 있는 게임 프론트 서버, 채팅서버 등등 Go를 잘 활용할 수 있는 분야는 다양하다고 생각합니다.

        제가 래퍼런스로한 글을 보시면 아시겠지만 서로가 단점이라고 생각하는 항목은 다릅니다.
        저 또한 본문의 글을 절대적 기준으로 작성한 것 아니며 Go 밥벌이 개발자 초년시절 기준으로 작성한 것이기에 느끼는점은 다르다고 생각합니다.

        글의 논지도 제대로 파악 못하는 분이 언어 자격지심에 치닫아서 오픈소스 많이 보면서 참고나 해라 이러는거 보면 헛웃음만 나오네요.
        개발 영역에서 된다 이러면 끝입니까; 고려해야 할 것들은 전부 제쳐두고, 이거 다 되는데요? 고 언어 짱인데; 저보다 오픈소스 코드 덜 뜯어보셨나? 이런 뉘앙스로 지금까지 개발자 하신거면 주변 사람들 겁나 힘들거라 확신합니다.
        소통능력부터 키우고 태클거세요. 보아하니 코드도 잘 못 짜실 것 같긴 한데..

        제가 3년간 서비스 개발 운영하면서 느낀것 그대로네요..
        최근에 다시 자바로 프로젝트중인데
        자바로 하는 OOP 너무 편합니다 ㅎㅎ
        각각의 장단점이 있는거 같습니다


0 개 댓글

답장을 남겨주세요