2016년 10월 26일 수요일

SQL의 데이터 조작 기능(2)

SQL의 데이터 조작 기능(2)

5. NULL을 이용한 검색

검색 조건에서 특성 속성의 값이 널 값인지를 비교하려면 IS NULL 키워드를 사용한다. 마찬가지로 특정 속성의 값이 널 값이 아닌지를 비교하려면 IS NOT NULL 키워드를 사용한다.

고객 테이블에서 나이가 아직 입력되지 않은 고객이름을 검색해보자.
SELECT name FROM customer WHERE age IS NULL;
검색 조건에서 나이가 아직 입력되지 않았다는 것은 나이 속성이 널 값임을 의미하며 이러한 검색 조건은 'age = NULL' 형태로 표현해서는 안된다.

고객 테이블에서 나이가 이미 입력된 고객의 고객 이름을 검색해보자.
SELECT name FROM customer WHERE age IS NOT NULL;
검색 조건에서 나이가 이미 입력되었다는 것은 나이 속성이 널 값이 아님을 의미한다. 이러한 검색 조건은 'age <> NULL' 의 형태로 표현하지 않고 반드시 'age IS NOT NULL' 형태로 표현해야 한다.

검색 조건에서 널 값은 다른 값과 크기를 비교하면 결과가 모두 거짓이 된다. 아래에서 재고량 stock의 값이 널이면 어떤 비교 연산자를 사용해도 결과가 모두 거짓이다.

재고량 > 10
재고량 < 10
재고량 >= 10
재고량 <= 10
재고량 = 10
재고량 <> 10

6. 정렬 검색

SELECT 문의 검새 결과 테이블은 일밙거으로 DBMS가 정한 순서로 출력된다. 결과 테이블의 내용을 사용자가 원하는 순서로 출력하려면 ORDER BY 키워드를 사용한다. 결과 테이블의 내용을 원하는 기준에 따라 정렬하여 출력하는 SELECT 문의 기본 형식은 다음과 같다.

SELECT [ ALL | DISTINCT ] 속성_리스트
FROM 테이블_리스트
[ WHERE 조건 ]
[ ORDER BY 속성_리스트 [ ASC | DESC ] ];

ORDER BY 키워드와 함께 정렬 기준이 되는 속성을 지정하고, 오름차순 정렬이면 ASC, 내림차순 정렬이면 DESC로 표현한다. 기본 정렬 방법은 오름차순이므로 특별히 지정하지 않으면 오름차순으로 기본 정렬한다.

문자 데이터를 오름차순으로 정렬하면 알파벳이나 사전 순으로 출력된다. 날짜 데이터는 빠른 날짜가 먼저 출력된다. 널 값은 오름차순에서 맨 먼저 출력되고 내림차순에서는 맨 마지막에 출력된다.

결과를 여러 기준에 따라 정렬하려면 ORDER BY 키워드와 함께 정렬 기준이 되는 속성을 차례로 제시하면 된다.

고객 테이블에서 고객이름, 등급, 나이를 검색하되, 나이를 기준으로 내림차순 정렬해보자.
SELECT name, grade, age FROM customer ORDER BY age DESC;

주문 테이블에서 수량이 10개 이상인 주문의 주문고객, 주문제품, 수량, 주문일자를 검색해보자. 단, 주문제품을 기준으로 오름차순 정렬하고, 동일 제품은 수량을 기준으로 내림차순 정렬해보자.
SELECT name, product, quantity, date FROM order_info ORDER BY product ASC, quantity DESC;

7. 집계함수

함수의미사용 가능한 속성의 타입
COUNT속성 값의 개수
MAX속성 값의 최대값모든 데이터
MIN속성 값의 최소값
SUM속성 값의 합계숫자 데이터
AVG속성 값의 평균

집계 함수를 사용할 때 다음과 같은 사항에 주의해야 한다.
  • 집계 함수는 널인 속성 값은 제외하고 계산한다.
  • 집계 함수는 WHERE 절에서는 사용할 수 없고 SELECT 절이나 HAVING 절에서만 사용할 수 있다.
제품 테이블에서 모든 제품의 단가 평균을 검색해보자.
SELECT AVG(price) FROM product;

한빛제과에서 제조한 제품의 재고량 합계를 제품 테이블에서 검색해보자. 출력할 때 속성이름을 재고량 합계로 표시하자.

