반응형

해당 링크, 항목은 주기적으로 최신화 및 갱신될 예정입니다.

 

 

DB 관련

. https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all 
 - 간단한 쿼리등을 연습할 수 있는 곳

. http://sqlfiddle.com/

 - 간단한 쿼리등을 연습할 수 있는 곳

. https://sqlzoo.net/wiki/SQL_Tutorial

 - SQL Tutorial 같은 곳.

 

CPP

. https://modoocode.com/

 - 개인적으로 요근래 자주 보는 곳, C / CPP / 알고리즘이 정리되어 있는 곳.

 

C#

. https://www.csharpstudy.com/

 - 개인적으로 가장 자주보는 C# 관련 site, C#과 관련된 많은 것들이 잘 정리되어 있다.

 

Django

 

Web

 

Unreal

 

Unity

 

GameClient

 

GameServer

 

 

반응형

'기타 상식' 카테고리의 다른 글

OIDC란?  (0) 2020.07.28
서버 인증방식  (0) 2020.07.26
SaaS/PaaS/IaaS란?  (0) 2020.05.29
software license 에 대하여.  (0) 2020.05.27
프로그램에서 CPU 시간정보 얻는법  (0) 2019.09.20
Posted by Sweetmeats_boy

2020. 7. 28. 18:35 기타 상식

OIDC란?

반응형

OIDC(OpenID Connect)에 대해서 알아보자.

 

OIDC란 OAuth2.0 기반으로 유저를 인증하는 프로토콜이다.

OAuth2.0과 다소 차이점이라 함은 OAuth가 Athorization을 포함한다면 OIDC는 Authentication에 집중한다는 점이다.

 

OIDC를 사용하는 방법은 매우 간단하다.

OAuth 를 통해 Access_token을 받을 때 id_token이라는 것도 같이 전달 받는데 이 id_token을 활용하면 된다.

 

구글을 예로 들면 OAuth2.0에서 token을 요청할 때 response_type, client_id 등을 넘기게 되는데 이 때 scope에 

필요한 정보에 대해서 명시하게 되어 있다.(openid profile email 등등)

이 scope에 명시한 정보들은 추후 id_token을 받을 때 안에 포함되어 전달된다.

따라서 OAuth을 통한 API호출이 아닌 단순 유저 인증 및 기본정보 등을 알기위해서라면 OIDC를 사용하는것이 더 좋다.

 

구글에서 OIDC는 JWT을 사용한 id_token을 전달해주므로 해당 token의 위변조 확인 후 관련 정보를 활용하면 된다.

 

공식 레퍼런스 : https://developers.google.com/identity/protocols/oauth2/openid-connect

 

OpenID Connect  |  Google ID 플랫폼  |  Google Developers

Google's OAuth 2.0 APIs can be used for both authentication and authorization. This document describes our OAuth 2.0 implementation for authentication, which conforms to the OpenID Connect specification, and is OpenID Certified. The documentation found in

developers.google.com

 

반응형

'기타 상식' 카테고리의 다른 글

유용한 site link 모음  (0) 2021.10.02
서버 인증방식  (0) 2020.07.26
SaaS/PaaS/IaaS란?  (0) 2020.05.29
software license 에 대하여.  (0) 2020.05.27
프로그램에서 CPU 시간정보 얻는법  (0) 2019.09.20
Posted by Sweetmeats_boy

2020. 7. 26. 17:57 기타 상식

서버 인증방식

반응형

웹 싸이트에서 유저의 인증을 확인하는 방식에는 여러 방식이 존재한다.

 

각 방식에 대해서 간단하게 알아보자.

 

1. 단순하게 Http Header에 특정 정보를 전달하는 방식.

- 해당 방식은 Client와 Server가 통신할 때마다 Header 에 Id, pw 등의 정보를 포함 시킨 후 

통신하는 방식이다. 매 통신마다 해당 정보를 검증하며 위조여부 등을 판단한다.

 

-> 단점 :

. 해커가 해당 패킷을 탈취 시 중요 정보가 유출된다.

. 매번 인증정보를 확인해야 하며 이는 비효율적이다.

-> 장점 : 

. 구현이 쉽다.

 

