시리즈: 격투 게임이 지연 기반 넷코드 및 롤백 넷코드를 사용하는 방법에 대한 설명

 

원문

격투 게임이 지연 기반 넷코드 및 롤백 넷코드를 사용하는 방법에 대한 설명

네트워크를 통한 최적의 플레이를 위해 게임을 디자인하는 방법

언제든지 격투 게임 커뮤니티를 돌아다니면 온라인에서 격투 게임을 하는 것이 왜 답답한 경우가 있는지에 대한 토론을 보게 될 것입니다. 순간적 반사작용(twitch reflexes)와 플레이어의 반응을 기반으로 만들어진 장르인 격투 게임은 오프라인에서 당연했던 것들을 온라인 환경으로 변환하는 데 어려움을 겪을 수 있습니다. 그러나 오프라인의 경험처럼 좋은 온라인 플레이는 가능하며, 이 목표를 실현하는데 가장 중요한 것은 넷코드(netcode)에 대한 올바른 접근법을 선택하는 것입니다.

기본적으로 넷코드는 동일한 게임을 진행하고 있는 두 대 이상의 컴퓨터가 인터넷을 통해 서로 통신하는 방법입니다. 로컬 플레이는 항상 모든 플레이어 입력이 도착하고 동시에 처리되도록 보장하지만 온라인 플레이상에서 네트워크는 게임이 제어 또는 예측할 수 없는 방식으로 끊임없이 불안정합니다. 상대방과의 물리적 거리, Wi-Fi 연결 여부, 룸메이트의 Netflix 시청 여부 등 수십 가지 요인에 따라 상대방에게 전송된 정보가 지연되거나, 순서가 맞지 않거나, 완전히 손실될 수 있습니다. .

게임에서 온라인 플레이는 새로운 것이 아니지만 격투 게임에는 고유한 도전 과제가 있습니다. 다른 많은 인기 게임 장르와 달리 다른 플레이어와 직접 연결되는 경향이 있으며 근육 기억과 반응(muscle memory and reactions)이 거의 모든 격투 게임의 핵심이기 때문에 낮고 일관된 레이턴시(latency)가 매우 중요합니다. 결과적으로 온라인 대전 게임을 위한 두 가지 주요 전략, 즉 지연 기반 넷코드(delay-based netcode)와 롤백 넷코드(rollback netcode)가 등장했습니다.

격투 게임 커뮤니티에서는 롤백을 하는 것이 최선의 선택이라는 인식이 다시 대두되고 있으며, 지연 기반 넷코드를 사용하는 격투 게임 개발자들이 장르의 성장을 가로막고 있습니다. 사람들이 수년 동안 이 주제에 대해 열정적이었지만, 새롭거나 또는 기존의 훌륭한 게임들이 반복적으로 나쁜 온라인 경험을 지원하면서 좌절감이 계속 증가하고 있습니다.

롤백 넷코드가 정확히 무엇인지, 어떻게 작동하는지, 왜 나쁜 연결의 영향을 숨기는 데 뛰어난지에 대한 (일부는 있지만) 알기 쉬운 설명문이 상대적으로 적습니다. 이 주제가 격투 게임 커뮤니티의 미래 건강을 위해 매우 중요하다고 생각하기 때문에 넷코드에 대한 몇 가지 오해를 없애고 두 넷코드 전략을 철저히 설명하여 모든 사람이 토론할 때 정보를 얻을 수 있도록 돕고 싶습니다. 끝까지 버티면 해당 주제에 대해 업계 전문가와 커뮤니티 리더를 인터뷰할 수도 있습니다!

자세한 내용을 살펴보기 전에 한 가지만 짚고 넘어가겠습니다.

 

왜 이 주제에 대해 알아야 합니까?

온라인 게임은 더 이상 미래가 아니라 현재이기 때문에 회사와 플레이어 모두 좋은 넷코드에 관심을 가져야 합니다.

