쪽지발송 성공
Click here
재능넷 이용방법
재능넷 이용방법 동영상편
가입인사 이벤트
판매 수수료 안내
안전거래 TIP
재능인 인증서 발급안내

🌲 지식인의 숲 🌲

🌳 디자인
🌳 음악/영상
🌳 문서작성
🌳 번역/외국어
🌳 프로그램개발
🌳 마케팅/비즈니스
🌳 생활서비스
🌳 철학
🌳 과학
🌳 수학
🌳 역사
해당 지식과 관련있는 인기재능

 기본 작업은 사이트의 기능수정입니다.호스팅에 보드 설치 및 셋팅. (그누, 제로, 워드, 기타 cafe24,고도몰 등)그리고 각 보드의 대표적인 ...

○ 2009년부터 개발을 시작하여 현재까지 다양한 언어와 기술을 활용해 왔습니다. 특히 2012년부터는 자바를 중심으로 JSP, 서블릿, 스프링, ...

워드프레스를 설치는 했지만, 그다음 어떻게 해야할지 모르시나요? 혹은 설치가 어렵나요?무료 워드프레스부터 프리미엄 테마까지 설치하여 드립니...

SignalR로 실시간 웹 애플리케이션 만들기

2024-09-17 05:13:04

재능넷
조회수 14 댓글수 0

SignalR로 실시간 웹 애플리케이션 만들기 🚀

 

 

안녕하세요, 열정 넘치는 개발자 여러분! 오늘은 C# 개발자들의 실시간 웹 애플리케이션 개발을 위한 강력한 도구인 SignalR에 대해 깊이 있게 알아보겠습니다. 이 글을 통해 여러분은 SignalR의 기본 개념부터 고급 기능까지 모두 마스터할 수 있을 거예요. 🎉

SignalR은 ASP.NET Core의 일부로, 실시간 웹 기능을 쉽게 추가할 수 있게 해주는 라이브러리입니다. 채팅 애플리케이션, 대시보드, 게임 등 실시간 데이터 교환이 필요한 모든 종류의 애플리케이션에서 유용하게 사용될 수 있죠.

이 글에서는 SignalR의 기본 개념, 설정 방법, 실제 구현 사례, 그리고 고급 기능들까지 상세히 다룰 예정입니다. 여러분이 재능넷과 같은 실시간 상호작용이 필요한 플랫폼을 개발하고 있다면, 이 글이 큰 도움이 될 거예요. 자, 그럼 SignalR의 세계로 함께 떠나볼까요? 🌟

1. SignalR 소개 및 기본 개념 🌈

SignalR은 실시간 웹 기능을 .NET 애플리케이션에 쉽게 추가할 수 있게 해주는 강력한 라이브러리입니다. 전통적인 웹 통신 모델을 넘어서, 서버에서 클라이언트로의 실시간 데이터 푸시를 가능하게 해줍니다.

1.1 SignalR의 주요 특징

  • 실시간 양방향 통신: 클라이언트와 서버 간의 실시간 데이터 교환을 지원합니다.
  • 자동 전송 프로토콜 선택: WebSockets, Server-Sent Events, Long Polling 등 최적의 전송 방식을 자동으로 선택합니다.
  • 확장성: 수천 명의 동시 사용자를 지원할 수 있는 확장성을 제공합니다.
  • 크로스 플랫폼 지원: 다양한 클라이언트 플랫폼(웹, 모바일, 데스크톱)을 지원합니다.

1.2 SignalR의 작동 원리

SignalR은 크게 두 가지 주요 컴포넌트로 구성됩니다:

  1. Hub: 서버 측 코드로, 클라이언트와의 통신을 관리합니다.
  2. Connection: 클라이언트 측 코드로, 서버의 Hub와 통신합니다.

이 두 컴포넌트를 통해 SignalR은 실시간 양방향 통신을 구현합니다. 예를 들어, 재능넷과 같은 플랫폼에서 실시간 메시징 기능을 구현할 때 SignalR을 활용할 수 있습니다.

