레이블이 Computing인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Computing인 게시물을 표시합니다. 모든 게시물 표시

2010년 6월 6일 일요일

SAX를 사용한 XML 파싱 (Parsing XML document using SAX)



SAX를 사용해서 XML 문서를 파싱하려면 먼저 DefaultHandler를 확장한 클래스가 필요하다.

import org.xml.sax.helpers.DefaultHandler;

public class MySAXApp extends DefaultHandler
{
  public MySAXApp()
  {
    super();
  }
}

또한 JAVA 어플리케이션에서 동적으로 SAX드라이버를 사용하기 위해 XMLReaderFactory 클래스의 createXMLReader 메소드를 사용해서 XML reader를 만들어 줘야 한다.

public static void main(String args[])
{
  XMLReader xr = XMLReaderFactory.createXMLReader();
}

여기서 만든 오브젝트를 사용하면 XML문서를 파싱할 수 있는데, 먼저 XMLReader 인터페이스에서 setContentHandler와 setErrorHandler 메소드를 사용해 파싱결과와 에러가 발생했을 때 리포트하는데 사용되는 핸들러를 등록해 줘야 한다. 일반적으로 실제 복잡한 어플리케이션에서는 핸들러를 별도의 오브젝트로 만들지만 여기서는 간단한 데모를 위해 부모 클래스에 포함시켰기 때문에 단순히 클래스를 인스턴스화 해서 XML reader에 등록하면 된다.

public static void main(String args[])
{
  XMLReader xr = XMLReaderFactory.createXMLReader();
  MySAXApp handler = new MySAXApp();
  xr.setContentHandler(handler);
  xr.setErrorHandler(handler);
}

위의 예제 코드는 파싱 이벤트를 처리할 MySAXApp 인스턴스를 만들어 그 인스턴스를 XML reader의 정상적인 컨텐트 이벤트와 에러 이벤트 핸들러로 등록한다.

public static void main(String args[])
{
  XMLReader xr = XMLReaderFactory.createXMLReader();
  MySAXApp handler = new MySAXApp();
  xr.setContentHandler(handler);
  xr.setErrorHandler(handler);

  for (int i=0; i<args.length;i++) {
    FileReader r = new FileReader(args[i]);
    xr.parse(new InputSource(r));
  }
}

지금까지 설명한 예제의 전체 코드는 다음과 같다.

import java.io.FileReader;

import org.xml.sax.XMLReader;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.XMLReaderFactory;
import org.xml.sax.helpers.DefaultHandler;

public class MySAXApp extends DefaultHandler
{
  public static void main (String args[])
    throws Exception {
      XMLReader xr = XMLReaderFactory.createXMLReader();
      MySAXApp handler = new MySAXApp();
      xr.setContentHandler(handler);
      xr.setErrorHandler(handler);

      // Parse each file provided on the
      // command line.
      for (int i = 0; i < args.length; i++) {
        FileReader r = new FileReader(args[i]);
        xr.parse(new InputSource(r));
      }
    }

  public MySAXApp ()
  {
    super();
  }
}

예제 코드를 컴파일해서 실행시키면 XML문서를 파싱하지만 그에 따라 발생하는 이벤트를 처리하는 코드가 빠져있기 때문에 XML문서의 포맷이 틀려 에러가 발생하지 않으면 아무 출력도 없이 실행이 종료된다.


이벤트 처리

XML 문서를 처리하려면 파싱하면서 발생하는 이벤트를 처리해주는 핸들러를 만들어 줘야 한다. 먼저 가장 중요한 이벤트로 문서의 시작과 끝, 엘리먼트의 시작과 끝, 문자데이터가 있다.
클라이언트 어플리케이션이 문서의 시작과 끝을 발견하려면 startDocument/endDocument 메소드를 구현해줘야 한다.

public void startDocument()
{
  System.out.println("Start document");
}

public void endDocument()
{
  System.out.println("End document");
}

