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

🌲 지식인의 숲 🌲

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

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

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

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

* 프로그램에 대한 분석과 설계 구현.(OA,FA 등)* 업무 프로세스에 의한 구현.(C/C++, C#​) * 기존의 C/C++, C#, MFC, VB로 이루어진 프로그...

RxJava: 리액티브 프로그래밍 라이브러리

2024-11-01 18:09:40

재능넷
조회수 426 댓글수 0

RxJava: 리액티브 프로그래밍의 마법사 🧙‍♂️✨

 

 

안녕, 친구들! 오늘은 정말 흥미진진한 주제로 찾아왔어. 바로 RxJava라는 놀라운 녀석에 대해 이야기해볼 거야. 😎 RxJava가 뭐냐고? 간단히 말하면, Java 개발자들의 삶을 더 쉽고 재미있게 만들어주는 마법 지팡이 같은 거라고 할 수 있지! 🪄

우리가 살고 있는 이 디지털 세상에서는 매 순간 엄청난 양의 데이터가 쏟아져 나와. 그리고 우리 개발자들은 이 데이터의 홍수 속에서 우아하게 헤엄치면서 멋진 애플리케이션을 만들어내야 해. 바로 이때 RxJava가 등장하는 거지! 🏊‍♂️💻

RxJava는 리액티브 프로그래밍이라는 패러다임을 Java 세계로 가져온 라이브러리야. 리액티브 프로그래밍? 뭔가 어려워 보이지? 걱정 마! 지금부터 차근차근 설명해줄게. 🤓

🌟 Fun Fact: RxJava는 Netflix에서 만들었어! 넷플릭스에서 영화 보면서 "와, 이 추천 시스템 진짜 똑똑하다!"라고 생각한 적 있지? 그 뒤에 RxJava가 숨어있었던 거야!

자, 이제 본격적으로 RxJava의 세계로 들어가볼까? 준비됐어? 그럼 출발! 🚀

리액티브 프로그래밍: 데이터의 흐름을 타고 노는 서핑 🏄‍♂️

리액티브 프로그래밍이 뭔지 알아보기 전에, 잠깐 우리가 평소에 하던 프로그래밍을 생각해보자. 보통은 어떻게 코딩하지? 🤔

일반적으로 우리는 명령형 프로그래밍을 해. 뭐 이런 식이지:


int a = 5;
int b = 3;
int result = a + b;
System.out.println(result);
  

간단하지? A랑 B를 더해서 결과를 출력해. 끝! 👍

그런데 말이야, 현실 세계의 문제는 이렇게 단순하지 않아. 예를 들어, 너가 재능넷(https://www.jaenung.net)같은 플랫폼을 만든다고 생각해봐. 사용자들이 실시간으로 새로운 재능을 등록하고, 다른 사용자들은 그걸 검색하고, 또 누군가는 리뷰를 남기고... 이 모든 게 동시에 일어나는 거야! 😵‍💫

이런 복잡한 상황에서 기존의 방식으로 코딩하면 어떻게 될까? 아마 이런 느낌일 거야:


while (true) {
    if (newTalentRegistered()) {
        updateTalentList();
    }
    if (userSearched()) {
        performSearch();
    }
    if (newReviewPosted()) {
        updateReviews();
    }
    // ... 더 많은 if 문들 ...
}
  

우와, 벌써부터 머리가 아파오지 않아? 😅 이런 코드는 읽기도 어렵고, 유지보수하기도 힘들어. 게다가 효율적이지도 않지.

여기서 리액티브 프로그래밍이 등장해! 리액티브 프로그래밍은 데이터의 흐름과 그 변화의 전파에 중점을 둔 프로그래밍 패러다임이야. 쉽게 말해, 데이터가 변할 때마다 자동으로 반응하는 프로그램을 만드는 거지.

리액티브 프로그래밍을 사용하면, 위의 복잡한 코드가 이렇게 바뀔 수 있어:


Observable.merge(
    talentRegistrations,
    userSearches,
    reviewPosts
).subscribe(event -> handleEvent(event));
  

와! 훨씬 간단해 보이지? 😮 이게 바로 리액티브 프로그래밍의 매력이야. 복잡한 비동기 작업들을 우아하게 처리할 수 있지.

💡 Tip: 리액티브 프로그래밍은 마치 물이 흐르는 것처럼 데이터가 흐른다고 생각하면 돼. 그리고 우리는 이 물줄기를 따라 필요한 작업을 수행하는 거지. 물 흐르듯 자연스럽게! 🌊

자, 이제 리액티브 프로그래밍이 뭔지 대충 감이 왔지? 그럼 이제 RxJava가 어떻게 이 리액티브 프로그래밍을 Java 세계로 가져왔는지 알아볼 차례야! 🕵️‍♂️

RxJava: 리액티브의 마법을 Java에 불어넣다 🧙‍♂️✨

자, 이제 우리의 주인공 RxJava를 만나볼 시간이야! RxJava는 ReactiveX(Reactive Extensions)라는 더 큰 프로젝트의 일부로, Java를 위한 리액티브 프로그래밍 라이브러리야. 😎

RxJava는 비동기적이고 이벤트 기반의 프로그램을 만들 때 사용해. 음... 뭔가 어려워 보이지? 걱정 마, 예를 들어 설명해줄게! 🤓

재능넷(https://www.jaenung.net)에서 새로운 재능이 등록될 때마다 알림을 보내는 기능을 만든다고 생각해보자. 기존의 방식으로는 이렇게 할 수 있을 거야:


while (true) {
    Talent newTalent = waitForNewTalent(); // 새 재능이 등록될 때까지 기다림
    if (newTalent != null) {
        sendNotification(newTalent);
    }
}
  

이 코드의 문제점이 보여? 새 재능이 등록될 때까지 계속 기다리고 있어야 해. 그동안 다른 일은 아무것도 못하지. 비효율적이지? 😓

이제 RxJava로 같은 기능을 구현해보자:


Observable<talent> talentStream = createTalentStream();
talentStream.subscribe(talent -> sendNotification(talent));
  </talent>

와! 훨씬 간단해 보이지? 😮 이게 RxJava의 마법이야. 새로운 재능이 등록되면 자동으로 알림을 보내주는 거지. 우리는 그저 "구독"만 하면 돼!

🎭 Analogy: RxJava는 마치 유튜브 구독 같아. 너가 좋아하는 유튜버를 구독하면, 새 영상이 올라올 때마다 알림을 받지? RxJava도 그래. 데이터 스트림을 "구독"하면, 새로운 데이터가 올 때마다 알려줘!

RxJava의 핵심 개념들을 좀 더 자세히 살펴볼까? 여기 RxJava의 주요 플레이어들이야:

  • Observable: 데이터 스트림을 표현해. 시간이 지남에 따라 발생하는 일련의 이벤트라고 생각하면 돼.
  • Observer: Observable을 구독하고 데이터를 받는 녀석이야.
  • Operators: 데이터 스트림을 변형하고 조작하는 함수들이야.
  • Schedulers: 작업이 어떤 스레드에서 실행될지 결정해주는 녀석들이야.

이 개념들이 어떻게 작동하는지 더 자세히 알아볼까? 🕵️‍♂️

1. Observable: 데이터의 강물 🏞️

Observable은 RxJava의 심장이라고 할 수 있어. 이건 시간에 따라 발생하는 일련의 이벤트나 데이터를 표현해. 마치 강물처럼 데이터가 흘러가는 거지.

Observable을 만드는 방법은 여러 가지가 있어. 가장 간단한 방법부터 살펴볼까?


Observable<string> simple = Observable.just("Hello", "RxJava");
  </string>

이 코드는 "Hello"와 "RxJava"라는 두 개의 문자열을 차례로 방출하는 Observable을 만들어. 😊

좀 더 복잡한 예제를 볼까? 1부터 5까지의 숫자를 방출하는 Observable을 만들어보자:


Observable<integer> numbers = Observable.range(1, 5);
  </integer>

이 Observable은 1, 2, 3, 4, 5를 순서대로 방출할 거야.

재능넷의 예를 들어볼까? 새로운 재능이 등록될 때마다 이를 방출하는 Observable을 만들 수 있어:


Observable<talent> talentStream = Observable.create(emitter -> {
    // 새로운 재능이 등록될 때마다
    Talent newTalent = waitForNewTalent();
    emitter.onNext(newTalent);
});
  </talent>

이 Observable은 새로운 재능이 등록될 때마다 그 정보를 방출할 거야. 멋지지? 😎

2. Observer: 데이터를 받아먹는 물고기 🐠

Observer는 Observable이 방출하는 데이터를 받아 처리하는 녀석이야. Observable이 강물이라면, Observer는 그 강물 속의 물고기라고 생각하면 돼. 🎣

Observer를 만드는 가장 간단한 방법은 이렇게:


Observer<string> observer = new Observer<string>() {
    @Override
    public void onSubscribe(Disposable d) {
        System.out.println("구독 시작!");
    }

    @Override
    public void onNext(String s) {
        System.out.println("받은 데이터: " + s);
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("에러 발생: " + e.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("완료!");
    }
};
  </string></string>

이 Observer는 데이터를 받을 때마다 그 데이터를 출력하고, 에러가 발생하면 에러 메시지를 출력하고, 모든 데이터 처리가 끝나면 "완료!" 메시지를 출력해.

재능넷의 예로 돌아가보자. 새로운 재능이 등록될 때마다 알림을 보내는 Observer를 만들어볼까?


Observer<talent> talentObserver = new Observer<talent>() {
    @Override
    public void onSubscribe(Disposable d) {
        System.out.println("새로운 재능 모니터링 시작!");
    }

    @Override
    public void onNext(Talent talent) {
        sendNotification("새로운 재능이 등록되었습니다: " + talent.getName());
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("재능 모니터링 중 오류 발생: " + e.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("재능 모니터링 종료");
    }
};
  </talent></talent>

이 Observer는 새로운 재능이 등록될 때마다 알림을 보내고, 오류가 발생하면 로그를 남기고, 모니터링이 끝나면 종료 메시지를 출력해. 👨‍💻

3. Operators: 마법의 도구상자 🧰

Operators는 RxJava의 진정한 힘이라고 할 수 있어. 이들은 Observable이 방출하는 데이터를 변형하고, 필터링하고, 결합하는 등의 작업을 할 수 있게 해줘. 마치 마법사의 도구상자 같은 거지! 🧙‍♂️

몇 가지 유용한 Operator들을 살펴볼까?

  • map: 각 항목을 변환해
  • filter: 조건에 맞는 항목만 통과시켜
  • flatMap: 각 항목을 Observable로 변환하고 그 결과를 합쳐
  • zip: 여러 Observable의 항목들을 결합해

예를 들어볼까? 재능넷에서 프로그래밍 관련 재능만 필터링하고, 각 재능의 이름을 대문자로 바꾸는 작업을 해보자:


Observable<talent> talentStream = createTalentStream();
talentStream
    .filter(talent -> talent.getCategory().equals("프로그래밍"))
    .map(talent -> {
        talent.setName(talent.getName().toUpperCase());
        return talent;
    })
    .subscribe(talent -> System.out.println("새로운 프로그래밍 재능: " + talent.getName()));
  </talent>

이 코드는 프로그래밍 관련 재능만 선택하고(filter), 그 재능의 이름을 대문자로 바꾼 뒤(map), 결과를 출력해. 멋지지? 😎

4. Schedulers: 일꾼들을 관리하는 매니저 👨‍💼

Schedulers는 RxJava의 동시성을 관리해. 어떤 작업이 어떤 스레드에서 실행될지 결정하는 거지. 이건 마치 큰 회사의 매니저가 여러 부서의 일꾼들에게 일을 분배하는 것과 비슷해.

RxJava는 여러 종류의 Scheduler를 제공해:

  • Schedulers.io(): I/O 작업에 최적화된 스레드 풀
  • Schedulers.computation(): CPU 집약적인 작업을 위한 스레드 풀
  • Schedulers.newThread(): 매번 새로운 스레드를 생성
  • AndroidSchedulers.mainThread(): 안드로이드의 메인 스레드 (UI 작업용)

예를 들어, 재능넷에서 새로운 재능을 데이터베이스에 저장하고 UI를 업데이트하는 작업을 해보자:


Observable<talent> talentStream = createTalentStream();
talentStream
    .subscribeOn(Schedulers.io()) // 데이터베이스 작업은 I/O 스레드에서
    .observeOn(AndroidSchedulers.mainThread()) // UI 업데이트는 메인 스레드에서
    .subscribe(
        talent -> updateUI(talent),
        error -> showError(error),
        () -> showComplete()
    );
  </talent>

이 코드는 새로운 재능을 받아 데이터베이스에 저장하는 작업을 I/O 스레드에서 처리하고, UI 업데이트는 메인 스레드에서 처리해. 이렇게 하면 앱이 부드럽게 동작하면서도 효율적으로 작업을 처리할 수 있어. 👍

💡 Pro Tip: Scheduler를 잘 활용하면 앱의 성능을 크게 향상시킬 수 있어. 하지만 너무 많은 스레드를 사용하면 오히려 성능이 떨어질 수 있으니 주의해야 해!

자, 이제 RxJava의 기본적인 구성 요소들을 알아봤어. 이것들이 어떻게 함께 작동하는지 더 자세히 알아볼까? 🤔

RxJava의 마법 레시피: 요소들의 환상적인 조합 🧪✨

자, 이제 RxJava의 기본 재료들을 알았으니, 이것들을 어떻게 조합해서 멋진 요리를 만들 수 있는지 알아보자! 🍳

재능넷(https://www.jaenung.net)을 예로 들어 RxJava의 마법을 펼쳐볼게. 우리가 만들고 싶은 기능은 이거야:

  1. 새로운 프로그래밍 관련 재능이 등록되면 알림을 보내기
  2. 재능의 이름을 대문자로 변경하기
  3. 데이터베이스에 저장하기
  4. UI 업데이트하기

이 모든 걸 RxJava로 어떻게 구현할 수 있을까? 한번 코드로 살펴보자!


Observable<talent> talentStream = createTalentStream();

talentStream
    .filter(talent -> talent.getCategory().equals("프로그래밍"))
    .map(talent -> {
        talent.setName(talent.getName().toUpperCase());
        return talent;
    })
    .flatMap(talent -> 
        Observable.fromCallable(() -> {
            saveTalentToDatabase(talent);
            return talent;
        }).subscribeOn(Schedulers.io())
    )
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<talent>() {
        @Override
        public void onSubscribe(Disposable d) {
            System.out.println("새로운 프로그래밍 재능 모니터링 시작!");
        }

        @Override
        public void onNext(Talent talent) {
            sendNotification("새로운 프로그래밍 재능 등록: " + talent.getName());
            updateUI(talent);
        }

        @Override
        public void onError(Throwable e) {
            System.out.println("오류 발생: " + e.getMessage());
        }

        @Override
        public void onComplete() {
            System.out.println("모니터링 완료");
        }
    });
  </talent></talent>

우와, 뭔가 복잡해 보이지? 😅 하지만 걱정 마! 하나씩 뜯어보면 그렇게 어렵지 않아. 각 단계를 자세히 살펴볼게:

  1. 필터링 (filter): 프로그래밍 관련 재능만 선택해. 다른 카테고리의 재능은 무시돼.
  2. 변환 (map): 재능의 이름을 대문자로 바꿔. 이렇게 하면 모든 재능 이름이 대문자로 통일돼.
  3. 비동기 작업 (flatMap + subscribeOn): 데이터베이스에 재능을 저장해. 이 작업은 I/O 스레드에서 실행되기 때문에 메인 스레드를 막지 않아.
  4. 스레드 전환 (observeOn): UI 작업을 위해 메인 스레드로 전환해.
  5. 구독 (subscribe): 최종 결과를 받아 처리해. 여기서는 알림을 보내고 UI를 업데이트하지.

이 코드의 마법 같은 점이 뭔지 알아? 모든 작업이 비동기적으로 처리돼! 새로운 재능이 등록되면, 그 즉시 다음 재능을 처리할 준비가 되는 거지. 기다림 없이 계속해서 재능을 처리할 수 있어. 😎

🎭 Analogy: 이 과정을 요리에 비유해볼까? 재능 스트림은 컨베이어 벨트야. 프로그래밍 재능만 골라내고(필터링), 이름을 예쁘게 꾸미고(변환), 냉장고에 보관하고(데이터베이스 저장), 최종적으로 손님에게 서빙(UI 업데이트)하는 거지. 그리고 이 모든 과정이 부드럽게, 멈춤 없이 진행돼!

이제 RxJava가 어떻게 복잡한 비동기 작업을 우아하게 처리하는지 알겠지? 🤓

하지만 잠깐, 여기서 끝이 아니야! RxJava는 더 많은 마법을 부릴 수 있어. 몇 가지 고급 기능들을 더 살펴볼까? 🧙‍♂️✨

1. 에러 처리의 마법 🛡️

RxJava는 에러 처리에도 강력해. 예를 들어, 데이터베이스 저장 중 에러가 발생하면 재시도를 할 수 있어:


talentStream
    .flatMap(talent -> 
        Observable.fromCallable  (() -> {
            saveTalentToDatabase(talent);
            return talent;
        })
        .subscribeOn(Schedulers.io())
        .retry(3) // 최대 3번 재시도
    )
    .onErrorResumeNext(error -> {
        logError(error);
        return Observable.empty(); // 에러 발생 시 빈 Observable 반환
    })
    .subscribe(/* ... */);
  

이 코드는 데이터베이스 저장에 실패하면 최대 3번까지 재시도해. 그래도 실패하면 에러를 로그에 기록하고 계속 진행해. 멋지지? 😎

2. 여러 스트림 결합하기 🔗

때로는 여러 데이터 소스를 결합해야 할 때가 있어. RxJava는 이런 상황에서도 빛을 발해! 예를 들어, 재능과 사용자 정보를 결합해보자:


Observable<talent> talentStream = createTalentStream();
Observable<user> userStream = createUserStream();

Observable.zip(talentStream, userStream, (talent, user) -> {
    talent.setUserName(user.getName());
    return talent;
})
.subscribe(talent -> System.out.println(talent.getName() + " by " + talent.getUserName()));
  </user></talent>

이 코드는 재능 스트림과 사용자 스트림을 결합해서, 각 재능에 해당 사용자의 이름을 붙여줘. 완벽한 팀워크야! 👥

3. 백프레셔 다루기 🚰

때로는 데이터가 너무 빨리 흘러와서 처리가 따라가지 못할 수 있어. 이런 상황을 "백프레셔"라고 해. RxJava는 이런 상황도 우아하게 처리할 수 있어:


Flowable<talent> talentFlowable = createTalentFlowable();
talentFlowable
    .onBackpressureBuffer(1000) // 최대 1000개까지 버퍼에 저장
    .observeOn(Schedulers.computation(), false, 10) // 한 번에 10개씩 처리
    .subscribe(new Subscriber<talent>() {
        @Override
        public void onSubscribe(Subscription s) {
            s.request(Long.MAX_VALUE); // 무제한으로 요청
        }

        @Override
        public void onNext(Talent talent) {
            processSlowly(talent); // 시간이 오래 걸리는 처리
        }

        // onError와 onComplete 메서드 생략
    });
  </talent></talent>

이 코드는 데이터가 너무 빨리 들어와도 패닉에 빠지지 않아. 최대 1000개까지 버퍼에 저장하고, 한 번에 10개씩 천천히 처리하지. 마치 물탱크와 수도꼭지 같은 거야! 💧

4. 테스팅의 마법 🧪

RxJava로 작성한 코드를 테스트하는 것도 쉬워! TestObserver를 사용하면 비동기 코드도 간단히 테스트할 수 있어:


@Test
public void testTalentStream() {
    Observable<talent> talentStream = createTalentStream();
    
    TestObserver<talent> testObserver = talentStream
        .filter(talent -> talent.getCategory().equals("프로그래밍"))
        .test();
    
    testObserver.assertValueCount(3) // 3개의 프로그래밍 재능이 있어야 함
                .assertNoErrors() // 에러가 없어야 함
                .assertComplete(); // 스트림이 완료되어야 함
    
    List<talent> talents = testObserver.values();
    assertTrue(talents.stream().allMatch(t -> t.getCategory().equals("프로그래밍")));
}
  </talent></talent></talent>

이렇게 하면 비동기 코드도 마치 동기 코드처럼 쉽게 테스트할 수 있어. 테스트의 신비로운 세계로 여행을 떠나보자! 🧭

💡 Pro Tip: RxJava를 사용할 때는 항상 메모리 누수에 주의해야 해. 구독을 제대로 해제하지 않으면 메모리 누수가 발생할 수 있어. Disposable을 잘 관리하는 것이 중요해!

자, 이제 RxJava의 강력한 마법을 충분히 맛봤지? 😄 이 도구를 사용하면 복잡한 비동기 작업도 우아하게 처리할 수 있어. 재능넷(https://www.jaenung.net)같은 실시간 플랫폼을 만들 때 정말 유용할 거야!

하지만 기억해, 모든 마법과 마찬가지로 RxJava도 신중하게 사용해야 해. 때로는 간단한 해결책이 더 좋을 수 있어. RxJava는 강력한 도구지만, 모든 문제의 해답은 아니야. 상황에 맞게 적절히 사용하는 게 중요해.

그래도 RxJava를 마스터하면, 넌 비동기 프로그래밍의 진정한 마법사가 될 수 있을 거야! 🧙‍♂️✨ 계속해서 연습하고 실험해봐. 그리고 언제나 기억해 - 코딩은 즐거워야 해! 😊

자, 이제 RxJava의 신비로운 세계로의 여행이 끝났어. 어떠니? 흥미진진했지? 🎢 이제 넌 리액티브 프로그래밍의 힘을 이해하고, RxJava의 기본을 익혔어. 이걸로 더 멋진 앱을 만들 수 있을 거야!

Remember, 코딩의 세계는 끝없이 넓고 깊어. RxJava는 그저 시작일 뿐이야. 계속해서 배우고, 성장하고, 새로운 것을 시도해봐. 그리고 가장 중요한 건, 코딩을 즐기는 거야! 🚀💻

Happy coding, 리액티브 프로그래머! 👨‍💻👩‍💻

관련 키워드

  • RxJava
  • 리액티브 프로그래밍
  • Observable
  • Observer
  • Operator
  • Scheduler
  • 비동기 프로그래밍
  • 데이터 스트림
  • 백프레셔
  • 에러 처리

지적 재산권 보호

지적 재산권 보호 고지

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

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

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

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

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

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

서울 4년제 컴퓨터공학과 재학중이며, 대학 연구실에서 학부연구생으로 일하고 있습니다.사용가능한 언어는 C / Objective C / C# /Java / PH...

땡큐엑셀-신차장기렌트카 비교견적기 엑셀 프로그램신차장기렌트 가격비교 비교견적 엑셀 프로그램을 통해 제휴사의 월렌트료및 잔가를 한번의 클...

📚 생성된 총 지식 10,264 개

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