전체 글 462

[Redis] redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value

Jedis 를 사용해서 게임 서버를 작성하던 중 아래와 같은 예외를 만났다. redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value 사실 위 예외가 발생하는 정석적인 이유는 그저 타입이 맞지 않기 때문이다. 그런데 나의 경우에는 예외가 발생하지 않을 것이라고 예상한 상황에 예외가 발생했다. 아래 코드를 보자. 참고로 아래 코드는 예외가 발생하지 않도록 수정한 코드이다. 위 코드에서 sadd 하는 부분이 문제였다. 문제가 발생했던 코드에서는 sadd의 첫번째 파라미터인 Key로 nickname을 전달했었다. 그런데 nickname이 이미 Key로 잡혀있는..

Database/Redis 2022.12.02

[Java] 외부에서 스레드를 안전하게 종료하는 방법

프로젝트를 진행하면서 Thread를 활용해야 하는 작업을 진행하고 있었다. 그러면서 특정 조건에서 Thread를 죽여야만 하는 상황이 존재했는데 어떻게 하면 외부에서 Thread를 죽일 수 있는지에 대해 고민하고 있었다. Thread의 run 내부에서는 보통 while true를 활용해서 무한 루프를 돌기 마련인데 이걸 특정 Flag를 활용해서 while true 가 아니라 while !flag 와 같은 식으로 while 문을 돌면서 flag 를 검사해주는 방식으로 할 지에 대해 고민했다. 결국에는 외부에서 해당 Thread 내에 있는 boolean stop flag 변수에 접근해서 해당 변수의 값을 바꿔주었고 while로 무한 루프를 돌던 Thread는 해당 stop flag 값이 true가 되었음을 ..

Java lang 2022.11.30

[Java] 생성자에서는 getInstance호출에 신중하자.

오늘 코드를 작성하던 중 신기한 현상을 만났다. 게임 서버를 구동했는데 정상 작동하지 않았다. 신기하게도 아무런 에러도 찍히지 않았다. 분명 어딘가 문제가 있을 것이라고 생각하고 살펴보았지만 짐작가는 곳은 없어서 빠르게 해결하기 위해 출력문으로 찍어보고 문제의 핵심을 찾았다. 아래 두 코드 부분을 보자. 두 코드는 각각 Game과 RedisTemplate의 생성자에 관한 코드이다. 왼쪽에 존재하는 Game에서는 RedisTemplate의 객체를 getInstance를 통해 받아오려 하고 있다. 오른쪽의 RedisTemplate 또한 Game의 객체를 getInstance를 통해 받아오려 하고 있다. 참고로 Game와 RedisTemplate 모두 싱글톤으로 작성되어있다. 그렇다면 이렇게 생성자 내에서 서..

Java lang 2022.11.30

[Java] Java에서 Redis 를 사용해보자. Jedis 사용하기

Java에서 Redis 를 사용해보자. Java 에서 Redis 를 쓸 수 있도록 Jedis 가 이미 준비되어있다. Gradle 에는 다음과 같이 추가한다. // https://mvnrepository.com/artifact/redis.clients/jedis implementation group: 'redis.clients', name: 'jedis', version: '2.8.0' 이후 아래 코드와 같이 redisTemplate 을 작성할 수 있다. redisTemplate 이란 redis 의 기본적인 명령어들을 method를 호출함으로써 사용할 수 있게끔 래핑한 클래스라고 볼 수 있다. 아래 예시를 천천히 살펴보자. // redisTemplate 아래 블로그에서 많은 도움을 받았습니다. 감사합니다...

Java lang 2022.11.23

[Java] PrintWriter 의 AutoFlush 사용

TCP 상에서 Client와 Server 상에서 문자열을 주고받는 것을 확인하려고 하는 와중에 문제가 발생했다. 아무리 client에서 입력을 하고 readLine으로 읽어들인 문자열을 server 쪽으로 보내려고 해도 server 상에서 받았다는 표시가 뜨지 않았다. 즉 아예 받지 못한 문제가 발생했다. 컴파일이나 런타임 에러도 아니고 그저 의도된 작동이 재현되지 않는 것이 문제였다. 문제의 원인은 금방 찾을 수 있었다. 원인은 PrintWriter에서 AuthFlush 를 사용하지 않았기 때문이다. 이제 문제가 발생한 배경에 대해서 알아보도록 하겠다. 우리는 통상 TCP 소켓 프로그래밍을 할때 server 쪽으로 전송하기 위해 client에 다음과 같은 코드를 작성하게 된다. in = new Buff..

