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

🌲 지식인의 숲 🌲

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

​불법으로 실행해드리는 서비스가 아닌 정직한 광고 운영 마케팅 서비스입니다 : )인스타그램 관리를 하고싶은데 어떻게 해야될지 고민...

​불법으로 실행해드리는 서비스가 아닌 정직한 광고 운영 마케팅 서비스입니다 : )유튜브 채널 관리를 하고싶은데 어떻게 해야될지 고민...

안녕하세요. 경력 8년차 프리랜서 개발자 입니다.피쳐폰 2g 때부터 지금까지 모바일 앱 개발을 전문적으로 진행해 왔으며,신속하 정확 하게 의뢰하...

미국석사준비중인 학생입니다.안드로이드 난독화와 LTE관련 논문 작성하면서 기술적인것들 위주로 구현해보았고,보안기업 개발팀 인턴도 오랜시간 ...

AssertJ: 유창한 assertion 라이브러리

2024-09-18 17:13:08

재능넷
조회수 11 댓글수 0

AssertJ: 유창한 assertion 라이브러리 🚀

 

 

Java 개발자 여러분, 안녕하세요! 오늘은 테스트 코드 작성 시 매우 유용한 도구인 AssertJ에 대해 깊이 있게 알아보겠습니다. AssertJ는 Java 애플리케이션의 테스트를 더욱 쉽고 직관적으로 만들어주는 강력한 assertion 라이브러리입니다. 이 글을 통해 여러분은 AssertJ의 기본 개념부터 고급 기능까지 상세히 학습하실 수 있을 것입니다.

프로그래밍 세계에서 테스트의 중요성은 아무리 강조해도 지나치지 않습니다. 특히 Java와 같은 강력한 객체지향 언어에서는 복잡한 비즈니스 로직을 검증하기 위해 효과적인 테스트 도구가 필수적입니다. 이러한 맥락에서 AssertJ는 개발자들에게 큰 도움을 주는 도구로 자리잡았습니다.

AssertJ를 사용하면 테스트 코드가 더욱 가독성 있고 유지보수가 쉬워집니다. 또한, IDE의 자동완성 기능과 결합하여 생산성을 크게 향상시킬 수 있죠. 이는 재능넷과 같은 플랫폼에서 활동하는 프리랜서 개발자들에게 특히 중요한 요소입니다. 시간은 곧 돈이니까요! 😉

자, 그럼 지금부터 AssertJ의 세계로 깊이 들어가 보겠습니다. 기본 사용법부터 고급 기능, 실제 프로젝트에서의 활용 사례까지 상세히 다뤄보겠습니다. 준비되셨나요? 시작해볼까요! 🎉

1. AssertJ 소개 및 기본 개념 🌟

AssertJ는 Java 애플리케이션을 위한 오픈소스 테스팅 라이브러리입니다. 이 라이브러리의 주요 목적은 테스트 코드를 더욱 읽기 쉽고 유지보수하기 쉽게 만드는 것입니다. AssertJ는 "fluent interface" 패턴을 사용하여 assertion을 체인으로 연결할 수 있게 해주며, 이를 통해 매우 표현력 있는 테스트 코드를 작성할 수 있습니다.

1.1 AssertJ의 핵심 특징

  • 유창한 API: 메소드 체이닝을 통해 자연스러운 문장처럼 assertion을 작성할 수 있습니다.
  • 강력한 타입 안정성: 컴파일 시점에 많은 오류를 잡아낼 수 있습니다.
  • 풍부한 assertion 메소드: 다양한 상황에 대응할 수 있는 많은 assertion 메소드를 제공합니다.
  • 사용자 정의 assertion 지원: 필요에 따라 커스텀 assertion을 만들 수 있습니다.
  • 상세한 에러 메시지: 테스트 실패 시 명확하고 자세한 에러 메시지를 제공합니다.

1.2 AssertJ vs JUnit assertions

