전체 글 465

[kotlin] 코틀린 inline과 crossinline 키워드

코틀린에 흥미로운 키워드가 하나 있다.  inline이라는건데,  inline함수로 지정하면 컴파일 시 해당 함수의 바이트코드가 호출 지점에 직접 삽입된다고 한다. 이걸 인라인화라고 한다. 그래서 함수 호출의 오버헤드를 줄일 수 있다고 한다.  간단한 함수 있을때 사용하면 조금이나마 성능을 줄일 수 있을 것 같다.  재밌는건 crossinline이라는 생소한 키워드도 있다는거다. 이건 inline함수의 람다 파라미터에 사용된다고 한다. inline함수 내부에 전달된 람다가 비지역 반환(non-local returns)를 할 수 없음을 나타낸다고 한다. 비지역 반환이란? 생소한 단어인데, inline함수에서 lambda를 파라미터로 사용할때 람다 안에서 return문을 사용하면 해당 r..

Kotlin lang 2024.04.27

[개발 이야기] exception 핸들링에 대한 고민

최근 exception핸들링에 대해서 고민이 있다. 애플리케이션을 만들때 어떻게 예외를 처리해야할지에 대해 근본적인 해답이 없다는 생각이 든다.  외부 api호출같은 IO작업에서 주로 try catch같은 exception 처리를 하는게 좋은데, 이미 요청이 실패하거나 크리티컬한 이유로 실패해서 exception이 터졌다면 애초에 처리하고자하는 정상적인 상태에서 깨진 상황인데 이상황에서 뭘 더 핸들링할까라는 생각이 든다. 바꿔 말하자면 이미 깨진 상태인데 뭘 더 하겠냐라는 뜻이다.  크리티컬한 이슈가 아닌 경우를 생각해보자면, 뭔가를 등록하려는데 중복 등록이라던지 혹은 워닝으로만 남겨도 될만한 작업이라면 쉽다. 그런데 인증이 잘못되었거나 뜬금없는 timeout 혹은 전혀 대비되지 않았던 예외케..

개발 이야기 2024.04.26

[kotlin] 코틀린 코루틴에 대한 개념 정리 (4)

코틀린에는 구조화된 동시성이란 개념이 있다고 한다.  꽤나 비중있는 주제인것 같아 깔끔하게 정리해보고자 한다.  코루틴에는 코루틴 내부에서 또 코루틴을 만들 수 있다.이 경우 부모코루틴과 자식 코루틴이 생긴다. 코루틴에는 Job객체로 코루틴을 추적할 수 있는데, Job객체 내부에는 parent와 children이라는 프로퍼티가 있어서 이걸로 부모 자식간 양방향 참조가 가능하다.참고로 parent는 Job?타입이고, children은 Sequence 타입이다. parent가 Job?인 이유는 루트 코루틴의 경우 부모가 없을 수도 있기 때문이다.  그리고 CoroutineContext의 경우 부모에서 자식으로 상속되고, 자식에서 별도의 CoroutineContext를 사용한다면 상속받은걸 덮어..

Kotlin lang 2024.04.25

[kotiln] 코틀린 코루틴에 대한 개념 정리 (3)

지난번 포스팅에서 코루틴 빌더 함수와 Job객체에 대해 알아보았다.  이번 포스팅에서는 async와 Deferred에 대해서 알아보자.  이전에 배운 launch 코루틴 빌더 함수는 코루틴으로부터 결과값을 받을 수 없었다. 다만 Job객체를 받을 뿐이었다.  그런데 코루틴으로부터 작업에 대한 결과값을 받을 필요가 있을 수 있다. 이때 사용하는데 async와 Deferred응답 객체이다. async(Dispatchers.IO) { ... }와 같이 사용할 경우 Deferred를 리턴받고, 해당 Deferred타입의 변수에 대해 await()메서드를 사용하면 결과를 받을 수 있다. await()을 사용하는 이유는, 코루틴이 언제 완료될지는 모르기 때문에 Deferred가 미래의 값이라는 의미..

Kotlin lang 2024.04.22

[kotlin] 코틀린 코루틴에 대한 개념 정리 (2)