2. 서버가 유저 인증 시 특정 세션정보를 활용하는 방법.

 - 유저의 로그인 절차 중 해당 정보가 인증된다면 이 유저에 대한 세션ID를 부여한다.

그 후 세션 ID를 Header에 포함시켜 보내면, client는 해당 session id 를 쿠키에 저장한 후 

서버와 통신할 때 인증정보가 필요한 경우 header에 포함시킨다.

 

-> 단점 : 

. 이 역시 해커가 탈취 시 중요 정보의 유출 위험이 존재한다.

 -> 세션 별 life time 을 설정해서 유효시간을 지정함으로서 탈취된 경우 무효화 될 수 있게 한다.

 -> HTTPS를 적용하여 탈취 후 에도 header를 파악하기 어렵게 한다.

. 세션을 저장할 추가적인 비용(DB, memory 등)가 발생한다.

-> 장점 : 

. 패킷 탈취 시 해당 session ID로만 구성되어 있으므로 유의미한 정보는 유출되지 않는다.

 

3. Token 기반 인증방식을 적용한다.(보통은 JSON Web token 사용)

 - token 정보를 header에 포함시켜 전달하는 방식이다. jwt의 경우 지정된 암호화 방식으로 tokenize를 진행할 수 있고 이에 대한 SECRET KEY 로 복호화 후 위변조 여부를 판단할 수 있다.

jwt의 경우 Header, payload, verify signature 로 구성되며 header, payload는 누구나 복호화 할 수 있고 verify signature의 경우 SECRET KEY를 알지못하면 복호화 하지 못한다. 따라서 payload에는 중요정보를 포함하면 안된다.

 

-> 단점 : 

 . 이 방식 역시 해커가 탈취가능하다.

 -> 이 역시, access token에 expire time을 적용하면 피해를 다소 방지할 수 있다.

 . payload는 복호화가 가능하기 때문에 넣을 수 있는 data는 한정적이다.

 . 서버에서 복호화하는 비용이 발생한다.

-> 장점 : 

 . session 인증 방식과 크게본다면 동일하지만 볃도의 비용이 발생하진 않는다.(DB 불필요)

 . 탈취 당한다고 해도 token 위조가 무의미해진다.

 

 

반응형

'기타 상식' 카테고리의 다른 글

유용한 site link 모음  (0) 2021.10.02
OIDC란?  (0) 2020.07.28
SaaS/PaaS/IaaS란?  (0) 2020.05.29
software license 에 대하여.  (0) 2020.05.27
프로그램에서 CPU 시간정보 얻는법  (0) 2019.09.20
Posted by Sweetmeats_boy

2020. 5. 29. 15:50 기타 상식

SaaS/PaaS/IaaS란?

반응형

IaaS : Infrastructure as a Service

 - 서버 유지에 필요한 저장소, 전력, 서버 자원등을 가상화된 형태로 제공하는 서비스

 - PaaS, SaaS 의 기반 기술이다.

 - 지속적인 시스템 관리, 데이터 백업 등도 처리해준다.

 

Paas : Platform as a Service

 - 서비스 개발에 필요한 플랫폼, 혹은 그와 관련된 응용 프로그램을 개발할 수 있는 API까지 제공하는 서비스

 

SaaS : Software as a Service

 - 응용프로그램을 Cloud 환경에서 제공하는 서비스

 - 예 : 메일, 구글 문서, AWS 

출처 : https://www.hostway.co.kr/support/faq/iaas-paas-saas%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94

 

간단하게 정리하자면 cloud 기반에서 software를 제공하는 서비스는 SaaS, 

사용하려는 software를 제외한 모든것을 제공하는 것이 PaaS, 

단순하게 Infra 를 가상회된 형태로 제공하는 서비스는 IaaS 라고 보면 될것같다,

[아마도 IDC 센터가 IaaS, CDN은 PaaS에 속하지 않을까 생각한다. ]

반응형

'기타 상식' 카테고리의 다른 글

OIDC란?  (0) 2020.07.28
서버 인증방식  (0) 2020.07.26
software license 에 대하여.  (0) 2020.05.27
프로그램에서 CPU 시간정보 얻는법  (0) 2019.09.20
함수 호출 정보에 관하여  (0) 2019.09.05
Posted by Sweetmeats_boy
반응형