JUnit은 Java에서 가장 널리 사용되는 테스팅 프레임워크입니다. 하지만 JUnit의 기본 assertion 기능은 다소 제한적입니다. 아래 예제를 통해 AssertJ와 JUnit의 assertion 문법을 비교해보겠습니다.


// JUnit assertion
assertEquals(expected, actual);

// AssertJ assertion
assertThat(actual).isEqualTo(expected);

얼핏 보면 큰 차이가 없어 보일 수 있지만, 복잡한 객체나 컬렉션을 다룰 때 AssertJ의 장점이 더욱 두드러집니다.

JUnit AssertJ assertEquals(expected, actual); assertTrue(condition); assertNull(object); assertThat(actual).isEqualTo(expected); assertThat(condition).isTrue(); assertThat(object).isNull();

위 그림에서 볼 수 있듯이, AssertJ의 문법은 더욱 직관적이고 읽기 쉽습니다. 특히 `assertThat()`으로 시작하는 AssertJ의 문법은 자연스러운 영어 문장처럼 읽힙니다.

1.3 AssertJ 설치하기

AssertJ를 사용하기 위해서는 먼저 프로젝트에 라이브러리를 추가해야 합니다. Maven을 사용하는 경우, `pom.xml` 파일에 다음 의존성을 추가하면 됩니다:


<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.21.0</version>
    <scope>test</scope>
</dependency>

Gradle을 사용하는 경우에는 `build.gradle` 파일에 다음 라인을 추가합니다:


testImplementation 'org.assertj:assertj-core:3.21.0'

이렇게 설정하면 AssertJ를 사용할 준비가 완료됩니다! 🎊

다음 섹션에서는 AssertJ의 기본적인 사용법에 대해 자세히 알아보겠습니다. AssertJ를 사용하면 여러분의 테스트 코드가 얼마나 명확하고 표현력 있게 변하는지 직접 경험하실 수 있을 것입니다.

2. AssertJ 기본 사용법 🛠️

이제 AssertJ의 기본적인 사용법에 대해 알아보겠습니다. AssertJ를 사용하면 다양한 타입의 객체에 대해 assertion을 수행할 수 있습니다. 여기서는 가장 흔히 사용되는 몇 가지 타입에 대한 assertion 방법을 살펴보겠습니다.

2.1 문자열(String) Assertions

문자열은 프로그래밍에서 가장 기본적이고 자주 사용되는 데이터 타입 중 하나입니다. AssertJ는 문자열에 대한 다양한 assertion 메소드를 제공합니다.


String text = "Hello, AssertJ!";

assertThat(text)
    .isNotNull()
    .startsWith("Hello")
    .endsWith("!")
    .contains("AssertJ")
    .hasSize(15);

위 코드는 다음과 같은 검증을 수행합니다:

  • 문자열이 null이 아님
  • "Hello"로 시작함
  • "!"로 끝남
  • "AssertJ"를 포함함
  • 길이가 15임

이처럼 AssertJ를 사용하면 하나의 객체에 대해 여러 가지 assertion을 체인으로 연결하여 간결하게 표현할 수 있습니다.

2.2 숫자(Number) Assertions

숫자 타입(int, long, float, double 등)에 대해서도 AssertJ는 다양한 assertion 메소드를 제공합니다.


int number = 42;

assertThat(number)
    .isPositive()
    .isEven()
    .isLessThan(100)
    .isGreaterThan(10)
    .isBetween(40, 45);

이 코드는 다음을 검증합니다:

  • 숫자가 양수임
  • 짝수임
  • 100보다 작음
  • 10보다 큼
  • 40과 45 사이에 있음

2.3 컬렉션(Collection) Assertions

Java에서 List, Set, Map 등의 컬렉션은 매우 자주 사용됩니다. AssertJ는 이러한 컬렉션에 대한 강력한 assertion 기능을 제공합니다.


List<String> fruits = Arrays.asList("Apple", "Banana", "Orange");

