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

🌲 지식인의 숲 🌲

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

 >>>서비스 설명<<<저렴한 가격, 합리적인 가격, 최적의 공수로윈도우 프로그램을 제작해 드립니다고객이 원하는 프로그램...

안녕하세요!!!고객님이 상상하시는 작업물 그 이상을 작업해 드리려 노력합니다.저는 작업물을 완성하여 고객님에게 보내드리는 것으로 거래 완료...

30년간 직장 생활을 하고 정년 퇴직을 하였습니다.퇴직 후 재능넷 수행 내용은 쇼핑몰/학원/판매점 등 관리 프로그램 및 데이터 ...

AS규정기본적으로 A/S 는 평생 가능합니다. *. 구매자의 요청으로 수정 및 보완이 필요한 경우 일정 금액의 수고비를 상호 협의하에 요청 할수 있...

Spring Boot와 WebSocket을 이용한 실시간 통신 구현

2024-09-09 22:36:42

재능넷
조회수 1176 댓글수 0

Spring Boot와 WebSocket을 이용한 실시간 통신 구현 🚀

 

 

안녕하세요, 개발자 여러분! 오늘은 Spring Boot와 WebSocket을 활용하여 실시간 통신을 구현하는 방법에 대해 자세히 알아보겠습니다. 이 기술은 현대 웹 애플리케이션에서 매우 중요한 역할을 하며, 특히 실시간 업데이트가 필요한 서비스에서 필수적입니다. 재능넷과 같은 플랫폼에서도 실시간 알림이나 채팅 기능을 구현할 때 이러한 기술이 활용될 수 있죠.

 

이 글을 통해 여러분은 WebSocket의 기본 개념부터 Spring Boot에서의 구현 방법, 그리고 실제 프로젝트에 적용하는 방법까지 상세히 배우게 될 것입니다. 그럼 지금부터 실시간 통신의 세계로 함께 떠나볼까요? 🌟

1. WebSocket 이해하기 📡

WebSocket은 웹 브라우저와 서버 간의 실시간, 양방향 통신을 가능하게 하는 프로토콜입니다. 전통적인 HTTP 통신과는 달리, WebSocket은 연결을 한 번 수립하면 그 연결을 통해 지속적으로 데이터를 주고받을 수 있습니다.

 

WebSocket의 주요 특징:

  • 실시간 양방향 통신
  • 낮은 지연 시간
  • 효율적인 리소스 사용
  • 프로토콜 오버헤드 감소

 

WebSocket은 HTTP와 어떻게 다를까요? HTTP는 클라이언트가 요청을 보내고 서버가 응답하는 방식으로 작동합니다. 반면, WebSocket은 연결이 수립된 후에는 클라이언트나 서버 어느 쪽에서든 자유롭게 메시지를 보낼 수 있습니다.

 

이러한 특성 때문에 WebSocket은 다음과 같은 애플리케이션에 특히 유용합니다:

  • 실시간 채팅 앱
  • 라이브 스트리밍 서비스
  • 실시간 협업 도구
  • 게임
  • 금융 거래 플랫폼

 

Client Server WebSocket Connection Bi-directional Communication

위 다이어그램은 WebSocket의 양방향 통신을 시각적으로 보여줍니다. 클라이언트와 서버 사이에 지속적인 연결이 유지되며, 양쪽에서 자유롭게 메시지를 주고받을 수 있습니다.

 

WebSocket 연결 과정:

  1. 클라이언트가 서버에 WebSocket 연결 요청을 보냅니다.
  2. 서버가 요청을 수락하고 핸드셰이크를 완료합니다.
  3. WebSocket 연결이 수립되고, 양방향 통신이 가능해집니다.
  4. 연결이 유지되는 동안 클라이언트와 서버는 자유롭게 메시지를 교환합니다.
  5. 어느 한 쪽에서 연결을 종료하면 WebSocket 연결이 닫힙니다.

 

💡 Pro Tip: WebSocket은 실시간성이 중요한 애플리케이션에 매우 유용하지만, 모든 상황에 적합한 것은 아닙니다. 간단한 요청-응답 패턴의 통신에는 기존의 HTTP가 더 적합할 수 있습니다. 프로젝트의 요구사항을 잘 분석하여 적절한 기술을 선택하는 것이 중요합니다.

