채널

Prev Next

Classic/VPC 환경에서 이용 가능합니다.

채널

Ncloud Chat에서 채널은 사용자들이 그룹으로 소통할 수 있는 가상의 공간입니다. 채널을 통해 사용자는 특정 주제나 목적에 맞게 정보를 공유하고, 팀워크를 강화하며, 커뮤니케이션을 조직화할 수 있습니다. 채널은 업무 효율을 높이고, 특정 그룹 내 커뮤니케이션을 중앙집중화하여 관리할 수 있는 유용한 도구입니다. 아래는 Ncloud Chat의 채널 기능에 대한 자세한 설명입니다.

채널의 주요 기능

  1. 그룹 커뮤니케이션: 채널을 생성하여 특정 그룹의 멤버들과 소통할 수 있습니다. 이는 프로젝트 팀, 부서, 클럽 등 다양한 형태의 그룹에 적합합니다.
  2. 메시지 및 파일 공유: 채널 내에서는 텍스트 메시지, 이미지, 동영상, 문서 등 다양한 형태의 파일을 쉽게 공유할 수 있습니다.
  3. 실시간 업데이트: 채널 내의 모든 활동은 실시간으로 업데이트되어, 모든 참여자가 최신의 정보를 접할 수 있습니다.
  4. 관리자 제어: 채널의 생성자 또는 관리자는 채널 설정을 변경하거나 사용자를 추가/제거할 권한을 가집니다.
  5. 통화 및 화상회의 기능: 일부 채널에서는 음성 통화나 화상 회의를 지원하여, 멤버 간의 대화를 더욱 효과적으로 할 수 있습니다.
  6. 알림 설정: 사용자는 채널별로 알림을 설정하여 중요한 메시지를 놓치지 않도록 할 수 있습니다.
  7. 검색 기능: 채널 내의 대화나 파일을 쉽게 검색할 수 있어, 필요한 정보를 빠르게 찾을 수 있습니다.

채널 관리

  • 채널 생성: 사용자는 목적에 맞는 채널을 새로 생성할 수 있으며, 채널명, 설명, 멤버 등의 정보를 설정할 수 있습니다.
  • 채널 초대: 채널의 관리자는 다른 사용자를 채널에 초대할 수 있습니다. 초대받은 사용자는 초대를 수락하거나 거절할 수 있습니다.
  • 멤버 관리: 관리자는 채널 멤버의 권한을 설정하거나 멤버를 채널에서 제거할 수 있습니다.

보안

  • 데이터 보안: 채널 내의 모든 데이터는 암호화되어 전송되며, 서버에 안전하게 저장됩니다.
  • 개인 정보 보호: 채널 내에서 공유되는 정보는 채널 멤버들 사이에서만 접근 가능하며, 외부에 유출되지 않도록 보호됩니다.

Ncloud Chat의 채널 기능을 활용하면 조직 내 또는 개인적인 소통을 원활하게 하고, 정보를 효과적으로 관리할 수 있습니다. 이러한 특성은 특히 대규모 조직이나 다양한 프로젝트를 관리할 때 매우 유용합니다.

채널 생성

모든 대화는 채널을 생성해야 하며 채널에 참여해야 정상적으로 채팅을 할 수 있습니다. 아래는 채널을 생성하고 구독하는 방법을 안내합니다.

Javascript/Typescript

await nc.createChannel({
    type: [TYPE], 
    name: [NAME], 
    customField: [CUSTOM_FIELD]
});
ID Type Description Required
NAME string 채널 이름 O
TYPE string 채널 종류 ( PUBLIC or PRIVATE ) O
CUSTOM_FIELD string 사용자 정의 필드, JSON String으로 넣으면 다양하게 활용 가능 X

Android (Kotlin)

NChat.createChannel([TYPE], [NAME], [CUSTOM_FIELD]) { result, e -> 
    if (e != null) {
        // 실패
    } else {
       // 성공
    }
}
ID Type Description Required
NAME String 채널 이름 O
TYPE String 채널 종류 ( PUBLIC or PRIVATE ) O
CUSTOM_FIELD String 사용자 정의 필드, JSON String으로 넣으면 다양하게 활용 가능 X