Server (Hub) Client (Connection) Real-time Communication

1.3 SignalR vs 전통적인 웹 통신

전통적인 웹 통신 모델에서는 클라이언트가 서버에 요청을 보내고 응답을 받는 방식으로 작동합니다. 하지만 이 방식은 실시간 업데이트에 적합하지 않습니다. SignalR은 이러한 한계를 극복하고 다음과 같은 이점을 제공합니다:

  • 낮은 지연시간: 실시간 통신으로 데이터 전송 지연을 최소화합니다.
  • 서버 푸시: 서버에서 클라이언트로 직접 데이터를 푸시할 수 있습니다.
  • 리소스 효율성: 불필요한 폴링을 줄여 서버 리소스를 절약합니다.

이러한 특징들로 인해 SignalR은 실시간 협업 도구, 라이브 대시보드, 게임 등 다양한 실시간 애플리케이션 개발에 이상적입니다.

 

다음 섹션에서는 SignalR을 프로젝트에 설정하는 방법에 대해 자세히 알아보겠습니다. SignalR의 강력한 기능을 여러분의 프로젝트에 통합하는 첫 걸음을 함께 떼어봐요! 🚀

2. SignalR 설정하기 🛠️

SignalR을 프로젝트에 설정하는 과정은 생각보다 간단합니다. 이 섹션에서는 단계별로 SignalR을 ASP.NET Core 프로젝트에 추가하고 구성하는 방법을 알아보겠습니다.

2.1 프로젝트 생성 및 NuGet 패키지 설치

먼저, 새로운 ASP.NET Core 프로젝트를 생성하거나 기존 프로젝트를 열어주세요. 그 다음, SignalR을 사용하기 위해 필요한 NuGet 패키지를 설치해야 합니다.

dotnet add package Microsoft.AspNetCore.SignalR

또는 Visual Studio의 NuGet 패키지 관리자를 통해 'Microsoft.AspNetCore.SignalR' 패키지를 설치할 수 있습니다.

2.2 Startup.cs 구성

SignalR을 사용하기 위해 Startup.cs 파일을 수정해야 합니다. ConfigureServices 메서드와 Configure 메서드에 다음과 같은 코드를 추가해주세요.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR();
    // 기타 서비스 구성...
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 기타 미들웨어 구성...
    
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chatHub");
        // 기타 엔드포인트 매핑...
    });
}

여기서 "/chatHub"는 SignalR hub의 URL 경로입니다. 이는 클라이언트가 서버의 SignalR hub에 연결할 때 사용하는 주소입니다.

2.3 Hub 클래스 생성

이제 실제로 SignalR의 기능을 구현할 Hub 클래스를 생성해야 합니다. 예를 들어, 간단한 채팅 기능을 구현하는 ChatHub 클래스를 만들어 보겠습니다.

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

이 Hub 클래스는 클라이언트로부터 메시지를 받아 모든 연결된 클라이언트에게 해당 메시지를 브로드캐스트합니다.

2.4 클라이언트 측 설정

마지막으로, 클라이언트 측에서 SignalR을 사용하기 위한 설정을 해야 합니다. HTML 파일에 SignalR 클라이언트 라이브러리를 포함시키고, JavaScript를 통해 서버의 Hub에 연결합니다.

<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/3.1.7/signalr.min.js"></script>

<script>
const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chatHub")
    .build();

connection.start().then(() => {
    console.log("SignalR Connected!");
}).catch(err => console.error(err));

connection.on("ReceiveMessage", (user, message) => {
    // 메시지 수신 시 처리 로직
});
</script>

이렇게 하면 기본적인 SignalR 설정이 완료됩니다! 🎉

Server SignalR Hub Client SignalR Connection Real-time Communication