assertThat(fruits)
    .hasSize(3)
    .contains("Apple", "Orange")
    .doesNotContain("Grape")
    .startsWith("Apple")
    .endsWith("Orange");

이 코드는 다음을 검증합니다:

  • 리스트의 크기가 3임
  • "Apple"과 "Orange"를 포함함
  • "Grape"를 포함하지 않음
  • "Apple"로 시작함
  • "Orange"로 끝남

2.4 객체(Object) Assertions

사용자 정의 객체에 대해서도 AssertJ를 사용하여 다양한 assertion을 수행할 수 있습니다.


public class Person {
    private String name;
    private int age;

    // constructor, getters, setters...
}

Person person = new Person("John", 30);

assertThat(person)
    .isNotNull()
    .hasFieldOrPropertyWithValue("name", "John")
    .hasFieldOrPropertyWithValue("age", 30);

이 코드는 다음을 검증합니다:

  • person 객체가 null이 아님
  • name 필드의 값이 "John"임
  • age 필드의 값이 30임

2.5 예외(Exception) Assertions

메소드가 특정 상황에서 예외를 던지는지 검증하는 것도 중요한 테스트 케이스입니다. AssertJ는 이러한 예외 검증을 위한 메소드도 제공합니다.


assertThatThrownBy(() -> {
    // 예외를 발생시키는 코드
    throw new IllegalArgumentException("Invalid argument");
})
    .isInstanceOf(IllegalArgumentException.class)
    .hasMessageContaining("Invalid");

이 코드는 다음을 검증합니다:

  • 코드 블록이 예외를 던짐
  • 던져진 예외가 IllegalArgumentException 타입임
  • 예외 메시지에 "Invalid"가 포함되어 있음
AssertJ 기본 사용법 문자열 숫자 컬렉션 • isNotNull() • startsWith() • endsWith() • contains() • isPositive() • isEven() • isLessThan() • isBetween() • hasSize() • contains() • doesNotContain() • startsWith() 객체 • hasFieldOrPropertyWithValue() • isInstanceOf()

이 그림은 AssertJ의 기본적인 assertion 메소드들을 한눈에 보여줍니다. 각 카테고리별로 자주 사용되는 메소드들을 정리했습니다.

AssertJ의 이러한 기본 사용법을 익히면, 여러분의 테스트 코드는 더욱 읽기 쉽고 표현력 있게 변할 것입니다. 특히 재능넷과 같은 플랫폼에서 활동하는 프리랜서 개발자들에게는 코드의 품질과 가독성이 매우 중요합니다. AssertJ를 활용하면 이러한 측면에서 큰 이점을 얻을 수 있습니다. 😊

다음 섹션에서는 AssertJ의 더 고급 기능들에 대해 알아보겠습니다. 이를 통해 여러분은 더욱 복잡한 시나리오에서도 AssertJ를 효과적으로 활용할 수 있게 될 것입니다.

3. AssertJ 고급 기능 🚀

AssertJ의 기본 사용법을 마스터했다면, 이제 더 복잡한 시나리오에서 활용할 수 있는 고급 기능들을 살펴보겠습니다. 이러한 고급 기능들을 활용하면 더욱 강력하고 유연한 테스트 코드를 작성할 수 있습니다.

3.1 Soft Assertions

일반적으로 assertion이 실패하면 테스트는 즉시 중단됩니다. 하지만 때로는 모든 assertion을 실행한 후 어떤 것들이 실패했는지 한 번에 보고 싶을 때가 있습니다. 이럴 때 Soft Assertions를 사용할 수 있습니다.


SoftAssertions softly = new SoftAssertions();
softly.assertThat(5).isLessThan(10);
softly.assertThat("hello").startsWith("h");
softly.assertThat(Arrays.asList(1, 2, 3)).hasSize(3);
softly.assertAll();

위 코드에서 `assertAll()`을 호출하면 그 때 모든 실패한 assertion들이 보고됩니다.