Java lang 2022.11.23

[C++] C++ 기초 개념 정리

1. 레퍼런스 = 참조자 레퍼런스는 반드시 처음에 누구의 별명이 될 것인지 지정해야 한다. int& another_a; 이렇게 하는건 불가능함. 반면에 포인터는 int* p; 이렇게 하는게 가능함. 또한 레퍼런스는 한 번 별명이 되면 절대로 다른 이의 별명이 될 수 없다. 또한 레퍼런스는 메모리 상에 존재하지 않을 수도 있다. 진짜 그냥 별명이라고 생각하면 된다. 왜 포인터 대신 참조자를 사용할까? 불필요하게 *나 &를 많이 쓸 필요가 없기 때문이다. 레퍼런스는 있는데 원래 참조하던 것이 사라진 것을 댕글링 레퍼런스라고 한다. 그러니 지역 변수의 레퍼런스를 리턴하지 않도록 주의하자. 레퍼런스를 리턴하는 장점? 레퍼런스가 참조하는 타입의 크기와 상관 없이 딱 한 번의 주소값 복사로 전달이 끝나게 됨. 하지..

C & C++/C++ 2022.11.13

[Tech] WAS와 웹서버의 차이

웹 서버는 클라이언트가 브라우저에서 어떤 페이지 요청을 하면 웹 서버에서 그 요청을 받아서 정적 컨텐츠를 제공하는 서버이다. 정적 컨텐츠는 주로 HTML, CSS, Javascript, 이미지 등을 말한다. 웹 서버 종류: Apache, Nginx, IIS WAS 는 웹 서버 단독으로는 처리할 수 없는 데이터베이스의 조회나 다양한 로직 처리가 필요한 동적 컨텐츠를 제공한다. WAS 종류: Tomcat, JBoss 웹 서버는 정적 컨텐츠만 처리하도록 기능 분배를 해서 서버 부담을 줄인다. WAS 를 통해 요청에 맞는 데이터를 DB에서 가져와서 비즈니스 로직에 맞게 그때마다 결과를 제공하면서 자원을 효율적으로 사용할 수 있다. 만약 WAS 가 정적 컨텐츠 요청까지 처리하면, 부하가 커지고 동적 컨텐츠 처리가..

개발 정보 2022.11.12

[Redis] Redis 기초 개념 정리(1)

Redis 를 쓸일이 생겼다. 이전에 한번도 써본적이 없었다. 실력있는 친구에게 물어보니 요즘 서버에서는 그냥 기본으로 쓴다고 들었다. hiredis 를 통해서 C++ 서버에서 작업하기 전에 기본적인 개념에 대해서는 어느정도 알고 진행해보고자 한다. Redis = Remote Dictionary Server In-memory 기반의 key - value 구조 데이터 관리 서버 시스템이다. key - value 구조는 비 관계형 구조로써 데이터를 그냥 키-값으로 가지고 있다고 보면 된다. 그래서 이 구조가 관계형 데이터가 아니기에 쿼리 연산이 지원되지 않는다. 다만 데이터의 고속 읽기와 쓰기에 최적화되있다. 그래서 Redis 가 일종의 NoSQL 로 분류되는 것이다. Redis 는 인 메모리 솔루션으로 D..

Database/Redis 2022.11.11

[BOJ] 백준 16939 - 2×2×2 큐브 - Java solution

백준 16939 문제이다. Java로 풀이했다. 참고로 이 문제는 굉장히 좋은 문제이다. 문제 자체의 퀄리티가 굉장히 좋다. 문제가 깔끔하고 실력 향상에도 많은 도움이 된다. 예전에 한번 풀려고 시도했지만 당시에 답안에 거의 근접했는데 사소한 로직에서 실수를 해서 풀지 못했다. 대략적인 풀이방법은 알고있었지만 오늘에서야 해당 로직을 수정하게 되었다. 구현 문제이고 정말 흥미로운 문제이다. 개인적으로 이런 문제를 좋아한다. 어째서인지 복잡한 구현 문제가 가장 재미있다. 그리고 참고로 이 문제는 도전 정신을 자극했다. 풀릴것같으면서도 풀리지 않아서 오히려 그렇게 느낀 것 같다. 28일전에 풀려고 했다가 다시 2주전에 시도했다가 오늘에서야 완벽하게 풀었다. 아래에서 솔루션을 설명하도록 하겠다. 코드가 꽤 길기..