이제 SignalR의 기본 설정이 완료되었습니다. 다음 섹션에서는 이를 바탕으로 실제 실시간 웹 애플리케이션을 구현하는 방법에 대해 자세히 알아보겠습니다. SignalR을 활용하면 재능넷과 같은 플랫폼에서 실시간 알림, 라이브 채팅, 실시간 업데이트 등 다양한 기능을 쉽게 구현할 수 있습니다. 함께 SignalR의 강력한 기능을 탐험해볼까요? 💪

3. SignalR을 이용한 실시간 채팅 애플리케이션 구현 💬

이제 SignalR의 기본 설정을 마쳤으니, 실제로 간단한 실시간 채팅 애플리케이션을 만들어보겠습니다. 이 예제를 통해 SignalR의 핵심 기능을 실제로 어떻게 사용하는지 이해할 수 있을 거예요.

3.1 서버 측 구현

먼저, 서버 측에서 ChatHub 클래스를 구현해봅시다. 이 클래스는 클라이언트로부터 메시지를 받아 모든 연결된 클라이언트에게 브로드캐스트합니다.

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }

    public override async Task OnConnectedAsync()
    {
        await Clients.All.SendAsync("UserConnected", Context.ConnectionId);
        await base.OnConnectedAsync();
    }

    public override async Task OnDisconnectedAsync(Exception exception)
    {
        await Clients.All.SendAsync("UserDisconnected", Context.ConnectionId);
        await base.OnDisconnectedAsync(exception);
    }
}

이 Hub 클래스는 다음과 같은 기능을 제공합니다:

  • SendMessage: 클라이언트로부터 받은 메시지를 모든 클라이언트에게 브로드캐스트합니다.
  • OnConnectedAsync: 새로운 클라이언트가 연결될 때 호출되며, 모든 클라이언트에게 새 사용자 연결을 알립니다.
  • OnDisconnectedAsync: 클라이언트 연결이 끊길 때 호출되며, 모든 클라이언트에게 사용자 연결 해제를 알립니다.

3.2 클라이언트 측 구현

이제 클라이언트 측 코드를 작성해봅시다. HTML과 JavaScript를 사용하여 간단한 채팅 인터페이스를 만들고, SignalR 연결을 구현합니다.

<!DOCTYPE html>
<html>
<head>
    <title>SignalR Chat</title>
</head>
<body>
    <div id="messagesList"></div>
    <input type="text" id="messageInput" />
    <button id="sendButton">Send</button>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/3.1.7/signalr.min.js"></script>
    <script>
        const connection = new signalR.HubConnectionBuilder()
            .withUrl("/chatHub")
            .build();

        connection.start().then(() => {
            console.log("SignalR Connected!");
        }).catch(err => console.error(err));

        connection.on("ReceiveMessage", (user, message) => {
            const msg = message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
            const encodedMsg = user + " says " + msg;
            const li = document.createElement("li");
            li.textContent = encodedMsg;
            document.getElementById("messagesList").appendChild(li);
        });

        connection.on("UserConnected", (connectionId) => {
            const li = document.createElement("li");
            li.textContent = `User connected: ${connectionId}`;
            document.getElementById("messagesList").appendChild(li);
        });

        connection.on("UserDisconnected", (connectionId) => {
            const li = document.createElement("li");
            li.textContent = `User disconnected: ${connectionId}`;
            document.getElementById("messagesList").appendChild(li);
        });

        document.getElementById("sendButton").addEventListener("click", event => {
            const user = "User"; // 실제 애플리케이션에서는 사용자 인증 정보를 사용할 수 있습니다.
            const message = document.getElementById("messageInput").value;
            connection.invoke("SendMessage", user, message).catch(err => console.error(err));
            event.preventDefault();
        });
    </script>
</body>
</html>