출처 : https://ko.wikipedia.org/wiki/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4_%EC%82%AC%EC%9A%A9%EA%B6%8C

 

소프트웨어 사용권 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

가끔 개발 시 라이센스 관련해서 찾아보기 쉽게 정리할 겸 포스팅을 한다.

 

PDS : public domain software

. 소스를 보여주고 다른사람이 수정, 그 수정된 버전을 다시 배포해도 되는 license이고 해당 소스에 대한 저작권 주장을 못하는 license이다.

. 요약하면 어떠한 의무사항도 없지만 내세울 권리 역시 없는 license 

 

FOSS : Free and Open source software

. 주로 open source 기반 software 들이 해당 license 에 포함된다.

. 다만 2차 저작물에 대한 공개 의무에 따라 좀더 세부적으로 구분이 된다.

 -> 2차 저작물 역시 공개 해야하는 경우 [ GPL ]: ex) GIMP

 -> 2차 저작물 역시 공개 하지 않아도 되는 경우 [ BSD license ] : ex) Apache

 

open source에 대한 license 종류는 아래와 같이 존재한다.

. MIT license

. BSD

. Apache license

. GPLv2, GPLv3

. LGPLv2

. MPL 

 

이러한 license들은 크게 Copyleft license와 Permissive license 두가지로 나눌 수 있다.

 

Copyleft license의 경우 저작권(copy right)과 반대되는 개념으로 공유를 위한 license이다.

해당 license의 경우 아래의 4가지 자유를 제공한다.

. 해당 source를 사용할 자유

. 해당 source를 배포할 자유

. 해당 source를 수정할 자유

. 해당 source를 활용한 source를 배포할 자유

 -> 다만 해당 source 역시 copy left license를 지녀야 한다.

=> 즉 쓰는건 맘대로 쓰되 니가 만든 것도 남들이 맘대로 쓰게 해야한다는 내용

 

Permissive license 의 경우는 약간 다르다.

해당 라이센스의 경우 copyleft 보다는 조금 완화된 license로써, 최소한의 open source 성격을 보장한다.

Permissive license는 2차 생산물에 대하여 공개의무가 없고 저작권을 보장한다

=>간단하게 말하자면 쓰는건 맘대로 하되 니가 만든건 공유 안해도 된다는 내용

 

이러한 기준에 의해 open source license들을 구분하면 아래와 같다.

Copyleft

 .  GPLv2, GPLv3, LGPLv2, MPL

Permissive

 . MIT , BSD, Apache

 

라이센스 별로 각기 다른점과 특징들이 있지만 해당 내용까지 다루기엔 너무 길어지기 때문에 마무리한다.

반응형

'기타 상식' 카테고리의 다른 글

서버 인증방식  (0) 2020.07.26
SaaS/PaaS/IaaS란?  (0) 2020.05.29
프로그램에서 CPU 시간정보 얻는법  (0) 2019.09.20
함수 호출 정보에 관하여  (0) 2019.09.05
게임에서의 랜덤값에 대해서  (0) 2019.09.02
Posted by Sweetmeats_boy
반응형

프로그래밍 중 매 Tick 마다 혹은 매 초마다 특정 루틴을 실행해야하거나 

 

프로그램이 실행된 시작 시간 혹은 지금까지의 가동 시간 등을 알아야 하는 경우가 생기기 마련이다.

 

이런 경우 각 언어, 플랫폼마다 여러 방식으로 확인할 수 있는 방법이 있는데 이 방법들에 대해서 알아보자.

 

우선 C 혹은 C++의 경우 주로 사용하는 방법은 QueryPerformanceFrequency 함수등과 관련된 방법이다.

참고 : http://egloos.zum.com/NeoTrinity/v/943773

 

코드 실행 시간 측정 방법 정리

코드 실행 시간 측정 방법 정리- 한양대 바라미 6기 이흔진 이번에 알아보는 것은 Visual C++에서 시간을 측정하는 방법입니다. Visual C++에서 시간을 측정하는 방법은 여러가지가 있는데 . ANSI C의 함수를 이용하는 방법부터 윈도우 API 함수를 이용하는 방법까지 다양합니다. 그리고, 각각의방법을 사용하기 위해서 함수에 따라 적절히

