전체 글 142

서버 개발자로 살아남기 - 멀티 쓰레드 환경에서 Singleton 초기화 - DCL(Double Checked Locking)

Singleton 패턴은 전체 중 하나의 인스턴스만 존재해야 한다. 싱글 쓰레드를 사용하는 경우에는 문제가 되지 않지만, 멀티 쓰레드 환경에서 Singleton에 접근 시 초기화 관련해서 문제가 있다. 아래코드는 단순하게 구현한 멀티쓰레드 환경에서의 Singleton 초기화 방법이다. class Foo { private Singleton instance; public Singleton getInstance() { if(Objects.isNull(instance)) { instance = new Singleton(); } return Singleton; } } 위 코드는 멀티쓰레드 환경에 적합하지 않다. 쓰레드가 getInstance()에 동시에 접근하면 여러번 초기화 되는 문제가 발생하기 때문이다.(상호..

java에서 모니터 사용하기 - synchronized

세마포어는 실제로 매우 오래된 동기화 도구이다. 현재에는 모니터(monitor)라는 동기화 도구를 주로 사용하며, 이는 좀 더 고수준의 동기화 기능을 제공한다. QuickSort 알고리즘으로 유명한 C. A. R. Hoare(호어)의 논문에서 처음 등장한 개념이다. 하나의 객체마다 하나의 모니터를 결합할 수 있으며, 모니터와 결합된 객체는 잠금(lock) 기능을 가지고 있어 하나의 쓰레드만 접근 가능한다. 모니터 구조 ![[Pasted image 20221107200903.png]] 위는 모니터 구조를 나타낸 그림이다. 모니터는 공유 자원 + 공유 자원 접근함수로 이루어져 있고, 2개의 큐를 가지고 있다. 각각 mutual exclusion(상호배타) queue, conditional synchroniz..

서버 개발자로 살아남기 - REST API

REST API란? REST는 Representational State Transfer라는 용어의 약자로서 2000년도에 로이 필딩 (Roy Fielding)의 박사학위 논문에서 최초로 소개되었다. 로이 필딩은 HTTP의 주요 저자 중 한 사람으로 그 당시 웹(HTTP) 설계의 우수성에 비해 제대로 사용되어지지 못하는 모습에 안타까워하며 **웹의 장점을 최대한 활용할 수 있는 아키텍처** 로써 REST를 발표했다고 한다. REST의 구성요소 자원(Resource): URI 모든 자원에 고유한 ID가 존재하고, 이 자원은 Server에 존재한다. 자원을 구별하는 ID는 ‘/groups/:group\_id’와 같은 HTTP URI 이다. Client는 URI를 이용해 자원을 지정하고 해당 자원의 상태(정보)..

Connection timeout VS Read timeout

개요 현재 운영하고 있는 게임서버에서 다른 서버의 API을 호출하는 일이 잦은데, 새로운 게임 오픈 이후, 유저 수가 많아져 자연스럽게 API 호출하는 일이 더 많아졌다. 새 게임 오픈 전에는 간헐적으로 timeout Exception이 발생하여 크게 신경 안쓰고 있었는데, 오픈 이후 급격하게 timeout Exception이 증가하였다. 다른 서버 담당자 분께 해당 Exception에 대해 문의드렸는데, connection timeout인지, Read timeout인지를 물어보셨는데, 이 2개의 차이를 정확히 몰라 찾아보고 말씀드렸고, 이를 정리하였다. Timeout 이란? 프로그램이 특정한 시간 내에 성공적으로 수행되지 않아서 진행이 자동적으로 중단되는 것 응답을 무한정 wait 하면 전체 프로그램에..

면접을 위한 CS 전공지식 노트 - 1.1.4 옵저버 패턴

옵져버 패턴 옵저버 패턴(observer pattern)은 주체가 어떤 객체(subject)의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다. 대표적인 사례 트위터 유튜브 특정 정보를 여러 뷰에서 동시에 얻기 위해 주제자(Subject)에 구독자(Observer)를 등록(Register) 하여 정보를 받는(갱신, Notify) 것을 옵저버 패턴(Observer pattern)이라 한다. 물론 등록을 했으니 해지(Remove)도 가능하다. 코드로 보는 옵져버 패턴 그럼 이제 본격적으로 코드를 확인해 보겠습니다. 여기서 보여드릴 예시는 Subject class에서 값을 변경하면 등록된 모든 Observer들에게 갱신하는 간단..

프로시저와 여러 의견들

프로시저란(Stored procedure)? 저장 프로시저는 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다. DB에 대한 일련의 작업을 정리한 절차를 RDBMS에 저장한 것으로, 영구저장모듈이라고도 불린다. 장점 하나의 요청으로 여러 SQL 문을 실행할 수 있는데, 이런 경우 네트워크 부하를 줄일 수 있다. 만약 JAVA 환경에서 10번의 쿼리를 실행한다고 가정한다면, JDBC를 통해 DB에 10번 request 해야한다. 하지만 프로시저를 이용한다면 DB에서 10번의 SQL 실행문을 구현하고 1번만 호출하면 된다. 개발 업무를 구분하여 더 효율적으로 프로젝트를 운용할 수 있다. 애플리케이션만 개발하는 조직과 DB만을 관리하는 조직이 따로 있다면, 애플리케이션 개발자는 JAVA와 같은..

@RequestBody vs @ModelAttribute 차이점

@RequestBody @ModelAttribute 차이점 개요 Spring boot 개발환경에서 Controller 부분 코드를 작성할 때, 아무생각 없이 Method가 GET 이면 @ModelAttribute을 사용하고, POST면 @RequestBody를 사용하였다. 그러다 어느순간 왜? 라는 의문점이 들었고, 두 어노테이션의 정확한 차이를 정리해보기로 한다. @ModelAttribute Spring docs Annotation that binds a method parameter or method return value to a named model attribute, exposed to a web view. Supported for controller classes with @RequestMap..

Spring boot 환경에서 대용량 엑셀 파일 다운로드 하기 - (1)

개요 게임 서버 개발 포지션에 있지만, 최근 게임과 관련된 API 서버를 인수인계 받으며 Spring boot + JPA 환경을 다룰일도 생겼다. 사내 게임의 FGT()를 진행하는데, 기획자 분이 매번 설문조사 결과를 요청하는 일이 있었다. 사실 설문조사 결과를 DB에 들어가 SQL문으로 뽑는 것은 살짝 귀찮고, 어려운 일은 전혀 아니다. 그러나, 굳이 불편하지 않는 일을 불편하다 생각해 무언가를 만드는게 개발자 특이니, API를 만들기로 한다. 요구사항 spring boot와 JPA 환경에서 DB에 있는 필요한 테이블에서 특정 조건(SQL)의 데이터를 csv 파일로 추출하는 API를 만든다. 예시로 2022년 1월부터 5월까지 게임에 결제한 유저 정보를 엑셀 파일로 추출하는 과정을 진행해본다. Enti..

ELK - Kibana 날짜별 데이터 비교하기

개요 팀에서 개발중인 서비스에 ELK을 붙인 이후, kibana에서 데이터를 이용해 다양한 종류의 visualize을 만들고 있었다. (유저 동접 추이, 특정 게임 동접수 등등) ELK와 비슷한 역할을 하는 NHN CLOUD의 Log N Crash 라는 서비스가 있는데, 여기서 제공해주는 visualize 중, 날짜별 데이터를 비교해주는 서비스가 있었다. 같은 기능을 kibana에서도 구현할 수 있을까 구글링을 해봤는데 kibana에서도 제공하는 기능이였다!! 하지만 역시.. 현재 사용하는 ELK 버전에는 존재하지 않은 기능 ㅎㅎ.. 결국 찾은 건 visualize 종류 중 Timelion이다. Timelion은 시계열 데이터 분석에 특화되어 있으며, 함수 형식의 표현식을 사용한다. 또한 코드가 직관적이..

Spring boot & JPA 조인 시 null 반환하기

개요 회사에서 PC방 관련 서비스를 이관하는 작업을 진행 중인데 테이블이 하나 추가되었고, 이 테이블을 기존의 사용하던 real_student(예시) 테이블에서 몇몇 필드가 제거된 테이블이다.(fake_student) 추가된 fake_student와 real_student를 함께 사용할 것이기 때문에 로직 수정이 필요한 상태이다. 요구사항 새로 추가된 fake_student와 real_student를 함께 사용한다는 말을 좀 더 풀어서 설명하자면 fake_student의 PK 값이 있는지 확인하고, 없다면 real_student에서 해당 PK 값을 찾는 것이 핵심 로직이다. 그러나 문제는 기존의 있던 real_student에 많은 테이블들이 조인되어 있다는 점이다. 이를 그대로 두고, fake_stude..

728x90