startDocument/endDocument 핸들러는 별도 argument를 가지지 않는다. SAX드라이버가 문서의 시작을 발견하면 startDocument 메소드를 호출한다. 또한 문서의 끝을 발견하면 (심지어 문서 내에 에러가 있더라도) endDocument 메소드를 호출한다.

예제 코드에서는 단순히 stdout에 메시지를 출력하지만 실제 어플리케이션에서는 핸들러 내에 어떤 코드도 넣어줄 수 있다. 가장 빈번히 볼 수 있는 코드는 메모리 상주 트리 생성, 내용 출력, 데이터베이스 생성/추가, 정보추출등을 수행한다.

SAX드라이버는 엘리먼트의 시작과 끝도 동일한 방법을 사용해 알려준다. 다만 startElement와 endElement 메소드는 몇개의 argument를 같이 넘겨준다.

public void startElement(String uri, String name, String qName, Attributes atts)
{
  if ("".equals(uri)) System.out.println("Start elements: " + qName);
  else System.out.println("Start elements: {" + uri + "}" + name);
}

public void endElement(String uri, String name, String qName)
{
  if ("".equals(uri)) System.out.println("End elements: " + qName);
  else System.out.println("End elements: {" + uri + "}" + name);
}

이 메소드들은 엘리먼트의 시작과 끝을 알려주는데 엘리먼트에 Namespace URI가 정의되어 있으면 '{URI namespace}이름' 형태로 출력하고 그렇지 않은 경우는 단순히 '이름' 형태로 출력해준다. qName에 XML 1.0 이름이 들어가 있기 때문에 namespace URI가 없는 엘리먼트의 경우 이 이름을 사용해줘야만 한다.

마지막으로 SAX2는 일반 문자데이터는 characters 메소드를 통해 리포트한다. 아래의 코드는 모든 문자데이터를 화면에 출력하는데 특수문자를 escape-character를 사용해 표현하기 때문에 보기좋게 출력하기 위해 코드가 좀 길다.

public void characters (char ch[], int start, int length)
{
  System.out.print("Characters:    \"");
  for (int i = start; i < start + length; i++) {
    switch (ch[i]) {
      case '\\':
        System.out.print("\\\\");
        break;
      case '"':
        System.out.print("\\\"");
        break;
      case '\n':
        System.out.print("\\n");
        break;
      case '\r':
        System.out.print("\\r");
        break;
      case '\t':
        System.out.print("\\t");
        break;
      default:
        System.out.print(ch[i]);
        break;
    }
  }
  System.out.print("\"\n");
}

지금까지 설명된 내용을 모두 추가한 예제 프로그램이다.

import java.io.FileReader;

import org.xml.sax.XMLReader;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.XMLReaderFactory;
import org.xml.sax.helpers.DefaultHandler;

public class MySAXApp extends DefaultHandler
{
    public static void main (String args[])
        throws Exception
    {
        XMLReader xr = XMLReaderFactory.createXMLReader();
        MySAXApp handler = new MySAXApp();
        xr.setContentHandler(handler);
        xr.setErrorHandler(handler);

        // Parse each file provided on the command line.
        for (int i = 0; i < args.length; i++) {
            FileReader r = new FileReader(args[i]);
            xr.parse(new InputSource(r));
        }
    }

    public MySAXApp ()
    {
        super();
    }

    ////////////////////////////////////////////////////////////////////
    // Event handlers.
    ////////////////////////////////////////////////////////////////////

    public void startDocument ()
    {
        System.out.println("Start document");
    }

    public void endDocument ()
    {
        System.out.println("End document");
    }

    public void startElement (String uri, String name,
                              String qName, Attributes atts)
    {
        if ("".equals (uri))
            System.out.println("Start element: " + qName);
        else
            System.out.println("Start element: {" + uri + "}" + name);
    }

    public void endElement (String uri, String name, String qName)
    {
        if ("".equals (uri))
            System.out.println("End element: " + qName);
        else
            System.out.println("End element:   {" + uri + "}" + name);
    }