SELECT SUM(price) AS '재고량 합계' FROM product WHERE manufacturer = '한빛제과';

고객 테이블에 몇 명이 등록되어 있는지 검색해보자.
SELECT COUNT(*) FROM customer;

집계 함수는 널인 속성 값은 제외하기 때문에 널 값을 포함하고 있는 속성으로 COUNT 함수를 적용하면 다른 값이 나올 수 있다. 개수를 정확히 계산하려면 널 값이 없는 속성에 COUNT 함수를 적용하는 것이 좋기 때문에 보통 기본키 속성이나 * 를 이용해 계산한다.

DISTINCT 키워드를 사용해 특정 속성 값의 중복을 없애고 집계 함수를 적용할 수도 있다.

제품 테이블에서 제조업체의 수를 검색해보자. 속성값은 '제조업체 수'로 표시한다.
SELECT COUNT(DISTINCT manufacturer) AS '제조업체 수' FROM product;


[출처] 한빛아카데미 데이터베이스 개론 김현희지음

2016년 10월 19일 수요일

SQL의 데이터 조작 기능(1)

SQL의 데이터 조작 기능(1)

데이터 검색 SELECT
데이터 삽입 INSERT
데이터 수정 UPDATE
데이터 삭제 DELETE

INSERT INTO customer VALUES ('apple', '정소화', 20, 'gold', '학생', 1000);
INSERT INTO customer VALUES ('banana', '김선우', 25, 'vip', '간호사', 2500);
INSERT INTO customer VALUES ('carrot', '고명석', 28, 'gold', '교사', 4500);
INSERT INTO customer VALUES ('orange', '김용욱', 22, 'silver', '학생', 0);
INSERT INTO customer VALUES ('melon', '성원용', 35, 'gold', '회사원', 5000);
INSERT INTO customer VALUES ('pear', '채광주', 31, 'silver', '회사원', 500);
INSERT INTO customer VALUES ('peach', '오형준', NULL, 'silver', '의사', 300);

INSERT INTO product VALUES ('p01', '그냥만두', 5000, 4500, '대한식품');
INSERT INTO product VALUES ('p02', '매운쫄면', 2500, 5500, '민국푸드');
INSERT INTO product VALUES ('p03', '쿵떡파이', 3600, 2600, '한빛제과');
INSERT INTO product VALUES ('p04', '맛난초콜렛', 1250, 2500, '한빛제과');
INSERT INTO product VALUES ('p05', '얼큰라면', 2200, 1200, '대한식품');
INSERT INTO product VALUES ('p06', '통통우동', 1000, 1550, '민국푸드');
INSERT INTO product VALUES ('p07', '달콤비스켓', 1650, 1500, '한빛제과');

INSERT INTO order_info VALUES ('o01', 'apple', 'p03', 10, '서울시 마포구', '13/01/01');
INSERT INTO order_info VALUES ('o02', 'melon', 'p01', 5, '인천시 계양구', '13/01/10');
INSERT INTO order_info VALUES ('o03', 'banana', 'p06', 45, '경기도 부천시', '13/01/11');
INSERT INTO order_info VALUES ('o04', 'carrot', 'p02', 8, '부산시 금정구', '13/02/01');
INSERT INTO order_info VALUES ('o05', 'melon', 'p06', 36, '경기도 용인시', '13/02/20');
INSERT INTO order_info VALUES ('o06', 'banana', 'p01', 19, '충청북도 보은군', '13/03/02');
INSERT INTO order_info VALUES ('o07', 'apple', 'p03', 22, '서울시 영등포구', '13/03/15');
INSERT INTO order_info VALUES ('o08', 'pear', 'p02', 50, '강원도 춘천시', '13/04/10');
INSERT INTO order_info VALUES ('o09', 'banana', 'p04', 15, '전라남도 목포시', '13/04/11');
INSERT INTO order_info VALUES ('o10', 'carrot', 'p03', 20, '경기도 안양시', '13/05/22');

1. 데이터의 검색

1. 기본 검색

SELECT [ALL | DISTINCT ] 속성_리스트 FROM 테이블_리스트;

