다국어를 제공하는 방법으로는 크게 3가지를 생각해 볼 수 있다.

 

1. 서버에서 json을 받아서 사용하기

2. 클라이언트에서 json을 하드코딩하기

3. 웹 문서 사이트 API 사용하기

 

서버에서 JSON 가져오기

서버로부터 JSON 형식으로 데이터를 받아서 클라이언트에서 적용만 하는 방식이다. 서버에서 데이터가 관리되기 때문에 내용에 변경사항이 생겨도 클라이언트에서 따로 수정이 필요하지 않으며 여러 플랫폼에서 동일한 데이터를 사용할 수 있다.

 

언어별 스키마 속성 추가

Monster라는 테이블이 있을 때 다음과 같이 정의한다.

Monster Table
{
	'monsterId' : '1',
    'monsterNameKor' : '박코딩',
    'monsterNameEng' : 'Coding Bak',
}

 

하나의 테이블에서 지원할 언어만큼 속성을 추가해서 만든다. 단순한 구조로 데이터가 추가되어도 DB가 크게 복잡해지지 않기 때문에 확장성이나 유지, 보수 측면에서 유리하다. 다만 사용하는 데 있어서 클라이언트에서는 적용할 때 서비스할 언어에 맞춰 Kor, Eng를 구분해서 접근하거나 또는 API 호출에서 구분해서 데이터를 받을 수 있도록 서버단에서 작업을 해줄 필요가 있다.

 

언어별 테이블 분리

제공할 언어마다 테이블을 따로 분리하는 구조이다.

Moster_Kor Table
{
	'id' : '1',
    'name' : '박코딩'
}

Monster_Eng Table
{
	'id' : '1',
    'name' : 'Coding Bak'
}

 

클라이언트에서는 별도로 처리할 필요 없이 name으로 접근해서 사용할 수 있어 편리하지만 서버 입장에서는 DB의 구조가 복잡해지고 지원할 언어의 수만큼 테이블이 배로 늘어나기 때문에 유지 보수에 불리하다.

 

다중 언어 전용 테이블 구조

다국어가 적용될 모든 데이터에 대한 정보를 모아두고 사용할 방식에 맞게 데이터를 정리해서 보낸다.

Monster Table
{
	'monsterId' : '1',
    'monsterName_tId' : '1'
}

Language Table
{
	'tId' : '1',
    'eng' : 'Coding Bak',
    'kor' : '박코딩',
}

 

 

번역이 필요한 정보들을 하나의 테이블에 묶고 별도의 키값을 통해서 데이터를 연동시켜 사용하는 방식이다. 한 곳에서 일괄적으로 정보들을 관리할 수 있기 때문에 데이터가 수정되거나 추가될 때 쉽게 처리가 가능하다. 하지만 데이터를 연관 짓고 필요한 정보만 묶어서 보내야 하기 때문에 DB구조와 쿼리문이 복잡해질 수 있다.

 

서버에서 언어 데이터를 관리하는 방식에는 여러 방법들이 있지만 서버에 요청하고 응답을 기다려야 하기 때문에 데이터량과 위치에 따라서 지연시간에 대한 문제가 발생할 수 있다. 서버에서 보낼 데이터량이나 서비스할 지역이 여러 곳이라면 각 지역별 인터넷 환경과 서버로부터 거리 또한 고려해서 대응이 필요하다.

 

이런 문제를 해결하기 위한 방법들도 존재한다.

 

Edge Computing

사용자 또는 데이터 소소의 물리적인 위치나 그 근처에서 컴퓨팅을 수행하는 것으로 사용자가 단말 장치와 가까운 위치에서 컴퓨팅 서비스를 처리하면 더 빠르고 안정적인 서비스를 제공받을 수 있는 여러 위치에서 공통의 리소스 풀을 사용하여 데이터 연산 및 처리를 분산시키는 방법이다.

 

AWS Lambda, Cloudflare Workers 등에서 서비스를 사용할 수 있다.

 

SSG

Server Side Generation 또는 Static Site Generation

Next.js 같은 메타 프레임워크에서 사용할 수 있는 방식으로 빌듯이 데이터를 받아서 미리 언어별로 페이지를 분기처리하는 방식이다.  빌드할 때 서버로부터 요청을 보내고 데이터를 받아와서 파일들을 미리 생성해 놓기 때문에 지연시간이 발생하지 않게 하는 방식이다.

 

클라이언트에서 관리

언어 데이터를 클라이언트단에서 관리하는 방식이다. 별도의 서버 요청이 필요 없기 때문에 요청하고 응답을 대기하는 시간이 없다. 하지만 정보가 변경될 때마다 클라이언트에서 수정이 필요할 수 있다.

 

클라이언트 내부에서 하드코딩으로 직접 언어 데이터를 정리해서 사용하는 경우 데이터 수정 시 클라이언트의 수정이 필요하고 다른 플랫폼의 클라이언트도 있는 경우 모두 동일하게 수정해서 데이터를 일치시켜야 하는 번거로움이 있다.

 