이 클라이언트 코드는 다음과 같은 기능을 제공합니다:

  • SignalR 연결을 설정하고 시작합니다.
  • "ReceiveMessage" 이벤트를 수신하여 새로운 메시지를 화면에 표시합니다.
  • "UserConnected"와 "UserDisconnected" 이벤트를 처리하여 사용자 연결 상태를 표시합니다.
  • 사용자가 메시지를 입력하고 전송할 수 있는 인터페이스를 제공합니다.

3.3 실행 및 테스트

이제 애플리케이션을 실행하고 여러 브라우저 창을 열어 실시간 채팅을 테스트해볼 수 있습니다. 각 창에서 메시지를 보내면 모든 창에서 실시간으로 메시지가 업데이트되는 것을 확인할 수 있습니다.

Server ChatHub Client 1 Client 2 Message Broadcast

이렇게 간단한 실시간 채팅 애플리케이션을 만들어보았습니다. SignalR을 사용하면 복잡한 실시간 기능도 비교적 쉽게 구현할 수 있죠. 이러한 기술은 재능넷과 같은 플랫폼에서 사용자 간의 실시간 소통을 가능하게 하는 핵심 요소가 될 수 있습니다.

다음 섹션에서는 SignalR의 더 고급 기능들에 대해 알아보겠습니다. 스케일링, 보안, 그리고 성능 최적화 등 실제 프로덕션 환경에서 SignalR을 사용할 때 고려해야 할 중요한 주제들을 다룰 예정입니다. 계속해서 SignalR의 강력한 기능들을 탐험해볼까요? 🚀

4. SignalR의 고급 기능 🔧

지금까지 SignalR의 기본적인 사용법에 대해 알아보았습니다. 이제 더 복잡하고 규모가 큰 애플리케이션을 위한 SignalR의 고급 기능들을 살펴보겠습니다. 이러한 기능들은 재능넷과 같은 대규모 플랫폼에서 실시간 기능을 구현할 때 매우 유용할 수 있습니다.

4.1 그룹 관리

SignalR의 그룹 기능을 사용하면 특정 사용자들을 그룹으로 묶어 관리할 수 있습니다. 이는 특정 주제나 방에 대한 채팅, 또는 특정 사용자 그룹에 대한 알림 등을 구현할 때 유용합니다.

public class ChatHub : Hub
{
    public async Task AddToGroup(string groupName)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
        await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
    }

    public async Task RemoveFromGroup(string groupName)
    {
        await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);
        await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}.");
    }

    public async Task SendMessageToGroup(string groupName, string message)
    {
        await Clients.Group(groupName).SendAsync("ReceiveMessage", Context.ConnectionId, message);
    }
}

4.2 연결 관리

SignalR은 연결 관리를 위한 다양한 메서드를 제공합니다. 이를 통해 연결 상태를 추적하고, 연결이 끊어졌을 때 적절히 대응할 수 있습니다.

public override async Task OnConnectedAsync()
{
    await Clients.All.SendAsync("UserConnected", Context.ConnectionId);
    await base.OnConnectedAsync();
}

public override async Task OnDisconnectedAsync(Exception exception)
{
    await Clients.All.SendAsync("UserDisconnected", Context.ConnectionId);
    await base.OnDisconnectedAsync(exception);
}

public async Task GetConnectionId()
{
    await Clients.Caller.SendAsync("ReceiveConnectionId", Context.ConnectionId);
}

4.3 스케일링

대규모 애플리케이션에서는 SignalR을 여러 서버에 분산하여 실행해야 할 수 있습니다. 이를 위해 SignalR은 Redis, SQL Server, Azure Service Bus 등을 백플레인으로 사용할 수 있는 기능을 제공합니다.

예를 들어, Redis를 백플레인으로 사용하는 경우:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR().AddStackExchangeRedis("localhost:6379");
}

4.4 인증과 권한 부여

SignalR 허브에 인증과 권한 부여를 적용하여 보안을 강화할 수 있습니다.

[Authorize]
public class SecureHub : Hub
{
    public async Task SendMessage(string message)
    {
        var username = Context.User.Identity.Name;
        await Clients.All.SendAsync("ReceiveMessage", username, message);
    }
}