이제 WebSocket의 기본 개념을 이해했으니, 다음 섹션에서는 Spring Boot에서 WebSocket을 어떻게 구현하는지 자세히 알아보겠습니다. Spring Boot는 WebSocket 구현을 위한 강력한 도구와 추상화를 제공하여 개발자가 쉽게 실시간 통신 기능을 구현할 수 있도록 돕습니다. 🛠️

2. Spring Boot에서의 WebSocket 구현 🌱

Spring Boot는 WebSocket을 구현하기 위한 강력한 지원을 제공합니다. 이를 통해 개발자는 복잡한 저수준 details에 신경 쓰지 않고도 효과적으로 실시간 통신 기능을 구현할 수 있습니다. 이 섹션에서는 Spring Boot에서 WebSocket을 구현하는 방법을 단계별로 살펴보겠습니다.

 

2.1 의존성 추가

먼저, 프로젝트의 pom.xml 파일에 WebSocket 관련 의존성을 추가해야 합니다:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

 

2.2 WebSocket 구성

다음으로, WebSocket을 구성하기 위한 설정 클래스를 만들어야 합니다:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyWebSocketHandler(), "/websocket")
                .setAllowedOrigins("*");
    }
}

이 설정은 /websocket 엔드포인트로 들어오는 WebSocket 연결을 처리할 핸들러를 등록합니다.

 

2.3 WebSocket 핸들러 구현

이제 실제로 WebSocket 메시지를 처리할 핸들러를 구현해야 합니다:

import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class MyWebSocketHandler extends TextWebSocketHandler {

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        // 메시지 처리 로직
        session.sendMessage(new TextMessage("서버에서 받은 메시지: " + payload));
    }
}

이 핸들러는 클라이언트로부터 받은 메시지를 처리하고, 응답을 다시 클라이언트에게 보냅니다.

 

2.4 클라이언트 측 구현

서버 측 구현이 완료되었다면, 이제 클라이언트 측에서 WebSocket 연결을 설정하고 메시지를 주고받을 수 있습니다. 다음은 JavaScript를 사용한 간단한 예시입니다:

const socket = new WebSocket('ws://localhost:8080/websocket');

socket.onopen = function(e) {
    console.log("연결이 열렸습니다.");
};

socket.onmessage = function(event) {
    console.log(`서버로부터 메시지를 받았습니다: ${event.data}`);
};

socket.onclose = function(event) {
    if (event.wasClean) {
        console.log(`연결이 정상적으로 종료되었습니다, 코드=${event.code} 이유=${event.reason}`);
    } else {
        console.log('연결이 끊겼습니다');
    }
};

socket.onerror = function(error) {
    console.log(`[error] ${error.message}`);
};

// 메시지 전송
socket.send("Hello, Server!");

 

⚠️ 주의: 실제 프로덕션 환경에서는 보안을 위해 WebSocket 연결에 SSL/TLS를 사용해야 합니다. 또한, 클라이언트의 origin을 적절히 제한하여 무단 접근을 방지해야 합니다.

 

2.5 STOMP 프로토콜 사용

더 복잡한 메시징 시나리오를 위해 Spring은 STOMP(Simple Text Oriented Messaging Protocol) 프로토콜을 지원합니다. STOMP를 사용하면 pub-sub 모델을 쉽게 구현할 수 있고, 메시지 라우팅과 같은 고급 기능을 활용할 수 있습니다.

STOMP를 사용하려면 다음과 같이 설정을 변경해야 합니다:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket-endpoint").withSockJS();
    }
}

이 설정은 /topic으로 시작하는 목적지로 메시지를 브로드캐스트하는 간단한 메시지 브로커를 활성화하고, /app으로 시작하는 메시지를 @MessageMapping 메서드로 라우팅합니다.

 

2.6 메시지 핸들링

STOMP를 사용할 때 메시지 핸들링은 다음과 같이 할 수 있습니다:

@Controller
public class MessageController {

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // 처리 시간을 시뮬레이션
        return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
    }
}

이 컨트롤러는 /app/hello로 전송된 메시지를 처리하고, 결과를 /topic/greetings로 브로드캐스트합니다.

 

Client Server STOMP over WebSocket /app/hello /topic/greetings

위 다이어그램은 STOMP를 사용한 WebSocket 통신의 흐름을 보여줍니다. 클라이언트는 /app/hello로 메시지를 보내고, 서버는 이를 처리한 후 /topic/greetings로 응답을 브로드캐스트합니다.

 