지난번 포스트에 이어 코틀린 코루틴에 대한 개념 정리를 이어가고자 한다. 코루틴에는 CoroutineStart.LAZY를 사용한 코루틴 지연이라는 개념이 있다. 왜 코루틴을 지연해야할까? 코루틴을 CoroutineDispatcher의 큐에 제출했다고해서, 곧장 코루틴을 특정 스레드에 할당해서 바로 실행해선 안될때 필요하기 때문이다. 그저 실행해야할 코루틴을 미리 만들어두고 나중에 실행시키는 것이다. 이 경우 launch의 start인자로 CoroutineStart.LAZY를 주어 제출하면 된다. 그리고 이후에 실행시킬 필가 있을때 start시키면 된다. 지연하고 나서 이후 시작할 수 있는 방법은 launch 코루틴 빌더함수를 통해 받은 Job객체를 사용하면 된다. Job객체는 코루틴을 실행시킬 수 있는 ..

Kotlin lang 2024.04.21

[Kotlin] 코틀린 코루틴에 대한 개념 정리 (1)

최근 코틀린을 다룰 일이 있었다. 코드는 그냥 작성하면 되는데, 코루틴에 대한 개념이 좀 부족했다고 생각했다. 애매하게 알고 있는 상태에서 코루틴의 기능을 쓰는게 썩 기분이 좋진 않았다. 뭔가 찝찝했다. 그래서 이번 기회에 코루틴에 대해 시간을 갖고 천천히 알아보고자 한다. 코루틴은 기본적으로 경량 스레드라고 불린다. 왜 경량 스레드냐면, 스레드에 붙였다 뗄 수 있기 때문이다. 왜 코루틴이 필요하냐를 정리하자면, 멀티스레드 프로그래밍에서의 일부 한계점을 극복하고자함이다. 우선 싱글 스레드부터 살펴보자. 스레드가 하나이므로 단 하나의 작업만 할 수 있다. 모든 일은 순차적으로 진행된다. cpu바운드던, 네트워크 IO 작업이던 모든지 하나라서 그다지 효율적이지 않다. 그래서 등장한게 멀티스레드 프로그래밍이다..

Kotlin lang 2024.04.20

[C] C language의 연산자 우선순위는 설계 실수인가?