iOS (Swift)

NChat.createChannel(NCChannel(
    name: [NAME],
    type: [.publicChannel or .privateChannel]),
    customField: [CUSTOM_FIELD])) { result in
        switch(result)
        {
        case .success(let status) :
            // 성공
            break
        case .failure(let error) :
            // 오류
            break
        }
    }
ID Type Description Required
NAME String 채널 이름 O
TYPE String 채널 종류 ( PUBLIC or PRIVATE ) O
CUSTOM_FIELD String 사용자 정의 필드, JSON String으로 넣으면 다양하게 활용 가능 X

iOS (Objective-C)

NSDictionary *channelDict = @{
    @"name": [NAME],
    @"type": [TYPE],
    @"customField": [CUSTOM_FIELD]
};

[NChatBridge.shared createChannelWithChannel:channelDict :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        // 오류
    } else {
        // 성공
    }
}];
ID Type Description Required
NAME NSString* 채널 이름 O
TYPE NSString* 채널 종류 ( PUBLIC or PRIVATE ) O
CUSTOM_FIELD NSString* 사용자 정의 필드, JSON String으로 넣으면 다양하게 활용 가능 X

Unity

await nc.createChannel(new NBaseSDK.Channel
{
    name = [NAME],
    type = [TYPE],    // PUBLIC or PRIVATE
    customField = [CUSTOM_FIELD]
});
ID Type Description Required
NAME string 채널 이름 O
TYPE string 채널 종류 ( PUBLIC or PRIVATE ) O
UniqueID string 고유한 ID X
push boolean 푸시 알림 여부 X
linkUrl string 링크 여부 X
imageUrl string 링크 여부 X
integrationId string 연동 기능 (번역, 보이스 등) X
disabled string 채널 사용여부 X
members array PRIVATE 일 경우 참여 가능한 아이디 X
CustomField string 사용자 정의 필드, JSON String으로 넣으면 다양하게 활용 가능 X
참고
  • 보안을 위해서 클라이언트에서 채널을 생성하는 것보다는 서버를 통한 채널을 생성을 추천해 드립니다.

채널 구독

원하는 채널에 가입(방 참여)합니다. 참여된 채널에는 구독 해제할 때까지 재접속 시에도 자동으로 참여하게 됩니다.

Javascript/Typescript

await nc.subscribe([CHANNEL_ID], {"language":"en"});
ID Type Description Required
CHANNEL_ID string 채널 ID O
language string 언어 코드 X

Android (Kotlin)

val options: Map<String, Any?> = mapOf(
    "language" to "en",
)
NChat.subscribe([CHANNEL_ID], options) { data, e ->
    if (e != null) {
        //오류
    } else {
       // 성공
    }
}
ID Type Description Required
CHANNEL_ID String 채널 ID O
language String 언어 코드 X

iOS (Swift)

let options: [String: Any] = ["language": "en"]
NChat.subscribe(channelId: [CHANNEL_ID], options: [OPTION]) {
    result in
    switch(result)
    {
    case .success(let subscription) :
       // 성공
        break;
    case .failure(let error) :
        // 오류
        break;
    }
}

iOS (Objective-C)

[NChatBridge.shared subscribeWithChannelId:[CHANNEL_ID] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        // 오류
    } else {
        // 성공
    }
}];

Unity

Hashtable option = new Hashtable
{
    { "language", "en" }    // 자동 번역시 필요한 옵션 이외에도 다양한 옵션 추가 가능합니다.
};
await nc.subscribe([CHANNEL_ID], option);

채널 구독 해제

해당 채널에 대한 가입을 해지합니다. 해당 채널에서 더 이상 메시지를 받을 수 없습니다.

Javascript/Typescript

await nc.unsubscribe([CHANNEL_ID]);

Android (Kotlin)