💡 Pro Tip: STOMP를 사용하면 메시지 라우팅, 인증, 권한 부여 등의 복잡한 시나리오를 쉽게 구현할 수 있습니다. 대규모 실시간 애플리케이션을 개발할 때 STOMP의 사용을 고려해보세요.

Spring Boot와 WebSocket을 결합하면 강력하고 확장 가능한 실시간 통신 시스템을 구축할 수 있습니다. 이는 채팅 애플리케이션, 실시간 협업 도구, 게임 등 다양한 분야에서 활용될 수 있습니다. 재능넷과 같은 플랫폼에서도 이러한 기술을 활용하여 사용자 경험을 크게 향상시킬 수 있을 것입니다. 🚀

다음 섹션에서는 실제 프로젝트에 이러한 기술을 적용하는 방법과 고려해야 할 사항들에 대해 더 자세히 알아보겠습니다.

3. 실제 프로젝트 적용 및 고려사항 🏗️

지금까지 Spring Boot와 WebSocket의 기본적인 구현 방법에 대해 알아보았습니다. 이제 실제 프로젝트에 이를 적용할 때 고려해야 할 사항들과 더 발전된 기술들에 대해 살펴보겠습니다.

 

3.1 확장성 고려

실제 프로덕션 환경에서는 많은 동시 연결을 처리해야 할 수 있습니다. 이를 위해 다음과 같은 전략을 고려해볼 수 있습니다:

  • 클러스터링: 여러 서버에 부하를 분산시켜 처리 능력을 향상시킵니다.
  • 메시지 브로커 사용: RabbitMQ나 Apache Kafka와 같은 메시지 브로커를 사용하여 메시지 처리를 분산시킵니다.
  • 비동기 처리: 블로킹 작업을 비동기로 처리하여 서버의 처리 능력을 최적화합니다.

 

📊 성능 최적화 팁

WebSocket 연결은 지속적으로 유지되므로, 서버 리소스를 효율적으로 관리하는 것이 중요합니다. 연결 풀링, 메시지 배치 처리, 적절한 타임아웃 설정 등을 통해 시스템의 전반적인 성능을 개선할 수 있습니다.

 

3.2 보안 고려사항

실시간 통신에서 보안은 매우 중요한 요소입니다. 다음과 같은 보안 조치를 고려해야 합니다:

  • SSL/TLS 사용: 모든 WebSocket 통신을 암호화하여 데이터 보안을 강화합니다.
  • 인증 및 권한 부여: WebSocket 연결 시 사용자 인증을 수행하고, 메시지 처리 시 적절한 권한 체크를 수행합니다.
  • 입력 유효성 검사: 클라이언트로부터 받은 모든 데이터에 대해 철저한 유효성 검사를 수행합니다.
  • Rate Limiting: 과도한 메시지 전송을 방지하기 위해 클라이언트별 메시지 전송 속도를 제한합니다.

 

@Configuration
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {

    @Override
    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
        messages
            .simpDestMatchers("/app/**").authenticated()
            .simpSubscribeDestMatchers("/topic/**").authenticated()
            .anyMessage().denyAll();
    }

    @Override
    protected boolean sameOriginDisabled() {
        return true;
    }
}

이 설정은 WebSocket 메시지에 대한 보안을 구성합니다. 인증된 사용자만 특정 목적지로 메시지를 보내거나 구독할 수 있도록 제한합니다.

 

3.3 에러 처리 및 복구 전략

실시간 통신에서는 네트워크 불안정성이나 서버 오류 등으로 인한 연결 끊김 상황에 대비해야 합니다:

  • 자동 재연결: 클라이언트 측에서 연결이 끊어졌을 때 자동으로 재연결을 시도하는 로직을 구현합니다.
  • 메시지 큐잉: 연결이 끊어진 동안 전송되지 못한 메시지를 큐에 저장했다가 재연결 시 전송합니다.
  • 상태 동기화: 재연결 후 클라이언트의 상태를 서버와 동기화하는 메커니즘을 구현합니다.

 

Client Server Connection Lost Auto Reconnect Error Handling

위 다이어그램은 연결 끊김 상황과 자동 재연결 프로세스를 보여줍니다. 에러 처리 메커니즘이 작동하여 연결을 복구하고 통신을 재개합니다.

 

3.4 테스트 전략