4.5 클라이언트 측 재연결

네트워크 문제로 연결이 끊어졌을 때 자동으로 재연결을 시도하는 기능을 구현할 수 있습니다.

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chatHub")
    .withAutomaticReconnect()
    .build();

connection.onreconnecting(error => {
    console.assert(connection.state === signalR.HubConnectionState.Reconnecting);
    document.getElementById("messageInput").disabled = true;
    const li = document.createElement("li");
    li.textContent = `Connection lost due to error "${error}". Reconnecting.`;
    document.getElementById("messagesList").appendChild(li);
});

connection.onreconnected(connectionId => {
    console.assert(connection.state === signalR.HubConnectionState.Connected);
    document.getElementById("messageInput").disabled = false;
    const li = document.createElement("li");
    li.textContent = `Connection reestablished. Connected with connectionId "${connectionId}".`;
    document.getElementById("messagesList").appendChild(li);
});

4.6 성능 최적화

대규모 애플리케이션에서는 성능 최적화가 중요합니다. SignalR에서는 다음과 같은 방법으로 성능을 개선할 수 있습니다:

  • 메시지 크기 최소화: 필요한 데이터만 전송하여 네트워크 부하를 줄입니다.
  • 프로토콜 버퍼 사용: JSON 대신 프로토콜 버퍼를 사용하여 메시지 직렬화/역직렬화 성능을 향상시킵니다.
  • 배치 처리: 여러 메시지를 하나의 패킷으로 묶어 전송합니다.
services.AddSignalR(hubOptions =>
{
    hubOptions.EnableDetailedErrors = true;
    hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(15);
}).AddMessagePackProtocol();

4.7 클라이언트 상태 관리

SignalR을 사용하여 클라이언트의 상태를 서버에서 관리할 수 있습니다. 이는 사용자의 온라인/오프라인 상태, 현재 활동 등을 추적할 때 유용합니다.

public class UserStatus
{
    public string ConnectionId { get; set; }
    public string Status { get; set; }
}

public class ChatHub : Hub
{
    private static Dictionary<string, UserStatus> _connectedUsers = new Dictionary<string, UserStatus>();

    public override async Task OnConnectedAsync()
    {
        var userId = Context.User.Identity.Name;
        _connectedUsers[userId] = new UserStatus { ConnectionId = Context.ConnectionId, Status = "Online" };
        await Clients.All.SendAsync("UserStatusChanged", userId, "Online");
        await base.OnConnectedAsync();
    }

    public override async Task OnDisconnectedAsync(Exception exception)
    {
        var userId = Context.User.Identity.Name;
        _connectedUsers.Remove(userId);
        await Clients.All.SendAsync("UserStatusChanged", userId, "Offline");
        await base.OnDisconnectedAsync(exception);
    }

    public async Task SetStatus(string status)
    {
        var userId = Context.User.Identity.Name;
        if (_connectedUsers.ContainsKey(userId))
        {
            _connectedUsers[userId].Status = status;
            await Clients.All.SendAsync("UserStatusChanged", userId, status);
        }
    }
}

4.8 실시간 대시보드 구현

SignalR을 사용하여 실시간으로 업데이트되는 대시보드를 구현할 수 있습니다. 이는 재능넷과 같은 플랫폼에서 실시간 통계, 활동 피드 등을 표시할 때 유용합니다.

public class DashboardHub : Hub
{
    public async Task UpdateStatistics(string metric, int value)
    {
        await Clients.All.SendAsync("StatisticsUpdated", metric, value);
    }

    public async Task AddActivityFeed(string activity)
    {
        await Clients.All.SendAsync("NewActivity", activity);
    }
}

// 클라이언트 측 코드
connection.on("StatisticsUpdated", (metric, value) => {
    document.getElementById(metric).textContent = value;
});