egloos.zum.com

일단 주요 원리는 특정 루틴의 호출 시점, 종료시점에서 시간을 측정해서 시간 경과를 측정하는 것이다.

 

개인적으로 Clock() 함수 혹은 timeGetTime() 함수는 사용해보지 않았기 때문에

 

QueryPerformanceFrequency / QueryPerformanceCounter 함수와 관련된 내용만 적어보려고 한다.

 

우선 두 함수 모두 Windows.h 에 포함된 함수이며 각각 CPU의 현재의 연산주기, 연산횟수를 얻어오는데 쓰인다.

[계산주기, 횟수라고 한것은 영어 원문에선 performance-counter라고 되어 있음]

 

위 두가지를 사용하여 시간을 측정하는 방법은 아래의 순서로 진행된다.

1. 우선 QueryPerformanceFrequency를 통해서 현재 프로그램이 돌아가는 장치의 계산주기를 얻는다.

2. QueryPerformanceCounter 함수를 특정 로직의 앞, 뒤에서 호출하여 start, end 시의 계산 횟수를 구한다.

* 이 때 end-start 를 통해서 특정 로직의 수행시 cpu가 몇번의 계산을 했는지 알 수 있다.[deltaCount]

3. 위의 deltaCount의 값을 계산주기로 나누면 경과한 시간을 알 수 있다.

* 계산주기=[계산횟수/시간] 이기 때문에 경과시간 = deltaCount / (계산횟수 / 단위시간) 이 된다.

 

 

그렇다면 C#의 경우는 어떤 방법들이 있을까?

 

우선 C#에서도 C++에서 사용하는 QueryPerformanceCounter 함수들을 사용하는 방법도 있다.

 

이 경우, DllImport를 사용하여 QueryPerformanceCounter, QueryPerformanceFrequency를선언하면 된다.

 public class QueryPerfCounter
    {
        [DllImport("KERNEL32")]
        private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceFrequency(out long lpFrequency);
    private long start;
    private long stop;
    private long frequency;
    double multiplier = 1.0e6;  // usecs / sec

    public QueryPerfCounter()
    {
        if (QueryPerformanceFrequency(out frequency) == false)
        {
            // Frequency not supported
            throw new Win32Exception();
        }
    }

    public void Start()
    {
        QueryPerformanceCounter(out start);
    }

    public void Stop()
    {
        QueryPerformanceCounter(out stop);
    }

    public double Duration(int iterations)
    {
        return ((((stop - start) * multiplier) / frequency) / iterations);
    }

이 방법보다 좀더 간편한 방법으로는 stopwatch를 사용하는 방법이다.

using System;
using System.Diagnostics;
using System.Threading;
class Program
{
    static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;

        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);
    }
}

내부적으로는 위의 dll을 사용하는 방식과 별 차이는 없다고 한다.

* stopwatch는 .Net2.0 버전 이후부터 지원

* 밑의 DateTime 보다는 정밀하게 측정이 가능하다고 함.

 

마지막으로 제일 간단한 방법으로는 DateTime을 통한 Tick값 비교이다.

DateTime StartTime = DateTime.Now;

//Code

TimeSpan ts = DateTime.Now.Subtract(StartTime);
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds / 10);
Console.WriteLine(elapsedTime, "RunTime");

* 다만, 이 방법의 경우 외부 프로세스의 영향 혹은 메모리 스왑등에 영향을 받아 함수의 첫 실행 시 소요시간이 그 이후 소요시간보다 크게 측정되는 문제가 있다고 한다.

 

 

반응형

'기타 상식' 카테고리의 다른 글

SaaS/PaaS/IaaS란?  (0) 2020.05.29
software license 에 대하여.  (0) 2020.05.27
함수 호출 정보에 관하여  (0) 2019.09.05
게임에서의 랜덤값에 대해서  (0) 2019.09.02
FirebaseMessage 란?  (0) 2019.07.31
Posted by Sweetmeats_boy
반응형

프로그래밍을 하다보면 보통 개발 단계에서 디버깅 로그 혹은 디버그 모드 등을 통해서

 

로직의 수행 단계 혹은 특정 객체의 정보등을 확인한다.

 