3.2 Custom Assertions

프로젝트에 특화된 assertion이 필요할 때는 Custom Assertion을 만들 수 있습니다. 예를 들어, `Person` 클래스에 대한 Custom Assertion을 만들어 보겠습니다.


public class PersonAssert extends AbstractAssert<PersonAssert, Person> {
    public PersonAssert(Person actual) {
        super(actual, PersonAssert.class);
    }

    public static PersonAssert assertThat(Person actual) {
        return new PersonAssert(actual);
    }

    public PersonAssert hasName(String name) {
        isNotNull();
        if (!Objects.equals(actual.getName(), name)) {
            failWithMessage("Expected person to have name %s but was %s", name, actual.getName());
        }
        return this;
    }

    public PersonAssert isAdult() {
        isNotNull();
        if (actual.getAge() < 18) {
            failWithMessage("Expected person to be adult but was %s years old", actual.getAge());
        }
        return this;
    }
}

이제 이 Custom Assertion을 다음과 같이 사용할 수 있습니다:


Person person = new Person("John", 30);
PersonAssert.assertThat(person)
    .hasName("John")
    .isAdult();

3.3 Extracting and Filtering

컬렉션에서 특정 필드를 추출하거나 필터링하여 assertion을 수행할 수 있습니다.


List<Person> persons = Arrays.asList(
    new Person("John", 30),
    new Person("Jane", 25),
    new Person("Bob", 40)
);

assertThat(persons)
    .extracting("name")
    .contains("John", "Jane", "Bob");

assertThat(persons)
    .filteredOn(person -> person.getAge() > 30)
    .hasSize(1)
    .extracting("name")
    .contains("Bob");

3.4 Recursive Comparison

객체의 내부 구조를 재귀적으로 비교할 때 사용합니다. 이는 특히 복잡한 객체 구조를 가진 경우에 유용합니다.


Person person1 = new Person("John", 30);
Person person2 = new Person("John", 30);

assertThat(person1).usingRecursiveComparison().isEqualTo(person2);

3.5 Dynamic Assertions

런타임에 동적으로 assertion을 생성할 수 있습니다. 이는 테스트 데이터가 동적으로 생성되는 경우에 유용합니다.


List<Person> persons = getPersons(); // 동적으로 생성된 리스트

assertThat(persons).allSatisfy(person -> {
    assertThat(person.getName()).isNotBlank();
    assertThat(person.getAge()).isPositive();
});
AssertJ 고급 기능 Soft Assertions 여러 assertion을 한 번에 실행 Custom Assertions 프로젝트에 특화된 assertion 생성 Extracting and Filtering 컬렉션에서 데이터 추출 및 필터링 Recursive Comparison 객체의 내부 구조를 재귀적으로 비교 Dynamic Assertions 런타임에 동적으로 assertion 생성

이 그림은 AssertJ의 고급 기능들을 시각적으로 표현한 것입니다. 각 기능은 서로 다른 색상의 박스로 표현되어 있어, 한 눈에 각 기능의 특징을 파악할 수 있습니다.

이러한 고급 기능들을 활용하면 더욱 강력하고 유연한 테스트 코드를 작성할 수 있습니다. 특히 재능넷과 같은 플랫폼에서 활동하는 프리랜서 개발자들에게는 이러한 고급 기능들이 매우 유용할 수 있습니다. 복잡한 비즈니스 로직을 테스트할 때, 이러한 기능들을 활용하면 테스트 코드의 품질과 유지보수성을 크게 향상시킬 수 있기 때문입니다. 😊

다음 섹션에서는 실제 프로젝트에서 AssertJ를 어떻게 활용할 수 있는지, 그리고 어떤 베스트 프랙티스들이 있는지 살펴보겠습니다. 이를 통해 여러분은 AssertJ를 실제 개발 환경에서 효과적으로 사용할 수 있는 방법을 배우게 될 것입니다.