[C++] C++ RapidJSON 라이브러리 사용법

사용법은 간단하게 아래와 같다. 아래 블로그에 tutorial 에 굉장히 친절하게 설명되어있다. 감사합니다. https://rapidjson.org/md_doc_tutorial.html RapidJSON: Tutorial This tutorial introduces the basics of the Document Object Model(DOM) API. As shown in Usage at a glance, JSON can be parsed into a DOM, and then the DOM can be queried and modified easily, and finally be converted back to JSON. Value & Document Each JSON rapidjson.org

C & C++/C++ 2022.11.10

[C++] C++ select api와 inet_ntop api 정리

c++ socket programming 을 하던 중 select api 가 어떻게 동작하는지 알지 못해서 코드를 읽는 도중에 흐름이 끊겼다. 알아보고 지나가자. 또한 inet_ntop api 에 대해서도 간략하게 알아보자. select api 를 설명하기 전에 멀티플렉싱 서버에 대해 설명해야한다. 멀티플렉싱 서버란 하나의 프로세스로 여러 클라이어트에 서비스를 하는 서버이다. 멀티플렉싱 서버에서는 하나의 프로세스가 서버 소켓 + 여러 클라이언트 소켓을 관리한다. 관리할때 fd_set 이라는 구조체를 사용한다고 보면 된다. 이 fd_set 은 배열 형태인데 인텍스로 매핑하기 위해 쓴다고 보면 된다. 그냥 bit array 에 특정 index 에 체크해준다고 생각하면 된다. 아래와 같은 함수가 있다. FD_..

C & C++/C++ 2022.11.10

[C++] C++ listen api 의 parameter 중 backlog.

C++ 을 사용해서 소켓 프로그래밍을 하던 중 listen api 에서 두번째 인자로 넘겨주는 backlog 라는 파라미터에 대해 정확하게 알고 있지 못했다. 우선 리눅스 메뉴얼에 들어가서 listen api 의 backlog 파라미터의 설명을 보면 다음과 같이 적혀있다. 즉 간단하게 보자면 큐 사이즈를 지정한다는 내용이다. 그런데 어떤 큐 사이즈를 지정하는것일까? 이제 아래 그림을 보자. 왼쪽이 서버에서 동시에 응답할 수 있는 최대 갯수라고 가정한다면 (현재로썬 3개) backlog 값이 5라고 했을때 아래와 같은 상황이 연출되는 것이다. 가운데 있는 listen backlog queue의 사이즈가 5로 잡혀있는 것이다. 그러니 10개의 요청이 들어왔을때 1, 2, 3 은 서버쪽에서 처리하고 있고 아직..

C & C++/C++ 2022.11.10

[C++] C++ 헷갈리는 개념 간단 정리 (2)

1. #include 순서 include 하는 헤더파일에도 순서가 있다. 1) 시스템 라이브러리의 헤더파일 2) 다른 라이브러리의 헤더파일 3) 현재 프로젝트의 헤더파일 이 순서로 나열하면 가독성을 높일 수 있고 종속성도 피할 수 있다고 한다. (참고로 이 문제는 오늘 아침에 직접 겪었는데 redis 와 winsock2 헤더는 서로 충돌한다. winsock2를 아래로 내려주니 작동하는 것을 확인할 수 있었다. ) 2) ZeroMemory() 구조체를 초기화할때 쓰인다. ZeroMemory랑 memset은 그냥 같다고 보면 된다. 다만 memset 의 경우에 메모리를 인자로 받은 char형 변수(1byte)로 채워주고 ZeroMemory는 메모리를 0으로 채워준다는 점이 다르다고 한다. 오버헤드 차이도 별..

C & C++/C++ 2022.11.09

[C++] Visual Studio 2022 에서 C++ rapidjson 사용하기