대부분의 다른 비디오 게임 장르가 10년 이상 동안 이러한 방식으로 진행되고 있으나, 격투 게임 개발자는 아케이드 및 토너먼트와 같은 오프라인 세팅에 뿌리를 둔 장르이기 때문에 때문에 온라인 플레이를 수용하는 데 저항하는 것 같습니다. 오프라인으로 플레이하는 것은 훌륭하고 격투 게임에서 항상 상당한 가치를 가질 것이지만, 많은 플레이어 기반이 오프라인에서 플레이하지 않을 것이라는 것이 당연한 현실입니다. 많은 격투 게임 팬에게 온라인 플레이는 게임 그 자체이며, 나쁜 온라인 경험은 게임을 개선하거나 친구에게 게임을 추천하지 못하게 하고 궁극적으로 게임 대신 다른 일을 선택하게 만듭니다.

연결 상태가 양호하거나 인터넷 인프라가 강력한 지역에 살고 있다고 생각하더라도 좋은 넷코드는 여전히 필수입니다. 또한 최상의 네트워크에서도 정보 손실 또는 지연이 정기적으로 발생하며, 넷코드가 좋지 않으면 조건이 아무리 원활하더라도 시합을 방해할 수 있습니다. 좋은 넷코드는 또한 더 먼 거리에 있는 지역을 연결하여 글로벌 플레이어 기반을 효과적으로 통합하는 이점이 있습니다.

 


잘못된 넷코드는 경기를 망칠 수 있습니다. 두 명의 일본 선수가 온라인으로 진행한 이 경기는 누가 Capcom Pro Tour 결승전에 참가할 수 있는지에 영향을 미쳤습니다.

 

친구들과 오프라인에서 플레이하는 것을 선호하기 때문에 온라인 게임을 전혀 하지 않는 사람들은 어떻습니까? 좋은 넷코드가 게임을 중심으로 만드는 건강한 생태계는 모두에게 이익이 됩니다. 기술 비디오에서 온라인 토너먼트 관전, 덜 사용되는 캐릭터의 전략 확장에 이르기까지 더 많은 활동적인 플레이어가 있고 , 게임의 콘텐츠를 소비할 기회가 더 많아지며, 격투 게임 커뮤니티에서 게임을 둘러싼 열광이 더 커질 것입니다. Killer Instinct(격투 게임)의 우수한 게임 혈통에도 불구하고, 롤백 넷코드 기술이 해당 게임 커뮤니티의 지속적인 성장에 큰 역할을 했다는 데는 의심의 여지가 없습니다.

좋은 넷코드가 중요합니다. 이에 대해 이야기해 보겠습니다.

 

기본

두 가지 넷코드 전략이 어떻게 작동하는지 구체적으로 알아보기 전에 먼저 격투 게임에 적용되는 몇 가지 기본 규칙을 설정하고 몇 가지 용어를 소개해야 합니다.

격투 게임에서 시간은 프레임이라는 단위로 측정됩니다. 논의를 쉽게 하기 위해 모든 격투 게임이 초당 60프레임으로 작동한다고 가정합니다. 즉, 한 프레임은 실시간으로 약 16밀리초(ms)입니다.

중요한 것은 게임이 화면에 새 이미지를 렌더링하는 속도만이 아닙니다. 매 프레임마다 게임은 게임 루프(game loop)를 실행합니다. 게임 루프는 무엇보다도 플레이어의 컨트롤러에 입력을 요청하고, 네트워크에서 새로운 정보를 확인하고, CPU 플레이어에 대해 AI를 실행하고, 각 캐릭터가 수행하는 움직임에 애니메이션을 적용하고, 플레이어 중 누군가가 타격 판정을 받고 있는지 확인합니다. 이 모든 작업을 수행한 후 모든 계산 결과를 화면에 표시하고 나서 이 모든 과정(게임 루프)을 16밀리초 후에 다시 수행합니다. 격투 게임에서 이 루프는 컴퓨터 속도에 관계없이 게임을 플레이하는 모든 플레이어에게 엄격하고 일관되어야 합니다.

친구와 오프라인으로 격투 게임을 할 때 두 개의 컨트롤러를 하나의 컴퓨터나 콘솔에 연결합니다. 동일한 16밀리초 창 내에서 둘 다 버튼을 누르면 게임이 동일한 프레임에서 입력을 수신 및 처리하고 예상대로의 로직을 적용합니다. 계산을 수행하는 컴퓨터가 한 대뿐이므로 둘 다 동일한 출력을 볼 수 있습니다.

 

 

각 플레이어의 커맨드 입력은 하단에 표시됩니다. 오프라인으로 플레이할 때 두 플레이어를 누르는 즉시 모든 입력을 처리하는 데 문제가 없습니다.

 