일반적인 경우 디버깅 모드에서 일일히 확인해도 가능하지만

 

스레드와 관련된 내용은 단순 호출 스택으로 확인하기에는 제한사항이 많다.

 

이러한 경우 보통 해당 로직을 호출한 함수, line등의 정보를 각 언어별로 제공하는 방법이 따로 있다.

 

C#의 경우 

 

1. GetCurrentMethod() 함수의 사용.
2. StackTrace 사용

3. Caller Information 클래스 사용

 

간단하게 설명하자면 GetCurrentMethod()함수의 경우 해당 함수를 내부에서 호출한 함수의 정보를 담아서 전달하며

 

해당 함수의 속성, 예를 들면 Name, IsPublic, IsStatic 등의 정보를 담고 있지만,

 

이 경우 GetCurrentMethod()를 통해 X함수에서 호출된 것은 알 수 있지만 X의 몆번째 line에서 호출됐는지는 모른다.

 

 

StackTrace 를 사용하는 경우 GetCurrentMethod() 와는 다르게 호출된 line까지 확인이 가능하다.

 

다만 StackTrace는 4.5 버전 미만에서 지원되며 실질적으론 StackTrace를 얻은 후 다시 StackFrame을 얻고

 

StackFrame을 통해서 FlieName, MethodName, Line 정보를 얻을 수 있다.

 

 

Caller Information의 경우 StackTrace와 같은 역할이지만 좀더 간편하게 사용할 수 있다.

 

CallerFilePathAttribute / CallerLineNumberAttribute / CallerMemberNameAttribute 3개의 어트리뷰트이다.

 

사용 방법 역시 매우 간단한데 아래와 같이 사용하면 된다.

public void LogTrace(string _log, [CallerMemberName]string _callerName = "", [CallerLineNo]string _lineNo)
{
   Console.WriteLine($"[{_callerName}|{_lineNo}]-{_log}");
}

다만 Caller Information의 경우 4.5이상에서 사용가능하며 아직은 기능이 그렇게 많지 않다는 단점이 있다.

 

위에서는 C#의 예를 들었지만 각 언어별 함수 호출 정보를 획득할 수 있는 방법들이 있을 것이다.

[C++의 경우 __LINE__ 키워드라던가]

 

자신이 사용하는 언어는 어떤 방법을 제공하고 있는지 알아두면 좋을 것이다.

 

반응형

'기타 상식' 카테고리의 다른 글

software license 에 대하여.  (0) 2020.05.27
프로그램에서 CPU 시간정보 얻는법  (0) 2019.09.20
게임에서의 랜덤값에 대해서  (0) 2019.09.02
FirebaseMessage 란?  (0) 2019.07.31
멀티 스레드에 관해서  (0) 2019.07.14
Posted by Sweetmeats_boy
반응형

게임 개발자나 유저들에게 항상 밀접한 관련이 있는 랜덤값에 대해서 알아보자.

 

개발자 입장에서 가장 처음 접하는 랜덤값과 관련된 함수는 아마도 C++의 rand()함수가 아닐까 싶다.

 

msdn의 함수 설명에서는 이렇게 설명하고 있다.

 

rand() 함수는 int 형의 무작위값을 반환하며 error는 반환하지 않는다.

 

더불어 srand()함수를 통해서 rand에 사용할 seed값을 미리 지정해줘야한다

 

다만, rand() 함수는 0 ~ RAND_MAX(32767) 까지의 값만 반환한다고 되어 있다.

 

위 간단하고 굳이 정밀도를 따지지 않는 확률이 요구될 때에는 해당 함수를 사용해도 문제가 생기진 않을것이다.

 

하지만 위 함수를 사용하면 문제가 발생할 수 있는 경우가 많은데 아래의 상황들이다.

 

우선 첫째로는 해당 함수는 의사난수[Pseudo Random] 이기 때문에 동일한 seed값에 대해서는 항상 동일간 결과가 나온다는 점이다.

[ 물론 이 경우 적용하는 곳에 따라 장점이 될 수 있다. ]

 

두번째로는 아래의 예시에 관한 상황이다.

 

우선 내가 원하는 아이템의 id가 70이라고 할 때 0~100000까지의 item들 중 랜덤으로 아이템을 드롭한다고 생각해보자.

 