c++ 프로젝트에서 json 으로 서버와 주고받을 일이 생겨 관련 라이브러리를 사용해보고자 한다. c++ 에서 json 을 주고 받기 위해서는 rapidjson 을 주로 사용한다고 한다. 사실상 쓰는 방법은 굉장히 간단한데 세팅하는 방법이 조금 투박하다. 아래처럼 잘 따라하면 rapidjson을 사용할 수 있는 환경을 갖출 수 있을 것이다. 우선 아래 github에 접속하자. https://github.com/Tencent/rapidjson 접속하면 아래와 같이 직접 zip 파일을 받던 clone을 하던 어떻게든 소스코드를 받는다. 받고나면 include 라는 폴더가 보일텐데 다른 파일들은 사실상 필요없고 include/rapidjson 만 필요하다. 위와 같이 include/rapidjson 이 있는데..

C & C++/C++ 2022.11.08

[Git] Git commit 컨벤션

아래와 같이 조금 더 디테일하게 적어줄 수 있을 것 같다. 이전에는 feat, docs, style, chore 등은 쓴 적이 없고 Delete, Add, Fix, Test와 같은 type만 적어줬는데 아래 처럼 feat, docs, refactor 등을 활용할 수 있을 것 같다. 이모지로 표현하는건 개인적으론 별로 좋지 않은것 같다. 근데 이건 그냥 개인 취향이라 하고 싶은 사람은 팀에서 잘 논의해서 결정하면 될 것 같다. 아래 양식 정도만 따르면 큰 문제는 없을 것 같다. feat : 새로운 기능 추가 fix : 버그 수정 docs : 문서 수정 style : 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우 refactor : 코드 리펙토링 test : 테스트 코드, 리펙토링 테스트 코드 추가 ..

인프라/Git 2022.11.08

[C++] C++ 헷갈리는 개념 간단 정리 (1)

1. C++ member initializer lists (멤버 초기화 리스트) -> 생성자 괄호 뒤에 콜론으로 표시해서 초기화할 멤버 변수들을 명시해줌. -> 간단하게 : 뒤에 쓰는건데 괄호 안에 어떻게 초기화할건지 값 명시해준다고 보면 됨. 2. tcp::acceptor -> socket에서 사용하는 acceptor와 동일한 존재이다. -> 말 그대로 accept 를 시작하는 녀석이다. -> 여기서 생성한 acceptor를 가지고 async_accept를 호출해서 비동기 accept를 시작하는 셈이다. 3. tcp::socket -> stream-oriented socket 기능을 제공한다. 그냥 socket 통신할때 필요한 변수라고 보면 된다. 4. 스마트 포인터 스마트 포인터에는 세가지 종류가 있..

C & C++/C++ 2022.11.07

[Blockchain] The Convergence of Blockchain

분산된 장부이다. 블록체인은 해킹이 불가능하다. (글쎄... 어떤 의미의 공격이냐에 따라 다르지 않을까? 불가능하지 않다. 다만 하기가 어려워서 공격을 시도하는 것보다 그냥 채굴하는 게 더 이득일 뿐 이다. 매번 언급되지만 Impossible와 Infeasible은 명백히 다른 의미이다. 블록체인은 그런 의미에서 Infeasible하다.) 머스크라는 회사에서 블록체인을 사용했다. 스마트 컨트랙트를 사용했다. 이로 인해 비용을 감소시켰다. 오픈이라는 회사도 있다. 블록체인에는 투명성을 제공한다. (개인적으로 투명성을 제공하지 않는 블록체인이 미래라고 생각한다. 내 은행 기록을 아무나 볼 순 없으니까.) 수백의 중개인도 있다. 이로 인해 중간비용도 발생한다. 그중의 25퍼센트는 필요없는 비용이다. 이 비용을..

블록체인 2022.11.05

[Go] Go 실행환경 - VScode 에서 Go를 사용해보자.