SELECT 키워드와 함께 검색하고 싶은 속성의 이름을 콤마(,) 로 구분하여 차례로 나열한다. 그리고 FROM 키워드와 함께 검색하고 싶은 속성이 있는 테이블의 이름을 콤마(,) 로 구분하여 차례로 나열한다. SELECT 문은 검색 결과를 테이블 형태로 반환한다. 즉, 테이블을 대상으로 하는 SELECT 문의 수행 결과도 테이블이다.

고객 테이블에서 고객아이디, 고객이름, 등급 속성을 검색해본다.
SELECT id, name, grade FROM customer;


고객 테이블에 존재하는 모든 속성을 검색해본다.
SELECT id, name, age, grade, job, saved_money FROM customer;

고객 테이블에 존재하는 모든 속성을 검색해보자.
SELECT * FROM customer;
결과는 컬럼을 모두 나열한 앞의 예와 동일하다.

제품 테이블에서 제조업체를 검색해보자.
SELECT manufacturer from product;
위 결과와 같이 SELECT 문의 결과 테이블은 관계 데이터 모델의 일반 릴레이션과 큰 차이가 있다. 관계 데이터 모델의 일반 릴레이션은 투플의 집합 개념으로 이해할 수 있으며 투플의 유일성을 만족해야 하기 때문에 릴레이션 하나에서 동일한 투플이 중복되면 안되다. 그러나 SELECT 문의 수행 결과로 반환되는 결과 테이블에서는 동일한 투플이 중복될 수 있다.

결과 테이블이 중복을 허용하도록 ALL 키워드를 명시적으로 사용할 수 있다.
SELECT ALL manufacturer from product;
결과는 위의 예와 동일하다.

결과 테이블에서 투플의 중복을 제거하고 한 번씩만 출력되도록 하려면 DISTINCT 키워드를 사용한다.

제품 테이블에서 제조업체 속성을 중복 없이 검색해보자.
SELECT DISTINCT manufacturer FROM product;


결과 테이블에서 출력되는 속성의 이름을 다른 이름으로 바꾸어 출력할 수도 있다. AS 키워드를 변경할 이름과 함께 지정하면 된다. 원래 테이블의 속성 이름이 실제로 바뀌는 것은 아니다. 지정하는 이름에 공백이 포함되어 있으면 작은 따옴표나 큰 따옴표로 묶어주어야 한다. 그리고 AS 키워는 생략할 수 있다.

제품 테이블에서 제품명과 단가를 검색하되, 단가를 가격이라는 새 이름으로 출력하자.
SELECT name, price AS 가격 FROM product;

2. 산술식을 이용한 검색

SELECT 키워드와 함께 산술식을 제시할 수 있다. 산술식은 속성의 이름과 +, -, *, / 등의 산술 연산자와 상수로 구성한다.

제품 테이블에서 제품명과 단가 속성을 검색하되, 단가에 500원을 더해 조정단가라는 새 이름으로 출력해보자.

SELECT name, price + 500 AS 조정단가 FROM product;

3. 조건 검색


조건을 만족하는 데이터만 검색하는 SELECT 문의 기본 형식은 다음과 같다.
SELECT [ ALL | DISTINCT ] 속성_리스트 FROM 테이블_리스트 [ WHERE 조건 ];

WHERE 키워드와 함께 비교 연산자(=, <>, <, >, <=, >=)와 논리 연산자(AND, OR, NOT)를 이용하여 검색 조건을 제시한다.
비교 연산자를 이용해 문자나 날짜 값을 비교할 수 있다.
'A' < 'C' '2013-12-01' < '2013-12-02'
조건에서 숫자값은 그대로 작성해도 되지만 문자나 날짜 값은 속성의 이름과 구별할 수 있도록 작은 따옴표로 묶어야 한다.
논리 연산자는 조건을 여러 개 결합하거나 조건을 만족하지 않는 데이터를 검색하고자 할 때 이용한다.

제품 테이블에서 한빛제과가 제조한 제품의 제품명, 재고량, 단가를 검색하자.
SELECT name, stock, price FROM product WHERE manufacturer = '한빛제과';
주문 테이블에서 apple 고객이 15개 이상 주문한 주문제품, 수량, 주문일자를 검색해보자.
SELECT product, quantity, order_date FROM order_info WHERE customer = 'apple' AND quantity >= 15;

