1. SQLite 소개
SQLite는 아시다시피 iphone이나 android에서 사용하는 파일 베이스 RDB입니다. 주요 특징으로는 Zero Configuration, Portabiliy, Compactness, Simplicity, Flexibility, Liberal Licensing, Reliability 라고 http://www.sqlite.org/ 사이트에 나와 있습니다. 좋은 말은 다 있는것 같습니다.
저희가 알아야 될 세부 특징은 다음과 같습니다. 중요합니다.
SQLite는 ANSI92의 기능을 대부분 지원하지만, 아래의 사항은 지원하지 않습니다.
1. RIGHT and FULL OUTER JOIN : LEFT OUTER JOIN만 지원합니다.
2. Complete ALTER TABLE Support : RENAME TABLE과 ADD COLUMN만 지원합니다. DROP COLUMN, ALTER COLUMN, ADD CONSTRAINT 등 다른 기능은 지원하지 않습니다.
3. Writing to VIEWs : SQLite에서 View는 read-only입니다.
4, GRANT and REVOKE : Sqlite에서 읽기/쓰기 권한은 OS 파일 시스템 권한을 사용합니다. 별도로 권한 부여 기능이 없습니다.
2. GUI Tools
SQLite 개발을 효과적으로 하기 위해서는 좋은 툴은 필수겠죠?
SQLite를 지원하는 GUI Tools 리스트는 아래 링크에 나와있습니다.
http://sb2.info/commercial-and-freeware-sqlite-tools-list-2/
무지 많습니다. 그 중 몇개를 골라서 사용해 봤는데.. 제가 추천해 드리고 싶은 툴은 다음과 같습니다.
SQLite Expert (http://www.sqliteexpert.com/)
여러 제품 중에서 가장 무난하게 사용할 수 있는 제품인 것 같습니다. 필요한 기능은 다 있고, UI도 그럭저럭 쓸만합니다. Personal Edition과 Professional Edition으로 나누어지며, Personal Edition은 무료입니다.
(향후 SQLite관련 포스트에서 저는 이 제품으로 테스트 하겠습니다.) Pro Edition의 Crack도 그리 어렵지 않게 구할 수 있습니다.
SQLite Maestro (http://www.sqlmaestro.com/products/sqlite/maestro/)
아마도 제가 본 Sqlite 관련 툴 중에서 가장 강력한 제품인 것 같습니다. 다른 기능은 몰라도 Reverse로 ERD를 만들어 주는 기능은 이 제품만이 가능합니다.
여담이지만 제가 Touch Call(터치콜) App 개발할 당시 Android SDK2.0 기준의 전화번호부 DB를 이용해야 하는데, 구글의 document만으로는 이해하기가 상당히 어려웠습니다. 출판되어 있는 책들도 다 이전 데이터베이스를 기준으로 작성된 책들이고.. 그때 이 제품을 평가판으로 설치해서 애뮬레이터에 있는 contact2 데이터베이스를 가지고 ERD를 만들어 보니… 훨씬 빠르게 이해를 할 수 있었습니다.
다음 그림은 그 당시 사용했던 contact2 db의 ERD입니다.
좋은 제품이긴 하지만 애석하게도 free 버전은 없습니다. 모두 상용버전 밖에 없으며, 한달 Trial 버전만 사용할 수 있습니다. 현재 버전의 crack은 거의 구하기 힘들며, 이전 버전은 구하실 수는 있을 겁니다.
DeZign (http://www.datanamic.com/dezign/index.html)
현재 SQLite를 Forward/Backward Engineering를 완벽하게 지원하는 모델링 툴은 datanamic의 dezign이란 모델링 툴 밖에 없습니다. 근데, 막상 평가판 설치해보니..저희 정서와 맞지 않는 툴이더군요. 저희는 한글로 논리모델을 만들고 영문으로 물리모델을 만드는데, 이 툴은 그런 개념없이 논리/물리가 함께 처리되는 툴이라 바로 지워 버렸습니다. 조금 불편하더라도 DA#이나 ERWin으로 모델링을 하고, Forward Generation한 스크립트를 수정해서 사용하는 게 더 편리할 듯 합니다.
끝으로 SQLite 강좌에서 사용할 demo db에 대해서 소개를 하겠습니다. 위에서 얘기했듯이 저는 SQLlite Expert Personal 버전을 이용해서 테스트를 하도록 하겠습니다.
SQLite Expert Personal를 실행한 후 File > Open Demo Database를 실행합니다.
Dbdemos란 데이터베이스가 스키마브라우저에 나타납니다.
좌측 스키마 브라우저에 많은 테이블 리스트가 나옵니다. 저는 그중에서 아래 ERD에 나오는 몇 개의 테이블을 주로 사용해서 DML 테스트 등을 진행하도록 하겠습니다.
고객, 직원, 주문, 주문내역 등 간단한 ERD 구조입니다.
참고로 이 ERD는 Dbdemos SQLlite 데이터베이스를 SQLite Maestro를 이용하여 일부 테이블만 designer에 띄운 모습입니다.)
3. System Catalog
시스템 카탈로그를 조회할 수 있는 방법은 sqlite_master 테이블을 직접 조회하시면 됩니다. SQLITE_MASTER 테이블은 READ-ONLY 테이블입니다.
SQLITE_MASTER
테이블을 조회하시면 테이블,
인덱스, 트리거등 모든 정보와 DDL문까지 알 수가 있습니다.
SQLITE_MASTER 테이블 조회 외에 PRAGMA 명령어를
통해서도 필요한 정보를 알 수 있습니다.
PRAGMA
table_info(table-name);
테이블 정보를 조회하는 명령어입니다.
cid name type notnull dflt_value pk
0 Name CHAR(24) 0 1
1 Capital CHAR(24) 0 0
2 Continent CHAR(24) 0 0
3 Area FLOAT 0 0
4 Population FLOAT 0 0
PRAGMA
index_list(table-name); 인덱스 리스트를 볼 수 있습니다.
PRAGMA
index_info(index-name); 인덱스 정보를 조회할 수 있습니다.
PRAGMA
foreign_key_list(table-name); fk 리스틀 볼 수 있습니다.
4. DATATYPE
Sqlite가 지원하는 데이터 타입은 다음과
같습니다.
1. Null
2. Integer ? 부호있는 정수, 실제 값에 따라 1byte에서
8byte까지 가변적으로 저장됨.
3. Real ? 실수
4. Text ? 문자열
5. BLOB ? blob 데이터
실제적으로 저희가 테이블 생성시 DDL상에
VARCHAR(10)이라고 컬럼 사이즈를 정의해도 SQLITE는 TEXT 타입으로 만들어집니다. 그렇기 때문에 10자 이상의 데이터도 삽입이
가능합니다. 그러니, DDL 문 만들 때 구지 다른 데이터 타입을 외울 필요없이 위 타입만 알고 있으면 될 것 같습니다.
재미있는 것은
Data and Time 즉, 날짜 관련 데이터 타입이 따로 없다는 것입니다. DATETIME은 입력되는 값에 따라서 TEXT, REAL,
INTEGER 타입으로 저장됩니다. http://www.sqlite.org/datatype3.html 보시면 어떤 데이터 타입이 어떤 식으로 변경되는지 알수가
있습니다.
5. CREATE
TABLE
예제1)
CREATE TABLE TEST2 (
_ID INTEGER NOT NULL,
CLASS TEXT NOT NULL,
VALUE TEXT,
CONSTRAINT TEST2_PK PRIMARY KEY (_ID, CLASS)
);
SQLite에서는 ALTER TABLE 문에서 ADD CONSTRAINT 구문이 지원되지
않기 때문에 PRIMARY
KEY, UNIQUE, CHECK등의 TABLE LEVEL의 CONSTRAINT는 위 문장처럼 CREATE TABLE 문 제일 하단에 기술해야
합니다.
예제2)
CREATE TABLE TEST1 (
_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
TYPE TEXT NOT NULL DEFAULT 'HIGH',
NAME TEX);
일련번호 채번은 위와 같이
AUTOINCREMENT 구문을 CRATE TABLE 의 해당 컬럼에 기술하면 자동 증가되는 일련번호를 사용할 수 있습니다.
AUTOINCREMENT
문을 가진 DDL이 최초 실행되면 SQLITE는 내부적으로 SQLITE_SEQUENCE 테이블을 생성합니다. 이 테이블은 NAME, SEQ 컬럼을 가진 테이블로 테이블마다 자동
증가되는 최종값을 가집니다. 재미있게도 SQLITE_SEQUENCE 테이블값을 직접 핸들링도 가능합니다.
6.
SELECT
SELECT 는 워낙 잘 들 아시는 부분이라 한 두가지만 테스트 해
보도록 하겠습니다.
먼저, 오라클의
dual 테이블 같이 처리되는 구문은 MS-SQL 처럼 FROM 절 없이 사용하면 될 것 같습니다.
SELECT 'A' a
페이징 처리 (ROWNUM,
TOP과 유사한 기능)
페이징 처리시 오라클에서는 ROWNUM을 사용하고 MS-SQL에서는
TOP을 주로 사용들 합니다. 물론 요즘은 ROW_NUMBER() 함수를 더 많이 사용하신다구요?
SQLITE에서는 페이징 처리하기가 더 편리합니다. LIMIT와
OFFSET이 그것입니다.
FROM CUSTOMER
ORDER BY CUSTNO
LIMIT 5 OFFSET 5;
ORDER BY와 상관없이 사용이 가능합니다.
LIMIT에 값을 지정하면 화면에 출력할 레코드 개수를 지정할 수 있습니다. OFFSET은 건너뛸 레코드 수를 나타냅니다. 즉, 위의 쿼리는
CUSTNO로 정렬해서 나온 순서에서 6번째부터 5개의 레코드를 가져오는 SELECT문입니다. OFFSET은 생략도 가능합니다.
페이징은 편리하나 오라클의
ROWNUM 처럼 결과에 수치값을 나타낼 방법이 있다면 여러모로 편리한데 그런 기능은 아쉽습니다. 필요시에는 별도의 NUMBER를 가진 테이블을
하나 만들어서 조인해서 사용해야 할 듯 합니다.
7. UPDATE
(JOIN)
UPDATE 구문도 워낙 잘 아시니 여기서는 JOIN UPDATE에
대해서만 확인해 보도록 하겠습니다.
테스트를 위해 CUSTOMER 테이블에 컬럼을 2개
추가했습니다.
-- ALTER TABLE에서 한번여 여러 컬럼 추가도 안됩니다.
ALTER TABLE CUSTOMER
ADD CAPITAL TEXT;
ALTER TABLE CUSTOMER
ADD COLUMN CONTINENT TEXT;
-- 오라클 스타일 JOIN UPDATE TEST => ERROR
UPDATE CUSTOMER C
SET (CAPITAL, CONTINENT) = (SELECT CAPTIAL, CONTINENT
WHERE COUNTRY K
AND K.[Name] = C.COUNTRY)
WHERE COUNTRY IN (SELECT NAME FROM COUNTRY);
-- MS-SQL 스타일 JOIN UPDATE => ERROR
UPDATE CUSTOMER
SET CAPITAL = K.CAPITAL,
CONTINENT = K.CONTINENT
FROM CUSTOMER C JOIN COUNTRY K ON C.Country = K.NAME;
찾아보니 JOIN UPDATE
자체를 지원하지 않는답니다.
에구, 이게 안되는 건 좀 치명적인듯. 업데이트시에 어플에서 처리하는 방식밖에 안될 것
같습니다.
8.
DELETE
DELETE시에도 LIMIT와 OFFSET 구문을 함께 사용할 수
있습니다. 이 부분은 편리한 듯~ , 참 UPDATE 구문에도 LIMIT와 OFFSET 구문을 함께 사용할 수
있습니다.
DELETE문도 단순
스타일은 워낙 잘 들 아시니 중복 레코드 제거 쿼리 테스트만 해보도록 하겠습니다.
/* 중복 제거 DELETE 문 테스트 */
-- 임시 테이블 생성.
create table t1 (
id integer,
name varchar(10)
);
-- 테스트 데이터 삽입.
insert into t1 values(1,'a');
insert into t1 values(2,'a');
insert into t1 values(2,'b');
insert into t1 values(1,'b');
insert into t1 values(1,'C');
-- 오라클에서 주로 사용하는 방식으로 테스트.
-- ANY 키워드를 지원하지 않아서 에러가 발생함.
DELETE FROM t1 A
WHERE ROWID > ANY (SELECT ROWID
FROM t1 B
WHERE A.id = B.id);
-- DELETE문에서 서브쿼리로 조인을 지원안해서 이것도 에러가 발생함.
DELETE FROM t1 A
WHERE ROWID > (SELECT MIN(ROWID)
FROM t1 B
WHERE A.id = B.id);
-- 조금은 부하가 있지만, GROUP BY절을 이용한 NOT IN 서브쿼리로 중복 제거 가능.
DELETE FROM t1
WHERE ROWID NOT IN (SELECT MIN(ROWID)
FROM T1
GROUP BY ID);
9.Core
Function
coalesce(X,Y,...) | coalesce() 함수는 Argument 중에서 첫번째로 Not Null인 Argument값을 리턴하는 함수입니다. 만일 모든 인자가 null이면 null을 리턴합니다. |
ifnull(X,Y) | ifnull() 함수는 두 인자중에서 첫번째로 Not Null인 인자값을 리턴합니다. 만일, 둘다 null이면 null을 리턴합니다. Ifnull() 함수는 인자가 두개인 coalesce() 함수와 동일합니다. |
length(X) | 길이값을 리턴하는 함수입니다. 만일 X 인자가 null이면 null을 리턴합니다. |
like(X,Y) like(X,Y,Z) |
Like 함수는 “Y LIKE X [ESCAPE Z]”구문과 동일합니다. |
lower(x) | 소문자로 변환 합니다. |
upper(X) | 대문자로 변환 합니다. |
ltrimX) ltrim(X,Y) |
ltrim(X)는 X 값 중 왼쪽편의
공백을 제거하는 함수입니다. ltrim(X,Y)는 X 문자열중에서 Y에 나타난 값을 제일 좌측부터 제거하는 함수입니다. select ltrim(" ZZZZabcZZ ", " aZ") => 좌측문자열에서 부터 공백,a,Z 문자열이 있으면 제거하고, 처음으로 공백,a,Z가 아닌 문자열부터 출력합니다. 즉, “bcZZ”가 출력됩니다. ltrim(" ZZZZabcZZ ", " ") 는 ltrim(" ZZZZabcZZ ")과 동일합니다. |
rtrim(X) rtrim(X,Y) |
rtrim(X)는 우측편 공백
제거 rtrim(X,Y)는 ltrim(X,Y)와 동일한 방식이지만 우측편부터 매칭되는 글자를 제거합니다. 예를들어 select rtrim(" ZZZZabcZZ ", " Z") 문장은 우측편부터 공백과 Z를 빼고 처음으로 공백과 Z가 아닌 글자, 즉 c 까지 글자가 나타납니다. 결과값: “ ZZZZabc” |
trim(X) trim(X,Y) |
trim(X)는 양쪽 공백
제거 trim(X,Y) 는 Y에 해당되는 글자를 양쪽 끝에서 부터 제거하고 나머지 글자만 리턴함. 예) trim(" ZZZZabcZZ ", " Z") => “abc” trim은 ltrim과 rtrim을 각각 적용한것과 동일한 결과가 나타납니다. |
max(X,Y,..) | 인자값들 중 최대값을
리턴합니다. create table t1 (coll integer, col2 integer, col3 integer); insert into t1 values(1,2,3); insert into t1 values(5,3,1); select max(col1, col2, col3) from t1; |
min(X,Y,...) | 인자값들 중 최소값을 리턴합니다. |
nullif(X,Y) | 두 인자가 서로 같으면 null을
리턴, 서로 다르면 X값을 리턴합니다. nullif('x','y') => ‘x’ , nullif('x','x') => null 리턴 |
quote(X) | Quote()함수는 single
quotation을 escape 해줍니다. ‘값을 ‘’ 로 변경합니다. Insert나 update 시에 사용하면 유용할 듯 합니다. select quote("girl's mouse") => 'girl''s mouse' |
random(*) | -9223372036854775808 부터 +9223372036854775807 숫자 사이의 임의의 수를 리턴합니다. |
randomblob(N) | N으로 지정된 bytes의 랜덤 바이너리 데이터를 생성합니다. |
hex(X) | 바이너리 값을 hex 값으로
변경합니다. select hex(randomblob(16)) |
replace(X,Y,Z) | X 문자열 중에서 Y문자열을 Z로
변경합니다. select replace('1/12/2009','1','x') => "x/x2/2009" |
round(X) round(X,Y) |
반올림 함수. Y는 소수점 자리. Y가
없으면 0으로 처리합니다. Round(3.5) => 4, round(2.555, 2) => 2.56 |
substr(X,Y) substr(X,Y,Z) |
substr()함수는 X문자열 중에서
Y번째부터 시작해서 Z개수만큼 문자열을 가져오는 함수입니다. Z가 생략되면 Y번째 문자열부터 문자열 끝까지 리턴합니다. Y의 최소값은 1입니다.
자바에서는 0으로 시작하지만 SQLite에서는 1부터 인덱스가 시작합니다. 만일 Y가 ?(마이너스)값이면 문자열 우측끝부터 카운팅을
시작합니다. select substr("string", 1, 3) => str select substr("string", 0, 3) => st select substr("string", -1, 3) => g select substr("string", -3, 3) => ing select substr("string", 2) => tring |
typeof(X) | X 표현식에 대한 데이터 타입을 리턴합니다. 리턴값은 “null”, “integer”, “real”, “text”, “blob” 중의 하나입니다. |
10. Aggregation Function (집합 함수)
avg(X) | 그룹내의 Not Null값의 평균값을 리턴합니다. X 컬럼값이 문자열이나 BLOB이면 0으로 간주하고 처리합니다. |
count(*) count(X) |
count(X)는 X가 Not
Null값을 가진 레코드의 개수 리턴합니다. count(*)는 그룹내의 모든 rows의 수를 리턴합니다. |
group_concat(X) group_concat(X,Y) |
X가 not null인 경우 그룹내의 모든 문자열을 콤마(,)를 구분자로 해서 문자열을 합쳐서 리턴합니다. Y가 주어지면 Y값이 구분자로 처리됩니다. |
max(X) | 그룹내의 값들중 최대값을 리턴합니다. |
min(X) | 그룹내의 값들중 최소값을 리턴합니다. 모든값이 Null이면 Null을 리턴합니다. |
sum(X) total(X) |
Sum과 total은 그룹내의 Not Null값의 합계를 리턴합니다. X의 모든 값이 Null인 경우 Sum()은 Null을 리턴하고 Total()은 0.0을 리턴합니다. |
11. DateTime 관련 Keyword
먼저 SQLite에서는 DateTime관련해서 다음과 같은 세가지 키워드가 있습니다.
CURRENT_TIME : 현재 시간 (형식: 03:22:56) 다만, UTC 기준입니다.
CURRENT_DATE: 현재 날짜 (형식: 2010-08-25) UTC 기준.
CURRENT_DATETIME : 현재 날자 및 시간 (형식: 2010-08-25 03:23:37) UTC 기준.
UTC 기준 날짜 및
시간이라서 사용할때는
로컬시간으로 다시 변환작업이 필요할 듯 보입니다. DATETIME 관련 함수들이 있어 크게 유용해 보이지는
않습니다.
12.
DateTime 관련 함수.
DateTime 관련 함수는 다음의 5가지가
있습니다.
date(timestring, modifier, modifier, ...)
: 날짜 함수
time(timestring, modifier, modifier, ...)
: 시간 함수
datetime(timestring, modifier, modifier, ...)
:날짜/시간 함수
julianday(timestring, modifier, modifier, ...)
: 율리우스력 함수
strftime(format, timestring, modifier,
modifier, ...) : 날짜 포맷팅 함수
위 다섯개의 함수 인자 중 timestring 파라미터에로 들어갈 수
있는 날짜 형식은 아래와 같습니다.
1. YYYY-MM-DD
2. YYYY-MM-DD HH:MM
3. YYYY-MM-DD HH:MM:SS
4. YYYY-MM-DD HH:MM:SS.SSS
5. YYYY-MM-DDTHH:MM
6. YYYY-MM-DDTHH:MM:SS
7. YYYY-MM-DDTHH:MM:SS.SSS
8. HH:MM
9. HH:MM:SS
10. HH:MM:SS.SSS
11. now
12. DDDDDDDDDD
strftime 함수에 사용되는
format에 사용할 수 있는 값들은 다음과 같습니다.
%d day of month: 00
%f fractional
seconds: SS.SSS
%H
hour: 00-24
%j day
of year: 001-366
%J
Julian day number
%m month: 01-12
%M minute: 00-59
%s seconds since 1970-01-01
%S seconds: 00-59
%w day of week 0-6
with sunday==0
%W
week of year: 00-53
%Y
year: 0000-9999
%%
%
함수의 modifer에
들어갈 수 있는 값들은 다음과 같습니다.
1. NNN days
2. NNN hours
3. NNN minutes
4. NNN.NNNN seconds
5. NNN months
6. NNN years
7. start of month
8. start of year
9. start of day
10. weekday N
11. unixepoch
12. localtime
13. utc
잘 안 와 닿는듯 합니다. 아래 샘플 코드를 보면 이해가 가실
겁니다.
select datetime('now');
2010-08-25 04:01:46
-- 로컬 기준의 현재 날짜/시간
select datetime('now','localtime');
2010-08-25 13:02:30
--현재 로컬 기준 시간에서 10분 3.5초를 더한 시간.
select datetime('now','localtime','+3.5 seconds','+10 minutes');
2010-08-25 13:14:15
--현재 로컬 시간에 3.5초를 더하고 날짜는 돌아오는 화요일 (weekday == 0 이 일요일입니다.)
select datetime('now','localtime','+3.5 seconds','weekday 2');
2010-08-31 13:05:39
--현재 달의 마지막 날짜
SELECT date('now','start of month','+1 month','-1 day','localtime');
2010-08-31
--2004-01-01 02:34:56초부터 현재까지의 총 초
SELECT strftime('%s','now') - strftime('%s','2004-01-01 02:34:56');
209785028
--현재날짜/시간 기준에서 올해 9번째달의 첫번째 화요일
SELECT date('now','start of year','+9 months','weekday 2');
2010-10-05
-- 날짜 포맷 스타일 변경
select strftime("%Y/%m/%d %H:%M:%S",'now','localtime');
2010/08/27 09:17:22
이것으로서 간략하게 나마 SQLite에 대해서
알아보았습니다.
SQLite User Guide 블로그
포스트
1. SQLite User Guide - 소개. GUI Tools
등
2. SQLite User Guide - PRAGMA, 시스템
카탈로그, DATA TYPE
3. SQLite User Guide - DDL(CREATE, DROP
등)
4. SQLite User Guide - DML (SELECT,
INSERT, UPDATE, DELETE 등)
5. SQLite User Guide - Function (내장함수,
Aggregation 함수)
6. SQLite User Guide - DateTime 함수,
DateTime Formatting
7. SQLite User Guide -
Trigger
|
본 게시물 작성자는 본인인증을 하지 않았습니다.
상품등록게시판에 게시물을 작성할 때에는 온라인 아이디의 사용자가 본인임을 확인하는 '본인인증'을 거칩니다.
단, 직접거래인 경우
본인인증을 나중에 할 수 있도록 제공하고 있습니다.
본 게시글의 작성자는 개인정보보호를 위하여 일회용 안심 전화번호
기능을 이용하고 있습니다.
연락 가능 기간 :
- 일회용 안심 전화번호로 전화를 걸면 판매자의 실제 연락처로 연결되며,
기존의 통화료 외 부가이용료가 없습니다.
(판매자의 실제 연락처가 휴대폰 번호인 경우, 안심 전화번호 옆에
휴대폰 아이콘이 표시되며 문자 발신도 가능합니다.) - 거래를 진행하실 경우 판매자의 실제 전화번호를 확인해두시는
것이 좋습니다.
(안전결제 이용 시에는 실제 전화번호 확인이 가능합니다.)
악성코드가 포함되어 있는 파일입니다.
백신 프로그램으로 치료하신 후 다시 첨부하시거나, 치료가 어려우시면
파일을 삭제하시기 바랍니다
고객님의 PC가 악성코드에 감염될 경우 시스템성능 저하,
개인정보 유출등의 피해를 입을 수 있으니
주의하시기 바랍니다.
구매자 안전거래 신청 안내
전문업체의 에스크로 결제방식을 이용하여 판매자가 등록한 상품을 안심하고
구매하실 수 있습니다.
구매자 안전거래 이용 방법
-
1. 구매자 신청
카페 게시물 내 구매자 안전거래 신청 버튼을 클릭하면
유니크로 페이지에서 신청에 필요한 정보를 입력합니다. -
2. 판매자 알림
판매자에게 안전거래 신청을 받았다는 알림 메일과 문자
메시지가 발송됩니다. -
3. 판매자 등록
판매자는 유니크로에 가입하여 메일에 기재된 인증번호로
상품을 등록합니다. -
4. 구매자 알림
구매자에게 상품이 등록되었다는 알림 메일과 문자 메시지가 발송됩니다.
-
5. 구매자 결제
구매자는 상품을 결제합니다.
- 구매자 안전거래는 유니크로(㈜다우기술)의 책임하에 운영됩니다.
- 구매자 안전거래 문의 : www.unicro.co.kr (1588-6295)
'Android > Tip&Tech' 카테고리의 다른 글
안드로이드:그림메모 소스.. (0) | 2010.11.14 |
---|---|
[Android] startActivityForResult(), onActivityResult() 사용하기 [출처] [Android] startActivityForResult(), onActivityResult() 사용하기|작성자 소녕 (0) | 2010.11.13 |
SQLite를 사용한 트리거 (Trigger) 의 이해 그리고 사용 방법 (0) | 2010.11.11 |
SimpleXMLBuilder (0) | 2010.11.05 |
안드로이드 (0) | 2010.11.05 |