WebSocket 기반의 실시간 통신 시스템을 테스트하는 것은 전통적인 HTTP 기반 시스템을 테스트하는 것과는 다소 차이가 있습니다. 다음과 같은 테스트 전략을 고려해볼 수 있습니다:

  • 단위 테스트: WebSocket 핸들러와 관련 비즈니스 로직에 대한 단위 테스트를 작성합니다.
  • 통합 테스트: Spring의 테스트 지원을 활용하여 WebSocket 서버와 클라이언트 간의 통합 테스트를 수행합니다.
  • 부하 테스트: 많은 동시 연결을 시뮬레이션하여 시스템의 성능과 안정성을 테스트합니다.
  • 장애 주입 테스트: 네트워크 불안정성이나 서버 오류 상황을 인위적으로 만들어 시스템의 복구 능력을 테스트합니다.

 

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class WebSocketIntegrationTest {

    @Autowired
    private TestWebSocketClient webSocketClient;

    @Test
    void testWebSocketCommunication() throws Exception {
        StompSession session = webSocketClient.connect("/websocket-endpoint", new StompSessionHandlerAdapter() {}).get(1, TimeUnit.SECONDS);

        String payload = "Hello, WebSocket!";
        session.send("/app/hello", payload);

        CompletableFuture<String> resultFuture = new CompletableFuture<>();
        session.subscribe("/topic/greetings", new StompFrameHandler() {
            @Override
            public Type getPayloadType(StompHeaders headers) {
                return String.class;
            }

            @Override
            public void handleFrame(StompHeaders headers, Object payload) {
                resultFuture.complete((String) payload);
            }
        });

        String result = resultFuture.get(5, TimeUnit.SECONDS);
        assertThat(result).contains("Hello, WebSocket!");
    }
}

이 테스트 코드는 WebSocket 연결을 설정하고, 메시지를 전송한 후 응답을 받아 검증하는 과정을 보여줍니다.

 

⚠️ 주의: 실시간 통신 시스템의 테스트는 비동기적 특성으로 인해 복잡할 수 있습니다. 타임아웃 설정과 적절한 비동기 테스트 기법을 사용하여 안정적인 테스트를 구현해야 합니다.

 

3.5 모니터링 및 로깅

실시간 통신 시스템의 안정적인 운영을 위해서는 효과적인 모니터링과 로깅 전략이 필수적입니다:

  • 연결 상태 모니터링: 활성 연결 수, 연결 수립/종료 빈도 등을 실시간으로 모니터링합니다.
  • 메시지 처리량 추적: 초당 처리되는 메시지 수, 평균 메시지 크기 등을 측정합니다.
  • 에러 로깅: 연결 오류, 메시지 처리 실패 등의 이벤트를 상세히 로깅합니다.
  • 성능 메트릭 수집: 응답 시간, 메모리 사용량, CPU 사용률 등의 성능 지표를 수집합니다.

Spring Boot Actuator와 같은 도구를 활용하면 이러한 모니터링 기능을 쉽게 구현할 수 있습니다:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

그리고 application.properties에 다음과 같이 설정을 추가합니다:

management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

 

3.6 클라이언트 라이브러리 선택

서버 측 구현만큼이나 중요한 것이 클라이언트 측 구현입니다. 적절한 클라이언트 라이브러리를 선택하는 것이 중요합니다:

  • SockJS: WebSocket을 지원하지 않는 브라우저를 위한 폴백 옵션을 제공합니다.
  • STOMP.js: STOMP 프로토콜을 사용할 때 유용한 클라이언트 라이브러리입니다.
  • Socket.IO: 실시간 양방향 이벤트 기반 통신을 위한 강력한 라이브러리입니다.

예를 들어, STOMP.js를 사용한 클라이언트 코드는 다음과 같을 수 있습니다:

const socket = new SockJS('/websocket-endpoint');
const stompClient = Stomp.over(socket);

stompClient.connect({}, function(frame) {
    console.log('Connected: ' + frame);
    stompClient.subscribe('/topic/greetings', function(greeting) {
        showGreeting(JSON.parse(greeting.body).content);
    });
});

function sendName() {
    stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
}

 

3.7 실제 사용 사례

재능넷과 같은 플랫폼에서 WebSocket을 활용할 수 있는 몇 가지 실제 사용 사례를 살펴보겠습니다:

  1. 실시간 채팅: 사용자 간 직접 소통을 위한 채팅 기능을 구현할 수 있습니다.
  2. 실시간 알림: 새로운 프로젝트 등록, 메시지 수신 등의 이벤트를 실시간으로 알릴 수 있습니다.
  3. 라이브 스트리밍: 실시간 강의나 워크샵을 위한 스트리밍 기능을 구현할 수 있습니다.
  4. 실시간 협업 도구: 공동 문서 편집, 화이트보드 공유 등의 기능을 제공할 수 있습니다.

 