일반적으로 json 형식으로 데이터 파일을 만들고 클라이언트에서는 파일을 로드하고 코드상에서 값들을 가져다 쓰는 방식을 사용한다. 

 

별도의 json 다국어 데이터 파일
{
  "en": {
    "greeting": "Hello!",
    "buttonText": "Submit"
  },
  "ko": {
    "greeting": "안녕하세요!",
    "buttonText": "제출"
  },
  "fr": {
    "greeting": "Bonjour!",
    "buttonText": "Soumettre"
  }
}
using System;
using System.IO;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {
        // JSON 파일 경로
        string jsonFilePath = "path/to/your/json/file.json";

        // JSON 파일 로드
        string jsonContent = File.ReadAllText(jsonFilePath);

        // JSON 파싱
        JObject jsonData = JObject.Parse(jsonContent);

        // 사용자 언어 설정 (예: "en", "ko", "fr")
        string userLanguage = "en";

        // 다국어 데이터 가져오기
        string greeting = jsonData[userLanguage]["greeting"].ToString();
        string buttonText = jsonData[userLanguage]["buttonText"].ToString();

        // 다국어 데이터 사용 예시
        Console.WriteLine(greeting);       // 인사말 출력
        Console.WriteLine(buttonText);     // 버튼 텍스트 출력
    }
}

파일을 별도로 두고 클라이언트에서는 파일을 로드하고 데이터를 가공해서 사용하게 된다. 이때 파일 위치를 번들처럼 외부에 두고 사용하여 언어 정보만 변경이 된 경우에는 해당 파일만 수정해 주면 클라이언트상에서 수정 없이 작업이 가능하다.

 

문서 관리 서비스 사용

여기서 문서 관리 서비스란 구글 스프레드시트 처럼 제공되는 서비스를 말한다. 직관적인 형식으로 데이터를 관리할 수 있으며 여러 클라이언트에서 동일한 데이터를 사용할 수 있다. 하지만 접근하기 위해서는 API의 호출이 필요하고 이 과정에서 서버에 요청이 필요하기 때문에 지연시간이 발생할 수밖에 없으며 서비스마다 지원되는 API에 제한이 있다.

 

using Google.Apis.Auth.OAuth2;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using System;
using System.Collections.Generic;
using System.IO;

public class Program
{
    static readonly string spreadsheetId = "your-spreadsheet-id";
    static readonly string credentialsFilePath = "path/to/your/credentials.json";

    public static void Main()
    {
        // 인증 정보 로드
        GoogleCredential credential;
        using (var stream = new FileStream(credentialsFilePath, FileMode.Open, FileAccess.Read))
        {
            credential = GoogleCredential.FromStream(stream)
                .CreateScoped(SheetsService.Scope.Spreadsheets);
        }

        // SheetsService 생성
        var serviceInitializer = new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "Your Application Name"
        };
        var sheetsService = new SheetsService(serviceInitializer);

        // 데이터 가져오기
        IList<IList<object>> values = GetSpreadsheetValues(sheetsService, spreadsheetId, "Sheet1");

        // 가져온 데이터 출력
        if (values != null && values.Count > 0)
        {
            foreach (var row in values)
            {
                foreach (var cell in row)
                {
                    Console.Write(cell + "\t");
                }
                Console.WriteLine();
            }
        }
        else
        {
            Console.WriteLine("No data found.");
        }
    }

    public static IList<IList<object>> GetSpreadsheetValues(SheetsService sheetsService, string spreadsheetId, string sheetName)
    {
        string range = $"{sheetName}!A1:Z";
        SpreadsheetsResource.ValuesResource.GetRequest request =
            sheetsService.Spreadsheets.Values.Get(spreadsheetId, range);

        ValueRange response = request.Execute();
        IList<IList<object>> values = response.Values;

        return values;
    }
}

 

다양한 방법들로 다국어 데이터를 관리할 수 있는데 이 중 장단점들을 고려하여 프로젝트의 성격 및 특징에 알맞은 방식을 선택하는 것이 중요하다. 

728x90
반응형

'Memo' 카테고리의 다른 글

C# Class 크기 확인  (0) 2023.02.06

 

슈퍼 마리오가 애니메이션으로 나온다는 소식을 처음 접했을 때는 과연 영화로 슈퍼 마리오의 스토리와 액션을 재밌게 풀어나갈 수 있을까 반신반의했다. 하지만 그런 걱정은 예고편을 보고 나서 사라졌다. 박진감 넘치는 액션과 익숙한 배경음악만으로 내 가슴은 두근거리기 시작했다.

 

2023 04 30 

강남의 메가박스에서 슈퍼 마리오 브라더스를 감상했다. 생각보다 사람들이 많이 없어서 한적하게 영화를 즐길 수 있었다.

 