NChat.unsubscribe([CHANNEL_ID]) { data, e ->
    if (e != null) {
        //오류
    } else {
       // 성공
    }
}

iOS (Swift)

NChat.unsubscribe(channelId: [CHANNEL_ID]) {
    result in
    switch(result)
    {
    case .success(let subscription) :
       // 성공
        break;
    case .failure(let error) :
        // 오류
        break;
    }
}

iOS (Objective-C)

[NChatBridge.shared unsubscribeWithChannelId:[CHANNEL_ID] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        // 오류
    } else {
        // 성공
    }
}];

Unity

await nc.unsubscribe([CHANNEL_ID]);

참여자 리스트

(특정 채널에 대해) 참여자 리스트를 가져올 수 있습니다.

Javascript/Typescript

const filter = { channel_id: [CHANNEL_ID] };
const sort = { created_at: -1 };
const option = { offset: 0, per_page: 100 };
const subscriptions = await nc.getSubscriptions(filter, sort, option);

Android (Kotlin)

 // 필터 설정
val filter: Map<String, Any?> = mapOf(
    "channel_id" to "[CHANNEL_ID]"
)

// 정렬 설정
val sort: Map<String, Any?> = mapOf(
    "created_at" to -1
)

// 옵션 설정
val options: Map<String, Any?> = mapOf(
    "per_page" to 10,
    "offset" to 0
)
NChat.getSubscriptions(filter, sort, options) {  subscriptions, e ->
    if (e != null) {
     // 오류
    } else {
        // 성공
    }
}

iOS (Swift)

let filter: [String: Any] = ["channel_id": [CHANNEL_ID]]
let option: [String: Any] = ["per_page": 10, "offset": 0]
let sort: [String: Any] = ["created_at": "-1"]

NChat.getSubscriptions(filter: filter, option: option, sort: sort) { result in
    switch(result)
    {
    case .success(let subscriptions) :
        // 성공
        break;
    case .failure(let error) :
        // 오류
        break;
    }
}

iOS (Objective-C)

[NChatBridge.shared getSubscriptionsWithCompletion:^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        // 오류
    } else {
        // 성공
    }
}];

Unity

Hashtable filter = new Hashtable
{
    { "channel_id", channelId }
};
Hashtable sort = new Hashtable
{
    { "created_at", -1 }
};
Hashtable option = new Hashtable
{
    { "offset", 0 },
    { "per_page", 10 }
};
var subscriptions = await nc.getSubscriptions(filter, sort, option);
foreach (var subscription in subscriptions.edges)
{
    string id = subscription.node.id.ToString();
    Console.WriteLine("[CloudChatSample] id={0}", id);
}
  • Parameters
ID Type Description
filter object 쿼리를 필터 모든 필드에 대해서 검색 가능
sort object 소트하고자 하는 필드의 필터 정의
option object 옵션이 존재할 경우 아래 참고
  • Filter
ID Type Description
project_id String 프로젝트 ID
channel_id String 채널 ID
user_id String 사용자 ID
language String 언어
uniquekey String 유니크 키
online Boolean 온라인 상태
push Boolean 푸시 알림 사용 여부
created_at String 생성 날짜
updated_at String 갱신 날짜
  • Sort
ID Type Description
created_at number 생성 날짜 (오름차순 "1", 내림차순 "-1")
  • Options
ID Type Description
offset number 시작 offset
per_page number 리턴하는 개수(최대 100개)

응용편

특정 채널에 온라인 접속 상태인 접속자 목록만 가져오려면 filter에 online을 true로 추가해 주십시오.

Unity

Hashtable filter = new Hashtable
{
    { "channel_id", [CHANNEL_ID] },
    { "online" , true}
};
Hashtable sort = new Hashtable
{
    { "created_at", -1 }
};
Hashtable option = new Hashtable
{
    { "offset", 0 },
    { "per_page", 10 }
};

var subscriptions = await nc.getSubscriptions(filter, sort, option);

채널 구독

  • Subscription Data Class
