분류 전체보기 444

[Tech] CORS 란? - Cross origin resource sharing

주말이라 블로그를 탐방하면서 백엔드 관련 기술 질문을 보고 있었는데 CORS에 대한 정확한 개념을 알고 있는지 의문이 들었다. CORS가 다른 도메인의 자원을 요청했을때 거부 당하는 개념이라고 알고 있는데 추가적인 내용은 알지 못했다. 다행히도 우테코에 CORS에 대한 굉장히 좋은 자료가 올라와있었다. 관련 자료들을 보고 요약하고 정리한 내용을 간단하게 써보고자 한다. Origin이란? url의 Protocol, Host, Port를 통해서 같은 출처인지 판단할 수 있다. SOP란? same origin policy의 약어이다. 다른 출처의 리소스를 사용하는 것에 제한하는 보안 방식이다. 왜 SOP을 사용해야 할까? 해커가 링크를 담은 메일을 보낸다. 클릭을 한 곳에 가면 해커가 만든 주소로 간다. 이때..

개발 정보 2023.01.01

[Java] ConcurrentModificationException 예외 해결 방법

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

Java 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년이 다되어..

Cloud/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 2022.11.30

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

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

Java 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 2022.11.23

[Java] PrintWriter 의 AutoFlush 사용

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

Java 2022.11.23
반응형