최근 흥미로운 내용을 접했다. C language의 연산자 우선순위에 설계상 결함이 있다는 이야기다. 전설의 C에 언어 설계 결함이 있을 수 있나? 라는 생각이 들었다. (지금도 결함 정도로 생각되진 않지만) 내용은 이렇다. & | 연산자와 == 연산자 간의 연산자 우선 순위로 인해 실수할 여지가 크다는 내용이다. & | 보다 ==의 연산자 우선순위가 더 높기 때문에 문제가 될 수 있다고 한다. 아래 코드가 있다고 보자. if (a & b == c) { // ... } 위 코드는 a&b의 결과가 c와 동등한지 확인하는 코드가 아니다. 오히려 b==c가 먼저 평가되고 그 결과와 a와 bit and를 한다. (당연히도) 해당 의견을 접하고 먼저 든 생각은 이렇다. 이게 왜 설계상 오류일까? 연산자 우선순위가..

C & C++/C 2024.01.01

[AWS] Dynamo: Amazon’s Highly Available Key-value Store

DynamoDB의 근간은 2007년 AWS에서 내놓은 Dynamo 논문에 기반을 둔다. 해당 논문을 읽어보고 간략하게 내용을 정리해보고자 한다. 주의 개인 학습을 위해 러프하게 읽어본 내용이라서 중간에 잘못 해석한 내용이 있을 수 있습니다. 간략하게 1회독 한 것이라서 정확하지 않습니다. 요약을 차차 수정할 예정이니 내용을 파악하고 싶다면 논문을 직접 보시는 게 좋습니다. 1. 서론 아마존은 전세계급 서비스를 운용 이 논문에서는 Dynamo라 불리는 고가용성의 키벨류 저장소 시스템을 다룸 즉 always-on이 가능하게 하는 서비스임 토네이도 때문에 데이터 센터가 날아가거나 혹은 네트워크 장애가 발생하더라도 언제나 가용한 저장소 기술에 대한 니즈는 항상 있다. RDB의 일반적인 패턴은 비효율성을 가져왔다..

클라우드/AWS 2023.11.10

[AWS] DynamoDB에서 쓰기 충돌을 방지하는 방법

최근 Dynamo 논문을 읽어보면서 흥미로운 개념을 발견했다. 대부분의 DB의 경우 last writes wins라는 전략을 택한다고 한다. 간단하게 말하자면 마지막에 쓴 자가 기존 데이터를 덮어씌우는 방식이다. 동시 쓰기의 문제를 심플하게 나중에 쓴 사람 걸 채택하는 방식으로 해결한다는 것이다. 이렇게 하는 이유는 개발자의 편의에 있기도 하고, (개발자들은 본인의 client단에 복잡한 충돌 처리 로직을 작성하는 걸 싫어한다고 한다) 단순하게 그 방법이 가장 간단하기 때문이라고도 한다. 그런데 Dynamo 논문에서는 DynamoDB의 경우 last writes wins가 아니라 애플리케이션에서 해당 충돌에 대한 권한을 가질 수 있도록 만들었다고 한다. 즉 애플리케이션 단의 로직으로 해당 충돌 문제를 해..

클라우드/AWS 2023.11.10

[AWS] DynamoDB 학습 자료 정리

DynamoDB에 대한 좋은 학습 자료가 있어서 정리해둔다. 모두 한번씩 읽어본 내용이지만 이해가 되지 않아서 다시 볼 필요가 있는 자료도 있다. 특히 key design에 대해서는 어떻게 해야하는지 알겠지만 막상 하라고 하면 제대로된 디자인을 할 수 있을지 걱정이다. 이런 류는 대부분 직업 만들어봐야 해결되는 부류라고 생각한다. 블로그 논문 영상

클라우드/AWS 2023.11.02

[RabbitMQ] RabbitMQ 구성요소와 용어 정리

용어 RabbitMQ의 클라이언트 브로커와 통신하는 모든 애플리케이션을 의미함 Producer 메세지를 생성하고 RabbitMQ 브로커로 전송함 Consumer RabbitMq 브로커로부터 메세지를 받아서 처리함 RabbitMQ의 브로커 중앙 메시징 시스템 브로커는 Producer로부터 메세지를 받아서 적절한 큐에 저장하고 그 큐의 메세지를 Consumer에게 전달함 구성요소 Exchange 메세지를 받아 적절한 큐로 라우팅하는 컴포넌트 direct, topic, fanout, headers등 타입을 가짐 각 타입에 따라 메세지를 다른 방식으로 라우팅함 Queues 메세지가 저장되는 곳 메세지를 컨슈머에게 전달하기 전에 일시적으로 저장하는 버퍼 역할 Blindings Exchange와 큐 사이의 연결을 ..

[RabbitMQ] RabbitMQ 공부 자료 모음

이번 주에 RabbitMQ에 대해서 알아보았다. 꽤나 재밌는 내용이 많았다. 단순히 producer, consumer만 있는게 아니라 exchange라는 개념까지? 그리고 클러스터링과 미러링, 성능에 대한 이야기도 모두 재밌게 보았다. AMQP라는 새로운 프로토콜에 대해서도 알 수 있었다. (디테일한 스펙은 내용이 너무 많아서 다 보지 못했다.) 공부하면서 보던 링크를 기록해둔다. RabbitMQ에 대해서 간략하게 학습하고 싶은 분이 계시다면 아래 링크를 참고하시기 바란다. RabbitMQ 공식 사이트 https://www.rabbitmq.com/ RabbitMQ 성능 가이드 https://chopstick-91.tistory.com/160 RabbitMQ internal https://github.co..

[RabbitMQ] vhost에 대한 이해

vhost는 무엇일까? vhost 즉 virtual host는 메시징 시스템 내에서 논리적으로 분리된 파티션 또는 네임스페이스임 vhost는 사용자, exchange, queue 및 binding 등 RabbitMQ 리소스에 대한 독립적인 네임스페이스를 제공 다양한 프로젝트나 환경에서 동일한 RabbitMQ 인스턴스나 클러스터를 공유하면서 리소스 간 충돌이나 권한 문제를 방지함 왜 vhost를 사용해야할까? 리소스 논리적 분리 vhost는 RabbitMQ 서버에서 논리적 분리를 제공함 각 vhost는 독립된 네임스페이스에서 exchanage, queue, binding등의 리소스를 관리함 이 점이 여러 애플리케이션, 프로젝트, 또는 팀이 동일한 RabbitMQ 인스턴스를 공유하면서도 각자의 리소스를 분리..

[RabbitMQ] RabbitMQ vs Kafka 성능 비교 논문

RabbitMQ에 대해 학습하는 도중 RabbitMQ와 Kafka에 대해 비교한 흥미로운 논문을 발견했다. 학사 학위 논문으로 보이는 이 논문을 읽어보고 간략하게 정리해보았다. 메세지 브로커에 대한 깊은 난이도라기보다는 두 오픈소스간 성능 비교를 해본 논문이다. 꽤 재밌다. RabbitMQ vs Kafka에 대해 재밌게 읽을 수 있다. 커피마시면서 읽기에 딱 좋다. 논문 링크 https://www.diva-portal.org/smash/get/diva2:1674316/FULLTEXT01.pdf 내용 요약 분산 시스템, MSA 구조는 컴포넌트의 결합도를 낮추는 방향임 그래서 각 디바이스로 컴포넌트가 분산되있을때,시스템 내 컴포넌트 간 통신을 위해 MOM이 필요하다. 메세지 브로커는 MOM의 핵심이다. (M..

[AWS] AWS EBS에 대한 이해

RabbitMQ 클러스터링을 공부하던 중 AWS EBS에 대한 내용이 등장했다. 처음 들어본 기술 용어이므로 관련 내용을 간략하게 정리하고자 한다. EBS란 무엇인가? Elastic Block Storage는 AWS 클라우드의 EC2 인스턴스에 사용할 영구 블록 스토리지 볼륨을 제공함 각 EBS 볼륨은 가용 영역 내에 자동으로 복제되어서 구성 요소 장애로부터 보호하고 고가용성 및 내구성을 제공함 요약 가상 하드드라이브임 EC2 인스턴스가 종료되어도 계속유지 가능함 인스턴스랑은 별개의 개념이라고 보면 됨 인스턴스와 EBS는 네트워크로 연결로 되어있기 때문임 하나의 EC2 인스턴스에 여러 하드드라이브 즉 EBS를 계속 네트워크에 붙여서 추가시킬 수 있음 인스턴스 정지 후 재기동 가능함 하나의 EBS를 여러 ..

클라우드/AWS 2023.10.27

[RabbitMQ] RabbitMQ에 대한 이해

최근 RabbitMQ를 사용할 일이 있었다. 이해가 부족해서 중간에 잘못된 코드를 사용해서 문제가 발생했다. 이번 기회에 RabbitMQ란 무엇인지, 왜 쓰는지, 어디에 쓰는지 학습해보고 간략하게 정리해보고자 한다. 메세지 드리븐? 서비스 사이에 비동기적으로 메세지를 전달하는 방식이다. 그래서 서비스들은 느슨한 결합 -> decoupling 된 의존성을 가지게 된다. -> 부하 관리, 탄력적인 흐름 제어가 가능함 이 메세지 드리븐의 장점을 얻기 위해 메세지 미들웨어를 쓸 수 있다. -> 그래서 MQ를 쓸 수 있다. 그런데 카프카는? RabbitMQ는 큐 카프카는 로그 큐 선입 선출 메세지는 소비되면 큐에서 삭제됨 일시적인 메세지 보관 생산자, 소비자가 독립적 비동기적으로 존재할 수 있다. 큐잉, 버퍼 역..

[JS] JS/TS 그리고 웹에 대한 개인적인 생각

최근 회사에서 웹 프론트 작업을 하면서 JS/TS를 많이 사용했다. 학부에서 두 언어를 거의 써본 적 없었다. 책 한권을 읽고 기본적인 개념을 파악했는데 그것도 시간이 지나서 희미해졌다. 이후 회사에서 업무를 하면서 레거시 프로젝트에는 자바스크립트를, 새로운 프로젝트에는 타입스크립트를 사용했다. 두 언어를 사용하면서 들었던 개인적인 생각을 정리하고자 한다. 자바스크립트를 공부하다보면 신기한 개념을 많이 접한다. 클로저, 프로토타입, this 등 타 언어와 다른 개념이 있다. 때문에 언어가 실용성과는 별개로 어딘가 나사가 하나 빠진 듯한 느낌이 들곤 한다. 예상치 못한 동작이 언어에 포함되어있다. (물론 이마저도 익숙해질 수 있긴하다.) 타입이 없다는 단점을 보완하기 위해 타입스크립트를 사용하지만 자바스크..

[인터뷰] OpenAI CEO 샘 알트먼 인터뷰

최근 샘 알트먼의 인터뷰 영상을 보게 되었다. 많은 영감을 받았다. 이후 인터뷰를 찾아보고 관련 기사도 많이 찾아보았다. 몇 가지 포인트에서 변화할 수 있는 부분을 찾아냈고 찾아본 내용을 간략하게 정리해보고자 한다. 샘 알트먼은 누구인가? 현직 OpenAI CEO 1985년 4월 22일생 스탠퍼드 대학교에서 컴퓨터 과학 전공했지만 2005년 중퇴 대학교 중퇴 후 친구들과 위치 기반 소셜 네트워킹 회사인 Loopt를 설립 후 2012년 매각 2011년에 Y Combinator의 파트타임 파트너로 합류 후 2014년 대표가 됨 스타트업의 초기 펀딩에 참여해서 막대한 수입을 벌임 2015년 포브스가 선정한 30세 미만의 최고 투자자로 선정됨 2015년 12월 11일부터 일론 머스크와 함께 OpenAI를 창업 ..

IT 인터뷰 2023.10.14

[블로그] 블로그 이사에 대한 생각

최근 티스토리 블로그에 대한 이야기가 많다. 특히 광고에 대한 이야기들이 꽤 많았다. 티스토리에서 계속 블로그를 운영할 지에 대한 고민을 했다. 다른 블로그로 이사해야하는지 생각해봤다. 만약 블로그 이사를 간다면 미디움도 괜찮다는 생각이 들었고 지금 운영하고 있는 브런치 블로그도 괜찮다는 생각이 들었다. 다만 기술적인 내용을 올리기에는 아무래도 티스토리가 그나마 낫다는 생각이 들었다. 지금 운영하는 브런치의 경우 디테일한 기술적인 이슈나 해결방법에 대한 이야기보다는 러프한 기술 전망과 사용후기 혹은 기술서적 리뷰를 주로 올리고 있다. 미디움의 경우 사람들이 말하기를 코드와 한글에 대한 지원이 빈약하다고 한다. 하지만 정작 미디움에서 작성된 기술 포스팅을 보면 나쁘지 않다고 생각한다. 가독성에 전혀 문제될..

카테고리 없음 2023.07.08

[Dev] 질문에 대한 이야기

최근 질문을 하는 방법에 대한 고민을 하는 중이다. 어떤 질문이 좋은 질문일까. 무례하지 않으면서도 내가 원하는 걸 얻을 수 있는 질문 말이다. 요즘 그걸 고민 중이다. 포프님께서 질문에 대한 영상을 찍은 게 있어서 해당 내용과 내 개인적인 생각을 간추려봤다. 포프님: 너무 넓은 범위의 질문을 하는 건 지양하는 게 좋다. 가장 중요한건 이해가 안되는 포인트 하나를 이야기하는 것이다. 그렇게 하면 상대방이 더 구체적인 내용에 대해 이야기해줄 수 있다. 뜬금없이 질문할 때 보통 상대방은 다른 일을 하고 있는 상황이다. 의미없이 질문했다고 하더라도 상대방은 왜 내가 그런 질문을 했는지를 이해 못할 수 있다. 그래서 정확히 뭘 물어보는 지 몰라서 상대방이 시간을 많이 쓸 수도 있다. 상대방이 yes or no ..

개발 정보 2023.06.06

[Pope] 게임에 대한 이야기 - 포프TV

주말 아침에 심심해서 포프님 영상을 몇개 봤다. 오래된 영상들이 몇 개 있긴 하지만 꽤나 재밌는 내용이 많다. 정자세로 시청하기보다는 영상을 틀어놓고 딴 짓을 하는데, 팟캐스트처럼 켜두고 시간 날때 들으면 나름 재밌다. 아침에 켜둔 영상 중 게임과 관련된 영상들이 있어서 간단한 내용 정리를 해봤다. 게임 판매량 성공하는 게임? 현실에서 게임의 성공요소는 그저 운이다. 출시 당시의 트렌드 덕분에 게임이 성공할 수 있는 거다. 시장을 읽는 눈을 가진 사람은 거의 없다. 아무리 성공한 게임도 후속작도 성공하는 경우는 드물다. 게임이 나왔을 때 처음 6주 간의 매출액이 이후 게임이 평생 팔릴 매출액의 절반이다. 게임은 처음 6주가 정말 중요하다. 그래서 마케팅 하는 분들이 이 부분에 돈을 퍼붓는다. 처음 6주 ..

개발 유튜버 2023.05.20

[AWS] DynamoDB 제대로 알고 사용하기

최근 Amazon DynamoDB를 사용할 일이 많다. DynamoDB는 간단하다는 점이 좋았다. 그럼에도 잘 알고 사용해보고자 DynamoDB에 대한 간략한 내용을 정리해보고자 한다. DynamoDB란? AWS에서 제공하는 서버리스 기반 key value 기반 NoSQL데이터베이스다. 높은 성능과 비용적 이점이 있다고 한다. 특징 NoSQL 데이터베이스 NoSQL데이터베이스에는 JOIN이 없다. JOIN개념이 없기 때문에 정규화도 불가능하다. 그래서 NoSQL에서는 반정규화를 한다고 한다. 반정규화란? 데이터베이스의 성능 향상을 위해서 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법이다. 반정규화는 조회(select) 속도를 향상시키지만 데이터 모델의 유연성은 낮아진다. 반정규화를 적..

클라우드/AWS 2023.05.06

[Tech] Cache invalidation이란 무엇일까?

오늘 인스타그램의 Scailing 아키텍쳐에 관한 영상을 보았다. 내용이 정말 좋다고 생각했는데 자주 등장하는 용어 중 낯선 용어가 있어 이에 대해 정리해보고자 한다. Cache invalidation 즉 캐쉬 무효화이다. 찾아보니 꽤나 도움되는 내용이 많은 개념이다. 왜 캐시가 등장했을까? 기술 발전으로 프로세스 속도는 증가했지만 메모리 속도가 이를 따라가지 못했다. 프로세서가 아무리 빨라도 메모리 처리 속도가 느리면 결과적으로 전체 시스템 속도가 느려진다. 이를 개선하기 위해 캐시가 나왔다. 캐시는 CPU 칩 안에 들어가는 작고 빠르고 비싼 메모리다. 프로세서가 매번 메인 메모리에 접근해서 데이터를 받아오면 시간이 오래 걸려서 자주 사용하는 데이터를 담아두고 해당 데이터가 필요할때 프로세스가 메인 메..

개발 정보 2023.05.05

[개발자의 자질] CTO의 역할

최근 EO에 올라온 영상 중 CTO에 관한 영상이 있었다. 꽤 재밌게 봤다. 문득 CTO는 어떤 일을 하는 사람인지 궁금해졌다. 기술 조직의 최고기술책임자는 어떤 일을 할까? CTO 공석인 스타트업들이 많다. 책임회피라고 볼 수 도 있다. 고객에게 진짜 가치를 줄 수 있다면 매출은 당연히 따라온다. Chief Technical Officer란 무엇일까? 기술 팀을 관리하고 회사의 전략과 기술의 전략이 잘 어울리도록 노력하는 사람이다. 회사와 기술팀이 성장함에 따라서 CTO의 역할도 함께 변해야 한다. 그렇지 않다면 서비스와 기술은 성장 정체기를 맞는다. 스타트업의 단계는 아래와 같다. 1. 암흑기 2. 성장기 3. 기술의 르네상스 4. 성숙기 암흑기 기술팀 규모 0~5명 재무적으로 어렵고 불확실성이 큰 ..

개발 정보 2023.04.30
반응형