About Websocket minimize data size and data transfer cost on cloud

이미지
웹소켓은 클라이언트와 서버간의 양방향으로 상호작용할 수 있게 만들어준다. 주로 채팅, 게임, 금융 거래 시스템 등 실시간 데이터 처리를 위해서 사용한다. 웹소켓을 사용하지 않고 롱폴링과 같은 방법을 사용할 수 있지만, 매 데이터 교환마다 새로운 요청을 보내야 한다. 웹소켓은 한번의 커넥션으로 지속해서 통신할 수 있어서 낮은 latency 를 보장한다. 따라서, 더 빠르고 유려한 사용자 경험을 제공할 수 있다. 내가 운영하는 서비스에서 웹소켓을 사용하고 있다고 가정해보자. 그리고 추가로 사용자가 접속할 때 항상 웹소켓을 사용해야 한다. 예를 들어, 주식 시장이나 코인 시장의 가격을 실시간으로 확인하거나, 교통의 흐름을 추적한다고 가정해보자. 실시간으로 제공해야 하는 제공해야 하는 데이터가 많아진다. 사용자가 많아질수록 또한 제공해야 하는 데이터가 많아진다. AWS와 같은 클라우드를 사용하여 서비스를 운영하는 상황일 때 데이터의 양이 많아질 경우 비용 증가로 이어지게 된다. AWS Data Transfer Cost 가 부과되는 방법은 다양하지만 이번 경우에서는 AWS 환경에서 Internet 환경으로 data 가 전송되는 구간에 대해서 정리해보겠다. 2023-03-12 기준 서울 region 에서 인터넷으로 데이터 송신 비용이다. 처음 100GB 전송은 무료이며 이후 부터 전송량 별 비용이 감소한다. 0 ~ 100GB 무료 100GB ~ 10340GB  0.126USD/GB 10340GB ~ 41060GB 0.122UDS/GB ... 생략 이렇게 산정되는데 10TB를 꽉 사용했다는 가정하에 가격은 1302.84 USD 이다.  2023-03-12 기준 1달러 환율은 1,320.64원이다.  1720582.6176 원으로 172만 5백원이다. 무시할 수 있는 비용이 아니다. 어떻게 해당 비용을 줄일 수 있을까?  Data Serialization json 일반적으로 WebSocket 으로 데이터를 교환할 때 흔히 사용한다. text...

About UTF-8, Base64

이미지
컴퓨터는 항상 비트를 다룬다 그리고 비트를 사용해 수와 같은 대상을 표현한다. https://infondgndg91.blogspot.com/2023/02/about-binary-number.html  그렇다면 문자나 키보드에 있는 다른 기호는 어떻게 표현할까? ASCII(American Standard Code for Information Interchange) 키보드에 있는 모든 기호를 7bit 를 할당했다. 예를 들어 65 는 대문자 A 66은 대문자 B를 표현한다. 아래 링크에서 확인할 수 있다. https://www.asciitable.com/ 위와 같이 글자를 출력하는 데 쓰이지 않고 장치를 제어하기 위해 쓰이는 control character 가 있다. 이 중 상당수는 통신 제어를 위한 문자다. ACK(수신확인) '메세지를 받았음' 이고, NAK(반수신확인)는 '메세지를 받지 못했음'을 의미한다. 유니코드(Unicode)  아스키는 영어를 표현하는 데 필요한 모든 문자를 포함하고 있어서 상당 기간 표준 역할을 했다. 초기 컴퓨터는 미국산 혹은 영국산이었기 때문이다. 컴퓨터가 널리 쓰이게 되면서, 이외의 언어를 지원해야 했다. 국제 표준화 기구인 ISO(International Standard Organization) 은 ISO-646, ISO-8859 를 도입했다. 기본적으로 아스키를 확장해 유럽 언어에 필요한 액센트 기호나 그 밖의 발음 구별 기호를 추가했다. 그리고 일본 산업 표준  위원회는 JIS(Japanese Industrial Standards) 일본 문자 표현을 위해서 JIS X 0201 을 만들었다. 또한 중국어, 아랍어, 한국어(KS C 5601) 등 표준도 생겼다.   이렇게 많은 표준이 존재한 이유는 비트가 지금보다 더 비쌌다. 그래서 최대한 문자를 7비트나 8비트에 욱여넣었다. 비트가격이 떨어지면서 유니코드라는 표준이 생겼다. 문자에 16비트 코드를 부여했다. 16비트면 지구상의 모든 문자...

About Binary Number