ID Type Description
id string 유니크 아이디
channel_id string 채널 아이디
user_id string 유저 고유 아이디
created_at string 생성 일자
online boolean 온라인 여부
push boolean 푸시 참여 여부
language string 접속 언어
channel string 채널 정보
mark.user_id string 마지막 메시지 보낸 사용자
mark.message_id string 마지막 메시지 아이디
mark.sort_id string 마지막 메시지 정렬 ID
mark.unread string 마지막 메시지 이후 안읽은 메시지 갯수

채널 정보

  • ChannelData data class
ID Type Description
totalCount Int 전체 채널 수
channels Channel 채널 데이터 리스트
  • Channel Data Class
ID Type Description
id string 채널 아이디 (unique)
project_id string 프로젝트 아이디
name string 채널 이름
user_id string (채널을 생성한) 사용자 아이디
user User (채널을 생성한) 사용자 정보
unique_id string 개발사에서 설정 가능한 채널 아이디 (unique)
type string 채널 종류 ( PUBLIC or PRIVATE )
members string 참여된 사용자 목록
push boolean 푸시 메시지 지원 여부
disabled boolean 채널 상태
customField string 사용자 정의 데이터
subscribed boolean 호출 유저에 대한 채널 구독 여부
unread int 안읽은 메시지 수
created_at string 생성 일자
updated_at string 갱신 일자
last_message Message 마지막 메시지 정보

채널 데이터 가져오기

프로젝트의 채널 데이터를 목록 형태로 가져오려면 아래 코드를 사용해 주십시오.

Javascript/Typescript

const filter = { state: true };
const sort = { created_at: -1 };
const option = { offset: 0, per_page: 100 };
const channels = await nc.getChannels(filter, sort, option);

Android (Kotlin)

val filter: Map<String, Any?> = mapOf(
    "state" to true
)
val sort: Map<String, Any?> = mapOf(
    "created_at" to -1
)
val options: Map<String, Any?> = mapOf(
    "per_page" to 10,
    "offset" to 0
)
NChat.getChannels(filter, sort, options) { channelData, e ->
    if (e != null) {
       // 오류
    } else {
        // 성공
    }
}

iOS (Swift)

let filter: [String: Any] = ["state": true]
let option: [String: Any] = ["per_page": 10, "offset": 0]
let sort: [String: Any] = ["created_at": "-1"]

NChat.getChannels(filter: filter, option: option, sort: sort) { result in
    switch(result)
    {
    case .success(let channelData) :
        // 성공
        break;
    case .failure(let error) :
        // 실패
        break;
    }
}

iOS (Objective-C)

[NChatBridge.shared getChannelsWithFilter:@{} option:@{} sort:@{} :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        // 오류
    } else {
        // 성공
    }
}];

Unity

Hashtable filter = new Hashtable
{
    { "state", true }
};
Hashtable sort = new Hashtable
{
    { "created_at", -1 }
};
Hashtable option = new Hashtable
{
    { "offset", 0 },
    { "per_page", 10 }
};
var channels = await nc.getChannels(filter,sort,option);
foreach (var channel in channels.edges)
{
    string id = channel.node.id.ToString();
    Console.WriteLine("[CloudChatSample] id={0}", id);
}
  • Parameters
ID Type Description Required
filter object 쿼리를 필터 모든 필드에 대해서 검색 가능 O
sort object 소트하고자 하는 필드의 필터 정의 X
option object 옵션이 존재할 경우 아래를 참고 X
  • Filter
ID Type Description
id String 채널 ID
project_id String 프로젝트 ID
name String 채널 이름
user_id String 사용자 ID
unique_id String 유니크 ID
type String 채널 타입
push Boolean 푸시 알림 사용 여부
disabled Boolean 비활성화 여부
customField String 사용자 정의 필드
link_url String 링크 URL
image_url String 이미지 URL
subscribed Boolean 구독 여부
unread Int 읽지 않은 메시지 수
created_at String 생성 날짜
updated_at String 업데이트 날짜
  • Sort