주문 테이블에서 apple 고객이 주문했거나 15개 이상 주문된 제품의 주문제품, 수량, 주문일자, 주문고객을 검색해보자.
SELECT product, quantity, order_date, customer FROM order_info WHERE customer = 'apple' OR quantity >= 15;

제품 테이블에서 단가가 2000원 이상이면서 3000원 이하인 제품의 제품명, 단가, 제조업체를 검색해보자.
SELECT name, price, manufacturer FROM product WHERE price >= 2000 AND price <= 3000;

4. LIKE를 이용한 검색

검색 조건을 정확히 몰라 부분적으로 일치하는 데이터를 검색하고 싶다면 LIKE 키워드를 사용한다. 검색 조건을 정확히 알면 = 연산자로 조건을 표현한다. 단 LIKE 키워드는 문자열을 이요하는 조건에만 사용할 수 있다. 

LIKE 키워드와 함께 사용할 수 있는 기호
  • % : 0개 이상의 문자(문자의 내용과 개수는 상관없음)
  • _ : 한 개의 문자(문자의 내용을 상관 없음)
LIKE 키워드의 사용 예
  • LIKE '데이터%' : 데이터로 시작하는 문자열(데이터로 시작하기만 하면 길이는 상관 없음)
  • LIKE '%데이터' : 데이터로 끝나는 문자열(데이터로 끝나기만 하면 길이는 상관 없음)
  • LIKE '%데이터%' : 데이터가 포함된 문자열
  • LIKE '데이터___' : 데이터로 시작하는 6자 길이의 문자열
  • LIKE '__한%' : 세 번째 글자가 '한'인 문자열
고객 테이블에서 성이 김씨인 고객의 고객이름, 나이, 등급, 적립금을 검색해보자.
SELECT name, age, grade, saved_money FROM customer WHERE name LIKE '김%' ;
고객 테이블에서 고객아이디가 5자인 고객의 고객아이디, 고객이름, 등급을 검색해보자.
SELECT id, name, grade FROM customer WHERE id LIKE '_____';



[출처] 한빛아카데미 데이터베이스 개론 김현희지음

Mysql root 패스워드 분실한 경우 처리

기본으로 윈도우에 Mysql을 설치한 경우 다음의 위치에
각 버전에 대한 데이터 디렉토리가 생성된다.

C:\ProgramData\MySQL\MySQL Server 5.6

해당 디렉토리에서
my.ini 파일을 열어서
skip-grant-tables 구문을 추가한다.

이후 Mysql을 재구동 하면  패스워드를 물어보지 않는다.

다음으로 명령창을 열어서 다음과 같이 실행한다.

$mysql -uroot mysql
mysql> UPDATE user SET password=PASSWORD('변경할 비밀번호') WHERE user='root';

마지막으로 my.ini 파일의
skip-grant-table 구문을 제거하고 Mysql을 재구동한다.

2016년 10월 12일 수요일

SQL의 데이터 정의 기능

SQL의 데이터 정의 기능

1. 테이블 생성

CREATE TABLE

CREATE TABLE 테이블_이름 (
    속성_이름 데이터 타입 [NOT NULL] [DEFAULT 기본_값]
    [PRIMARY KEY (속성_리스트)]
    [UNIQUE (속성_리스트)]
    [FOREIGN KEY (속성_리스트) REFERENCES 테이블_이름(속성_리스트)]
    [ON DELETE 옵션] [ON UPDATE 옵션]
    [CONSTRAINT 이름] [CHECK(조건)]
);

참조무결성 제약조건
왜리키가 어떤 테이블의 무슨 속성을 참조하는지를 REFERENCES 키워드 다음에 명확히 제시하여 참조되는 테이블에서 투플을 함부로 삭제하거나 변경하지 못하게 한다.

참조되는 테이블에서 투플을 삭제할 때 처리하는 방법
1) ON DELETE NO ACTION(투플을 삭제하지 못하게 함)(디폴트)
2) ON DELETE CASCADE(관련 투플을 함께 삭제함)
3) ON DELETE SET NULL(관련 투플의 외래키 값을 NULL로 변경함)
4) ON DELETE SET DEFAULT(관련 투플의 외래키 값을 미리 지정한 기본 값으로 변경함)