rand 함수를 사용할때 우선 발생하는 문제는 랜덤값이 32767까지라는 점이다.

 

위의 예를 통해서 본다면 itemid가 32767보다 큰 경우에는 드롭조차 되지 않는다.

 

두번째 문제는 특정 item에 대한 확률이 미묘하게 달라질 수 있다는 것이다.

 

이번에는 itemid가 1~10000까지있다고 가정하고 itemid를 랜덤으로 얻는 방법이 아래와 같다고 생각해보자.

 

itemid = ((rand()+1)%1000 + 1);

 

위 코드의 경우 itemid 는 1~768 / 768 ~ 1000 구간에서의 itemid가 나올 확률이 미묘하게 다르다.

 

A구간[0 ~ 767]과 B구간[768 ~ 999] 구간의 값의 확률 기대값이 다르기 때문이다

 

A구간의 경우 총 33번 나올 수 있다. (ex : 0~767, 1000~767, ...... 32000 ~ 32767)

 

B구간의 경우 총 32번 나올수 있다. (ex :  768 ~ 999, 1768 ~ 1999, ..... 31768 ~ 31999)

 

즉, A구간에 속한 itemId의 경우  미묘하게 드랍될 확률이 높은 것이다.

 

따라서 정밀도, 기대값에 따라 rand()함수의 사용을 잘 고려해야한다.

 

다른 방식의 랜덤값 추출은 어떤게 있을까

 

중앙제곱법, 선형 합동법, XOR-SHIFT 등 여러 방법이 있지만 우선은 메르센 트위스터라는 방법에 대해서 알아보자.

 

메르센 트위스터란?

 

Mersenne-twister [흔히 mt_rand()] 라고 불린다.

 

이 방법은 메르센 소수라는 값을 사용하며 효율이 좋아 C++11 버전에서 mt19937이 표준으로 채택되었다.

 

사용하는 방법도 매우 간단하다.

int main()
{
	auto randSeed;
    std::mt19937 engine(randSeed);
    std::uniform_int_distribution<int> distibution(0, 100);
    auto gen = distribution(engine);
}

위 코드를 보면 우선 하드웨어 리소스를 사용하여 난수를 생성한 후에 0 ~ 100까지 숫자중 임의의 수를 반환한다.

 

난수엔진에 주는 seed값은 필요에 따라 다른값으로 부여하면 된다.

 

이 메르센 트위스터 방식의 경우 기존 rand() 함수보다 랜덤값의 범위가 더 광범위하므로 특정구간에서의 값이 나올 확률차이는 미미하다.

 

기타 다른방식의 랜덤값 추출의 경우 아래의 출처를 읽어보면 좋을것 같다.

https://namu.wiki/w/%EB%82%9C%EC%88%98%EC%83%9D%EC%84%B1

 

난수생성 - 나무위키

Xn+1=(aXn+c) mod mX_{n+1} = (a X_n + c)\ \text{mod}\ mXn+1​=(aXn​+c) mod m static UINT32 next = 1; int __cdecl rand(void) { next = next * 1103515245 + 12345; return (UINT32)(next>>16) & RAND_MAX; } void __cdecl srand(unsigned int seed) { next = seed; } X는

namu.wiki

 

반응형

'기타 상식' 카테고리의 다른 글

프로그램에서 CPU 시간정보 얻는법  (0) 2019.09.20
함수 호출 정보에 관하여  (0) 2019.09.05
FirebaseMessage 란?  (0) 2019.07.31
멀티 스레드에 관해서  (0) 2019.07.14
ORM이란?  (0) 2019.06.23
Posted by Sweetmeats_boy

2019. 7. 31. 12:57 기타 상식

FirebaseMessage 란?

반응형

참고 출처 :  https://firebase.google.com/docs/android/setup

 

Android 프로젝트에 Firebase 추가  |  Firebase

시작하기 전에 Android 스튜디오를 설치하거나 최신 버전으로 업데이트합니다. Android 앱이 다음을 충족하는지 확인합니다. API 수준 16(Jelly Bean) 이상 타겟팅 Gradle 4.1 이상 사용 앱을 실행할 기기 또는 에뮬레이터를 설정합니다. Google Play가 포함된 에뮬레이터 이미지를 에뮬레이터에서 사용해야 합니다. Google 계정을 사용하여 Firebase에 로그인합니다. Android 앱 프로젝트가 준비되지 않았다면 빠른 시