이미지
이번 글에서는 기초로 돌아가는 시간을 가진다. 컴퓨터에서 정수와 실수를 어떻게 다루고 있는지에 대해서 정리하려고 한다. 우리는 일상생활에서는 10진법을 사용한다. 아무래도 손가락이 10개라서 이지 않을까?  하지만 컴퓨터에서는 2진법을 사용한다. 컴퓨터는 10진법을 이해하지 못한다.  컴퓨터가 사용하는 2진법 컴퓨터는 손가락이 2개만 있다.  컴퓨터는 전압을 사용하여 동작한다. data 가 있을 경우 전압을 올리고 없을 경우 내린다. on / off 로 부를 수 있는데 이러한 과정을 계속해서 반복한다. 전압을 올린 곳은 1 로 표현할 수 있고, 전압이 없을 경우 0으로 표현한다. 이러한 data 를 연결할 경우 101101 과 같은 data 가 된다. 이러한 data 0 또는 1 을 bit 라고 부른다. 1bit 는 0 또는 1 두가지 경우를 나타낼 수 있다. 1bit = 0, 1 = pow(2, 1) = 0 ~ 1 2bit = 00, 01, 10, 11 = pow(2,2) = 0 ~ 3 4bit = 0000, 0001, 0010, ... 1111 = pow(2,4) = 0 ~ 15 8bit = 0000 0000, .... 1111 1111 = pow(2,8) = 0 ~ 255 bit 가 8개 8bits 는 1 byte 가 된다. 8bits 의 절반인 4bit 를 nibble 이라고 부른다. 컴퓨터가 저장하는 최소단위가 byte 이다. 8 bits = 2 nibble = 1 byte 이다. nibble 은 4bits 이다. nibble  단위가 16진수의 단위가 된다.  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, a, b, c, d, e, f 1111 1111 은 10진수로 15 15 이고 16진수로 표현하자면 f f 가 된다. 0xFF 가 된다. 0xFF 는 1 byte 가 된다. 정수 2진 표현 Kotlin 을 기준으로 Int 는 4 bytes 로 32 bits 이다. 양의 정수 5028 을 2진...

Time Business Logic Testing on Spring (Kotlin, Java)

이미지
올해에 너무 글쓰는 것을 소홀히 했던것을 반성하며 남은 한 달 동안 글을 몇 개라도 조금 써보려고한다! Java, Kotlin 기반 Spring 프레임워크 환경에서 개발을 하다보면 시간과 관련된 로직이 필요할 수 있다. 이 때 어떻게 해결하면 좋을 지 테스트 코드는 어떻게 구성하면 좋을지 정리하려고 한다. 예를 들어, 특정 기간동안만 액션이 가능한 요구사항이 있다고 가정하자. 해당 기간이 시작하기전에 액션을 진행하지 못하도록 막아야 되고, 기간인 경우 가능하도록 그리고 기간이 끝났을 때 더이상 액션이 불가능하도록 막아야 한다. 이 예제를 바탕으로 간단한 샘플 코드를 정리해보았다. - Kotlin - Spring Boot 2.7.5 - Junit 5 우선 아래와 같이 zoneId 를 인자로 받는 now 함수를 작성하였다. CHANGEABLE_CLOKC 이 null 이 아닐경우 해당 Clock 을 기준으로 LocalDateTime 인스턴스를 생성한다. 그리고 now 를 테스트하기 위한 코드. CHANGEABLE_CLOCK 이 null 인 경우와 null 이 아닌 경우 두 가지 테스트 케이스이다. null 인경우에는 zoneId 에 따라서 인스턴스를 생성하기 때문에 빈 인자인 경우 UTC 기준, Kst ZoneId 제공시 kst 시간 인스턴스를 생성하여 9시간 차이를 확인하는 코드이다. 두번 째는 Clock 을 2025 년 1월 1일로 설정하여 now 함수 호출 시 CHANGEABLE_CLOCK 기준으로 인스턴스를 생성하게 되어있다. 자 그렇다면 기간과 관련된 로직과 해당 로직을 테스트하는 코드를 작성해보자. 아래와 같이 property 에서 기간을 주입받는 Service 를 test code 를 작성해보자. ReflectionTestUtils 를 통해서 Mocking 하는 service 에 기간을 주입한다. 그리고 CHANGEABLE_CLOCK 을 통해서 now() 함수가 기간에 속할 때와 아닐 때로 지정하여서 올바른 값을 반환하는지 검증한다. 또 다른 방법중 하...

Multiple Java In My Mac