참조되는 테이블에서 투플을 변경할 때 처리하는 방법
1) ON UPDATE NO ACTION(투플을 변경하지 못하게 함)(디폴트)
2) ON UPDATE CASCADE(관련 투플에서 외래키 값을 함께 변경함)
3) ON UPDATE SET NULL(관련 투플의 외래키 값을 NULL로 변경함)
4) ON UPDATE SET DEFAULT(관련 투플의 외래키 값을 미리 지정한 기본 값으로 변경함)

데이터 무결성 제약조건의 정의
CREATE TABLE 문으로 테이블을 정의할 때 CHECK 키워드를 사용해 특정 속성에 대한 제약조건을 지정한다. 테이블에 새로운 투플을 삽입하거나 기존 투플을 수정할 때도 이 제약조건을 반드시 지켜야 한다. 이는 테이블에 항상 정확하고 유효한 데이터를 유지하기 위해 데이터 무결성을 위한 제약조건을 표현하는 방법이다.

CHECK(재고량 >=0 AND 재고량 <=1000)
or CONSTRAINT CHK_CPY CHECK(제조업체 = '한빛제과')

고객 테이블
CREATE TABLE customer (
    id                VARCHAR(20) NOT NULL, /* 고객 아이디 */
    name           VARCHAR(10) NOT NULL, /* 고객 이름 */
    age              INT, /* 나이 */
    grade           VARCHAR(10) NOT NULL, /* 등급 */
    job              VARCHAR(20), /* 직업 */
    saved_money INT DEFAULT 0, /* 적립금 */
    PRIMARY KEY(id)
);

제품 테이블
CREATE TABLE product (
    id                CHAR(3) NOT NULL, /* 제품번호 */
    name           VARCHAR(20), /* 제품명 */
    stock           INT, /* 재고량 */
    price            INT, /* 단가 */
    manufacturer VARCHAR(20), /* 제조업체 */
    PRIMARY KEY(id),
    CHECK (stock >= 0 AND stock <= 10000)
);

주문 테이블
CREATE TABLE order_info (
    id            CHAR(3) NOT NULL, /* 주문번호 */
    customer   VARCHAR(20), /* 주문고객 */
    product     CHAR(3), /* 주문제품 */
    quantity     INT, /* 수량 */
    destination VARCHAR(30), /* 배송지 */
    order_date DATETIME, /* 주문일자 */
    PRIMARY KEY(id),
    FOREIGN KEY(customer) REFERENCES customer(id),
    FOREIGN KEY(product) REFERENCES product(id)
);
-- 오라클에서는 주문일자 속성의 데이터 타입은 DATE로 지정

2. 테이블 변경

ALTER TABLE 문을 이용해 새로운 속성 추가, 기존 속성 삭제, 새로운 제약조건 추가, 기존 제약조건 삭제 등이 가능하다.

새로운 속성의 추가

ALTER TABLE 테이블_이름 ADD 속성_이름 데이터_타입 [NOT NULL] [DEFAULT 기본_값];
ex) ALTER TABLE customer ADD join_date DATETIME;

기존 속성의 삭제

ALTER TABLE 테이블_이름 DROP 속성_이름 CASECADE | RESTRICT;

ALTER TABLE 문을 작성할 때는 삭제할 속성과 관련된 제약조건이 존재하거나 이 속성을 참조하는 다른 속성이 존재하는 경우에 처리하는 방법을 선택할 수 있다. 관련된 제약조건이나 참조하는 다른 속성을 함께 삭제하기 위해 CASCADE를 지정하거나, 관련된 제약조건이나 참조하는 다른 속성이 존재하면 삭제가 수행되지 않도록 RESTRICT를 지정할 수 있다.
ex) ALTER TABLE customer DROP grade CASCADE;

새로운 제약조건의 추가

ALTER TABLE 테이블_이름 ADD CONSTRAINT 제약조건_이름 제약조건_내용
ex) ALTER TABLE customer ADD CONSTRAINT CHK_AGE CHECK(age >= 20);

기존 제약조건의 삭제

ALTER TABLE 테이블_이름 DROP CONSTRAINT 제약조건_이름;
ex) ALTER TABLE customer DROP CONSTRAINT CHK_AGE;


3. 테이블 제거

DROP TABLE 테이블_이름 CASECADE | RESTRICT;