각 플레이어의 커맨드 입력은 하단에 표시됩니다. 오프라인으로 플레이할 때 두 플레이어를 누르는 즉시 모든 입력을 처리하는 데 문제가 없습니다.

이러한 과정은 두 명의 플레이어가 인터넷을 통해 플레이할 때 다르게 됩니다.

우선, (커맨드 입력의) 정보는 항상 네트워크를 통해 전송하는 데 시간이 걸립니다. 이것은 정보가 다른 플레이어에게 전송된 다음 사용자에게 다시 전송되는 데 걸리는 시간인 핑(ping)으로 측정됩니다. 예를 들어, 90ms 핑으로 연결하면 정보가 반대쪽에 도달하는 데 평균 45ms가 소요되며 이는 3개의 게임 프레임입니다. 이것은 이제 게임이 게임 루프의 입력 부분을 처리하는 방법에 대해 스마트해야 함을 의미합니다. 원격 플레이어의 버튼 누름이 로컬 플레이어와 일치하는지 더 이상 보장할 수 없기 때문입니다.

 

온라인으로 플레이할 때 자신의 (커맨드) 입력은 여전히 즉시 처리되지만 원격 플레이어의 입력은 이제 네트워크를 통해 이동하는 데 시간이 걸립니다. 두 플레이어가 동기화된 상태를 유지하려면 게임에서 이를 처리하는 방법을 결정해야 합니다.

 

다음, 두 대의 다른 컴퓨터가 동시에 두 개의 게임 복사본을 실행하려고 하더라도 여전히 두 플레이어에게 동일한 결과를 생성해야 합니다. 그렇기 때문에 격투 게임을 결정론적(deterministic)으로 만드는 것은 좋은 아이디어입니다. 동일한 입력이 주어지면 게임을 실행하는 모든 기계가 동일한 결과를 생성해야 합니다. 이는 각 플레이어의 입력을 간단히 저장하고 항상 매치를 완벽하게 재구성할 수 있기 때문에 리플레이와 같은 비네트워킹 기능에 유용하지만, 이는 또한 게임이 온라인 매치를 플레이하기 위해 네트워크를 통해 플레이어 입력만 보내면 된다는 의미이기도 합니다. 우리는 게임 상태에 대한 복잡한 정보를 보내는 것을 피할 수 있고 많은 대역폭을 절약할 수 있습니다.

게임이 서로에게 정보를 보낸 다음 각각의 컴퓨터에 의존하여 시뮬레이션을 독립적으로 동기화하여 실행할 때, 이러한 방식을 ‘락스텝 네트워킹(lockstep networking)을 사용한다’라고 말합니다. 각 컴퓨터들은 일반적인 서버처럼 게임을 추적하고 무엇을 해야 하는지 알려주는 중개자(central authority)와 통신하지 않습니다. 대신, 그들은 같은 게임 상태를 가지고 있는지 주기적으로 서로 물어서 스스로를 감시합니다. 게임이 게임 상태에 대해 동의하지 않기 시작하면 동기화가 해제되고 아마도 게임은 완전히 무효화 될 것입니다. 게임이 서로 직접 대화하는 것은 중개자를 통해 강제로 대화하는 것보다 더 빠를 수 있으며 락스텝 솔루션은 특히 여러 유형의 부정 행위를 방지하는 데 좋습니다. 예를 들어 Ryu(*Street Fighters 시리즈의 캐릭터)가 더 빠른 불덩어리를 던질 수 있도록 게임을 해킹한 경우에도 게임 시뮬레이션이 당신의 시뮬레이션과 일치하지 않는다면 빠르게 동기화가 해제됩니다.

이제 이 모든 셋업이 끝나면 마침내 문제의 핵심에 도달할 수 있습니다. 록스텝 네트워킹을 사용하는 결정론적 격투 게임이 있는 경우 온라인 경기를 하는 데  필요한 핵심은 오로지 두 플레이어의 입력입니다. 격투 게임이 제때 받지 못한 플레이어 입력을 처리하는 이러한 “스마트한 방법”에 대해 이야기해 보겠습니다.

 

 

지연 기반 넷코드 (Delay-based netcode)