이미지
 Java 언어를 통해서 개발을 하다보면 프로젝트마다 Java Version 이 달라서 스위칭하는 데에 꽤나 번거롭다. 조금이나마 간단하게 해결하기 위해서 이 글을 정리한다. 우선 나의 로컬에는 아래와 같이 3가지 version 의 JDK 가 공존한다. - Zulu 13 - Amazon Corretto 11 - Amazon Corretto 8 현재 설정된 JAVA_HOME 아래와 같이 지정한 alias 를 통해서 JAVA_HOME 을 편하게 변경해보자. 먼저 .zshrc 또는 .bash_profile 을아래와 같이 작성한다. version 에 따른 JAVA HOME 변수를 할당하고 각각의 alias 를 통해서 JAVA_HOME 을 switch 시킬 수 있도록 한다. 이외에도 jenv 를 통해서 관리할 수 있다. https://www.jenv.be/

String is Immutable In Java

이미지
개요  Java 에서 String 을 어떻게 다루고 있는지 정리해보겠다. Java 에서 String 은 Immutable 로 즉 불변이다. Java 의 아버지 제임스 고슬링은 "I would use an immutable whenever i can." 이라고도 말했다. 어떠한 이유에서 이러한 말을 했는지 알아보자. Immutable 먼저 Immutable 이란 무엇일까? 불변이란 생성 후에 내부 상태를 변경할 수 없다는 것을 나타낸다. 다시 말해, 생성 후 객체를 변수에 할당하고 나면 해당 객체 참조를 변경하거나 내부 상태를 변경할 수 없고 다시 생성해야지 해당 참조를 변경할 수 있다. Why String is Immutable? 바로 caching, security, synchronization and performance 이다. 차례대로 확인해보자. String pool String pool 은 JVM 에 의해서 String 들이 저장되는 특수한 메모리 영역이다. literals 로 String 변수를 할당하게 되면 다른 변수일지라도 같은 내용일 경우 String pool 에 있는 같은 객체를 참조하게 된다. 이를 통해서 heap 영역을 절약할 수 있고 재사용성을 높인다. s1 과 s2 는 literals 로 String 을 생성했기에 s1 변수가 할당 될 때 String pool 에 "hello world" 가 생성되고 s2 변수가 할당될 때 기존에 s1 이 가르키고 있는 String pool 의 "hello world" 를 참조하게 된다. 반대로 new String() 을 통해서 생성한 String 은 같은 참조를 가르키지 않는다. 항상 새로운 객체를 생성하게 된다. Security Java Application 에서 String 은 username, password, connection URLs, network connections, etc. 와 같이 민감한 자료를 저장하는데 사용된다. 따라서 보안...

I need to know a little Garbage Collection

이미지
개요  프로그래밍 언어에는 2가지 언어가 있다. Managed 언어와 Unmanaged 언어로 구분된다. 이 둘의 가장 큰 차이점은 개발자가 직접 메모리를 할당하고 해제하는 관리 여부로 결정된다.  대표적인 Unmanaged 언어로 C, C++ 이 있고, Managed 언어로는 Java, Python, Go, C# 등이 있다. 이번글에서는 알아서 memory 를 관리해주는 Garbage Collection 에 대해서 정리해보려고한다. 언어마다 Garbage Collection 알고리즘이나 기법이 다르다. 이 글에서 다루고자 하는 언어는 Java 이고 JVM 이다. What? Heap 영역에서 어떤 object 가 사용중인지 아닌지 확인하고 사용하지 않는 object 는 삭제한다. 사용중인 object 는 referenced object 로 program 에서 해당 object 에 대한 pointer 를 유지하고 있는 것을 의미한다. 사용하지 않는 object 는 unreferenced object 로 더 이상 program 에서 pointer 를 유지하고 있지 않는 것을 의미한다. 따라서 unreferenced object 의 memory 를 회수할 수 있다. C 나 C++ 은 수동으로 memory 를 allocate 하고 deallocate 한다. Java 에서는 Garbage Collector 에 의해서 자동으로 관리된다.  첫 번째 : Marking Garbage Collector 가 memory 의 사용여부를 확인하는 작업이다. referenced objects 들은 파란색이다. Unreferenced objects 는 주황색이다. 모든 objects 는 Marking 단계에서 scan 작업을 거친다. 만약 전체 시스템의 모든 objects 를 scan 해야 한다면, 이 작업은 시간이 많이 드는 작업이다. 두 번째 - 1 : Normal Deletion Normal deletion 은 unreferenced objects 지우지...