firebase.google.com

Firebase Message 란?

GCM[Google Cloud Message ] 지원이 사실상 종료됨에 따라 필수적으로 Migration해야 하는 서비스이다.

위 출처에서는 기본적으로 FCM을 Android에서 사용하려면 어떻게 해야하는지 잘 설명하고 있다.

 

 위 FCM 문서 내용중 중요한것은 아래와 같다.

1. Target SDK 버전은 16이상.

2. Gradle은 4.1 이상

 

만약 GCM에서 FCM으로 Migration해야한다면 아래의 링크, 영상을 확인하면 된다.

 - https://developers.google.com/cloud-messaging/android/android-migrate-fcm

 

Migrate a GCM Client App for Android to Firebase Cloud Messaging  |  Cloud Messaging  |  Google Developers

You can migrate an existing GCM client app on Android to Firebase Cloud Messaging (FCM) using the instructions in this guide. Before getting started, keep in mind: GCM and FCM SDKs cannot co-exist within an application. GCM tokens retrieved via GoogleCloud

developers.google.com

Migration 과정은 간단하게는 GCM관련 permission, service등을 제거 한 후 

FCM관련 service를 사용하게 하면 된다.

 

 

FCM의 적용, Migration의 방법에 대해서는 매우 간단하며 만약 기존의 GCM을 사용하고 있었다면

아마 Token을 얻어오는 과정만 수정한다면 그외에는 건드릴게 있나 싶다.

 

 

다만 개인적으로 해당 작업을 하면서 시간을 엄청 날렸던 점들에 대해서 적어보려고 한다.

우선 내가 Unity Client에 대해서 급작스럽게 fcm을 적용해야 하는 처지가 되서 진짜 맨땅에 헤딩을 엄청 했다.

기본적인 Gradle Build부터 현재 게임에 붙어있는 SDK들이 무엇인지 파악도 안된 상태에, 또 SDK들이 어떻게 엮여있는지 등등 하나하나 확인하며 작업하고 빌드하고 확인하는 과정을 주구장창했었는데 사실 엄청 간단했다.

 

우선 위의 출처에 나와있는 Firebase Message service문서를 순서대로 따라하면

Build.gradle에 implementation 'com.google.firebase:firebase-messaging:18.0.0' 이런식으로 나와있을 것이다.

 

이 문서에서 나오는 버전의 경우 반드시 최신버전은 아니기 때문에 만약 최신버전으로 적용하려고 한다면

maven을 확인하면 된다.

 

반면 나의 경우 게임에 엮여있는 SDK들 중 이미 FCM을 lib수준에서 implement하고 있던 SDK[KaKao......ㅅㅂ]가 있었고 

이부분을 모른채 공식 문서만 따라서 진행하던 나는 뭐가 문제인지 모르고 시간낭비만 했었다.

 

내가 implement로 추가한 FCM 버전과 SDK에서 이미 적용한 버전이 달랐던 부분이 문제였는데

SDK에서는 15.0.2를 참조했고 위 문서에서는 18.0.0을 참조하게 했으니 1차 문제였다.

2차적인 문제는 15.0.2에서는 FirebaseinstanceIDService를 사용하는 반면

18.0.0에서는 deprecated되어 않도록 문서가 작성되어 있다는 것이다.

[더 짜증나는건 FCM 이놈들이 딱히 버전 충돌같은 것을 언급도 안했다는 것]

 

아무튼 사용하려는 Firebase 버전에 따라서 Token을 얻어오는 과정이 다르니 반드시 확인하도록 하자.

반응형

'기타 상식' 카테고리의 다른 글

함수 호출 정보에 관하여  (0) 2019.09.05
게임에서의 랜덤값에 대해서  (0) 2019.09.02
멀티 스레드에 관해서  (0) 2019.07.14
ORM이란?  (0) 2019.06.23
LockFree란?  (0) 2017.03.03
Posted by Sweetmeats_boy
반응형