지연 기반(delay-based 또는 입력 지연이라고 하는 첫 번째 전략은 락스텝 네트워킹을 사용하는 게임에 대한 가장 간단하고 일반적인 구현 방법입니다. 원격 플레이어의 입력이 네트워크를 통해 전송되기 때문에 늦게 도착하는 경우, 이 전략은 단순히 로컬 플레이어의 입력을 같은 시간만큼 인위적으로 지연시킵니다. 그런 다음 이론적으로 두 입력이 동시에 “도착”하고 예상대로 동일한 프레임에서 실행할 수 있습니다.

이를 동영상 예제로 더 명확하게 설명하겠습니다. 여기에서 두 명의 플레이어가 핑이 90ms인 연결을 통해 지연 기반 넷코드를 사용하는 격투 게임인 UNIST를 플레이하고 있습니다. 이것은 상대방의 입력이 당신에게 도달하는 데 평균적으로 그 시간의 절반(45ms 또는 각각 16ms에서 약 3개의 게임 내 프레임)이 걸린다는 것을 의미합니다. 로컬 플레이어가 프레임 3에서 버튼을 누릅니다. 오프라인 플레이에서는 이 움직임이 즉시 애니메이션되기 시작하는 것을 볼 수 있지만 대신 게임은 입력을 3프레임 지연시키고 프레임 6에서 움직임을 실행하기 시작합니다.

 

지연 기반 넷코드에서는 로컬 플레이어가 버튼을 누르면 인위적으로 지연됩니다(여기서는 3프레임).

 

이 세 개의 추가 프레임은 프레임 3에서 상대의 입력이 인터넷을 통해 도달하는 데 필요한 시간을 줍니다. 프레임 6에서는 두 플레이어 모두로부터 입력을 받고 게임을 진행할 수 있습니다. 상대방의 모든 입력이 이 세 프레임에서 네트워크를 이동할 수 있는 한 게임은 안정적이고 일관되게 유지됩니다.

 

두 플레이어가 같은 프레임에서 버튼을 누릅니다. 로컬 플레이어에 대한 인위적인 지연은 원격 플레이어의 입력이 도달할 수 있는 시간을 제공하므로 동일한 프레임에서 계속 실행할 수 있습니다.

 

불행히도 이러한 방식은 인터넷의 현실과 동떨어져 있습니다.

 

지연 기반 넷코드의 문제

일단 문제는 입력이 조금이라도 지연되면 리액션과 게임 계획에 큰 영향을 미치기 때문에 게임을 오프라인처럼 플레이하기 어렵게 만든다는 것입니다. 지연이 이상적인 것은 아니지만 두세 프레임 정도의 작은 지연을 알아차리지 못하는 플레이어가 많습니다. 또 그것을 눈치채거나 훈련된 사람들에게는, 잘 짜여진 게임 디자인과 일관성 관리가 지연의 영향을 놀라울 정도로 잘 완화할 수 있고 여전히 온라인 플레이를 유용한 연습 방법을 만들 수도 있습니다.

더 큰 문제는 일관성(consistency)입니다. 네트워크는 일관성이 없는 것으로 악명이 높기 때문에 지연 기반 전략은 네트워크 변동을 처리하는 데 끔찍하기 때문에 어려움을 겪습니다. 연결에 스파이크가 있고 상대방의 일부 정보가 사용자에게 도달하는 데 예상되는 3프레임보다 약간 더 오래 걸린다고 가정합니다. 두 플레이어의 정보 없이는 게임을 진행할 수 없기 때문에 게임을 멈추고 입력이 올 때까지 기다려야 하며, 이로 인해 네트워크 문제가 장기간 지속되는 동안 게임이 꼬이고 비틀거리게 됩니다.

 

30% 속도에서 네트워크 문제가 발생하면 게임을 일시 중지해야 하는 것을 볼 수 있습니다. 다음 프레임별로 살펴보면 원격 플레이어의 입력이 6프레임 동안 손실되는 것을 보여주며 게임은 계속 진행하기 전에 거기에 앉아서 입력이 도착할 때까지 기다릴 수 밖에 없습니다.

 

잠시라도 게임을 일시 중지하는 것은 플레이어의 경험에 상당히 해롭기 때문에 대부분의 지연 기반 구현은 가능한 한 많이 발생하지 않도록 하려고 합니다. 네트워크 상태를 주시함으로써 현재 연결 상태와 일치하도록 즉석에서 입력 지연의 양을 변경할 수 있습니다. 그러나 네트워크 동작은 예측하기가 매우 어렵기 때문에 몇 번의 게임 일시 중지를 피하기에는 너무 늦게 변경되고 종종 필요한 것보다 더 오랫동안 입력 지연이 부풀려진 상태로 유지됩니다. 예를 들어, 롤백 접근 방식으로 전환하기 전에 Mortal Kombat X의 지연 기반 넷코드는 5~20프레임의 지연 사이에서 변동하고 스파이크가 몇 프레임에만 영향을 미쳤더라도 연결 스파이크로 인해 몇 초 동안 지연이 부풀려졌습니다. 이로 인해 플레이어가 보고하는 것보다 게임이 훨씬 더 지연되고 있다고 느끼는 경우가 발생할 수 있습니다.

 

Guilty Gear Xrd는 게임을 일시 중지하고 입력을 기다릴 필요가 없도록 즉석에서 입력 지연을 변경합니다. 변동이 작을 때도 있고 통제 불능 상태에서 벗어날 때도 있습니다.

 

지연 기반 넷코드는 또한 당신과 상대방 사이의 거리에 매우 민감합니다. 거리가 멀수록 네트워크를 통한 이동 시간이 증가하고 따라서 게임도 인위적인 입력 지연을 증가시켜야 하기 때문입니다. 거리는 넷코드 선택과 상관없이 모든 온라인 연결에 영향을 미치지만, 전 세계적으로 플레이어 기반을 통합하려는 시도는 고사하고 같은 시간대 지역에서도 지연 기반 게임을 플레이하는 것은 굉장히 어렵습니다.

마지막으로, 처음에는 분명하지 않을 수 있는 마지막 단점은 지연 기반 솔루션이 게임 상태를 신경 쓰지 않는다는 것입니다. 아나운서가 “Round 2, Fight”라고 부르든, 상대방이 쓰러지든, 두 플레이어가 중립적으로 돌아다니든, 지연 기반 게임은 모든 경우에서 연결 문제를 동일하게 처리합니다. 이는 상대의 입력이 경기에 전혀 영향을 미치지 않는 경우더라도 나쁜 연결 상태가 이러한 입력을 문제화시킨다는 것입니다.

궁극적으로 지연 기반 솔루션은 오프라인 플레이와 달리 플레이어 입력이 일관되지 않거나 반응이 좋지 않기 때문에 좋은 사용자 경험을 제공하지 못합니다. 격투 게임 플레이어는 반응과 반사 신경과 밀접하게 관련된 재현 가능하고 훈련 가능한 상황을 잘 활용합니다. ‘상대가 점프하면 나는 대공을 입력할 수 있다’든가, ‘이 콤보 시작점에서 머슬 메모리로 콤보를 계속할 수 있다’든가, ‘내가 상대를 쓰러뜨렸을 때 이것을 체화시켜 앞으로 그들을 제압할 수 있다’든가 등의 경우입니다. 입력 지연이 크게 변동하면 두 개의 서로 다른 경기 사이이든 같은 경기 중이든 상관없이 격투 게임 플레이어는 자신이 하는 모든 것이 예상대로 작동할 것이라는 확신을 잃습니다. 그리고 그들이 승리하는 데 도움이 될 게임 계획을 실행할 수 없을 때 온라인 플레이는 극도로 실망스럽고 종종 무용지물이 됩니다.

 

 

하지만 연결 상태가 좋으면 어떻게 될까요?

사람들은 그들의 연결을 극도로 과대평가합니다. 가까운 사람들과 빠르고 안정적인 연결을 가질 수는 있지만 다른 모든 잠재적인 플레이어와의 연결 품질을 제어하는 ​​것은 불가능합니다. 일부 플레이어는 멀리 떨어져 있거나 네트워크를 통해 정보를 빼먹는 경향이 더 높을 수 있습니다. 일반적으로 빠른 연결을 사용하는 서로 가까이 있는 두 사람이라도 어느 당사자가 제어할 수 없는 이유로 서로 안정적인 연결을 유지하는 데 어려움을 겪을 수 있습니다.

그러나 예, 적절하게 작은 입력 지연이 있는 일부 연결 하위 집합에서는 지연 기반 게임의 일부 일치가 잘 수행될 수 있습니다. 그러나 넷코드는 좋은 연결이 아닌 잘못된 연결을 처리하는 방식을 기준으로 판단해야 합니다. 항상 동기화되는 입력과의 완벽한 연결이 제공된다면 오프라인 플레이에 근접하는 스마트한 전략이 필요하지 않습니다. 게임은 이미 잘 되고 있으니까요! 지연을 교묘하게 숨기는 것이 넷코드의 역할이며, 네트워크 문제의 사소한 징후에도 전략이 무너지면 결국 효과적인 방법이 아닙니다.

 

지연 기반이 여전히 사용되는 이유는 무엇입니까?

많은 격투 게임이 지연 기반 넷코드를 구현하는 주된 이유는 상대적으로 간단하기 때문입니다. 게임 루프가 시작될 때 두 플레이어의 입력이 모두 제공된다고 항상 가정할 수 있으므로 게임 플레이 로직은 오프라인 플레이와 크게 다르지 않습니다. 또한 발생해야 하는 추가 게임 상태 처리가 없습니다. 즉, 게임이 오프라인 및 온라인 경기를 모두 실행하는 데 컴퓨터에서 거의 동일한 양의 리소스를 사용합니다. 베어본 온라인 모드를 제공하려는 개발자에게 가장 저렴하고 쉬운 옵션일 것입니다.

불행히도 미국에서 만들어진 거의 모든 격투 게임이 지연 기반 넷코드를 포기하고 롤백으로 전환했기 때문에 지연 기반 접근 방식을 계속 사용하는 것은 대부분 일본 개발자였습니다. 여기에는 Killer Instinct 및 Mortal Kombat 11과 같은 대형 퍼블리셔의 타이틀부터 Skullgirls, Punch Planet, Pocket Rumble 및 Them’s Fightin’ Herds와 같은 소규모 인디 게임에 이르는 타이틀이 포함됩니다. 미국과 유럽의 더 넓은 지리적 영역이 이 개발자들에게 넷코드를 더 큰 우선순위로 두도록 부추겼을 수도 있지만, 일본에서 플레이하는 사람들이 더 가까이 살고 강력한 온라인 인프라를 가지고 있다고 하더라도 나쁜 접속과 나쁜 넷코드의 좌절로부터 안전한 것은 아닙니다.

팬들의 주장과 업계 동향으로 인해 일본 개발자가 게임 옵션으로 롤백을 배제하는 경우도 점점 더 줄어들고 있습니다. 일본 최고의 격투 게임 개발자 중 하나인 Capcom은 3가지 다른 타이틀(Street Fighter x Tekken, Street Fighter V, Marvel vs. Capcom: Infinite)에서 넷코드 롤백을 시도했으며 다양한 성공을 거두었습니다. Arc System Works의 CCO(Chief Creative Officer)인 Daisuke Ishiwatari는 팬들이 롤백 넷코드에 대해 자신들을 괴롭히고 있다는 사실을 인정했지만 그들은 여전히 ​​2018년 Blazblue: Cross Tag Battle에서 지연 기반 넷코드를 사용하기로 결정했습니다. 일부 팬 및 심지어 일부 개발자은 특히 일본 스튜디오에 영향을 미치는 것처럼 보이는 이 문제를 해결하기 위한 그들만의 해결책을 작성하려는 일부 회사들의 선호에 기인할 수 있다는 이론을 주장했습니다. 커뮤니티에서 인기 있는 일본산 격투 게임이 너무 많기 때문에 지연 기반 넷코드가 계속해서 만연해 있습니다. 롤백 넷코드가 처음 개척된 지 10년이 넘었지만 EVO 2019의 9개 게임 중 2개만 온라인 멀티플레이어에 롤백을 사용했으며 이 두 게임 중 1개만 넷코드에 대한 팬의 좋은 반응을 얻었습니다.

이제 롤백이 어떻게 작동하는지 정확히 이야기할 때입니다.

 


(계속)


시리즈: 격투 게임이 지연 기반 넷코드 및 롤백 넷코드를 사용하는 방법에 대한 설명

 

원문

문의 | 코멘트 또는 yoonbumtae@gmail.com


카테고리: etc.


1개의 댓글

fan · 2023년 6월 5일 5:07 오전

와 정말 좋은 글 감사합니다

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다