ID Type Description
created_at number 생성 날짜 (오름차순 "1", 내림차순 "-1")
  • Option
ID Type Description
offset number 시작 offset
per_page number 리턴하는 개수(최대 100개)

개별 채널

  • 개별 채널에 대한 정보를 가져올 수 있습니다.

Javascript/Typescript

const channel = await nc.getChannel(channelId);

Android (Kotlin)

NChat.getChannel([CHANNEL_ID]) { channel, e ->
    if (e != null) {
       // 오류
    } else {
        // 성공
    }
}

iOS (Swift)

NChat.getChannel(channelId: [CHANNEL_ID]) { result in
    switch(result)
    {
    case .success(let channel) :
        // 성공
        break;
    case .failure(let error) :
        // 실패
        break;
    }
}

iOS (Objective-C)

[NChatBridge.shared getChannelWithChannelId:[CHANNEL_ID] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        // 오류
    } else {
        // 성공
    }
}];

Unity

Channel channel = await nc.getChannel(id);

채널 내 사용자 초대

PRIVATE 채널의 경우 참여하고자 하는 사용자를 초대합니다.

Javascript/Typescript

const channel = await nc.addUsers(channelId, [userIds], {
    message: "user joins",
});

Android (Kotlin)

val userIds = listOf("user1", "user2")
NChat.addUsers([CHANNEL_ID],userIds) { channel, e->
    if (e != null) {
        // 오류
    } else {
        // 성공
    } 
}

iOS (Swift)

let userIds = ["userId1", "userId2", "userId3"] // 예제 사용자 ID 배열
NChat.addUsers(channelId: [CHANNEL_ID], userIds: userIds) { result in
    switch(result)
    {
    case .success(let channel) :
        // 성공
        break;
    case .failure(let error) :
        // 실패
        break;
    }
}

iOS (Objective-C)

[NChatBridge.shared addUsersWithChannelId:[CHANNEL_ID] userIds:@[[USER_ID]] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        // 오류
    } else {
        // 성공
    }
}];

Unity

await nc.addUsers(newChannelId, new string[] { "ID", "ID" });

채널 내 사용자 삭제

PRIVATE 채널의 경우 참여된 사용자를 삭제합니다.

Javascript/Typescript

const channel = await nc.removeUsers(channelId, [user_id], {
    message: "user removed",
});

Android (Kotlin)

val userIds = listOf("user1", "user2")
NChat.removeUsers([CHANNEL_ID],userIds) { channel, e->
    if (e != null) {
        // 오류
    } else {
        // 성공
    } 
}

iOS (Swift)

let userIds = ["userId1", "userId2", "userId3"] // 예제 사용자 ID 배열
NChat.removeUsers(channelId: [CHANNEL_ID], userIds: userIds) { result in
    switch(result)
    {
    case .success(let channel) :
        // 성공
        break;
    case .failure(let error) :
        // 실패
        break;
    }
}

iOS (Objective-C)

[NChatBridge.shared removeUsersWithChannelId:[CHANNEL_ID] userIds:@[[USER_ID]] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        // 오류
    } else {
        // 성공
    }
}];

Unity

await nc.removeUsers(channelId, new string[] { "ID", "ID" });

채널 내 사용자 차단

채널 내에 사용자를 차단합니다. 채널을 생성한 권한을 가지고 있는 유저나 전체 관리자만 사용이 가능합니다.

Javascript/Typescript

const subscribe = await nc.banUser(channelId, id, {
    timeout: 60 * 60,
    reason: "욕설로 차단되었습니다.",
});

Android (Kotlin)

val options: Map<String, Any?> = mapOf(
    "timeout" to [종료시간(초)],
    "reason" to "[차단사유]"
)
NChat.banUser([CHANNEL_ID], userId, options) { channel, e->
    if (e != null) {
        // 오류
    } else {
        // 성공
    } 
}

iOS (Swift)