우선 스레드란 프로세스 내부에서 공통 자원을 토대로 실행되는 가장 작은 작업단위라는 것을 모두 알 것이다.

 

멀티스레드란 한개의 프로세스 내에서 여러 스레드가 동시 다발적으로 작업을 수행하는 것을 의미한다.

 

그렇다면 멀티스레드의 장단점은 무엇일까?

 

우선 장점으로는 크게 응답성, 자원공유, 경제성, 멀티프로세서 활용 이렇게 4가지가 존재한다.

 

대화형 프로그램을 멀티스레드화 하면, 프로그램의 일부 스레드가 지연되더라도 다른 스레드가 여전히 수행된다.

 

예를 들면 웹페이지에서 이미지 로딩중에 다른 작업이 진행되는 경우 등이 응답성 측면에서의 장점에 속한다.

 

자원 공유와 경제성의 경우 같은 프로세스에 속한 스레드는 자원을 공유하기 때문에 context switching 등에서 좀더 비용이 적다는 이점이다.

 

마지막으로 멀티프로세서 활용의 경우 각각의 스레드를 다른 프로세서에서 병렬로 수행이 가능하다는 것이다.

 

단점의 경우는 크게 4가지로 볼수 있다.

첫번째로는 자원공유로 인해 발생하는 단점으로 각각의 스레드가 공유자원에 대해서 서로 간섭하는 경우가 생긴다는 것이다.

 

두번째로는 한개의 스레드만 실행 중인 경우 싱글 스레드와 차이가 없고 오히려 더 지연되는 경우가 생길 수 있다는 것이다.

 

세번째로는 멀티 스레드 적용 시 운영체제를 우선 고려해야 하고 응용프로그램의 경우 멀티 스레드를 고려한 구조로 설계되어야 한다는 것이다.

 

마지막으로는 각 스레드 별 스케줄링에 주의해야 한다는 것이다.

 

 

멀티 스레드 모델

 

멀티 스레드는 크게 3가지 모델로 구분할 수 있다.

1. 다 대 일[Many To one]

Many To one의 경우 여러 유저 스레드들이 한개의 프로세서로 매핑되는 방식이다.

스레드의 관리는 유저 레벨에서 이루어 지며 주로 커널 스레드를 지원하지 않는 시스템에서 사용한다.

다만, 이 경우 한개의 스레드만 커널에 접근 할 수 있다는 단점이 존재한다.

이 단점 때문에 진정한 의미의 동시성이 지원되지 않는다.

 

 

2. 일 대 일[One to One]

One to One의 경우 한개의 스레드를 한개의 프로세서에 한개의 스레드를 매핑 시키는 방법이다.

이 경우 위의 Many To One 모데에서 발생하던 단점인 특정 스레드가 커널 사용시 다른 스레드가 중단되는 단점이 사라진다. 

그러나 커널 스레드도 한정된 자원을 사용하기 때문에 무한정 생성할 수는 없으며 항상 스레드 생성 갯수를 염두해 두어야 한다.

 

 

3. 다 대 다

Many To Many 의 경우 여러개의 유저 스레드를 여러 개의 커널 스레드로 매핑시키는 방법이다.

Many to One, One to One의 단점을 해결하기 위해 고안된 방법이다.

커널 스레드는 생성된 사용자 스레드와 같은 수 또는 그 이하로 생성되어 스케쥴링 한다.

Many to One 방식에서 스레드가 시스템 호출 시 중단 되는 현상, One to One의 스레드 생성 갯수제한에 대해서 고민하지 않아도 된다. 커널에서 유저 스레드와 커널 스레드의 매핑을 조절하기 때문이다.

[출처 : 위키 https://ko.wikipedia.org/wiki/%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%94%A9 ]

 

 

 

 

반응형

'기타 상식' 카테고리의 다른 글

게임에서의 랜덤값에 대해서  (0) 2019.09.02
FirebaseMessage 란?  (0) 2019.07.31
ORM이란?  (0) 2019.06.23
LockFree란?  (0) 2017.03.03
메모리 거짓 공유란?  (0) 2017.01.13
Posted by Sweetmeats_boy
이전버튼 1 2 이전버튼

블로그 이미지
Sweetmeats_boy

태그목록

Yesterday
Today
Total

달력

 « |  » 2024.12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함