    public void characters (char ch[], int start, int length)
    {
        System.out.print("Characters:    \"");
        for (int i = start; i < start + length; i++) {
            switch (ch[i]) {
            case '\\':
                System.out.print("\\\\");
                break;
            case '"':
                System.out.print("\\\"");
                break;
            case '\n':
                System.out.print("\\n");
                break;
            case '\r':
                System.out.print("\\r");
                break;
            case '\t':
                System.out.print("\\t");
                break;
            default:
                System.out.print(ch[i]);
                break;
            }
        }
        System.out.print("\"\n");
    }
}

샘플 출력

예제에 사용할 XML파일이다.

<?xml version="1.0"?>

<poem xmlns="http://www.megginson.com/ns/exp/poetry">
<title>Roses are Red</title>
<l>Roses are red,</l>
<l>Violets are blue;</l>
<l>Sugar is sweet,</l>
<l>And I love you.</l>
</poem>

이 문서파일 이름을 roses.xml이라고 하고 com.example.xml.SAXDriver 클래스 패스에 SAX2 드라이버가 있으면 샘플 어플리케이션은 다음과 같이 실행하면 된다.

java -Dorg.xml.sax.driver=com.example.xml.SAXDriver MySAXApp roses.xml

실행 결과는 다음과 같다.