최근에 블록체인을 공부하던 중 Go 로 작성된 샘플 소스코드가 굉장히 많다는 것을 알게 되었다. 원래 Java 에 익숙해서 예제들도 전부 Java 쪽으로 찾아봤는데 오히려 go 쪽에서 간단하게 구현된 Blockchain 이나 P2P network 예제가 많았다. (Python3로 작성된 자료들도 많아서 신기했다.) Go를 개인적으로 공부한지 오랜 시간이 지났고 제대로 사용해본 적도 없어서 이번에 학교에서 진행하는 프로젝트가 끝나자마자 바로 보관해두었던 오픈소스를 읽어볼 생각이라 그전에 미리 환경을 세팅해두고자 한다. 아래와 같은 과정을 따르면 된다. 아래 링크에서 본인 OS에 맞는 Go를 다운받자. https://go.dev/dl/ Downloads - The Go Programming Language ..

Go lang 2022.11.05

[Blockchain] 라인 블록체인 영상 (The Future of Blockchain with LINE)

LINK? BITMAX Wallet에서는 8600만의 라인 유저가 블록체인에 참여할 기회를 제공한다. 블록체인의 미래? privacy 이슈가 해결되야 한다. explorer에 존재하는 visualization이 privacy에 이슈가 될 수 있다. 계층화된 wallet으로 해결할 수 있다. tree 구조를 가지고 있다. 블록체인의 방향성에 대해 이야기해보자. 왜 킬러앱이 없을까? 블록체인 개발이 어렵다. 유저 접근성이 좋지 않다. 이런 문제를 극복하려면 가장 기본적인 툴셋이 제공되야한다. 라인 블록체인에서 뭔가를 개발할 수 있도록 제공되어야한다. 유저들은 블록체인이 쓰이는지도 모른채 쓸 수 있다. 블록체인에는 흥미로운 점들이 있다. 분산화, private, 퍼블릭 블록체인 등등 해시 구조, DLT기술 등..

블록체인 2022.11.04

[Blockchain] 라인 블록체인 영상 (P2P 네트워크에서 블록체인의 일관성에 도전)

2000년대 P2P 네트워크가 사회 윤리와 대립하면서 사그라들었다. 블록체인은 화폐에 관련된 부분 말고 시스템 적인 부분 그러니까 분산 시스템에 대한 부분이 조금은 부족했다. 하지만 이제는 분산 시스템에 대해 진지하게 고찰해볼 필요가 있다. 분산 시스템에서 일관성을 유지하기 위해 여러 기법을 쓴다. 일관성에 있어서 클라우드에 없는 P2P 만의 어려운 점이 있다. 비잔틴 문제가 있다. 악의적인 행동을 취하는 노드가 있다는 점이다. 합의와 관련된 노드가 시스템 전체의 합의를 얻지 않고 언제든 나갈 수 있다는 거다. P2P 네트워크에 비결정론적 성질이 생긴다. 블록체인 네트워크 전체를 유한 상태의 기계로 간주하는게 어려워지게 되는 것이다. 과반수가 몇명인지 어느 시점에 알게 되는게 굉장히 어렵다. https:..

블록체인 2022.11.03

[Blockchain] 라인 블록체인 영상 (LINE Blockchain에서도 프로그램을 실행)

스마트 컨트랙트를 통해 다양한 기능을 블록체인에 기록 가능하다. 그런데 이게 쉽진 않다. 요건이 세가지 지켜져야 한다. 1. 안전성 2. executable and deterministic -> 모든 머신이 실행할 수 있는 코드여야 한다는 뜻. 3. effective -> 실행이 느려선 안된다. 효율적이어야 한다는 뜻. 그런데 웹어셈블리가 이 세 가지 성질을 충족시킬 수 있다는 전망이 있다. 웹어셈블리는 3D 게임도 가능할 정도로 성능이 좋다. 왜 웹어셈블리가 스마트 컨트랙트에 적합할까? 위에서 언급했던 요건을 충족시킨다. 웹어셈블리는 portable 하다. 또한 deterministic 하다. 늘 같은 결과를 돌려줌. efficient and fast 도 가능하다. 웹어셈블리는 jit과 aot를 사용가..

블록체인 2022.11.03

[Blockchain] 블록체인 확장성 이슈 관련 영상 요약