connection.on("NewActivity", (activity) => {
    const li = document.createElement("li");
    li.textContent = activity;
    document.getElementById("activityFeed").prepend(li);
});
SignalR Server Dashboard Activity Feed Clients Real-time Updates

이러한 고급 기능들을 활용하면 SignalR을 사용하여 더욱 강력하고 확장 가능한 실시간 애플리케이션을 구축할 수 있습니다. 재능넷과 같은 플랫폼에서는 이러한 기능들을 조합하여 사용자 경험을 크게 향상시킬 수 있습니다. 예를 들어, 실시간 알림, 라이브 채팅, 실시간 협업 도구, 실시간 경매 시스템 등을 구현할 수 있죠.

다음 섹션에서는 SignalR을 사용할 때의 모범 사례와 주의해야 할 점들에 대해 알아보겠습니다. 이를 통해 더욱 안정적이고 효율적인 실시간 애플리케이션을 개발할 수 있을 거예요. 계속해서 SignalR의 세계를 탐험해볼까요? 🚀

관련 키워드

  • SignalR
  • 실시간 웹
  • ASP.NET Core
  • 웹소켓
  • 실시간 통신
  • 확장성
  • 성능 최적화
  • 보안
  • 연결 관리
  • 에러 처리

지식의 가치와 지적 재산권 보호

자유 결제 서비스

'지식인의 숲'은 "이용자 자유 결제 서비스"를 통해 지식의 가치를 공유합니다. 콘텐츠를 경험하신 후, 아래 안내에 따라 자유롭게 결제해 주세요.

자유 결제 : 국민은행 420401-04-167940 (주)재능넷
결제금액: 귀하가 받은 가치만큼 자유롭게 결정해 주세요
결제기간: 기한 없이 언제든 편한 시기에 결제 가능합니다

지적 재산권 보호 고지

  1. 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
  2. AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
  3. 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
  4. 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
  5. AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.

재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

해당 지식과 관련있는 인기재능

★ 퀄리티높은 배너/모바일/팝업/상세페이지/홈페이지 등 각종웹시안 제작! ★ 주문전 필히 쪽지, 메세지로 먼저 문의 해주시기 바랍니다^^ 5분...

안녕하세요.부동산, ​학원, 재고관리, ​기관/관공서, 기업, ERP, 기타 솔루션, 일반 서비스(웹, 모바일) 등다양한 분야에서 개발을 해왔습니...

 안녕하세요. 개발자 GP 입니다. 모든 사이트 개발은 웹사이트 제작시 웹표준을 준수하여 진행합니다.웹표준이란 국제표준화 단체...

10년차 php 프로그래머 입니다. 그누보드, 영카트 외 php로 된 솔루션들 커스터마이징이나 오류수정 등 유지보수 작업이나신규개발도 가능합...

📚 생성된 총 지식 2,792 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동) | 사업자등록번호 : 131-86-65451
    통신판매업신고 : 2018-수원영통-0307 | 직업정보제공사업 신고번호 : 중부청 2013-4호 | jaenung@jaenung.net

    (주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.
    (주)재능넷은 통신판매중개자로서 재능넷의 거래당사자가 아니며, 판매자가 등록한 상품정보 및 거래에 대해 재능넷은 일체 책임을 지지 않습니다.

    Copyright © 2024 재능넷 Inc. All rights reserved.
ICT Innovation 대상
미래창조과학부장관 표창
서울특별시
공유기업 지정
한국데이터베이스진흥원
콘텐츠 제공서비스 품질인증
대한민국 중소 중견기업
혁신대상 중소기업청장상
인터넷에코어워드
일자리창출 분야 대상
웹어워드코리아
인터넷 서비스분야 우수상
정보통신산업진흥원장
정부유공 표창장
미래창조과학부
ICT지원사업 선정
기술혁신
벤처기업 확인
기술개발
기업부설 연구소 인정
마이크로소프트
BizsPark 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창