DROP TABLE 문을 작성할 때 삭제할 테이블을 참조하는 다른 테이블도 함께 삭제하려면 CASCADE를 지정한다. 반대로 삭제할 테이블을 참조하는 테이블이 있으면 삭제가 수행되지 않도록 하려면 RESTRICT를 지정한다.

ex) DROP TABLE customer RESTRICT;

2016년 9월 11일 일요일

Mosquitto 설치

MQTT 브로커인 Mosquitto 를 설치한다.

모스키토 다운로드 페이지

Mosquitto 설치시
Mosquitto 설치 디렉토리에 다음 파일을 복사에 주어야 한다.

OpenSSL dll 파일들(ssleay32.dll, libeay32.dll)과 pthreadVC2.dll
파일들
최근 버전의 OpenSSL 에는 ssleay32.dll과 libeay32.dll 파일들이 없으므로
Win32OpenSSL_Light-1_0_2h 이전 버전을 다운받아야 한다.

Win32OpenSSL 다운로드 페이지
pthreadVC2.dll 다운로드 페이지

설치후 실행중 에러 조치사항

컴퓨터에 MSVCR100.dll이(가) 없어 프로그램을 시작할 수 없습니다.
프로그램을 다시 설치하여 이 문제를 해결하십시오
시스템 오류 팝업이 뜨는 경우

Visual C++ 재배포 가능 패키지 다운로드
운영체제가 32비트인 경우 vredist_x86.exe
운영체제가 64비트인 경우 vredist_x64.exe와 vredist_x86.exe 둘다 다운로드

커맨드 창에서 unknown 에러가 뜨는 경우

Mosquitto Broker 서비스가 잘못 실행되는 경우가 있다. 컴퓨터를 재시작하고
[제어판][관리도구][서비스] 에서
Mosquitto Broker 서비스를 수동 혹은 자동으로 변경해준다.

[참고 페이지]
http://midnightcow.tistory.com/entry/MQTT-Sever-Mosquitto
http://deneb21.tistory.com/416
http://dalkomit.com/119
http://programmerchoo.tistory.com/132



2016년 9월 8일 목요일

[LoRa]Device Classes – Not All Nodes Are Created Equal

End-devices는 다양한 애플리케이션을 제공하고 다른 요구사항들을 갖는다. 다양한 end 애플리케이션 프로파일을 최적화하기 위해 LoRaWAN 은 각각 다른 device classes를 사용한다. 장치 class들은 네트워크 다운로드 통신 대기 시간(반응 시간)에 대해 배터리 수명의 균형을 맞춘다.제어 또는 구동 타입의 애플리케이션에서 다운로드 통신 반응시간은 중요한 요소이다.



양 방향의 end-devices(Class A):Class A의 End-device들은 양방향 통신을 위해 각
end-device의 상방향 전송 이후에 두개의 짧은 하방향 수신 윈도우가 따라온다. end-device에 의해 스케줄되는 전송 슬롯은 랜덤 시간 기반(ALOHA-type의 프로토콜)에 약간의 변형을 가하여 자신의 통신 필요에 기초를 둔다. 이 Class A 작업은 end-device가 상방향 전송을 보낸 후에 서버로부터 짧은 하방향 통신을 필요로 하는 가장 적은 전력을 소비하는 애플리케이션을 위한 end-device 시스템이다. 다른 시간의 서버로부터 하방향 통신은 다음 스케줄된 상방향 통신 때까지 기다려야 할 것이다.

스케줄된 수신 슬롯을 가진 양 방향의 end-devices(Class B): Class A 의 랜덤 수신
윈도우와 더불어, Class B 장치는 예정된 시간에 추가적인 수신 윈도우를 연다. end-device가 예정된 시간에 수신 윈도우를 열기 위해 게이트웨이로부터 시간 동기화된 신호를 받는다. 이는 서버가 end-device가 언제 귀기울이고 있는지를 알게 해준다.

최대 수신 슬롯을 가진 양방향 en-devices(Class C):Class C의 end-device는
전송시에만 닫아놓고 거의 계속해서 수신 윈도우를 열어놓는다.

2016년 9월 3일 토요일

[퍼온글]AI 스피커를 가진 자, IoT 지배한다