4. AssertJ 실전 활용 및 베스트 프랙티스 🏆

이제 AssertJ의 기본 사용법과 고급 기능에 대해 알아보았으니, 실제 프로젝트에서 어떻게 활용할 수 있는지, 그리고 어떤 베스트 프랙티스들이 있는 지 살펴보겠습니다. 이 섹션에서는 실제 개발 환경에서 AssertJ를 효과적으로 사용하는 방법과 팁을 제공하겠습니다.

4.1 실제 프로젝트에서의 AssertJ 활용

실제 프로젝트에서 AssertJ를 활용할 때는 단순히 값을 검증하는 것을 넘어, 비즈니스 로직과 도메인 규칙을 테스트하는 데 중점을 둡니다.

4.1.1 서비스 레이어 테스트 예시


@Test
public void testCreateUser() {
    // Given
    UserDto userDto = new UserDto("john@example.com", "John Doe", 25);
    
    // When
    User createdUser = userService.createUser(userDto);
    
    // Then
    assertThat(createdUser)
        .isNotNull()
        .satisfies(user -> {
            assertThat(user.getId()).isNotNull();
            assertThat(user.getEmail()).isEqualTo(userDto.getEmail());
            assertThat(user.getName()).isEqualTo(userDto.getName());
            assertThat(user.getAge()).isEqualTo(userDto.getAge());
            assertThat(user.getCreatedAt()).isCloseTo(LocalDateTime.now(), within(1, ChronoUnit.SECONDS));
        });
}

이 예시에서는 사용자 생성 서비스를 테스트하고 있습니다. AssertJ를 사용하여 생성된 사용자 객체의 각 필드를 검증하고, 생성 시간이 현재 시간과 가까운지 확인합니다.

4.1.2 리포지토리 레이어 테스트 예시


@Test
public void testFindUsersByAgeRange() {
    // Given
    List<User> users = Arrays.asList(
        new User("john@example.com", "John", 25),
        new User("jane@example.com", "Jane", 30),
        new User("bob@example.com", "Bob", 35)
    );
    userRepository.saveAll(users);
    
    // When
    List<User> foundUsers = userRepository.findByAgeBetween(26, 36);
    
    // Then
    assertThat(foundUsers)
        .hasSize(2)
        .extracting(User::getName)
        .containsExactlyInAnyOrder("Jane", "Bob");
}

이 예시에서는 특정 나이 범위의 사용자를 찾는 리포지토리 메소드를 테스트하고 있습니다. AssertJ의 `extracting` 메소드를 사용하여 결과의 이름만 추출하고 검증합니다.

4.2 AssertJ 베스트 프랙티스

AssertJ를 효과적으로 사용하기 위한 몇 가지 베스트 프랙티스를 소개합니다:

4.2.1 명확하고 표현력 있는 assertion 작성

assertion은 테스트의 의도를 명확히 표현해야 합니다. 가능한 한 구체적이고 명확한 assertion을 작성하세요.


// 좋지 않은 예
assertThat(user.getAge()).isGreaterThan(0);

// 좋은 예
assertThat(user.getAge())
    .as("User's age")
    .isGreaterThanOrEqualTo(18)
    .isLessThan(100);

4.2.2 커스텀 assertion 활용

프로젝트에서 자주 사용되는 복잡한 assertion은 커스텀 assertion으로 만들어 재사용성을 높이세요.


public class UserAssert extends AbstractAssert<UserAssert, User> {
    public UserAssert(User actual) {
        super(actual, UserAssert.class);
    }

    public static UserAssert assertThat(User actual) {
        return new UserAssert(actual);
    }

    public UserAssert hasValidAge() {
        isNotNull();
        if (actual.getAge() < 18 || actual.getAge() >= 100) {
            failWithMessage("Expected user's age to be between 18 and 99 but was %d", actual.getAge());
        }
        return this;
    }
}

// 사용 예
UserAssert.assertThat(user).hasValidAge();

4.2.3 Soft Assertions 활용