우선 영화 감상부터 말하자면 캐릭터부터 배경, 음악, 스토리 모두 잘만들어진 작품이었다. 정교한 애니메이션으로 캐릭터들 하나하나 개성을 잘 살리고 표정과 액션을 잘 묘사했다. 배경으로 보이는 여러 요소들도 원작의 팬들이라면 반가워할 만큼 디테일하게 담아냈다. 배경 음악과 효과음 또한 영화에 어울리게 보정을 해서 튀지 않으면서도 원본을 잘 살려 반가움과 추억을 느낄 수 있었다. 

 

스토리는 원작의 느낌을 잘 녹여냈고 126분이라는 시간동안 지루할 틈 없이 매끄럽게 쭈욱 이어나간다.

너무 유치하지도 않으면서 개연성은 잘살렸고 나이 상관없이 모두 즐길 수 있는 유머들도 좋았다. 물론 원작을 전혀 몰라도 보는데 지장이 없는 작품이지만 나처럼 어린 시절에 슈퍼 마리오에 대한 추억이 있다면 더 몰입되고 반가운 요소들과 사운드 때문에 상영 내내 설레면서 보게 될 것 같다.

 

엔딩 크레딧이 모두 올라가고 나오는 쿠키 영상에서 상영관의 모든 사람들이 반가움의 감탄을 뱉어냈다. 그렇게 다음 후속작에 대한 떡밥까지 던지면서 영화는 마무리되었다. 

 

귀여운 펭귄

 

가정의 달인 5월에 가장 어울리는 영화라 생각한다.

이번편에서 자세하게 다루지 않은 부분들이 다음 편에 어떻게 나올지 기대되면서 후속작을 기다려본다.

728x90
반응형

'Life' 카테고리의 다른 글

치토스 맥앤치즈  (0) 2023.10.23
사이버 나무  (0) 2023.05.11
베트남 콘삭 커피  (0) 2023.04.09
티스토리 단축키  (0) 2023.03.30
장 줄리앙 전시회 - 그리고 거기  (1) 2023.03.27

에디터 버전 : 2021.3.28f1 (LTS)

 

Adaptive Performance

모바일 장치와 같은 저사양의 플랫폼에서 자동으로 프레임률을 관리하고 최적화할 수 있도록 기능을 제공한다.

기능이 활성화되면 하드웨어 자원을 최대한 활용하여 최적의 성능을 얻을 수 있다. 

 

기능을 사용하기 위해서는 Adaptive Performance 패키지부터 설치해야 한다. 아래의 인스톨 버튼을 클릭하면 해당 패키지의 최신 버전의 설치가 진행된다.

 

패키지 설치가 끝나면 다음과 같이 화면이 변경된다.

 

Adaptive Performance Docs

공식 문서부터 살펴본다.

view documentation

 

해당 패키지의 설명은 이렇다.

 

Adaptive Performance allows you to get feedback about the thermal and power state of your mobile device and react appropriately.
(Adaptive Performance를 사용하면 모바일 장치의 발열과 전원 상태에 대한 피드백을 가지고 적절하게 대응할 수 있다.)

 

여기서 전원 상태란 모바일 장치의 전력 상태를 의미한다.

(전력이 낮은지, 충분한지 또는 충전 중인지 등의 상태)

For example, you can create applications that react to temperature trends and events on the device, to ensure constant frame rates over a longer period of time and prevent thermal throttling.
(장치의 온도 추세나 이벤트에 반응해서 일관된 프레임률을 장기간 유지하고 열 제한을 방지하는 애플리케이션을 만들 수 있다.)

 

온도 추세는 모바일 장치의 온도 변화를 뜻한다. 모바일 장치는 사용자가 앱을 실행하거나 다양한 작업을 수행할 때 온도가 상승할 수 있다. 이벤트는 앱의 실행과 종료, 배터리 잔량 변화, 충전 상태 변화, 네트워크 상태, 알림, 회전 등과 같이 여러 상태 변화를 뜻한다. 

 

열 제한은 모바일 장치가 과열될 때 발생하는 현상으로 온도가 높아짐에 따라 장치의 성능이 저하되거나 충전이 중단되는 등의 문제가 발생한다. 따라서 열 제한을 방지한다는 것은 장치의 온도가 올라가서 열 제한을 발생시켜 성능이 저하되지 않도록 온도추세와 이벤트에 반응하여 프레임률 관리를 통해서 모바일 장치의 과열을 방지하는 것을 의미한다.

 

Thermal Throttling 

 

Provider

Adaptive Performance를 활용하기 위해서는 정보를 제공할 장치가 필요하다. 이 장치를 Provider라고 하며 빌드 대상에 맞는 Provider가 제공된다. PC 플랫폼인 경우 별도의 Provider는 제공되지 않으며 Simulator라는 가상 장치를 사용할 수 있다. Simulator는 Adaptive Performance 패키지가 설치될 때 함께 다운로드되며 Provider의 경우 선택될 때 패키지 설치가 진행된다. 하지만 선택을 해제해도 해당 패키지가 삭제되진 않으며 삭제하고 싶은 경우 패키지 매니저를 사용해야 한다.

 

 

Simulator = PC, Provider = Mobile (android, ios) 

 

 

728x90
반응형

+ Recent posts