💡 Pro Tip: WebSocket을 사용할 때는 항상 사용자 경험을 최우선으로 고려해야 합니다. 연결이 끊어졌을 때 자동으로 재연결을 시도하고, 사용자에게 현재 상태를 명확히 알려주는 UI를 제공하세요.

 

3.8 성능 최적화

대규모 실시간 통신 시스템에서는 성능 최적화가 매우 중요합니다. 다음과 같은 전략을 고려해볼 수 있습니다:

  • 메시지 압축: 대용량 메시지를 압축하여 네트워크 대역폭 사용을 줄입니다.
  • 메시지 배치 처리: 여러 개의 작은 메시지를 하나의 큰 메시지로 묶어 전송합니다.
  • 연결 풀링: 클라이언트와 서버 간의 연결을 재사용하여 연결 수립에 드는 오버헤드를 줄입니다.
  • 비동기 처리: 메시지 처리를 비동기적으로 수행하여 서버의 응답성을 향상시킵니다.

 

Client 1 Client 2 Server Compressed Messages Batched Messages

위 다이어그램은 메시지 압축과 배치 처리를 통한 성능 최적화 전략을 시각화합니다. 여러 클라이언트의 메시지가 압축되고 배치 처리되어 서버로 전송됩니다.

 

3.9 확장 가능한 아키텍처 설계

대규모 시스템에서는 수평적 확장이 가능한 아키텍처를 설계하는 것이 중요합니다:

  • 마이크로서비스 아키텍처: WebSocket 서비스를 독립적인 마이크로서비스로 분리하여 개별적으로 확장할 수 있게 합니다.
  • 로드 밸런싱: 여러 WebSocket 서버 간에 연결을 분산시켜 부하를 균등하게 분배합니다.
  • 서버리스 아키텍처: AWS Lambda나 Azure Functions와 같은 서버리스 플랫폼을 활용하여 자동 스케일링을 구현합니다.

 

🌟 최종 조언

WebSocket과 Spring Boot를 활용한 실시간 통신 시스템 구축은 강력한 사용자 경험을 제공할 수 있는 훌륭한 방법입니다. 하지만 항상 시스템의 요구사항과 제약 조건을 신중히 고려하여 적절한 기술을 선택해야 합니다. 때로는 단순한 폴링이나 서버-센트 이벤트(SSE)가 더 적합할 수 있습니다. 기술 선택은 항상 구체적인 사용 사례와 비즈니스 요구사항에 기반해야 합니다.

Spring Boot와 WebSocket을 활용한 실시간 통신 구현은 현대적인 웹 애플리케이션 개발에 있어 매우 강력한 도구입니다. 이를 통해 사용자에게 더욱 동적이고 인터랙티브한 경험을 제공할 수 있으며, 재능넷과 같은 플랫폼의 가치를 한층 더 높일 수 있습니다. 기술의 장단점을 잘 이해하고, 적절한 설계와 구현 전략을 선택하여 성공적인 실시간 통신 시스템을 구축하시기 바랍니다. 화이팅! 🚀

관련 키워드

  • WebSocket
  • Spring Boot
  • 실시간 통신
  • STOMP
  • 확장성
  • 보안
  • 성능 최적화
  • 클러스터링
  • 모니터링
  • 테스트 전략

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

자유 결제 서비스

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

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

지적 재산권 보호 고지

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

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

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

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

개인용도의 프로그램이나 소규모 프로그램을 합리적인 가격으로 제작해드립니다.개발 아이디어가 있으시다면 부담 갖지 마시고 문의해주세요. ...

#### 결재 먼저 하지 마시고 쪽지 먼저 주세요. ######## 결재 먼저 하지 마시고 쪽지 먼저 주세요. ####안녕하세요. C/C++/MFC/C#/Python 프...

◆ C언어 또는 JAVA 응용프로그램 개발 및 유지보수 해드립니다 ▣ 재능 사항- 각종 API 및 함수, 메소드를 이용한 응용프로그램 가능합니다.- ...

엑셀 문서 작성 / VBA 개발 도와드립니다.1. 기본 가격으로 구매 가능한 재능  - 간단한 문서 작성  - 간단한 함수를 응용한 자료 정리&...

📚 생성된 총 지식 9,688 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 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 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창