여러 assertion을 한 번에 실행하고 싶을 때는 Soft Assertions를 활용하세요.


SoftAssertions softly = new SoftAssertions();
softly.assertThat(user.getName()).isNotBlank();
softly.assertThat(user.getEmail()).contains("@");
softly.assertThat(user.getAge()).isBetween(18, 99);
softly.assertAll();

4.2.4 테스트 가독성 향상

Given-When-Then 구조를 사용하여 테스트의 구조를 명확히 하고, 각 섹션에 주석을 달아 테스트의 의도를 명확히 표현하세요.


@Test
public void testUserRegistration() {
    // Given: 유효한 사용자 정보
    UserDto userDto = new UserDto("john@example.com", "John Doe", 25);
    
    // When: 사용자 등록 서비스 호출
    User registeredUser = userService.registerUser(userDto);
    
    // Then: 등록된 사용자 정보 검증
    assertThat(registeredUser)
        .isNotNull()
        .satisfies(user -> {
            assertThat(user.getEmail()).isEqualTo(userDto.getEmail());
            assertThat(user.getName()).isEqualTo(userDto.getName());
            assertThat(user.getAge()).isEqualTo(userDto.getAge());
        });
}
AssertJ 베스트 프랙티스 명확하고 표현력 있는 assertion • 구체적이고 명확한 assertion 작성 • as() 메소드로 설명 추가 커스텀 assertion 활용 • 자주 사용되는 복잡한 assertion • 재사용성 향상 Soft Assertions 활용 • 여러 assertion 한 번에 실행 • 모든 실패 한 번에 확인 테스트 가독성 향상 • Given-When-Then 구조 사용 • 명확한 주석으로 의도 표현

이 그림은 AssertJ의 주요 베스트 프랙티스를 시각적으로 요약한 것입니다. 각 프랙티스는 서로 다른 색상의 박스로 표현되어 있어, 한 눈에 각 프랙티스의 핵심을 파악할 수 있습니다.

이러한 베스트 프랙티스들을 따르면, 여러분의 테스트 코드는 더욱 읽기 쉽고, 유지보수하기 쉬워질 것입니다. 특히 재능넷과 같은 플랫폼에서 활동하는 프리랜서 개발자들에게는 이러한 프랙티스들이 매우 중요합니다. 깔끔하고 효율적인 테스트 코드는 프로젝트의 품질을 높이고, 클라이언트의 신뢰를 얻는 데 큰 도움이 될 것입니다. 😊

다음 섹션에서는 AssertJ를 사용할 때 주의해야 할 점들과 흔히 발생하는 실수들에 대해 알아보겠습니다. 이를 통해 여러분은 AssertJ를 더욱 효과적으로 사용할 수 있게 될 것입니다.

관련 키워드

  • AssertJ
  • Java
  • 테스팅
  • assertion
  • 유닛 테스트
  • 소프트웨어 품질
  • 테스트 자동화
  • 테스트 주도 개발(TDD)
  • 리팩토링
  • 코드 품질

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

자유 결제 서비스

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

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

지적 재산권 보호 고지

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

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

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

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

------------------------------------만들고 싶어하는 앱을 제작해드립니다.------------------------------------1. 안드로이드 ( 자바 )* 블루...

안녕하세요.신호처리를 전공한 개발자 입니다. 1. 영상신호처리, 생체신호처리 알고리즘 개발2. 안드로이드 앱 개발 3. 윈도우 프로그램...

 안녕하세요. 안드로이드 기반 개인 앱, 프로젝트용 앱부터 그 이상 기능이 추가된 앱까지 제작해 드립니다.  - 앱 개발 툴: 안드로이드...

애플리케이션 서비스 안녕하세요. 안드로이드 개발자입니다.여러분들의 홈페이지,블로그,카페,모바일 등 손쉽게 어플로 제작 해드립니다.요즘...

📚 생성된 총 지식 3,032 개

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