[아이티투데이 이경탁 기자] 최근 인공지능(AI) 기술이 음성인식 기반의 스피커 형태로 구체화되고 있다. 아마존, 구글, 애플, 페이스북 등의 글로벌 기업이 이미 제품을 출시하거나 준비할 뿐 아니라 국내 대표 ICT 기업인 삼성전자, 네이버도 한창 개발 중인 것으로 알려졌다.

SKT 또한 지난달 31일 음성인식 기반 인공지능 서비스 ‘누구‘와 전용기기를 공개했다. 이처럼 각 분야에서 내노라 하는 AI 스피커 제품을 개발하는 이유는 향후 사물인터넷(IoT), 특히 스마트홈이라 불리는 홈 IoT 시장을 선점할 수 있기 때문이다.

스마트홈은 집안의 가전제품, 수도, 전기, 보안기기 등 모든 것을 통신망으로 연결해 모니터링과 제어할 수 있는 기술이 구현된 집을 뜻한다. IoT 구현에는 빅데이터 서비스가 핵심기술로 사용. 예를 들면 우리 집 냉장고가 나의 퇴근 시간 패턴을 빅데이터로 분석한 뒤 퇴근 시간에 맞춰 저녁 메뉴를 추천해주는 상황이 가능해지는 것이다.

경제협력개발기구(OECD) 조사에 따르면 현재 가정당 인터넷에 연결된 기기는 10개 수준이며 오는 2022년에는 가정당 인터넷에 연결된 기기가 50개에 이를 것으로 예상된다.


x
▲ 최근 AI 기술이 음성인식 기반의 스피터 형태로 구체화되고 있다 (사진=위키피디아)
하지만 안 그래도 수 많은 앱이 깔려 복잡한 스마트폰에서 홈IoT까지 구현하기에는 사용자들의 피로성을 증가시킬 수 있다는 지적이다. 이에 기업들이 집안의 기기들을 목소리만으로 간편하게 컨트롤할 수 있는 AI 스피커 제품을 개발하는 것이다.

AI 스피커는 딥러닝(사람처럼 학습하는 인공신경망) 기술을 활용한 인공지능 알고리즘이 제품 속에 탑재된 사용자와 음성으로 커뮤니케이션을 할 수 있는 기기다. 예를 들어 사용자가 음성으로 “신나는 음악을 틀어줘”, “날씨가 더운데 에어컨을 틀어줘”같은 명령어를 내리면 수행하게 된다.

아마존이 지난 2014년 선보인 에코 같은 경우는 음성인식과 블루투스 기능을 갖췄다. ‘알렉사’라고 불러 음악 재생을 요청하거나 인터넷에 연결된 조명을 켜고 끌 수 있다. 이외에도 길이나 위치에 대해 물어보거나 스포츠 경기는 언제 하는지 물어보고 전자책을 읽어 달라할 수 있다.

아마존에서 에코의 제품 평점은 5점 만점에 4.4점 사용자들의 평가도 후한 편이다. 아마존은 지속적인 기술 개발을 통해 같은 가격 또한 대폭 낮춘다는 계획이다.
▲ 아마존 AI 알렉사가 탑재된 스피커 '에코' (사진=플리커)
구글 또한 지난 5월 구글개발자회의에서 ‘구글 어시스턴트’를 탑재한 구글홈을 선보였다. 현재 구글의 지주회사 알파벳의 홈 기술 기업 네스트의 엔지니어들이 구글에 투입되어 기술 개발에 더욱 박차를 가하고 있다.

SKT의 누구는 음악 스트리밍 서비스, 조명, 제습기, 플러그, TV 등 가전기기를 제어하고 음악추천 및 자동 재생, 날씨·일정 등 정보 안내, 스마트폰 위치 찾기 등의 기능이 가능하다.

박일환 SK텔레콤 디바이스 지원단장은 “과거 키보드에서 마우스로, 이후 터치로 입력방식이 진화하며 우리의 일상이 크게 변해 왔다”며 “누구를 시작으로 음성인식과 인공지능이 생활 전반을 획기적으로 바뀌는 AI 대중화 시대를 열어갈 것”이라고 밝혔다.

한편, 삼성전자도 마찬가지로 스피커 형태 인공지능 홈 비서 ‘스쿱’을 준비 중인 것으로 알려졌다. 네이버는 연내 출시를 목표로 홈 비서인 ‘라온’을 개발 중에 있지만 타사와 같이 스피커 제품 형태로 내놓을지는 미정이다.