let option: [String: Any] = ["timeout": [종료시간(초)], "reason": "[차단사유]"]
NChat.banUser(channelId: [CHANNEL_ID], userId: userId, options: options) { result in
    switch(result)
    {
    case .success(let channel) :
        // 성공
        break;
    case .failure(let error) :
        // 실패
        break;
    }
}

iOS (Objective-C)

[NChatBridge.shared banUserWithChannelId:[CHANNEL_ID] userId:[USER_ID] options:@{@"timeout": [종료시간(초)], @"reason": [차단사유]} :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        // 오류
    } else {
        // 성공
    }
}];

Unity

Hashtable option = new Hashtable
{
    { "timeout", [종료시간(초)] },
    { "reason", [차단사유] }
};
await nc.banUser(channelId, userId, options);
  • Options Data Class
ID Type Description
timeout string 차단 시간 (seconds)
reason string 차단 사유

채널 내 사용자 차단 해제

채널 내에 차단한 사용자의 차단을 해제합니다. 채널을 생성한 권한을 가지고 있는 유저나 전체 관리자만 사용이 가능합니다.

Javascript/Typescript

const subscribe = await nc.unbanUser(channelId, id);

Android (Kotlin)

NChat.unbanUser([CHANNEL_ID],userId) { channel, e->
    if (e != null) {
        // 오류
    } else {
        // 성공
    } 
}

iOS (Swift)

NChat.unbanUser(channelId: [CHANNEL_ID],userId: userId) { result in
    switch(result)
    {
    case .success(let channel) :
        // 성공
        break;
    case .failure(let error) :
        // 실패
        break;
    }
}

iOS (Objective-C)

[NChatBridge.shared unbanUserWithChannelId:[CHANNEL_ID] userId:userId :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        // 오류
    } else {
        // 성공
    }
}];

Unity

await nc.unbanUser(channelId, userId);

채널 삭제

해당 채널을 삭제합니다 (한 개 또는 여러 개를 삭제할 수 있습니다).

Javascript/Typescript

const channel = await nc.deleteChannel(channelId);

Android(Kotlin)

NChat.deleteChannel([CHANNEL_ID]) { channel, e->
    if (e != null) {
        //  오류
    } else {
        // 성공
    }
}

iOS(Swift)

NChat.deleteChannel(channelId: [CHANNEL_ID]) { result in
    switch(result)
    {
    case .success(let channel) :
        // 성공
        break
    case .failure(let error) :
        // 실패
        break
    }
}

iOS (Objective-C)

[NChatBridge.shared deleteChannelWithChannelId:[CHANNEL_ID] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        // 오류
    } else {
        // 성공
    }
}];

Unity

Channel channel = await nc.deleteChannel([CHANNEL_ID]);

채널 수정

채널 정보를 업데이트합니다.

Javascript/Typescript

const channel = await nc.updateChannel(channelId, {
    name,
    type: "PUBLIC",
    members: [],
});

Android(Kotlin)

import com.nbase.adpater.cloudchat.model.Channel

val newChannel = Channel(name = "New Channel2")
NChat.updateChannel([CHANNEL_ID], newChannel) { channel, e->
    if (e != null) {
        // 오류
    } else {
        // 성공
    }
}

iOS(Swift)

var newChannel: NCChannel = NCChannel(name: "New Channel2")
NChat.updateChannel(channelId: [CHANNEL_ID], channel: newChannel) { result in
    switch(result)
    {
    case .success(let channel) :
        // 성공
        break
    case .failure(let error) :
        // 실패
        break
    }
}

iOS (Objective-C)

NSMutableDictionary *channelDict = [NSMutableDictionary dictionary];
channelDict[@"name"] = @"New Channel2";

[NChatBridge.shared updateChannelWithChannelId:[CHANNEL_ID] channel:channelDict :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        // 오류
    } else {
        // 성공
    }
}];

Unity

Channel channel = await nc.updateChannel([CHANNEL_ID],new NBaseSDK.Channel
{
    name = "Update Channel",
    type =[TYPE],    // PUBLIC or PRIVATE
    customField = [CUSTOM_FIELD]
});