Start documentStart element: {http://www.megginson.com/ns/exp/poetry}poem
Characters:    "\n"
Start element: {http://www.megginson.com/ns/exp/poetry}title
Characters:    "Roses are Red"
End element:   {http://www.megginson.com/ns/exp/poetry}title
Characters:    "\n"
Start element: {http://www.megginson.com/ns/exp/poetry}l
Characters:    "Roses are red,"
End element:   {http://www.megginson.com/ns/exp/poetry}l
Characters:    "\n"
Start element: {http://www.megginson.com/ns/exp/poetry}l
Characters:    "Violets are blue;"
End element:   {http://www.megginson.com/ns/exp/poetry}l
Characters:    "\n"
Start element: {http://www.megginson.com/ns/exp/poetry}l
Characters:    "Sugar is sweet,"
End element:   {http://www.megginson.com/ns/exp/poetry}l
Characters:    "\n"
Start element: {http://www.megginson.com/ns/exp/poetry}l
Characters:    "And I love you."
End element:   {http://www.megginson.com/ns/exp/poetry}l
Characters:    "\n"
End element:   {http://www.megginson.com/ns/exp/poetry}poem
End document

이렇게 짧은 문서라도 (최소) 25개의 이벤트가 발생하는걸 볼 수 있다. 문서의 시작과 끝에 각각 하나씩, 6개의 엘리먼트마다 시작과 끝, 11개의 문자데이터(엘리먼트 사이의 공백을 포함)모든 엘리먼트의 네임스페이스를 선언하기 위한 xmlns="http://www.magginson.com/ns/exp/poetry" 속성이 포함되어 있으면 위와 같은 결과가 나오지만 xmlns 속성이 정의되어 있지 않았을때의 출력은 다음과 같다.

Start document
Start element: poem
Characters:    "\n"
Start element: title
Characters:    "Roses are Red"
End element:   title
Characters:    "\n"
Start element: l
Characters:    "Roses are red,"
End element:   l
Characters:    "\n"
Start element: l
Characters:    "Violets are blue;"
End element:   l
Characters:    "\n"
Start element: l
Characters:    "Sugar is sweet,"
End element:   l
Characters:    "\n"
Start element: l
Characters:    "And I love you."
End element:   l
Characters:    "\n"
End element:   poem
End document

어플리케이션은 XML 네임스페이스가 있는 경우와 없는 경우 두가지 타입의 문서를 모두 사용하게 될 수 있다. 또한 문서 내 일부 엘리먼트는 네임스페이스를 가지고 있고 나머지는 그렇지 않은 문서를 다룰수도 있기 때문에 항상 네임스페이스가 있거나 또는 없다고 가정하지 말고 코드내에서 실제로 네임스페이스 URI를 확인해야만 한다.

2010년 3월 25일 목요일

Google Docs를 사용해서 쉽게 설문조사 하기 (Easy email survey using Google Docs)

Google Docs에는 많이 알려지지 않았지만 매우 편리한 기능이 숨겨져있다.
그 중 유용한 것이 이메일을 통한 설문조사 기능이다.


Google Docs의 좌측 상단에 있는 'Create New'를 눌러 그 중 'Form'을 선택한다.


위와 같이 질문을 입력하는 화면이 나오게 된다. 여기서 각 질문을 만들어주면 된다.


각 항목에 대한 설명은 위와 같다.


답변 타입은 위와 같이 7개가 있다.


질문을 추가하려면 좌측 상단의 Add item 버튼을 눌러주면 된다.


설문지가 어떻게 보이는지 미리보기를 하고 싶으면 화면 아래쪽의 검은색 부분에 있는 주소를 눌러주면 된다.


그러면 브라우져의 새 창이나 탭에 위와같이 설문지를 미리보기 할 수 있다.


설문지 디자인이 심심(?)하다고 생각되면 Theme 버튼을 눌러 테마를 선택할 수 있다. 모든 확인이 끝났으면 Email this form 버튼을 눌러 설문지를 보내면 된다.


현재 약 70개 정도의 테마가 있다.


Email this form 버튼을 누르면 위와 같은 화면이 열려 누구에게 메일로 보낼지 지정해 줄 수 있다. 여러 사람의 주소를 쓰는 경우 각 주소는 ','로 구분해주면 된다.


설문지를 받은 사람의 브라우져 화면이다.


설문에 답한 다음 Submit버튼을 눌러주면 된다.


Submit 버튼을 누르면 데이터를 보내기 때문에 진짜로 보낼건지 확인한다. 'OK'를 눌러주면 된다.


데이터가 전달되고 나면 위와 같이 Thank you 화면이 나온다.


이렇게 메일로 수집된 데이터는 자동으로 설문을 보낸 사람의 스프레드쉬트 파일에 입력된다. Google Docs에 가 보면 자신이 만든 설문에 대한 파일이 생겨져 있다.


파일을 열어보면 위와 같이 설문 응답 내용이 자동으로 스프레드 쉬트에 입력되어 있다.


또한 설문을 보내 사람은 메일함을 열어보면 설문결과를 확인할 수 있는 링크와 설문지를 추가로 발송할 수 있는 링크가 들어있는 메일이 google docs로부터 와 있다.

이 기능을 사용하면 설문지를 돌리고 수집한 다음 결과를 정리하기 위해 입력하는 수고 없이 매우 쉽게 설문조사를 할 수 있다.

2010년 3월 5일 금요일

초음파 소나를 사용한 전원관리 - Sonar Power Manager

현재 컴퓨터 전원절약을 위해 스크린세이버에서 가장 많이 사용되는 방법은 일정시간 이상 사용자의 입력이나 이벤트가 없으면 사용자가 컴퓨터 앞에 앉아 있다고 해도 컴퓨터를 사용하지 않는다고 판단해서 모니터를 끄고 다음 단계로 하드 정지 등의 전원을 절약하기 위한 절차를 수행한다.
하지만 이 방법으로는 사용자가 컴퓨터 앞에 앉아있어 원하지 않는 경우에도 화면이 꺼질수 있고, 반대로 자리를 비워도 일정시간동안은 화면이 그대로 유지될 수 밖에 없다.

그에 대한 대안으로 휴대폰은 보통 사용자가 항상 몸에 지니고 다닌다는 점에 착안해 블루투스를 지원하는 휴대폰을 등록해 놓으면 휴대폰의 블루투스 신호가 잡히면 컴퓨터를 사용할 수 있게 하고 신호가 사라지면 사용자가 컴퓨터에서 멀리 떨어졌다고 생각해 슬립모드 또는 스크린세이버를 실행하게 하기도 한다.

블루투스 휴대폰의 활용법 - 컴퓨터의 RFID키로 사용하기 (Use bluetooth-enabled cellphone as a RFID key for PC)

하지만 더 재미있는 방법을 생각해 낸 사람이 있다. 요새 컴퓨터...특히 노트북의 경우 거의 다 스피커와 마이크를 가지고 있기 때문에 그걸 이용해서 박쥐가 비행할 때 앞쪽의 장애물을 감지하는 방식과 같은 식으로 사용자가 컴퓨터 앞에 있는가를 감지해 내는 것이다.


이 프로그램을 만든 사람에 의하면 대부분의 컴퓨터는 사람 귀의 가청주파수(~20KHz)보다 높은 초음파를 발생하고 마이크로 받아들일 수 있다고 한다. (물론 모든 기종이 다 가능하지는 않고 그런 경우 불행하게도 이 프로그램을 사용할 수 없다.) 오픈소스 소프트웨어로 윈도우와 리눅스에서 사용할 수 있고 리눅스의 경우는 소스를 받아 컴파일 해 줘야 한다.


이 프로그램의 스크린샷이다. 저 그래프에서 파란색 선은 매 초마다 읽은 소나값이고 검은색 선은 소나값을 최근 10초동안 평균한 값(잡음등의 영향을 최소화), 빨간색 선은 presence threshold로 검은색 선이 빨간선 아래로 내려가면 사용자가 컴퓨터 앞에서 멀어졌다고 판단하는 기준이 된다.

프로그램은 여기에서 다운받을 수 있다.

- 관련 논문
S. P. Tarzia, R. P. Dick, P. A. Dinda, G. Memik. Sonar-based Measurement of User Presence and Attention. In Proc. 11th Intl. Conf. on Ubiquitous Computing (UbiComp'09). September 2009. pages 89-92.

2010년 2월 4일 목요일

구글앱스 사용자 관리 (Manage accounts in google apps)

구글앱스에서 사용자 및 그룹 추가/관리법에 대해 설명하겠다.


해당 도메인의 관리자 아이디로 로그인하면 화면 오른쪽 상단에 Manage this domain 링크가 보인다. 이걸 클릭해 준다.


관리자 화면으로 넘어오면 도메인에 관련된 여러가지를 설정할 수 있다. 사용자를 추가하기 위해 Users and groups를 선택한다.


사용자를 추가해야 하니까 Create a new user를 선택한다. 이 방법은 한명씩 추가하는 것이고 여러명을 한꺼번에 추가할수도 있다.


사용자의 이름과 아이디를 넣어준다. 기본적으로는 랜덤하게 정해진 초기암호가 설정되어 있다. 해당 사용자가 저 암호를 가지고 처음으로 로그인을 하면 새 암호를 넣으라고 나오게 된다. 랜덤한 암호 대신 관리자가 임의로 암호를 설정해 주고 싶으면 Set password를 눌러주면 된다. 모든 정보를 다 입력했으면 Create new user 버튼을 눌러주면 된다.


이제 Test User라는 이름의 계정이 만들어 진 것이다. 이 사용자의 아이디는 'testuser', 초기암호는 'Z57829'이고 예를 들어 회사 도메인이 xyz.com이라고 하면 이메일 주소는 testuser@xyz.com 이다.
또한 웹 브라우져에서 이 계정으로 로그인 하기 위한 초기 웹 페이지는 http://start.xyz.com이 된다.


좀 더 상세하게 설정하거나 입력된 내용을 수정하고 싶으면 위의 화면에서 Edit settings for test를 눌러주면 된다.


Edit settings for test를 누르면 화면이 위와 같이 바뀐다. 여기서 이 사용자가 다음번 로그인하면 강제적으로 암호를 바꾸기, 도메인 관리자 권한 부여(관리자가 되면 사용자 생성, 수정, 삭제등 모든것이 가능), 별명 추가(여기서 사용자 이메일 주소는 testuser@xyz.com인데 별명으로 foo를 추가해주면 foo@xyz.com으로 보낸 메일도 testuser@xyz.com으로 배달된다.), 그룹 설정등이 가능하다.


하나라도 변경하면 맨 아래 Save changes의 글자가 진하게 바뀐다. 변경한 다음에는 잊지 말고 꼭 눌러줘야 변경된게 적용된다.


계정이 추가되었으므로 처음 화면으로 돌아가보면 위와 같이 추가된 계정이 보인다.





그룹을 추가하려면 Groups 탭을 선택한 다음 Create a new group을 눌러준다.


그룹에 관련된 정보를 넣어준다. 위와 같이 RnD라는 그룹을 만들어주고 그룹의 이메일 주소를 rnd@xyz.com으로 해 주면 rnd@xyz.com으로 메일을 보내면 그룹에 속한 모든 멤버에게 메일이 날라가게 된다.
또한 그룹의 억세스 권한을 따로 설정해 줄 수 있다.

- Team : xyz.com 도메인의 모든 멤버(그룹에 속해있지 않아도 관계 없음)가 rnd@xyz.com으로 메일을 보낼 수 있고 멤버 목록을 볼 수 있다.
- Announcement-only : 공지사항 전용으로 그룹의 owner만 rnd@xyz.com으로 메일을 보내거나 멤버 목록을 볼 수 있다.
- Restricted : 그룹에 속한 멤버만 rnd@xyz.comdm로 메일을 보내거나 멤버 목록을 볼 수 있다.

즉 회사 내에 연구개발 팀을 위한 그룹을 두개 만들어서 그룹 멤버는 같지만 하나는 rnd-public@xyz.com, 나머지는 rnd-private@xyz.com 으로 해 주고 rnd-public은 억세스 권한을 Team으로, rnd-private은 억세스 권한을 Restricted로 해 주면 사내의 다른 부서 사람이 연구개발팀원 전체에게 메일을 보낼때는 rnd-public@xyz.com을 사용하고 연구개발팀원중 한명이 팀원에게 공지사항을 보낼때는 rnd-private@xyz.com을 사용할수도 있다.
이렇게 하면 메일의 필터 기능을 이용해서 팀원에게 오는 메일은 별도의 라벨을 붙여 관리할수도 있어 편리하다.

모든 정보를 입력했으면 아래쪽의 Create new group 버튼을 눌러준다.


그룹의 멤버를 추가해준다. 위쪽의 칸에 이미 만들어져 있는 사용자의 이름, 아이디 또는 이메일 주소를 넣어주고 Member 로 추가할것인지 Owner로 추가할것인지 정한 다음에 Add버튼을 누르면 된다. 위쪽의 칸에 여러명을 한꺼번에 추가할 경우는 ','로 구분해주면 된다.


여기서는 testuser@xyz.com을 RnD 그룹의 Member로 추가했다.

이렇게 계정 추가가 끝났으면 실제 계정 사용자에게 아이디와 임시 암호를 알려주면 된다.


만들어 진 계정을 사용하려면 웹 브라우져에서 시작페이지로 가면 된다. 이 예제에서는 http://start.xyz.com 으로 가면 된다. 위의 화면에서 오른쪽 상단의 Sign in을 눌러준다.


위와 같은 화면이 나온다. 여기서 자신의 아이디와 임시 암호를 넣어주고 Sign in 버튼을 누른다.


처음 로그인 하는 것이기 때문에 위와 같은 화면이 나오고 새 암호를 넣으라고 나온다. 여기에 자신이 원하는 암호를 넣어주고 사람이라는걸 확인(컴퓨터가 자동으로 하는걸 방지하기 위함)해주기 위해 중간에 녹색으로 나온 글자를 그래도 입력(여기서는 gitation 을 넣어준다.)하고 맨 아래쪽의 I accept. Create my accounts를 눌러준다.


그럼 모든 설정이 끝난 것이고 위와 같은 화면이 나와서 자신이 사용할 수 있는 서비스 목록을 보여준다.


Email 화면이다. 구글의 gmail을 그대로 사용하는 것이지만 메일 주소는 testuser@gmail.com이 아니고 testmail@xyz.com (자신의 회사 도메인을 그대로 사용)하게 된다. 웹 브라우져로 메일을 사용하려면 이대로도 문제없지만 만일 아웃룩, 썬더버드, 애플 메일등 외부 메일 클라이언트를 사용할 예정이면 우측 상단의 Settings를 눌러준다.


설정 화면에서 Forwarding and POP/IMAP을 눌러준다.


기본적으로 POP3는 활성화 되어있고 IMAP은 비활성화 되어 있다. IMAP프로토콜을 사용할 생각이면 Enable IMAP을 선택하고 Save Changes를 눌러 설정변경을 저장해주면 된다.

* 도메인을 구입한 후 구글앱스 신청 및 도메인을 구글앱스에 연동시키는 방법은 이 포스트를 참조하면 된다.
* 각 사용자가 자신의 계정을 아웃룩에 연동시키는 방법은 이 포스트를 참조하면 된다.

2010년 2월 3일 수요일

아웃룩에서 구글앱스 (Google Apps) 계정 설정하기 (How to set up outlook for google apps account)

별도의 전산팀을 두기 힘든 소규모의 회사나 모임의 경우 구글앱스를 사용하면 거의 비용을 들이지 않고도 자신의 도메인으로 메일, 웹, 게시판, 캘린더등을 공유하고 관리할 수 있어 소규모 업체에게는 축복과도 같은 서비스다. (현재 Standard타입이 무료 서비스인 경우 50개까지 계정을 만들 수 있다.)

* 도메인을 구입한 후 구글앱스 신청 및 도메인을 구글앱스에 연동시키는 방법은 이 포스트를 참조하면 된다.
* 구글앱스에서 사용자 추가/관리는 다른 포스트를 참조하면 된다.

구글 앱스를 설정하고 나면 각 개인 사용자들이 사용할 수 있게 설정을 해 줘야 하는 경우가 많다. 물론 웹 인터페이스를 사용해도 별 문제는 없지만 아웃룩에 연동시켜 사용하기를 원하는 사람들도 많기 때문에 그 때의 설정방법이다.



아웃룩을 실행한 화면이다. 메뉴의 Tools를 선택한다.


Tools에서 Account Settings를 선택해준다.


Account Settings 창에서 새 어카운트를 추가해야 하니까 New...를 선택한다.


이메일 계정을 추가할 것이기 때문에 Microsoft Exchange, POP3, IMAP, or HTTP를 체크하고 Next를 눌러준다.


Add New E-mail Account 창이 열리면 위쪽의 정보는 넣어줄 필요 없고 맨 아래쪽의 Manually configure server settings or additional server types를 체크하고 Next를 눌러준다.


Internet E-mail을 체크하고 Next를 눌러준다.





이 화면에서 자신의 이름, 이메일 주소(구글앱스로 만든 이메일 주소), 아이디(이메일 주소에서 '@' 앞쪽 부분), 암호를 넣어주고 Account Type은 'IMAP', Incoming mail server는 'imap.gmail.com' , Outgoing mail server (SMTP)는 'smtp.gmail.com'을 넣어준다. 다 입력했으면 More Settings...를 선택한다.


Internet E-mail Settings창에서 Advanced 탭을 선택한다.


Advanced탭에서 표시된 4가지 정보를 바꿔줘야 한다.


위와 같이 정보를 변경해주고 Outgoing Server 탭을 선택한다.


My outgoing server (SMTP) requires authentication을 체크해주고 Use same settings as my incoming mail server를 선택하고 OK를 누르면 된다.


그러면 다시 위의 화면으로 돌아온다. 이제 Next를 눌러준다.


위와 같은 설정이 끝나 축하한다는 화면이 나온다. Finish를 눌러주면 된다.


이제 아웃룩 왼쪽에 방금 추가한 계정이 보인다.


계정 왼쪽의 '+'를 누르면 Inbox폴더가 나타나고 오른쪽에 메일폴더의 내용이 나타나는걸 확인할 수 있다.