아래 링크의 영상에서 블록체인의 확장성과 문제점에 대해 이야기한다. 긴 영상이 아니라서 가볍게 볼 수 있다. https://www.youtube.com/watch?v=8uF7RVF2osk https://www.youtube.com/watch?v=4CdO0olVfAA 첫번째 영상 간략한 요약: 블록 사이즈에 제한이 있다. 사이즈에 대한 공격을 피하기 위해 그 제한이 모든 블록에 적용되었다. 1MB을 넘길 수 없다. 그렇다고 해서 또 블록 사이즈를 늘리면 storage에 저장하게 될 체인의 사이즈가 상당히 커진다. 사이즈를 늘리려면 하드포크해야한다. 그리고 작은 커피값 계산까지 모두 블록에 넣어야하는지에 대한 논의도 있다. 라이트닝 네트워크에서는 이 문제를 해결한다. 두번째 영상의 간략한 요약: 투명성으로 ..

블록체인 2022.10.31

[Blockchain] Base64 인코딩과 디코딩

블록체인 관련 예제 혹은 암복호화 예제를 살펴보면 Base64인코딩과 디코딩을 진행하는 예제가 상당히 많다. Base64 인코딩과 디코딩이 어떤 개념인지에 대해서 살펴보도록 하자. 인코딩은 주로 정보의 형태, 형식을 표준화하거나, 보안, 속도, 저장 공간 절약을 위해서 다른 형태로 바꾸는 처리 방식을 말한다고 보면 된다. 아주 간단하게 말하자면 Base64 인코딩이란 Binary Data를 Text로 바꿔주는 인코딩 방식이다. Binary Data를 Character set 에 영향을 받지 않는 공통 ASCII 영역의 문자로만 이루어진 하나의 문자열로 바꿔준다. 방식은 꽤나 간단한데 Binary Data 를 6비트씩 자른 뒤에 6비트에 해당하는 문자를 Base64 전용 색인표에서 찾아서 그것으로 바꾸어준..

블록체인 2022.10.31

[Git] git local default branch 변경과 remote default branch 변경

아래와 같은 명령어를 입력한다. git config --global init.defaultBranch 이후에 아래 명령어를 통해 바뀐 default branch name을 확인할 수 있다. git config --global init.defaultBranch 아래와 같이 보여질 것이다. 참고로 원격에 있는 github 에서도 default branch 를 변경할 수 있다. 굳이 하지 않긴 하는데 방법은 아래와 같다. settings -> 좌측 메뉴에서 branchs 선택 -> Default branch 에서 switch to another branch 선택 -> 변경

인프라/Git 2022.10.31

[Redis] Windows에서 wsl2에 Docker와 Redis를 설치해보자.

최근에 Windows 에서 Docker와 Redis 를 설치해서 실습할 일이 생겼는데 Windows에서 특히나 Docker도 지원이 안되고 Redis도 지원이 안되서 굳이 wsl2를 설치해주고 이것 저것 설정할 일이 많았다. 아래 블로그에서 많은 도움을 받았고 에러없고 천천히 따라하기만 하면 된다. windows 에서 wsl2 세팅하기 https://www.44bits.io/ko/post/wsl2-install-and-basic-usage windows 에서 docker 설치 https://www.lainyzine.com/ko/article/a-complete-guide-to-how-to-install-docker-desktop-on-windows-10/ wsl위에 redis 설치하기 https://de..

Database/Redis 2022.10.30

[Blockchain] [작성 중...] Bitcoin: A Peer-to-Peer Electronic Cash System - by Satoshi Nakamoto 의 번역 및 정리

비트코인 백서를 읽고 간단한 번역을 해보려고 한다. 블록체인의 워낙 근본적인 내용을 담고 있기 때문에 꼭 한번은 읽어봐야하는 논문이다. Bitcoin: A Peer-to-Peer Electronic Cash System Satochi Nakamoto satoshi@gmx.com www.bitcoin.org Abstract. 진정 순수한 의미에서의 peer 2 peer 형태의 전자 화폐는 금융 기관의 개입없이 타인에게 전송될 수 있다. 전자서명이 그 해결법 중 일부를 제시한다. 그러나 이중지불을 막기 위해서 제 3자의 개입이 필요하게 된다면 이 또한 우리가 원했던 주요한 이점이 사라지게 된다. 그래서 우리는 peer 2 peer network를 활용하여 이중지불의 해결방법을 제시하고자 한다. 네트워크는 해..

블록체인 2022.10.29
반응형