분류 전체보기 465

[Thoughts] 2022년 마무리 - 드디어 졸업합니다

학교 생활을 마치고 집에 돌아왔다. 2022년 마무리를 위해서 지금까지 해왔던 일들을 되짚어 보고 여유로운 시간을 보내고 있다. 방에 혼자 앉아서 글을 쓰는 것도 참 오랜만이라는 생각이 든다. 개발하면서 몰랐던 내용, 새로 알게된 내용을 기록해야겠다는 생각이 들면 허겁지겁 블로그로 달려와서 발생했을 당시 상황과 해결방법 올리곤 했는데 그렇게 작성하는건 여유롭게 글을 쓰는 것과는 사뭇 달랐다. 확실히 여유가 생기니 마음이 놓인다. 동시에 벌써 졸업이라는 생각이 들면서 오묘한 기분이 들었다. 그간의 과정을 생각해보면 공부하고 싶었던 내용은 다 공부했고 해보고 싶었던 것도 다 해봤다는 점에서 만족스러웠다. 아예 진로를 통째로 바꿔보고 싶어서 1학년때는 컴퓨터공학과는 전혀 관련없는 내용을 공부하기도 했고 한 번..

생각들 2022.12.23

[Java] ConcurrentModificationException 예외 해결 방법

오늘 Java로 MUD 게임을 개발하던 중 ConcurrentModificationException 이라는 예외를 만나게 되었다. 지금까지 개발하면서 이 예외를 처음 본 것 같다는 생각이 들었다 . 이전에 본 적이 있다면 조금이라도 기억이 날텐데 이 예외는 왠지 오늘 처음 발생한 예외라고 생각했다. 자료구조를 순회하면서 해서는 안되는 동작에 대해 알고 있다면 발생하지 않는 예외에 속한다. 왜 발생하는 지와 그 해결 방법에 대해서 간단하게 알아보고자 한다. 핵심은 간단하다. 자료구조를 순회하면서 우리는 특정 원소에 대해 Delete 연산을 수행하게 되는데 이때 자료구조를 for loop으로 순회하면서 .size() 혹은 len() 혹은 .legth를 통해 loop 횟수를 정해줬을 것이다. 그런데 순회하는 ..

Java lang 2022.12.08

[GCP] GCP 생성방법

https://wildeveloperetrain.tistory.com/169 GCP 인스턴스 SSH 접속하는 방법 앞전에 아래 포스팅의 과정을 통해 구글 클라우드 플랫폼 GCP 무료 서버를 생성했었는데요. 서버 생성 후 'SSH 키를 통해 해당 서버에 접속하는 방법'에 대해 정리한 내용입니다. 해당 과정대로 진 wildeveloperetrain.tistory.com https://minimin2.tistory.com/171 [GCP] 구글 클라우드 프리티어(무료) 사용하기 GCP란?GCP는 Google Cloud Platform의 약자로 구글에서 제공하는 클라우드 플랫폼이다. 클라우드 플랫폼은 대표적으로 AWS, GCP, Azuer등이 있다.원래 AWS의 1년 프리티어를 사용하고 있었는데, 1년이 다되어..

클라우드/GCP 2022.12.05

[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
반응형