5. Calendar Access Feature

5.1. Calendar Access Support

이 문서에 설명된 기능을 지원하는 서버는 캘린더 속성, 보고서, 메서드 또는 권한을 지원하는 리소스에 대한 OPTIONS 요청의 DAV 응답 헤더에 "calendar-access"를 필드로 포함해야 합니다.  DAV 응답 헤더의 "calendar- access" 값은 서버가 이 문서에 명시된 모든 MUST 수준 요구 사항을 지원함을 나타내야 합니다.

5.1.1.  Example: Using OPTIONS for the Discovery of Calendar Access

>> Request <<

OPTIONS /home/bernard/calendars/ HTTP/1.1
Host: cal.example.com

>> Response <<

HTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE
Allow: PROPFIND, PROPPATCH, LOCK, UNLOCK, REPORT, ACL
DAV: 1, 2, access-control, calendar-access
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Length: 0

이 예에서 OPTIONS 메서드는 DAV 응답 헤더에 "calendar- access" 값을 반환하여 "/home/bernard/calendars/" 컬렉션이 이 사양에 정의된 속성, 보고서, 메서드 또는 권한을 지원한다는 것을 나타냅니다.

5.2. Calendar Collection Properties

이 섹션에서는 캘린더 컬렉션의 속성을 정의합니다.

5.2.1. CALDAV:calendar-description Property

Name: calendar-description

 

Namespace: urn:ietf:params:xml:ns:caldav

 

목적: 캘린더 컬렉션에 대해 사람이 읽을 수 있는 설명을 제공합니다.

 

적합성:  이 속성은 모든 캘린더 컬렉션에 정의될 수 있습니다.  정의된 경우, 이 속성은 보호될 수 있으며 PROPFIND DAV:allprop 요청에 의해 반환되어서는 안 됩니다([RFC2518]의 12.14.1절에 정의됨).  설명의 인간 언어를 나타내는 xml:lang 속성은 클라이언트 또는 서버 프로비저닝을 통해 이 속성에 대해 설정되어야 합니다.  서버는 속성에 대해 설정된 경우 xml:lang 속성을 반환해야 합니다.

 

설명:  있는 경우 이 속성에는 사용자에게 표시하기에 적합한 캘린더 컬렉션에 대한 설명이 포함됩니다. 없는 경우 클라이언트는 캘린더 컬렉션에 대한 설명이 없다고 가정해야 합니다.

 

정의:

 <!ELEMENT calendar-description (#PCDATA)>
 PCDATA value: string

 

예시:

<C:calendar-description xml:lang="fr-CA"
   xmlns:C="urn:ietf:params:xml:ns:caldav"
>Calendrier de Mathilde Desruisseaux</C:calendar-description>

 

5.2.2.  CALDAV:calendar-timezone Property

Name: calendar-timezone

Namespace: urn:ietf:params:xml:ns:caldav

Purpose: 캘린더 컬렉션의 표준 시간대를 지정합니다.

Conformance:

이 속성은 모든 캘린더 컬렉션에 정의되어야 합니다.  정의된 경우 PROPFIND DAV:allprop 요청([RFC2518] 12.14.1절에 정의됨)에 의해 반환되지 않아야 합니다.

Description:

CALDAV:calendar-timezone 속성은 서버가 '날짜' 값과 '현지 시간 포함 날짜' 값(즉, 부동 시간)을 'UTC 시간 포함 날짜' 값으로 변환할 때 사용해야 하는 시간대를 지정하는 데 사용됩니다.  서버는 "날짜" 값 또는 "현지 시간 포함 날짜" 값으로 예약된 캘린더 구성 요소가 CALDAV:캘린더 쿼리 REPORT에 지정된 CALDAV: 시간 범위와 겹치는지 확인하기 위해 이 정보를 필요로 합니다.  또한 서버는 "날짜" 값 또는 "현지 시간 포함 날짜" 값으로 예약된 캘린더 구성 요소를 고려하는 CALDAV:free-busy-query REPORT 요청에 대한 응답으로 반환되는 VFREEBUSY 구성 요소에서 "UTC 시간 포함 날짜"로 적절한 FREEBUSY 기간을 계산하기 위해 이 정보를 필요로 합니다.  이 속성이 없는 경우 서버는 선택한 표준 시간대를 사용할 수 있습니다.

Note

CALDAV:calendar- 시간대 XML 요소에 포함된 iCalendar 데이터는 <![CDATA[ ... ]]> 엔티티 인코딩 사용 또는 <![CDATA[ ... ]]> 구문 사용 등 표준 XML 문자 데이터 인코딩 규칙을 따라야 합니다.  후자의 경우 iCalendar 데이터에는 CDATA 섹션의 끝 구분 기호인 문자 시퀀스 "]]>"를 포함할 수 없습니다.

 

Definition:

<!ELEMENT calendar-timezone (#PCDATA)>
PCDATA value: an iCalendar object with exactly one VTIMEZONE
       component.

Example:

<C:calendar-timezone
   xmlns:C="urn:ietf:params:xml:ns:caldav">BEGIN:VCALENDAR
PRODID:-//Example Corp.//CalDAV Client//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:US-Eastern
LAST-MODIFIED:19870101T000000Z
BEGIN:STANDARD
DTSTART:19671029T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:Eastern Standard Time (US &amp; Canada)
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19870405T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:Eastern Daylight Time (US &amp; Canada)
END:DAYLIGHT
END:VTIMEZONE
END:VCALENDAR
</C:calendar-timezone>

5.2.3. CALDAV:supported-calendar-component-set Property

Name: supported-calendar-component-set

 

Namespace: urn:ietf:params:xml:ns:caldav

 

Purpose:

캘린더 객체 리소스가 캘린더 컬렉션에 포함할 수 있는 캘린더 구성요소 유형(예: VEVENT, VTODO 등)을 지정합니다.
적합성:  이 속성은 모든 캘린더 컬렉션에 정의할 수 있습니다.  정의된 경우 반드시 보호되어야 하며 PROPFIND DAV:allprop 요청에 의해 반환되어서는 안 됩니다([RFC2518]의 12.14.1절에 정의됨).

 

Description:

CALDAV:supported-calendar-component-set 속성은 캘린더 개체 리소스가 캘린더 컬렉션에 포함할 수 있는 캘린더 구성 요소 유형에 대한 제한을 지정하는 데 사용됩니다. 클라이언트가 이 속성에 나열되지 않은 구성 요소 유형이 있는 캘린더 객체 리소스를 저장하려고 시도하면 반드시 오류가 발생하며, CALDAV:supported-calendar-component 전제 조건(섹션 5.3.2.1)을 위반한 것이 됩니다.  이 속성은 보호되어 있으므로 클라이언트가 PROPPATCH 요청을 사용하여 변경할 수 없습니다.  그러나 클라이언트는 MKCALENDAR를 사용하여 새 캘린더 컬렉션을 만들 때 이 속성의 값을 초기화할 수 있습니다.  빈 요소 태그 <C:comp name="VTIMEZONE"/>는 VTIMEZONE 구성 요소만 포함된 캘린더 객체 리소스에 대한 지원이 제공되거나 원하는 경우에만 지정해야 합니다.  VEVENT 또는 VTODO 구성 요소가 포함된 캘린더 객체 리소스에서 VTIMEZONE 구성 요소에 대한 지원은 항상 가정됩니다.  이 속성이 없는 경우 서버는 모든 구성 요소 유형을 수락해야 하며 클라이언트는 모든 구성 요소 유형이 수락된다고 가정할 수 있습니다.

 

Definition:

<!ELEMENT supported-calendar-component-set (comp+)>

Example:

<C:supported-calendar-component-set
   xmlns:C="urn:ietf:params:xml:ns:caldav">
  <C:comp name="VEVENT"/>
  <C:comp name="VTODO"/>
</C:supported-calendar-component-set>

5.2.4. CALDAV:supported-calendar-data Property

Name: supported-calendar-data

 

Namespace: urn:ietf:params:xml:ns:caldav

 

Purpose: 캘린더 컬렉션의 캘린더 객체 리소스에 허용되는 미디어 유형을 지정합니다.

 

Conformance: 이 속성은 모든 캘린더 컬렉션에 정의될 수 있습니다.  정의된 경우 반드시 보호되어야 하며 PROPFIND DAV:allprop 요청([RFC2518] 12.14.1절에 정의됨)에 의해 반환되어서는 안 됩니다.

 

Description: CALDAV:supported-calendar-data 속성은 지정된 캘린더 컬렉션에 포함된 캘린더 객체 리소스에 대해 지원되는 미디어 유형을 지정하는 데 사용됩니다(예: iCalendar 버전 2.0).  클라이언트가 이 속성에 나열되지 않은 미디어 유형으로 캘린더 객체 리소스를 저장하려고 시도하면 반드시 오류가 발생하며, CALDAV:supported-calendar-data 전제 조건(섹션 5.3.2.1)을 위반한 것입니다.  이 속성이 없는 경우 서버는 미디어 유형이 "text/calendar" 및 iCalendar 버전 2.0인 데이터만 허용해야 하며, 클라이언트는 서버가 이 데이터만 허용한다고 가정할 수 있습니다.

 

Definition:

<!ELEMENT supported-calendar-data (calendar-data+)>

Example:

<C:supported-calendar-data
    xmlns:C="urn:ietf:params:xml:ns:caldav">
   <C:calendar-data content-type="text/calendar" version="2.0"/>
</C:supported-calendar-data>

5.2.5.  CALDAV:max-resource-size Property

Name: max-resource-size

 

Namespace: urn:ietf:params:xml:ns:caldav

 

Conformance:

이 속성은 모든 캘린더 컬렉션에 정의될 수 있습니다.  정의된 경우 반드시 보호되어야 하며 PROPFIND DAV:allprop 요청([RFC2518] 12.14.1절에 정의됨)에 의해 반환되어서는 안 됩니다.

 

Description:

CALDAV:max-resource-size는 캘린더 객체 리소스가 캘린더 컬렉션에 저장될 때 서버가 허용할 수 있는 최대 크기를 옥텟 단위로 나타내는 숫자 값을 지정하는 데 사용됩니다.  이 크기를 초과하는 캘린더 객체 리소스를 저장하려고 하면 반드시 오류가 발생하며, CALDAV:max-resource-size 전제 조건(섹션 5.3.2.1)을 위반한 것입니다.  이 속성이 없는 경우 클라이언트는 서버가 합리적인 크기의 리소스 저장을 허용한다고 가정할 수 있습니다.

 

Definition:

<!ELEMENT max-resource-size (#PCDATA)>
PCDATA value: a numeric value (positive integer)

Example:

<C:max-resource-size xmlns:C="urn:ietf:params:xml:ns:caldav"
>102400</C:max-resource-size>

5.2.6. CALDAV:min-date-time Property

5.2.7. CALDAV:max-date-time Property

 

5.2.8. CALDAV:max-instances Property

5.2.9. CALDAV:max-attendees-per-instance Property

Name: max-attendees-per-instance

 

Namespace: urn:ietf:params:xml:ns:caldav

 

Purpose: 캘린더 컬렉션에 저장된 캘린더 객체 리소스의 모든 인스턴스에서 최대 참석자 속성 수를 나타내는 숫자 값을 제공합니다.

 

Conformance: 이 프로퍼티는 모든 캘린더 컬렉션에 정의될 수 있습니다.  정의된 경우 반드시 보호되어야 하며 PROPFIND DAV:allprop 요청에 의해 반환되어서는 안 됩니다([RFC2518]의 12.14.1절에 정의됨).

 

Description:

CALDAV:max-attendees-per-instance는 캘린더 컬렉션에 저장된 캘린더 객체 리소스의 한 인스턴스에 있는 iCalendar 참석자 속성의 최대 개수를 나타내는 숫자 값을 지정하는 데 사용됩니다.  이 값보다 인스턴스당 참석자 속성이 많은 캘린더 객체 리소스를 저장하려고 하면 반드시 오류가 발생하며, CALDAV: max-attendees-per-instance 전제조건(섹션 5.3.2.1)을 위반한 것입니다.  이 속성이 없는 경우 클라이언트는 서버가 캘린더 구성 요소의 참석자 속성을 원하는 수만큼 처리할 수 있다고 가정할 수 있습니다.

 

Definition:

<!ELEMENT max-attendees-per-instance (#PCDATA)>
PCDATA value: a numeric value (integer greater than zero)

Example:

<C:max-attendees-per-instance
  xmlns:C="urn:ietf:params:xml:ns:caldav"
>25</C:max-attendees-per-instance>

5.2.10. Additional Precondition for PROPPATCH

이 사양에는 PROPPATCH 메서드에 대한 추가 전제 조건이 필요합니다.  전제 조건은 다음과 같습니다:

(CALDAV:valid-calendar-data): CALDAV:calendar-timezone 속성에 지정된 표준 시간대는 유효한 단일 VTIMEZONE 구성 요소를 포함하는 유효한 iCalendar 객체여야 합니다.

5.2. Creating Resources

캘린더 컬렉션과 캘린더 객체 리소스는 CalDAV 클라이언트 또는 CalDAV 서버에 의해 생성될 수 있습니다.  이 사양은 클라이언트와 서버가 이러한 캘린더 데이터를 조작할 때 반드시 준수해야 하는 제한 사항과 데이터 모델을 정의합니다.

5.3.1. MKCALENDAR Method

MKCALENDAR 메서드를 사용하는 HTTP 요청은 새 캘린더 컬렉션 리소스를 생성합니다.  서버는 캘린더 컬렉션 생성을 특정 컬렉션으로 제한할 수 있습니다.

일부 캘린더 저장소는 사용자(또는 본인) 당 하나의 캘린더만 지원하며 일반적으로 각 계정에 대해 미리 생성되기 때문에 서버에서 MKCALENDAR를 지원하는 것은 권장 사항일 뿐 필수는 아닙니다.  그러나 서버와 클라이언트는 사용자가 여러 개의 캘린더 컬렉션을 만들어 데이터를 더 잘 정리할 수 있도록 가능하면 MKCALENDAR를 지원할 것을 적극 권장합니다.

클라이언트는 사람이 읽을 수 있는 캘린더 이름에 DAV:displayname 속성을 사용해야 합니다.  클라이언트는 MKCALENDAR 요청의 요청 본문에서 DAV:displayname 속성의 값을 지정하거나, 또는 MKCALENDAR 요청을 발행한 후 즉시 PROPPATCH 요청을 발행하여 DAV:displayname 속성을 적절한 값으로 변경할 수 있습니다.  클라이언트는 동일한 URI "level"에 있는 다른 캘린더 컬렉션과 동일하게 DAV: displayname 속성을 설정해서는 안 됩니다.  캘린더 컬렉션을 사용자에게 표시할 때 클라이언트는 DAV:displayname 속성을 확인하고 해당 값을 캘린더의 이름으로 사용해야 합니다.  DAV: displayname 속성이 비어 있는 경우 클라이언트는 캘린더 컬렉션 URI의 마지막 부분을 이름으로 사용할 수 있지만, 해당 경로 세그먼트는 "opaque"하여 사람이 읽을 수 있는 의미 있는 텍스트를 나타내지 않을 수 있습니다.

MKCALENDAR 요청이 실패하면 요청 이전의 서버 상태가 반드시 복원되어야 합니다.

 

Marshalling:

요청 본문이 포함된 경우, 반드시 CALDAV:mkcalendar XML 요소여야 합니다.  명령 처리는 명령이 수신된 순서대로(즉, 위에서 아래로) 수행되어야 합니다. 인스트럭션은 모두 실행되거나 실행되지 않아야 합니다.  따라서 처리 중에 오류가 발생하면 실행된 모든 인스트럭션을 취소하고 적절한 오류 결과를 반환해야 합니다.  명령어 처리에 대한 자세한 내용은 [RFC2518] 섹션 12.13.2의 DAV:set 명령어 정의에서 확인할 수 있습니다.

<!ELEMENT mkcalendar (DAV:set)>

 

성공적인 요청에 대한 응답 본문이 포함된 경우, 반드시 CALDAV:mkcalendar-response XML 요소여야 합니다.

<!ELEMENT mkcalendar-response ANY>

 

응답에는 Cache-Control:no-cache 헤더가 포함되어야 합니다.

 

Postconditions:

(CALDAV:initialize-calendar-collection): 새 캘린더 컬렉션이 Reqeust-URI에 존재합니다.  캘린더 컬렉션의 DAV:resourcetype 에는 DAV:collection CALDAV:calendar XML 요소가 모두 포함되어야 합니다.

 

5.3.1.1. Status Codes

다음은 MKCALENDAR 요청에 대한 응답으로 받을 수 있는 응답 코드의 예시입니다.  이 목록은 결코 완전한 목록이 아닙니다.

201(Created) - 캘린더 컬렉션 리소스가 완전히 생성되었습니다;

207(Multi-Status) - 요청 본문에 지정된 하나 이상의 DAV:set 명령어를 성공적으로 처리할 수 없기 때문에 캘린더 컬렉션 리소스를 만들지 못했습니다.  다음은 이 상황에서 207(다중 상태) 응답에 사용될 것으로 예상되는 응답 코드의 예입니다:

        403(Forbidden) - 서버가 지정하지 않은 이유로 클라이언트가 속성 중 하나를 변경할 수 없습니다;

       409(Conflict) - 클라이언트가 해당 프로퍼티에 적합하지 않은 의미를 가진 값을 제공했습니다.  여기에는 읽기 전용 속성을 설정하려는 시도가 포함됩니다;

        424(Failed Dependency) - 요청 본문에 지정된 다른 DAV:set 명령의 실패가 아니었다면 지정된 리소스에 대한 DAV:set 명령이 성공했을 것입니다;

        423(Locked) - 지정한 리소스가 잠겨 있고 클라이언트가 잠금 소유자가 아니거나 잠금 유형에 잠금 토큰을 제출해야 하는데 클라이언트가 제출하지 않았습니다.

        507 (Insufficient Storage) - 서버에 속성을 기록할 공간이 충분하지 않습니다;

403(Forbidden) - 다음 두 가지 조건 중 하나 이상을 나타냅니다: 1) 서버가 네임스페이스의 지정된 위치에 캘린더 컬렉션을 만드는 것을 허용하지 않거나 2) Request-URI의 상위 컬렉션이 존재하지만 구성원을 받아들일 수 없습니다;

409(Conflict) - 하나 이상의 중간 컬렉션이 만들어질 때까지 Request-URI에서 컬렉션을 만들 수 없습니다;

415(Unsupported Media Type) - 서버가 본문의 요청 유형을 지원하지 않습니다.

507(Insufficient Storage) - 이 메서드 실행 후 리소스의 상태를 기록할 공간이 충분하지 않습니다.

 

5.3.1.2. Example: Successful MKCALENDAT Request

이 예에서는 서버 cal.example.com에 /home/lisa/calendars/events/라는 캘린더 컬렉션을 생성하고, DAV:displayname, CALDAV:calendar-description, CALDAV:supported-calendar-component-set 및 CALDAV:calendar-timezone 속성에 대한 특정 값을 지정합니다.

>> Request <<

MKCALENDAR /home/lisa/calendars/events/ HTTP/1.1
Host: cal.example.com
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<C:mkcalendar xmlns:D="DAV:"
              xmlns:C="urn:ietf:params:xml:ns:caldav">
 <D:set>
   <D:prop>
     <D:displayname>Lisa's Events</D:displayname>
     <C:calendar-description xml:lang="en"
>Calendar restricted to events.</C:calendar-description>
     <C:supported-calendar-component-set>
       <C:comp name="VEVENT"/>
     </C:supported-calendar-component-set>
     <C:calendar-timezone><![CDATA[BEGIN:VCALENDAR
PRODID:-//Example Corp.//CalDAV Client//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:US-Eastern
LAST-MODIFIED:19870101T000000Z
BEGIN:STANDARD
DTSTART:19671029T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:Eastern Standard Time (US & Canada)
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19870405T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:Eastern Daylight Time (US & Canada)
END:DAYLIGHT
END:VTIMEZONE
END:VCALENDAR
]]></C:calendar-timezone>
   </D:prop>
 </D:set>
</C:mkcalendar>

>> Response <<

HTTP/1.1 201 Created
Cache-Control: no-cache
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Length: 0

5.3.2. Creating Calendar Object Resources

클라이언트는 캘린더 개체 리소스로 캘린더 컬렉션을 채웁니다. 각 캘린더 객체 리소스의 URL은 전적으로 임의적이며 캘린더 객체 리소스의 iCalendar 속성 또는 기타 메타데이터와 특정 관계를 가질 필요가 없습니다.  새 캘린더 객체 리소스는 매핑되지 않은 URI를 대상으로 하는 PUT 요청으로 만들어야 합니다.  매핑된 URI를 대상으로 하는 PUT 요청은 기존 캘린더 객체 리소스를 업데이트합니다.

서버가 새 리소스를 만들 때 서버가 매핑되지 않은 URI를 선택하는 것은 어렵지 않습니다.  클라이언트는 컬렉션의 모든 리소스를 검사하고 싶지 않을 수도 있고 새 리소스가 이름 충돌로 생성되지 않도록 전체 컬렉션을 잠그고 싶지 않을 수도 있기 때문에 약간 더 까다롭습니다.  하지만 이를 완화하는 HTTP 기능이 있습니다.  클라이언트가 새 이벤트와 같이 컬렉션이 아닌 리소스를 새로 만들려는 경우, 클라이언트는 PUT 요청에 HTTP 요청 헤더 "If-None-Match: *"를 PUT 요청에 사용해야 합니다.  PUT 요청의 Request-URI는 리소스가 생성될 대상 컬렉션과 마지막 경로 세그먼트에 있는 리소스 이름을 포함해야 합니다.  "If-None-Match: *" 요청 헤더는 마지막 경로 세그먼트가 이미 사용된 것으로 판명된 경우 클라이언트가 실수로 기존 리소스를 덮어쓰지 않도록 보장합니다.

>> Request <<

PUT /home/lisa/calendars/events/qwue23489.ics HTTP/1.1
If-None-Match: *
Host: cal.example.com
Content-Type: text/calendar
Content-Length: xxxx

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VEVENT
UID:20010712T182145Z-123401@example.com
DTSTAMP:20060712T182145Z
DTSTART:20060714T170000Z
DTEND:20060715T040000Z
SUMMARY:Bastille Day Party
END:VEVENT
END:VCALENDAR

>> Response <<

HTTP/1.1 201 Created
Content-Length: 0
Date: Sat, 11 Nov 2006 09:32:12 GMT
ETag: "123456789-000-111"

기존 이벤트를 변경하는 요청은 동일하지만 "If-None- Match" 헤더가 아닌 "If-Match" 헤더에 특정 ETag를 사용합니다.

RFC2445] 섹션 3.10에 명시된 대로 캘린더 및 스케줄링 정보를 포함하는 (임의의) 캘린더 객체 리소스의 URL에는 ".ics"가 붙을 수 있으며, 여유 시간 또는 바쁜 시간 정보를 포함하는 캘린더 객체 리소스의 URL에는 ".ifb"가 붙을 수 있습니다.

 

5.3.2.1. Additional Preconditions for PUT, COPY, and MOVE

이 사양은 PUT, COPY 및 MOVE 메서드에 대한 추가 전제 조건을 생성합니다.  이러한 전제 조건은 캘린더 객체 리소스를 캘린더 컬렉션으로 PUT 작업할 때, 캘린더 객체 리소스를 캘린더 컬렉션으로 COPY 또는 MOVE 작업할 때 또는 캘린더 컬렉션에서 COPY 또는 MOVE 작업이 발생할 때 적용됩니다.

새로운 전제 조건은 다음과 같습니다:

(CALDAV:supported-calendar-data): PUT 요청에 제출되거나 COPY 또는 MOVE 요청의 대상이 되는 리소스는 캘린더 객체 리소스에 대해 지원되는 미디어 유형(즉, iCalendar)이어야 합니다;

(CALDAV:valid-calendar-data): PUT 요청에 제출되거나 COPY 또는 MOVE 요청의 대상이 되는 리소스는 지정된 미디어 유형에 유효한 데이터여야 합니다(즉, 유효한 iCalendar 데이터를 포함해야 합니다);

(CALDAV:valid-calendar-object-resource): PUT 요청에 제출되거나 COPY 또는 MOVE 요청의 대상이 되는 리소스는 섹션 4.1에 명시된 모든 제한 사항을 준수해야 합니다(예: 캘린더 객체 리소스는 두 가지 이상의 캘린더 구성 요소 유형을 포함해서는 안 되며, 캘린더 객체 리소스는 iCalendar METHOD 속성을 지정해서는 안 됨 등);

(CALDAV:supported-calendar-component): PUT 요청에 제출되거나 COPY 또는 MOVE 요청의 대상이 되는 리소스에는 대상 캘린더 컬렉션에서 지원되는 캘린더 컴포넌트 유형이 포함되어야 합니다;

(CALDAV:no-uid-conflict): PUT 요청에 제출되거나 COPY 또는 MOVE 요청에 의해 대상이 되는 리소스는 대상 캘린더 컬렉션에서 이미 사용 중인 iCalendar UID 속성 값을 지정하거나 기존 캘린더 개체 리소스를 다른 UID 속성 값을 가진 것으로 덮어쓰지 않아야 합니다. 서버는 DAV:href 요소에 이미 동일한 UID 속성 값을 사용하고 있는 리소스의 URL을 보고해야 합니다;

<!ELEMENT no-uid-conflict (DAV:href)>

 

(CALDAV:calendar-collection-location-ok): 복사 또는 이동 요청에서 Request-URI가 캘린더 컬렉션인 경우, Descrination-URI는 캘린더 컬렉션을 만들 수 있는 위치를 식별해야 합니다;

(CALDAV:max-resource-size): PUT 요청에 제출되거나 COPY 또는 MOVE 요청의 대상이 되는 리소스는 리소스가 저장될 캘린더 컬렉션의 CALDAV:max-resource- size 속성 값(섹션 5.2.5)의 값보다 작거나 같은 옥텟 크기를 가져야 합니다;

(CALDAV:min-date-time): PUT 요청에 제출되거나 COPY 또는 MOVE 요청의 대상이 되는 리소스는 리소스가 저장될 캘린더 컬렉션의 모든 iCalendar DATE 또는 DATE-TIME 속성 값(각 반복 인스턴스에 대해)이 CALDAV:min-date-time 속성 값(섹션 5.2.6)보다 크거나 같아야 합니다;

(CALDAV:max-date-time): PUT 요청에 제출되거나 COPY 또는 MOVE 요청의 대상이 되는 리소스는 리소스가 저장될 캘린더 컬렉션의 모든 iCalendar DATE 또는 DATE-TIME 속성 값(각 반복 인스턴스에 대해)이 CALDAV:max-date-time 속성 값(섹션 5.2.7)보다 작아야 합니다;

(CALDAV:max-instances): PUT 요청에 제출되거나 COPY 또는 MOVE 요청의 대상이 되는 리소스는 리소스가 저장될 캘린더 컬렉션에서 CALDAV: max-instances 속성 값(섹션 5.2.8)의 값보다 작거나 같은 수의 반복 인스턴스를 생성해야 합니다;

(CALDAV:max-attendees-per-instance): PUT 요청에 제출된 리소스 또는 복사 또는 이동 요청의 대상이 되는 리소스는 리소스가 저장될 캘린더 컬렉션의 CALDAV:max-attendees-per-instance 속성 값(섹션 5.2.9) 값보다 작거나 같은 수의 참석자 속성을 하나의 인스턴스에서 가져야 합니다;

5.3.3. Non-Standard Components, Properties, and Parameters

iCalendar는 "standdatd mechanism for doing non-standard things"을 제공합니다.  이 확장 지원을 통해 구현자는 이름 앞에 "X-"라는 텍스트가 붙은 비표준 컴포넌트, 속성 및 매개변수를 사용할 수 있습니다.

서버는 PUT 메서드를 통해 저장된 캘린더 객체 리소스에서 비표준 컴포넌트, 속성 및 파라미터의 사용을 지원해야 합니다.

서버는 자체 "private" 컴포넌트, 속성 또는 매개변수에 대한 규칙을 적용해야 할 수 있으므로 서버는 클라이언트가 해당 컴포넌트를 변경하거나 서버가 가진 제한을 벗어난 값을 사용하려는 시도를 거부할 수 있습니다.  서버는 사용하는 모든 "private" 컴포넌트, 속성 또는 매개변수가 [RFC2445] 섹션 4.2에 설명된 대로 "X-" 이름에 공급업체 ID를 포함하는 규칙을 따르도록 해야 합니다(예: "X-ABC-PRIVATE").

5.3.4. Calendar Object Resource Entity Tag

모든 캘린더 객체 리소스에서 DAV:getetag 속성을 정의하고 강력한 엔티티 태그로 설정해야 합니다.

캘린더 객체 리소스를 대상으로 하는 GET 요청에 대한 응답에는 캘린더 객체 리소스의 강력한 엔티티 태그의 현재 값을 나타내는 ETag 응답 헤더 필드가 포함되어야 합니다.

서버는 저장된 캘린더 객체 리소스가 PUT 요청 본문에 제출된 캘린더 객체 리소스와 옥텟 단위로 동등한 경우 PUT 응답에 강력한 엔티티 태그(ETag 헤더)를 반환해야 합니다.  이를 통해 클라이언트는 반환된 강력한 엔티티 태그를 데이터 동기화 목적으로 안정적으로 사용할 수 있습니다.  예를 들어, 클라이언트는 저장된 캘린더 객체 리소스에 대해 PROPFIND 요청을 수행하여 DAV:getetag 속성을 반환받고, 이 값을 PUT 응답에서 받은 강력한 엔티티 태그와 비교하여 두 값이 같으면 서버의 캘린더 객체 리소스가 변경되지 않았음을 알 수 있습니다.

PUT 요청의 결과로 서버에 저장된 데이터가 제출된 캘린더 객체 리소스와 옥텟 단위로 동일하지 않은 경우, 강력한 엔티티 태그가 응답에 반환되지 않아야 한다는 점을 제외하고는 ETag 응답 헤더의 동작이 여기에 지정되어 있지 않습니다.  따라서 클라이언트는 PUT 요청과 함께 보낸 캘린더 객체 리소스를 사용하는 대신 추가 변경을 위해 수정된 캘린더 객체 리소스(및 ETag)를 검색해야 할 수 있습니다.

나중에 찾아보기 위해 RFC 4791을 번역된 것 남김.

Calendaring Extensions to WebDAV (CalDAV)

개요

이 문서는 iCalendar 형식을 기반으로 캘린더 및 일정 정보에 액세스, 관리, 공유하는 표준 방법을 지정하기 위해 WebDAV(Web Distributed Authoring and Versioning) 프로토콜의 확장을 정의합니다.  이 문서는 CalDAV의 'calendar-access' 기능을 정의합니다.

1. Introduction

캘린더 액세스 프로토콜의 기반으로 HTTP[RFC2616]와 WebDAV[RFC2518]를 사용하는 개념으로 결코 새로운 개념이 아니며, 1997년 또는 1998년 초에 IETF CALSCH 워킹 그룹에서 논의된 바 있습니다. 여러 회사에서 HTTP를 사용하여 iCalendar[RFC2445] 개체를 업로드 및 다운로드하고 WebDAV를 사용하여 리소스 목록을 가져오는 캘린더 액세스 프로토콜을 구현한 바 있습니다.  그러나 이러한 구현은 상호 운용되지 않는데, 그 이유는 캘린더 데이터를 WebDAV 리소스로 모델링하는 방법과 WebDAV에 아직 포함되지 않은 필수 기능을 구현하는 방법에서 크고 작은 많은 결정을 내려야 하기 때문입니다. 이 문서에서는 상호 운용 가능한 캘린더 액세스 프로토콜을 만들기 위한 추가 기능과 함께 WebDAV에서 캘린더 데이터를 모델링하는 방법을 제안합니다.

1.1. Notational Conventions

본 문서에서 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMAND권장", "MAY" 및 "OPTIONAL" 키워드는 [RFC2119]에 설명된 대로 해석해야 합니다.


"protected"이라는 용어는 [RFC3253]의 1.4.2절에 정의된 대로 속성 정의의 적합성 필드에 사용됩니다.


본 문서에서 XML 조각의 컨텍스트 외부에서 "DAV:" 및 "urn:ietf:params:xml:ns:caldav" 네임스페이스의 XML 요소 유형을 참조하는 경우, 요소 유형 이름 앞에 각각 "DAV:" 및 "CALDAV:" 문자열이 접두사로 붙게 됩니다.

1.2.  XML Namespaces and Processing

이 문서에서 XML 요소의 정의는 [W3C.REC-xml-20060816]의 3.2절에 설명된 XML 요소 유형 선언(XML 문서 유형 선언에서 찾을 수 있음)을 사용합니다.

네임스페이스 "urn:ietf:params:xml:ns:caldav"는 이 사양, 그 개정판 및 관련 CalDAV 사양에 정의된 XML 요소를 위해 예약되어 있습니다.  개별 구현에 의해 정의된 XML 요소는 "urn:ietf:params:xml:ns:caldav" 네임스페이스를 사용해서는 안 되며, 대신 해당 구현이 제어하는 네임스페이스를 사용해야 합니다.

이 문서에 사용된 XML 선언에는 네임스페이스 정보가 포함되어 있지 않습니다.  따라서 구현자는 이러한 선언을 유효한 CalDAV 프로퍼티를 생성하거나 CalDAV XML 요소 유형의 유효성을 검사하는 유일한 방법으로 사용해서는 안 됩니다.  일부 선언은 "DAV:" 네임스페이스를 사용하는 WebDAV [RFC2518]에 정의된 XML 요소를 참조합니다. 이러한 XML 요소가 나타나는 곳에는 혼동을 피하기 위해 명시적으로 "DAV:"가 접두사로 붙습니다.

1.3.  Method Preconditions and Postconditions

메서드의 "precondition"(전제 조건)은 해당 메서드가 수행되기 위해 참이어야 하는 서버의 상태를 설명합니다.  메서드의 "postcondition"(사후 조건)은 해당 메서드가 완료된 후 참이어야 하는 서버의 상태를 설명합니다.  요청에 대한 메서드 전조건 또는 후조건이 충족되지 않으면 요청이 항상 실패하므로 요청을 반복해서는 안 되는 경우 요청의 응답 상태는 403(Forbidden)이거나 사용자가 충돌을 해결하고 요청을 다시 제출할 수 있을 것으로 예상되는 경우 409(Conflict)여야 합니다.

 

클라이언트가 403 및 409 응답을 더 잘 처리할 수 있도록 요청의 각 메서드 전제 조건 및 후제 조건에 고유한 XML 요소 유형이 연관됩니다.  특정 전제 조건이 충족되지 않거나 특정 후제 조건을 달성할 수 없는 경우, 요청에서 달리 협상하지 않는 한 응답 본문에서 최상위 DAV:error 요소의 하위 요소로 적절한 XML 요소를 반환해야 합니다.

2.  Requirements Overview

이 섹션에서는 CalDAV 서버에 필요한 기능을 나열합니다. 서버가 CalDAV 지원을 알리려면 다음과 같이 해야 합니다:

  • (MUST) 캘린더 객체 리소스 형식의 미디어 유형으로 iCalendar[RFC2445]를 지원해야 합니다;
  • (MUST) WebDAV 클래스 1 [RFC2518]을 지원해야 합니다([rfc2518bis]에는 상호 운용성을 지원하는 [RFC2518]에 대한 설명이 나와 있습니다);
  • (MUST) 이 문서의 섹션 6.1에 정의된 추가 권한으로 WebDAV ACL [RFC3744]을 지원해야 합니다;
  • (MUST) [RFC2818]에 정의된 대로 TLS[RFC2246]를 통한 전송을 지원해야 합니다([RFC2246]은 [RFC4346]에 의해 폐기되었음에 유의);
  • (MUST) 이 문서의 섹션 5.3.4에 명시된 추가 요구 사항과 함께 ETag [RFC2616]을 지원해야 합니다;
  • (MUST) 이 문서의 섹션 7에 정의된 모든 calendaring reports를 지원해야 합니다.
  • (MUST) WebDAV[RFC3253] Versioning Extensions에 정의된 대로 모든 캘린더 컬렉션 및 캘린더 객체 리소스에서 calendaring reports에 대한 지원을 DAV:supported- report-set 속성에 공표해야 합니다.

또한 서버:

  • (SHOULD) 이 문서의 5.3.1절에 정의된 MKCALENDAR 메서드를 지원해야 합니다.

3.  Calendaring Data Model

WebDAV를 성공적인 프로토콜로 만든 기능 중 하나는 확고한 데이터 모델입니다. 이는 캘린더와 같은 다른 애플리케이션에 유용한 프레임워크입니다. 이 사양은 잘 설명된 데이터 모델을 기반으로 모든 기능을 개발함으로써 동일한 패턴을 따릅니다.

 

간단히 요약하면, CalDAV 캘린더는 정의된 구조를 가진 WebDAV 컬렉션으로 모델링되며, 각 캘린더 컬렉션에는 직접 하위 리소스로서 캘린더 개체를 나타내는 여러 리소스가 포함되어 있습니다.  캘린더 객체(event, to-do, journal 또는 기타 캘린더 구성요소)를 나타내는 각 리소스를 "calendar object resource"라고 합니다.  각 캘린더 객체 리소스와 각 캘린더 컬렉션은 개별적으로 잠글 수 있으며 개별 WebDAV 속성을 가질 수 있습니다.  이 모델에서 파생된 요구사항은 섹션 4.1과 섹션 4.2에 나와 있습니다.

3.1.  Calendar Server

캘린더 서버는 WebDAV 저장소와 결합된 calendaring-aware engine입니다.  WebDAV 리포지토리는 통합 URL 네임스페이스 내에 다른 WebDAV 리소스를 포함하는 WebDAV 컬렉션의 집합입니다. 예를 들어, 리포지토리 "http://www.example.com/webdav/"에는 모두 "http://www.example.com/webdav/"로 시작하는 URL을 가진 WebDAV 컬렉션 및 리소스가 포함될 수 있습니다.  루트 URL인 "http://www.example.com/"는 그 자체로 WebDAV 리포지토리가 아닐 수도 있습니다(예: WebDAV 지원이 서블릿 또는 기타 웹 서버 확장을 통해 구현되는 경우).

 

WebDAV 리포지토리는 URL 네임스페이스의 일부에 캘린더 데이터를 포함하고 다른 부분에는 비캘린더 데이터를 포함할 수 있습니다.

 

WebDAV 리포지토리는 리포지토리 루트 내의 어느 지점에서든 이 사양에 정의된 기능을 지원하는 경우 스스로를 CalDAV 서버로 광고할 수 있습니다.  이는 캘린더 데이터가 리포지토리 전체에 분산되어 있고 인근 컬렉션의 비캘린더 데이터와 혼합되어 있음을 의미할 수 있습니다(예: 캘린더 데이터는 /home/lisa/calendars/와 /home/bernard/calendars/에서 찾을 수 있고, 비캘린더 데이터는 /home/lisa/contacts/에서 찾을 수 있음).  또는 리포지토리의 특정 섹션(예: /calendar/)에서만 캘린더 데이터를 찾을 수 있다는 의미일 수도 있습니다.  캘린더 기능은 캘린더 객체 리소스를 포함하거나 포함하는 리포지토리 섹션에만 필요합니다. 따라서 캘린더 데이터를 /calendar/ 컬렉션에 한정하는 리포지토리는 해당 컬렉션 내에서 CalDAV 필수 기능만 지원하면 됩니다.

CalDAV 서버 또는 리포지토리는 캘린더 데이터 및 상태 정보를 위한 표준 위치입니다. 클라이언트는 데이터 변경 또는 데이터 다운로드 요청을 제출할 수 있습니다. 클라이언트는 캘린더 개체를 오프라인으로 저장하고 나중에 동기화를 시도할 수 있습니다. 그러나 클라이언트는 여러 클라이언트를 통해 캘린더 컬렉션을 공유하고 액세스할 수 있으므로 마지막 동기화 시점과 업데이트 시도 시점 사이에 서버의 캘린더 데이터가 변경될 수 있으므로 이에 대비해야 합니다.  엔티티 태그 및 기타 기능을 통해 이를 가능하게 합니다.

3.2.  Recurrence and the Data Model

반복은 얼마나 많은 리소스가 존재할 것으로 예상되는지를 관리하기 때문에 데이터 모델에서 중요한 부분입니다.  이 사양에서는 recurring calendar component와 recurrence exception를 단일 리소스로 모델링합니다. 이 모델에서는 반복 규칙, 반복 날짜, 예외 규칙 및 예외 날짜가 모두 단일 캘린더 객체 리소스에 있는 데이터의 일부입니다.  이 모델은 리포지토리에 저장할 반복 인스턴스 수 제한, 반복 인스턴스를 반복 캘린더 구성 요소와 동기화하는 방법, 반복 예외를 반복 캘린더 구성 요소와 연결하는 방법 등의 문제를 피할 수 있습니다.  또한 클라이언트와 서버 간에 동기화할 데이터가 줄어들고 모든 되풀이 인스턴스 또는 되풀이 규칙을 더 쉽게 변경할 수 있습니다.  반복 캘린더 컴포넌트를 더 쉽게 만들고 모든 반복 인스턴스를 삭제할 수 있습니다.

 

클라이언트는 반복 구성 요소의 모든 반복 인스턴스에 대한 정보를 강제로 검색하지 않아도 됩니다.  이 문서에 정의된 CALDAV:calendar-query 및 CALDAV:calendar-multiget 보고서를 사용하면 클라이언트가 지정된 시간 범위와 겹치는 반복 인스턴스만 검색할 수 있습니다.

4. Calendar Resources

4.1. Calendar Object Resources

캘린더 컬렉션에 포함된 캘린더 객체 리소스에는 두 가지 이상의 유형의 캘린더 컴포넌트(예: VEVENT, VTODO, VJOURNAL, VFREEBUSY 등)가 포함되어서는 안 되며, iCalendar 객체에 지정된 각 고유 TZID 파라미터 값에 대해 지정되어야 하는 VTIMEZONE 컴포넌트를 제외하고는 두 가지 이상을 포함할 수 없습니다.  예를 들어, 캘린더 객체 리소스에는 하나의 VEVENT 구성 요소와 하나의 VTIMEZONE 구성 요소가 포함될 수 있지만 하나의 VEVENT 구성 요소와 하나의 VTODO 구성 요소는 포함될 수 없습니다.  대신, VEVENT 구성 요소와 VTODO 구성 요소는 동일한 컬렉션에 있는 별도의 캘린더 객체 리소스에 저장해야 합니다.

 

캘린더 컬렉션에 포함된 캘린더 객체 리소스는 iCalendar METHOD 속성을 지정하지 않아야 합니다.

 

캘린더 객체 리소스에 포함된 캘린더 구성 요소의 UID 속성 값은 해당 구성 요소가 저장된 캘린더 컬렉션의 범위 내서 고유해야 합니다.

캘린더 컬렉션의 캘린더 구성요소 중 UID 속성 값이 다른 구성요소는 별도의 캘린더 객체 리소스에 저장해야 합니다.
특정 캘린더 컬렉션에서 동일한 UID 속성 값을 가진 캘린더 구성요소는 반드시 동일한 캘린더 객체 리소스에 포함되어야 합니다.  이렇게 하면 반복 '세트'의 모든 구성요소가 동일한 캘린더 객체 리소스에 포함될 수 있습니다.  캘린더 객체 리소스에는 "재정의된" 인스턴스(일반 인스턴스의 동작을 수정하는 인스턴스이므로 RECURRENCE-ID 속성을 포함하는 인스턴스)를 나타내는 구성 요소만 포함할 수 있으며, "마스터" 반복 구성 요소(반복 "세트"를 정의하고 RECURRENCE-ID 속성을 포함하지 않는 구성 요소)는 포함하지 않을 수 있습니다.

 

예를 들어, 다음 iCalendar 개체가 있습니다:

   BEGIN:VCALENDAR
   PRODID:-//Example Corp.//CalDAV Client//EN
   VERSION:2.0
   BEGIN:VEVENT
   UID:1@example.com
   SUMMARY:One-off Meeting
   DTSTAMP:20041210T183904Z
   DTSTART:20041207T120000Z
   DTEND:20041207T130000Z
   END:VEVENT
   BEGIN:VEVENT
   UID:2@example.com
   SUMMARY:Weekly Meeting
   DTSTAMP:20041210T183838Z
   DTSTART:20041206T120000Z
   DTEND:20041206T130000Z
   RRULE:FREQ=WEEKLY
   END:VEVENT
   BEGIN:VEVENT
   UID:2@example.com
   SUMMARY:Weekly Meeting
   RECURRENCE-ID:20041213T120000Z
   DTSTAMP:20041210T183838Z
   DTSTART:20041213T130000Z
   DTEND:20041213T140000Z
   END:VEVENT
   END:VCALENDAR

 

UID 값이 "1@example.com"인 VEVENT 컴포넌트는 자체 캘린더 객체 리소스에 저장됩니다.  하나의 반복 인스턴스가 재정의된 반복 이벤트를 나타내는 UID 값이 "2@example.com"인 두 개의 VEVENT 구성 요소는 동일한 캘린더 객체 리소스에 저장됩니다.

4.2. Calendar Collection

캘린더 컬렉션에는 캘린더 내의 캘린더 구성요소를 나타내는 캘린더 객체 리소스가 포함되어 있습니다.  캘린더 컬렉션은 URL로 식별되는 WebDAV 리소스 컬렉션으로 클라이언트에게 표시됩니다.  캘린더 컬렉션은 DAV: 자원 유형 속성 값에 DAV: 컬렉션 및 CALDAV:calendar XML 요소를 보고해야 합니다.  CALDAV: calendar에 대한 요소 유형 선언은 다음과 같습니다:

<!ELEMENT calendar EMPTY>

캘린더 컬렉션은 프로비저닝을 통해 만들거나(즉, 사용자 계정이 프로비저닝될 때 자동으로 만들어짐), MKCALENDAR 메서드를 사용하여 만들 수 있습니다(5.3.1절 참조).  이 방법은 사용자가 추가 캘린더(예: 축구 일정)를 만들거나 사용자가 캘린더(예: 팀 이벤트 또는 회의실)를 공유할 때 유용할 수 있습니다.  하지만 이 문서에서는 추가 캘린더 컬렉션의 용도를 정의하고 있지 않다는 점에 유의하세요.  사용자는 비표준 단서에 의존하여 캘린더 컬렉션의 용도를 찾거나 섹션 5.2.1에 정의된 CALDAV:calendar-description 속성을 사용하여 그러한 단서를 제공해야 합니다.

 

캘린더 컬렉션 내의 리소스에는 다음과 같은 제한이 적용됩니다:

  1. 캘린더 컬렉션에는 캘린더 객체 리소스와 캘린더 컬렉션이 아닌 컬렉션만 포함되어야 합니다. 즉, 캘린더 컬렉션에서 허용되는 유일한 "최상위" 비컬렉션 리소스는 캘린더 객체 리소스입니다.  따라서 캘린더 클라이언트는 캘린더 컬렉션에서 캘린더 이외의 데이터를 처리할 필요가 없지만, 표준 WebDAV 기술을 사용하여 컬렉션의 콘텐츠를 검사할 때는 캘린더 객체 리소스와 컬렉션을 구분해야 합니다.
  2. 캘린더 컬렉션에 포함된 컬렉션은 어떤 깊이의 캘린더 컬렉션도 포함해서는 안 됩니다. 즉, 어떤 깊이의 다른 캘린더 컬렉션 내에 캘린더 컬렉션을 "중첩"하는 것은 허용되지 않습니다.  이 사양은 캘린더 컬렉션에 포함된 컬렉션의 사용 방법이나 캘린더 컬렉션에 포함된 캘린더 객체 리소스와 관련된 방법을 정의하지 않습니다.

여러 캘린더 컬렉션은 동일한 컬렉션의 하위 컬렉션일 수 있습니다.

'calendar' 카테고리의 다른 글

CalDAV - Calendar Access Feature,  (0) 2023.04.25
iTIP - Interoperability Models  (1) 2023.04.19
iTIP - Introduction  (0) 2023.04.19

나중에 찾아보기 위해 RFC 2446을 번역된 것 남김.

iCalendar Transport-Independent Interoperability Protocol (iTIP)
Scheduling Events, BusyTime, To-dos and Journal Entries

2 Interoperability Models

상호 운용성과 관련된 프로토콜에는 "응용 프로그램 프로토콜"과 "전송 프로토콜"이라는 두 가지가 있습니다. 애플리케이션 프로토콜은 위에 나열된 스케줄링 트랜잭션을 수행하기 위해 발신자와 수신자 간에 전송되는 iCalendar 개체의 내용을 정의합니다. 전송 프로토콜은 발신자와 수신자 간에 iCalendar 개체를 전송하는 방법을 정의합니다. 이 문서는 애플리케이션 프로토콜에 중점을 둡니다. iMIP]와 같은 바인딩 문서는 전송 프로토콜에 중점을 둡니다.

아래 다이어그램에서 발신자와 수신자 간의 연결은 애플리케이션 프로토콜을 참조합니다. 발신자에서 수신자에게 전달되는 iCalendar 개체는 섹션 3, 애플리케이션 프로토콜 요소에 나와 있습니다.

   +----------+                      +----------+
   |          |        iTIP          |          |
   |  Sender  |<-------------------->| Receiver |
   |          |                      |          |
   +----------+                      +----------+

이 다이어그램에는 발신자와 수신자가 'Calendar User Agent(CUA)' 또는 'Calendar Service(CS)'의 다양한 역할을 맡는 여러 가지 변형이 있습니다.

iTIP의 아키텍처는 아래 다이어그램에 나와 있습니다. 이 사양에 따라 작성된 애플리케이션은 저장 후 전달 전송, 실시간 전송 또는 둘 다에 대한 바인딩과 함께 작동할 수 있습니다. 또한 iTIP는 다른 전송에 바인딩될 수도 있습니다.

   +------------------------------------------+
   |                   iTIP                   |
   +------------------------------------------+
   |Real-time | Store-and-Fwd | Other         |
   |Transport | Transport     | Transports... |
   +------------------------------------------+

2.1 Application Protocol

iTIP 모델에서 캘린더 항목은 "주최자"가 생성하고 관리합니다. "주최자"는 위에 나열된 iTIP 메시지 중 하나 이상을 전송하여 다른 CU와 상호 작용합니다. "참석자"는 "회신" 방법을 사용하여 자신의 상태를 전달합니다. "참석자"는 마스터 캘린더 항목을 직접 변경할 수 없습니다. 그러나 "카운터" 방법을 사용하여 "주최자"에게 변경 사항을 제안할 수 있습니다. 어떤 경우든 "주최자"는 마스터 캘린더 항목을 완전히 제어할 수 있습니다.

2.1.1 Calendar Entry State

캘린더 항목과 관련된 상태에는 항목의 전체 상태와 해당 항목의 '참석자'와 관련된 상태라는 두 가지가 있습니다.

항목의 상태는 "상태" 속성에 의해 정의되며 "주최자"에 의해 제어됩니다. "상태" 속성에는 기본값이 없습니다. "주최자"는 "상태" 속성을 각 일정관리 항목에 적합한 값으로 설정합니다.

항목과 관련된 특정 "참석자"의 상태는 각 "참석자"의 "참석자" 속성에 있는 "partstat" 매개변수에 의해 정의됩니다.  "주최자"가 초기 항목을 발행하면 "참석자" 상태를 알 수 없습니다. "주최자"는 "partstat" 매개변수를 "NEEDS-ACTION"으로 설정하여 이를 지정합니다. 각 "참석자"는 "참석자" 속성의 "partstat" 매개변수를 적절한 값으로 수정하여 "주최자"에게 다시 보내는 "REPLY" 메시지의 일부로 사용합니다.

2.1.2 Delegation

위임은 "참석자"가 다른 CU(또는 여러 CU)에 자신을 대신하여 참석할 수 있는 권한을 부여하는 절차로 정의됩니다. "주최자"는 위임하는 "참석자"가 "주최자"에게 알리기 때문에 이러한 변경 사항을 알게 됩니다. 이러한 단계는 요청 방법 섹션에 자세히 설명되어 있습니다.

2.1.3 Acting on Behalf of other Calendar Users

많은 조직에서 한 사용자가 다른 사용자를 대신하여 미팅 요청을 조직하거나 응답합니다. ITIP는 이러한 활동을 지원하는 두 가지 메커니즘을 제공합니다.

첫째, '주최자'는 '참석자'와는 별개의 특수한 개체로 취급됩니다. '참석자'의 모든 응답은 '주최자'에게 전달되므로 미팅을 조직하는 캘린더 사용자와 미팅에 참석하는 캘린더 사용자를 쉽게 구분할 수 있습니다. 또한, iCalendar는 각 "참석자"에 대해 설명적인 역할을 제공합니다. 예를 들어, '의장'이라는 역할은 한 명 이상의 '참석자'에게 할당될 수 있습니다. "의장"과 "주최자"는 동일한 캘린더 사용자일 수도 있고 아닐 수도 있습니다. 이는 어시스턴트가 회의의 의장을 맡은 다른 사람을 위해 회의 일정을 관리할 수 있는 시나리오에 잘 부합합니다.

둘째, '보낸 사람' 매개변수는 '주최자' 또는 '참석자' 속성 중 하나에 지정할 수 있습니다. 지정된 경우, "보낸 사람" 매개변수는 응답하는 CU가 지정된 "참석자" 또는 "주최자"를 대신하여 작업했음을 나타냅니다.

2.1.4 Component Revisions

"SEQUENCE" 속성은 "주최자"가 캘린더 구성 요소의 수정본을 표시하는 데 사용됩니다. "SEQUENCE" 숫자를 증가시키는 규칙은 [iCAL]에 정의되어 있습니다. 명확성을 위해 여기서는 이러한 규칙을 [iTIP]에서 적용되는 방식에 따라 의역했습니다. 캘린더 컴포넌트에서 주어진 "UID"에 대해:

. "PUBLISH" 및 "REQUEST" 메서드의 경우, [iCAL]에 정의된 규칙에 따라 "SEQUENCE" 속성 값이 증가합니다.
. "주최자"가 "추가" 또는 "취소" 메서드를 사용할 때마다 "SEQUENCE" 속성 값은 반드시 증가해야 합니다.
. "응답", "새로고침", "카운터", "선언 카운터"를 사용하거나 "요청" 위임을 보낼 때 "SEQUENCE" 속성 값을 증가시키면 안됩니다.

경우에 따라 "주최자"는 발송된 최종 수정본에 대한 응답을 받지 못할 수도 있습니다. 이 경우 "주최자"는 업데이트 "REQUEST"를 보내고 모든 "참석자"에 대해 "RSVP=TRUE"를 설정하여 현재 응답을 수집할 수 있도록 할 수 있습니다.

 

"참석자"의 응답에 포함된 "SEQUENCE" 속성 값은 "주최자"의 수정본과 항상 일치하지 않을 수 있습니다. 구현은 CUA가 CU에 응답이 수정된 항목에 대한 것임을 표시하고 CU가 응답을 수락할지 여부를 결정하도록 선택할 수 있습니다.

2.1.5 Message Sequencing

iTIP] 애플리케이션 프로토콜을 처리하는 CUA는 종종 캘린더 저장소의 구성 요소와 [iTIP] 메시지로 수신된 구성 요소를 연관시켜야 합니다. 예를 들어, 이벤트가 동일한 이벤트의 이후 개정판으로 업데이트될 수 있습니다. 이를 위해 CUA는 캘린더 저장소에 이미 있는 이벤트의 버전과 [iTIP] 메시지로 전송된 버전을 상호 연관시켜야 합니다. 이러한 상관관계 외에도 [iTIP] 메시지가 예기치 않은 순서로 도착하는 원인이 될 수 있는 몇 가지 요인이 있습니다.  즉, '주최자'가 구성 요소의 이전 버전에 대한 회신을 받은 후에 이후 버전에 대한 회신을 받을 수 있습니다.

상호 운용성을 극대화하고 예기치 않은 순서로 도착하는 메시지를 처리하려면 다음 규칙을 사용하세요:

 

  1. 특정 iCalendar 구성 요소를 참조하기 위한 기본 키는 "UID" 속성 값입니다. 반복 구성 요소의 인스턴스를 참조하기 위해 기본 키는 "UID" 및 "RECURRENCE-ID" 속성으로 구성됩니다.
  2. 컴포넌트를 참조하기 위한 보조 키는 "SEQUENCE" 속성 값입니다.  "UID"가 동일한 컴포넌트의 경우, "SEQUENCE" 속성 값이 가장 높은 컴포넌트가 낮은 값을 가진 컴포넌트의 다른 모든 리비전을 무시합니다.
  3. "참석자"는 "주최자"에게 "REPLY" 메시지를 보냅니다.  "UID" 속성 값이 동일한 답장의 경우, "SEQUENCE" 속성 값은 "참석자"가 답장하는 구성 요소의 리비전을 나타냅니다.  "SEQUENCE" 속성의 가장 높은 숫자 값을 가진 회신은 낮은 값을 가진 다른 모든 회신을 무시합니다.
  4. "UID" 및 "SEQUENCE" 속성이 일치하는 경우, "DTSTAMP" 속성이 동점자로 사용됩니다. 가장 최근의 "DTSTAMP"를 가진 구성 요소가 다른 모든 구성 요소보다 우선합니다. 마찬가지로 "UID" 속성 값이 일치하고 "SEQUENCE" 속성 값이 일치하는 "참석자" 응답의 경우 가장 최근의 "DTSTAMP"가 있는 응답이 다른 모든 응답보다 우선합니다.

따라서 CUA는 다음 구성 요소 속성을 유지해야 합니다: "UID", "RECURRENCE-ID", "SEQUENCE" 및 "DTSTAMP".  또한 구성 요소의 각 "참석자" 속성에 대해 CUA는 "참석자"의 응답과 관련된 "SEQUENCE" 및 "DTSTAMP" 속성 값을 유지해야 합니다.

나중에 찾아보기 위해 RFC 2446을 번역된 것 남김.

iCalendar Transport-Independent Interoperability Protocol (iTIP)
Scheduling Events, BusyTime, To-dos and Journal Entries

개요

이 문서는 캘린더 시스템이 iCalendar 객체를 사용하여 다른 캘린더 시스템과 상호 운용하는 방법을 지정합니다. 이는 시스템 간의 다양한 통신 방법을 허용하기 위해 일반적인 방식으로 수행됩니다. 후속 문서에서는 이 프로토콜을 사용하는 시스템 간의 상호 운용 가능한 통신 방법을 지정합니다.

이 문서에서는 static 및 dynamic event, to-do, journal, free/busy 개체를 모두 정의하는 캘린더 교환 모델을 간략하게 설명합니다. static 객체는 원본 항목과의 연속성이나 참조 무결성을 기대하지 않고 한 개체에서 다른 개체로 정보를 전송하는 데 사용됩니다. dyamic 객체는 정적 객체의 상위 집합이며 static 객체만 지원하는 클라이언트의 경우 static 객체로 자연스럽게 저하됩니다.

이 문서는 서로 다른 캘린더 시스템 간에 일정관리 상호 운용성을 제공하는 iCalendar 객체 사양을 기반으로 하는 인터넷 프로토콜을 지정합니다. 이 인터넷 프로토콜을 "iTIP(iCalendar 전송 독립적 상호 운용성 프로토콜)"이라고 합니다.

iTIP는 현재 캘린더 시스템에서 일반적으로 사용할 수 있는 그룹 스케줄링 메서드에 대한 시맨틱을 추가하여 iCalendar 객체 사양을 보완합니다. 이러한 예약 방법을 사용하면 두 개 이상의 캘린더 시스템이 게시, 예약, 일정 재조정, 예약 요청에 대한 응답, 변경 협상 또는 iCalendar 기반 캘린더 구성 요소 취소와 같은 트랜잭션을 수행할 수 있습니다.

iTIP는 스케줄링 정보를 전송하는 데 사용되는 특정 전송 방식과 무관하게 정의됩니다. iTIP에 대한 동반 메모는 여러 인터넷 프로토콜에 대한 상호 운용성 프로토콜의 바인딩을 제공합니다.

1. Introduction

이 문서는 캘린더 시스템이 iCalendar 개체를 사용하여 다른 캘린더 시스템과 상호 운용하는 방법을 지정합니다. 특히 event, to-do 또는 daily journal 항목을 예약하는 방법을 명시합니다. 또한 사용 가능한 바쁜(busy) 시간 정보를 검색하는 방법을 지정합니다. 이는 시스템 간의 다양한 통신 방법을 허용하기 위해 일반적인 방식으로 수행됩니다. 후속 문서에서는 이 프로토콜을 사용하는 시스템 간의 전송 바인딩을 지정합니다.

이 프로토콜은 발신자(originator)가 한 명 이상의 수신자(recipients)에게 보내는 메시지를 기반으로 합니다. 특정 유형의 메시지에 대해 수신자는 자신의 상태를 업데이트하기 위해 응답할 수 있으며 트랜잭션/요청 상태 정보를 반환할 수도 있습니다. 이 프로토콜은 메시지 발신자가 원래 메시지를 수정하거나 취소할 수 있는 기능을 지원합니다. 또한 프로토콜은 수신자가 메시지 발신자에게 변경 사항을 제안할 수 있는 기능도 지원합니다. 프로토콜의 요소는 트랜잭션에 대한 사용자 역할도 정의합니다.

1.1 Formatting Conventions

캘린더링 및 스케줄링 모델, 핵심 객체 또는 상호 운용성 프로토콜의 요소를 참조하기 위해 [iCAL] 및 [iTIP]에 정의된 몇 가지 형식 규칙이 활용되었습니다.

이 문서에서 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENT", "MAY" 및 "OPTIONAL"이라는 키워드는 [RFC-2119]에 설명된 대로 해석되어야 합니다.

캘린더 및 스케줄링 역할은 각 단어의 첫 글자를 대문자로 따옴표로 묶은 텍스트 문자열로 참조됩니다. 예를 들어, 'Organizer'(주최자)는 [iTIP]에 정의된 스케줄링 프로토콜 내에서 'Calendar User(캘린더 사용자)'(CU)의 역할을 나타냅니다. [iCAL]에 정의된 캘린더 구성 요소는 대문자로 따옴표로 묶인 문자열로 참조됩니다. 모든 캘린더 구성 요소는 문자 "V"로 시작합니다. 예를 들어, "VEVENT"는 이벤트 캘린더 구성 요소, "VTODO"는 할 일 캘린더 구성 요소, "VJOURNAL"은 일일 저널 캘린더 구성 요소를 나타냅니다. [iTIP]에 정의된 스케줄링 메서드는 대문자로 따옴표로 묶인 텍스트로 참조됩니다. 예를 들어, "REQUEST"은 일정관리 캘린더 구성 요소의 생성 또는 수정을 요청하는 메서드를 의미하고, "REPLY"은 요청을 받은 사람이 캘린더 구성 요소의 "Organizer"에게 자신의 상태를 업데이트하는 데 사용하는 메서드를 의미합니다.

[iCAL]에 정의된 속성은 대문자로 따옴표로 묶인 텍스트 문자열 뒤에 "property"이라는 단어가 붙어서 참조됩니다. 예를 들어, "ATTENDEE"(참석자) 속성은 "Calendar User"(캘린더 사용자)의 캘린더 주소를 전달하는 데 사용되는 iCalendar 속성을 나타냅니다. 이 메모에 정의된 속성 매개변수는 소문자로 따옴표로 묶인 텍스트 문자열 뒤에 "parameter"라는 단어가 붙어서 참조됩니다. 예를 들어, "value" 매개변수는 속성 값의 기본 데이터 유형을 재정의하는 데 사용되는 iCalendar 속성 매개변수를 나타냅니다. 이 메모에 정의된 열거형 값은 대문자로 된 텍스트를 단독으로 사용하거나 그 뒤에 "value"라는 단어를 사용하여 참조합니다.

테이블에서는 테이블 길이를 최소화하기 위해 따옴표로 묶인 문자열 텍스트가 따옴표 없이 지정됩니다.

 

1.2 Related Documents

구현자는 이 문서와 함께 인터넷 캘린더 및 스케줄링 표준을 설명하는 다른 여러 메모를 숙지하고 있어야 합니다. 이 문서인 [iTIP]는 서로 다른 구현 간의 스케줄링을 위한 상호 운용성 프로토콜을 지정합니다. 관련 문서는 다음과 같습니다:

     [iCAL] - 프로토콜에 사용되는 객체, 데이터 유형, 속성 및 속성 매개변수와 이를 표현하고 인코딩하는 방법을 지정합니다;

     [iMIP] - [iTIP]에 대한 인터넷 이메일 바인딩을 지정합니다.

이 메모에서는 이러한 다른 메모의 개념이나 정의에 대한 사양을 반복하지 않습니다. 가능한 경우 이러한 개념 또는 정의의 사양을 제공하는 메모를 참조합니다.

1.3 ITIP Roles and Transactions

ITIP는 "Calendar User"(CU) 간의 그룹 캘린더링 및 예약을 목적으로 [iCAL] 개체를 교환하는 방법을 정의합니다. CU는 iTIP에서 두 가지 역할 중 하나를 수행합니다. 교환을 시작한 CU는 "Organizer"(주최자) 역할을 맡습니다. 예를 들어, 그룹 모임을 제안한 CU가 "Organizer"입니다. "Organizer"로부터 그룹 미팅에 참여하도록 요청받은 CU는 "Attendee"(참석자) 역할을 맡습니다. "role"은 _ATTENDEE_ 속성에 대한 설명 매개변수이기도 합니다. 이 매개변수는 'chair', 'req-participant' 또는 'non-participant'와 같이 'Attendee'에게 설명적인 컨텍스트를 전달하는 데 사용되며 캘린더 워크플로와는 아무런 관련이 없습니다.

ITIP 메서드는 아래에 나열되어 있으며 그 사용법과 의미는 이 문서의 섹션 3에 정의되어 있습니다.

Method Description
PUBLISH 한 명 이상의 캘린더 사용자에게 캘린더 항목을 게시하는 데 사용됩니다. 게시자와 다른 캘린더 사용자 간에는 상호 작용이 없습니다. 예를 들어 야구 팀이 대중에게 일정을 게시하는 경우를 들 수 있습니다.
REQUEST 다른 캘린더 사용자와 캘린더 항목을 예약하는 데 사용됩니다. 요청은 수신자가 응답 메서드를 사용해 응답해야 한다는 점에서 대화형입니다. 미팅 요청, 바쁨 시간 요청, 다른 캘린더 사용자에게 VTODO 할당 등이 모두 그 예입니다. 요청은 'Organizer'가 캘린더 항목의 상태를 업데이트하는 데에도 사용됩니다.
REPLY Reply은 'Attendee' 상태를 'Organizer'에게 전달해 달라는 요청에 대한 응답으로 사용됩니다. 회신은 일반적으로 미팅 및 작업 요청에 응답하는 데 사용됩니다.
ADD 기존 VEVENT, VTODO 또는 VJOURNAL에 하나 이상의 인스턴스를 추가합니다.
CANCEL 기존 VEVENT, VTODO 또는 VJOURNAL의 인스턴스를 하나 이상 취소합니다.
REFRESH REFRESH 방법은 'Attendee'가 캘린더 항목의 최신 버전을 요청하는 데 사용됩니다.
COUNTER Counter 메서드는 'Attendee'가 캘린더 항목의 변경을 협상하는 데 사용됩니다. 예를 들어, 제안된 이벤트 시간을 변경하거나 VTODO의 마감일을 변경하는 요청이 있습니다.
DECLINE-COUNTER "Organizer"가 제안된 반대 제안을 거부하는 데 사용됩니다.

iTIP에서 그룹 예약은 위에서 설명한 "request" 및 "response" 메서드 세트를 사용하여 수행됩니다. 다음 표는 메서드를 보낼 수 있는 사람에 따라 분류된 메서드를 보여줍니다.

Originator Methods
Organizer PUBLISH, REQUEST, ADD, CANCEL, DECLINECOUNTER
Attendee REPLY, REFRESH, COUNTER
REQUEST only when delegating  

일부 캘린더 컴포넌트 유형의 경우 허용되는 메서드가 위 집합의 하위 집합이라는 점에 유의하세요.


$ cat /etc/*-release | uniq

CentOS release 6.9 (Final)
$ uname -m
x86_64


'System > Linux, unix' 카테고리의 다른 글

[UNIX] session 죽이기(kill)  (0) 2014.11.16
[UNIX]메시지 보내기 - talk, write, wall  (0) 2014.10.22
[ubuntu] ssh server 설치  (0) 2014.07.02
[ubuntu] JAVA JDK 설치하기  (0) 2014.04.06

파이썬, 장고 설치

# python 설치
$ sudo apt-get install python3.4

# 가상환경 만들기
$ python3 -m venv myvenv
## 우분투 14.04 에러시
$ sudo apt-get install python-virtualenv
$ virtualenv --python=python3.4 myvenv
##실행하기
$ . myvenv/bin/activate

실행한 뒤 프롬프트 앞에 (myvenv) 가 붙는다면 성공

# Django 설치
$ pip install django==1.8

가상환경 만들기 참고 링크


Django 프로젝트 시작

# 프로젝트 설치
$ django-admin startproject myproj .
# 생성 디렉토리
├── manage.py
└── myproj
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
# 설정변경
$ vi settings.py 

## 아래 내용 추가 및 변경
TIME_ZONE = 'Asia/Seoul'
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

# 데이터베이스 만들기
$ python manage.py syncdb
$ python manage.py migrate


개발서버 실행하기

$ python manage.py runserver
# 터미널 종료하지 않은 채로 새로운 터미널에서 확인
$ curl 127.0.0.1:8000

# AWS 사용시에 외부에서 접속 가능하도록 하려면
$ python manage.py runserver 0.0.0.0:8000

aws 포트열기

포트를 열어두어야 외부에서 공용IP로 접속이 가능하다.

NETWORK & SECURITY -> Security Groups 에서 그룹 선택하고 Inbound에 8000 포트 추가


이진탐색

 이진 탐색(binary search)는 정렬되어 있는 자료들의 집합에서 특정 자료를 찾고자 할 때 많이 사용되며 매우 빠른 탐색 알고리즘이다. 이진 탐색은 '퀵정렬'과 유사하게 '분할 후 정복(divide and conquer)'의 전략을 사용한다. 이 전략을 사용하는 알고리즘은 문제를 나누어 해결해 나가는 방법이기 때문에 실행시간은 log의 설징을 갖는다. 특히 문제의 크기를 정확히 양분하는 경우에는 최악의 경우라고 logN의 성능을 보장한다.

 이진 탐색의 탐색 시간은 'T = K * logN'으로 O(logN)이다. 선형 탐색의 시간보다 상당히 빠르지만 이진 탐색은 반드시 정렬이 되어있어야 한다. 그러므로 정렬되지 않는 리스트의 경우에는 정렬하는 비용 또한 상당히 들 것이다. 이와 같은 단점에도 불구하고 다음과 같은 상황에서 이진 탐색은 효율적인 성능을 제공한다.

 1) 새로운 자료가 추가되었어도 모든 자료가 재정렬이 일어나지 않는 경우 -> 해싱, 인덱스를 이용하는 경우

 2) 획기적으로 빠르고, 효율적인 자료의 재정렬이 가능한 자료 구조를 사용할 경우 -> B-트리 계열의 트리 구조 사용


다음은 이진 탐색의 JAVA 소스이다.

package Search;

public class BinarySearch {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

		binarySearch(2, arr);
	}

	public static void binarySearch(int iKey, int arr[]) {
		int mid;
		int left = 0;
		int right = arr.length - 1;

		while (right >= left) {
			mid = (right + left) / 2;

			if (iKey == arr[mid]) {
				System.out.println(iKey + " is in the array with index value: " + mid);
				break;
			}

			if (iKey < arr[mid]) {
				right = mid - 1;
			} else {
				left = mid + 1;
			}

		}
	}
}


+

기술면접에서 이진탐색을 왜 구현하지 못했을까... 자료구조 시간에 그렇게 공부하고 이해하고 구현하고 다 해본 것을ㅠㅠ

기본을 먼저 보고 갔어야 하는 건데, 괜히 다른 알고리즘을 너무 보고 갔더니 간단한 알고리즘조차 어렵게만 생각하고 복잡하게 풀려고 한 것 같다.. 그래서 다시 기본기를 훑어보고자 이렇게 블로그에 남겨놓는다.

'대학 생활 > JAVA' 카테고리의 다른 글

[JAVA] 기수정렬(RadixSort)  (0) 2015.11.20
[JAVA] 피보나치 - 재귀사용  (0) 2015.11.13
[JAVA] 퀵정렬(QuickSort)  (0) 2015.11.06
[JAVA] 딕스트라 최단경로(Dijkstra Shortest Paths)  (0) 2015.10.31


i n v i t a t i o n

티스토리 초대장

+ 남은 초대장 수 : 10

안녕하세요!

티스토리에 보금자리를 마련하시려는 여러분께 초대장을 배포해 드리려고 합니다.

나만의, 내 생각을, 내 기억을 담는 소중한 블로그를 만들고 싶다면 티스토리로 시작해보세요!

티스토리 블로그는 초대에 의해서만 가입이 가능합니다. 원하시는 분은 비밀댓글로 E-mail 주소와 운영목적을 남겨주시면 초대장을 보내드립니다. 남겨주실 때에는 꼭 비밀댓글로 남겨주세요!

초대장을 보내드리고 바로 개설하시지 않으신 분들은 초대장을 회수할 수도 있으니 바로 개설해주세요!

Yes
이런 분들께 드립니다!
1. 다른 블로그를 사용해보셨던 분
2. 이메일 주소가 정상적인 분
3. 블로그를 시작하려는 이유를 남겨주신 분!
No
이런 분들께 드리지 않아요!
1. 이메일 주소가 의심되는 분!
2. 이메일 주소를 남기지 않으신 분
3. 이유도 없이 달라고 하시는 분!
티스토리 이래서 좋아요!
1. 이미지, 동영상, 오디오, 파일까지! 무한 용량과 강력한 멀티미디어를 올릴 수 있어요!
2. 스킨위자드로 스킨을 내맘대로~ 거기에 기능 확장 플러그인까지!
3. 내가 원하는대로 myID.com으로 블로그 주소를 만들 수 있어요!


'대학 생활 > JAVA' 카테고리의 다른 글

[JAVA] 이진탐색(Binary Search)  (0) 2015.11.27
[JAVA] 기수정렬(RadixSort)  (0) 2015.11.20
[JAVA] 퀵정렬(QuickSort)  (0) 2015.11.06
[JAVA] 딕스트라 최단경로(Dijkstra Shortest Paths)  (0) 2015.10.31

'대학 생활 > JAVA' 카테고리의 다른 글

[JAVA] 피보나치 - 재귀사용  (0) 2015.11.13
[JAVA] 퀵정렬(QuickSort)  (0) 2015.11.06
[JAVA] 병합정렬(MergeSort)  (0) 2015.10.30
[JAVA] 버블정렬(BubbleSort)  (0) 2015.10.23

삽입정렬

- 안정정렬

- 시간복잡도: 

- 설명: 왼쪽에 있는 항목들은 정렬된 것으로 가정하고, 증가하는 인덱스의 값을 삽입하는 방법.

- 특징: 정렬대상이 적거나, 이미 부분적으로 정렬되어 있는 상황일 경우 효율적. 선택정렬과 버블보다는 빠름



'대학 생활 > JAVA' 카테고리의 다른 글

[JAVA] 병합정렬(MergeSort)  (0) 2015.10.30
[JAVA] 버블정렬(BubbleSort)  (0) 2015.10.23
[JAVA] 선택정렬(SelectionSort)  (0) 2015.10.09
[JAVA] 쉘정렬(ShellSort)  (0) 2015.10.02

'대학 생활 > JAVA' 카테고리의 다른 글

[JAVA] 버블정렬(BubbleSort)  (0) 2015.10.23
[JAVA] 삽입정렬(InsertionSort)  (0) 2015.10.16
[JAVA] 쉘정렬(ShellSort)  (0) 2015.10.02
[JAVA] 달팽이 만들기  (0) 2015.06.23

쉘정렬, (불안정) 간격을 두어 나눈 하위배열을 삽입정렬 반복


이클립스(eclipse)에서 ObjectAid 플러그인 사용하여 Class Diagram 만들기

설치방법

이클립스 실행 후 Help > Install New Software > Add 선택하고 아래 사진과 같이 입력하기.

ObjectAid Update Site 이동하기




사용방법

1. 먼저 사용하려는 프로젝트에 uml 파일을 추가할 폴더 생성.

2. Class Diagram 파일을 생성한다.

3. 생성된 ucls 확장자를 가진 파일에 클래스파일을 드래그해 넣는다.

* 다이어그램 화면에서 오른쪽 클릭하면 이미지 저장(Automatic Image > Save Now , Save As Image)이 가능하고, Layout Diagram을 클릭하면 자동정렬된다.



소프트웨어 공학 실무적 접근

저자
Roger S. Pressman, Bruce R. Maxim 지음
출판사
McGRAW HILL | 2015-01-02 출간
카테고리
컴퓨터/IT
책소개
▶ 이 책은 소프트웨어 공학 이론서입니다. 소프트웨어 공학의 기...
가격비교


애자일 개발


 애자일 개발은 문서가 생성되지 않는다는 것을 의미하는 것이 아니고, 개발 프로세스의 뒤에서 참조되어질 수 있는 문서들을 만든다는 것을 의미한다. 애자일 방법은 종종 라이트 방법(light methods) 또는 린 방법(lean methods)라고도 한다.


[애자일 소프트웨어 개발 선언문]

우리는 소프트웨어를 개발하면서, 또 다른 사람들이 그 일을 하는 것을 도와주면서, 소프트웨어 개발을 위한 더 좋은 방법을 찾아내고 있다. 이 작업을 통해 다음과 같은 것에 가치를 둔다.

        프로세스와 도구보다 개인과 상호작용에

        포괄적인 문서보다 작동하는 소프트웨어에

        계약 협상보다 고객과의 협동에

        계획을 따르는 것 보다 변경에 대한 대응에

즉, 왼쪽 항목도 가치가 있지만, 오른쪽 항목에 더 높은 가치를 둔다.


 민첩성이란

 민첩성이란 환경의 변화에 재빨리 그리고 효율적으로 적응하는 능력의 의미한다. 애자일에서는 고객을 개발 팀의 멤버로 받아들이고, 커뮤니케이션을 보다 쉽게 할 수 있도록 해주는 팀 구조와 사고방식을 장려한다.


 민첩성과 변경 비용

[그림 1] 개발에서의 시간에 따른 변경 비용

 소프트웨어 개발에 있어서 전통적으로는 변경 비용이 시간이 증가함에 따라 비선형 형태로(짙은 실선) 비용이 급속하게 증가한다. 하지만 잘 설계된 애자일 프로세스는 변경 비용 곡선이 평평하게 되도록 하고, 소프트웨어 팀이 과도한 비용을 쓰지 않고 또 개발시간에 영향을 받지 않으면서 나중에 변경하는 것이 가능하게 해준다고 한다. 애자일 프로세스는 소프트웨어가 점증의 형태로 릴리스 되고, 점증 내에서 변경을 보다 잘 제어할 수 있기 때문에 변경 비용을 감소시켜 준다. 또한, 단위 테스팅과 페어 프로그래밍과 같은 다른 애자일 실무와 연관되어 있으면 변경을 하는 데 드는 비용이 적어진다.


페어 프로그래밍 : 한 개의 컴퓨터에 두 명의 프로그래머가 앉아 컴포넌트의 코드를 작성하는 소프트웨어 개발 접근법. 키보드를 잡고 있는 사람을 driver라고 하고 다른 한 사람을 Observer, pointer, navigator라고 한다. 실시간 코드 리뷰가 수행된다는 것을 암시적으로 의미한다.


  애자일 프로세스란?

  애자일 개발 프로세스란 어느 특정 개발 방법론을 가리키는 말이 아니라 애자일(agile=기민한, 좋은 것을 빠르고 낭비 없게 만드는 것) 개발을 가능하게 해 주는 다양한 방법론 전체를 일컫는 말이다 - 애자일 소프트웨어 개발, 위키백과


3.1  애자일리티 원칙

 애자일 연합은 민첩성을 달성하기 원하는 사람들을 위해 12가지 애자일리티 원칙을 정의하였다.

1)   가치 있는 소프트웨어를 일찍 그리고 지속적으로 전달해서 고객을 만족시킨다.

2)   개발 후반부일지라도 요구사항 변경을 반겨라. 애자일 프로세스는 변화를 활용해 고객의 경쟁력에 도움이 되게 한다.

3)   작동하는 소프트웨어를 자주 전달하라. 두어 주에서 두 달 간격으로 하되 더 짧은 기간을 선호하라.

4)   비즈니스 쪽의 사람들과 개발자들은 프로젝트 진행하는 동안 같이 일해야 한다.

5)   동기부여가 된 개인들 중심으로 프로젝트를 구성하라. 그들이 필요로 하는 환경과 자원을 주고 그들이 일을 끝내리라고 신뢰하라.

6)   개발 팀으로, 또 개발팀 내부에서 정보를 전하는 가장 효율적이고 효과적인 방법은 면대면 대화이다.

7)   작동하는 소프트웨어가 진척의 주된 척도이다.

8)   애자일 프로세스들은 지속 가능한 개발을 장려한다. 스폰서, 개발자, 사용자는 일정한 속도를 계속 유지 할 수 있어야 한다.

9)   기술적 탁월성과 좋은 설계에 대한 지속적 관심이 민첩성을 높인다.

10)  간결함-처리하지 않은 작업의 양을 최대로 해주는 기술-은 필수적이다.

11)  최고의 아키텍처, 요구사항, 설계는 자기 조직적인 팀에서 나온다.

12)  팀은 정기적으로 어떻게 더 효과적이 될지 숙고하고, 이에 따라 팀의 행동을 조율하고 조정한다.


3.2  애자일 개발 전략

 "... 아무도 민첩성을 반대하지는 않는다. 실질적인 질문은 다음과 같은 것이다. 민첩성을 얻기 위해 가장 좋은 방법이 무엇인가? 중요한 것은, 고객의 오늘의 요구를 만족하고 오랜 기간 동안 요구를 만족하도록 확장 가능한 품질 특성을 가지고 있는 소프트웨어를 어떻게 개발하나?이다. ... 두 학파의 좋은 점만 생각하면 얻을 수 있는 것이 많이 있고, 각 방식을 폄하하면 아무것도 얻을 것이 없다."

 애자일리티와 소프트웨어공학 중에서 선택할 필요는 없다. 그보다는 애자일한 소프트웨어 공학을 정의하라.


 익스트림 프로그래밍

 익스트림 프로그래밍(eXtreme Programming, XP)은 켄트 백 등이 제안한 소프트웨어 개발방법으로, 비즈니스 상의 요구가 시시각각 변동이 심한 경우에 적합한 개발 방법이다. -위키백과


4.1  XP 프로세스

 XP는 객체지향 기법을 개발 패러다임으로 사용하고, 네 가지 프레임워크 액티비티(계획 수립, 설계, 코딩, 테스팅) 맥락 안에서 이루어지는 규칙들과 실무들을 포함한다.


[그림 2] 익스트림 프로그래밍 프로세스


●  계획 수립 : 계획 수립 액티비티(=planning game)는 요구하는 출력과 주요 특징과 기능에 대한 요구 사항(스토리)을 수집한다. 고객은 각 스토리를 인덱스 카드에 정한다(우선순위 설정). XP팀은 스토리를 평가하고 비용과 시간(주 단위)을 판단한다. 3주 이상이 된다면 스토리를 더 작은 스토리로 나눠야 한다.

●      XP팀에 의해 개발될 다음 릴리스(다음 점증)에 요구사항 그룹을 어떻게 나눌지 결정하기 위해 고객과 개발자는 같이 작업한다. 개발이 진행되면서, 고객이 요구사항을 변경할 수 있다. XP는 남아 있는 모든 릴리스를 다시 생각하고 그것에 따라 계획을 수정한다.(Small Release)                                                        

●  설계 : XP설계는 엄격하게 KIS(keep it simple), KISS(keep it small and simple) 원칙을 따른다. 복잡한 표현보다는 항상 간단한 설계를 선호한다.(Simple Design)

●   XP에서는 소프트웨어를 객체지향 맥락으로 생각하기 위한 효율적인 방법으로 CRC카드를 사용할 것을 권장한다. CRC(class-responsibility-collaborator) 카드는 객체 지향 소프트웨어설계에서 사용되는 브레인스토밍 툴로, 지금의 소프트웨어 점증에 적합한 객체지향 클래스를 파악하고 구조화한다. 일반적으로 디자인을 시작할 때 어떤 객체가 필요하고 그들이 어떻게 상호 연계할지 여부를 결정하는 데 사용한다.

●   만약 스토리 설계의 한 과정에서 어려운 설계 문제를 접하게 되면, XP는 그 부분에  대해 작동하는 프로토타입을 즉각적으로 만들 것을 권장한다.


●  코딩 : 코딩을 시작하기 전에 단위 테스트를 생성한다.(XP 방식의 핵심 요소) 관련 없는 것은 더 이상 추가하지 않는다(KIS). 코드가 완성되면 즉시 단위 테스트가 이루어지고, 개발자에게 즉각적인 피드백을 제공하게 된다.

●   코딩 액티비티를 진행하는 동안의 핵심 개념은 페어 프로그래밍(pair programming)이다. 이 방법은 실시간 문제 해결과 실시간 품질보증을 위한 메커니즘을 제공한다. 작업을 완수하면 다른 사람이 작업한 것과 통합한다. 통합 팀에 의해 하루 단위로 이루어지고, 다른 경우 페어 프로그래머가 통합의 책임을 진다. "지속적인 통합" 전략은 호환성과 인터페이스 문제들을 피하도록 해주고, 초기에 에러를 발견하는 "스모크 테스팅(smoke testing)" 환경을 제공해 준다.


●  테스팅 : 단위 테스트는 자동적인 수행을 가능하게 해주는 프레임워크를 사용하여 구현되어야 한다. 이렇게 하는 것은 코드가 수정될 때 마다(XP 리팩토링 철학에 따라, 자주) 회귀 테스트 전략을 쓸 것을 권장한다.

●   고객 시험(customer test)이라고도 하는 XP의 인수시험(acceptance test)은 고객에 의해 명시되고, 보여지고, 검토되는 전반적인 시스템 특성과 가능에 초점을 맞춘다. 인수 시험은 소프트웨어 릴리스의 일부분으로 구현되는 사용자 스토리로부터 만들어진다.


4.2   산업계 XP

 Joshua Kerievaky는 산업계 익스트림 프로그래밍(Industrial Extreme Programming, IXP)을 다음과 같이 묘사하였다. "IXP는 XP가 자연스럽게 발전한 것이다. XP가 가진 최소화, 고객 중심, 테스트 구동 정신으로 가득 차 있다. 기존 XP와의 차이점으로 더욱 많이 포함되어 있는 관리, 확장된 고객의 역할, 개선된 기술적 실무 측면이 있다. 대규모 조직 안에서 XP팀이 중요한 프로젝트를 성공적으로 수행하기 위해 고안된 여섯 가지의 새로운 실무과정은 다음과 같다.

●   준비 평가 : 모든 구성원이 준비가 되었는지, 적합한 개발환경이 만들어졌는지, 연관된 수준의 기술을 이해하고 있는지 확인한다.

●   프로젝트 커뮤니티 : 커뮤니티는 기술자와 다른 이해관계자들을 포함해야 하고, 프로젝트 팀을 위해 알맞은 사람들이 필요한 기술과, 훈련이 잘 되어있는지 결정한다.

●   프로젝트 차터링 : 프로젝트를 위한 적합한 비즈니스 명분이 있는지와, 프로젝트가 조직의 전반적인 목표와 목적을 발전시킬 것인지를 결정하기 위해 프로젝트 자체를 평가한다.

●   테스트-주도 관리 : 일련의 측정 가능한 목표를 설정하고, 이러한 목표에 도달하였는지 여부를 결정하기 위한 메커니즘을 정의한다.

●   회고 : 소프트웨어 점증이 인도된 후에 특별한 기술적 검토를 수행한다. 회고라고 불리는 검토에서는 소프트웨어 점증과 또는 전체적인 소프트웨어 릴리스를 통해 "이슈, 이벤트 그리고 학습한 교훈"을 조사한다.

●   지속적 학습 : 고품질 프로덕트를 만들 수 있도록 새로운 방법론과 기술을 배울 것을 권장한다.


 그 외 애자일 프로세스 모델

 가장 광범위하게 사용되는 애자일 프로세스 모델은 익스트림 프로그래밍이다. 그 외에 네 가지 일반적인 애자일 방법에 대해 살펴본다.


5.1  스크럼(scrum, 럭비 경기의 액티비티에서 유래)

 스크럼은 특정 언어나 방법론에 의존적이지 않으며, 개발 언어는 물론이고 객체지향 언어와도 관련이 없는 넓은 응용 범위의 개발 기법이다. 프로젝트관리를 위한 상호, 점진적 개발방법론으로, 개발 프로젝트를 위해 고안되었지만 유지보수 팀이나 일반적 프로젝트/프로그램 관리에서도 적용 가능하다. 스크럼은 애자일 소프트웨어 개발 과정의 하나로 다음과 같  은 특성을 가지고 있다.

●   솔루션에 포함할 기능/개선점에 대한 우선 순위를 부여한다.

●   개발 주기는 30일 정도로 조절하고 개발 주기마다 실제 동작할 수 있는 결과를 제공하라.

●   개발 주기마다 적용할 기능이나 개선에 대한 목록을 제공하라.

●   날마다 15분 정도 회의를 가져라.

●   항상 팀 단위로 생각하라.

●   원활한 의사소통을 위하여, 구분 없는 열린 공간을 유지하라.


[그림 3] 스크럼 프로세스 흐름


 각각의 프레임워크 액티비티(요구사항, 분석, 설계, 변경, 인도를 포함하는 개발 액티비티)에서, 작업 태스크는 스프린트(Sprint)라 불리는 프로세스 패턴 안에서 생긴다. 스프린트 안에서 수행되는 작업은 스크럼 팀에 의해 당면한 문제에 맞춰지고 실시간으로 정의되고 또한 종종 수정된다.

 스크럼은 빠듯한 시간, 요구사항의 변경, 그리고 사업상 위험한 상태를 가지고 있는 프로젝트에 효과적이고, 프로젝트 우선순위, 구분되어 있는 작업 단위, 커뮤니케이션, 그리고 빈번한 고객 피드백을 강조하는 일련의 프로세스 패턴을 포함하고 있다


●   백로그(Backlog) : 개발할 제품에 대한 요구 사항 목록

●   스프린트(Sprints) : 반복적인 개발 주기, 미리 정의된 타임박스(일반적으로 30일)에 적절하게, 백로그에 정의되어 있는 요구사항을 완수하는 데 필요한 작업 단위.

●   스크럼 미팅(Scrum meeting) : 스크럼 팀에 의해 매일 열리는(일반적으로 15분) 회의. 세 가지 주요 질문내용에 대해서 모든 팀 멤버가 묻고 대답한다.

●   지난번 팀 미팅 이후에 무엇을 하였나?

●   어떤 걸림돌이 있나?

●   다음 팀 미팅 때까지 무엇을 완수할 계획인가?

 스크럼마스터(ScrumMaster)라 불리는 팀 리더는 미팅을 주관하며, 팀원을 코칭하고, 프로젝트의 문제 상황을 해결하는 역할을 하고, 각 멤버들의 답변을 평가한다.

●   데모(Demos) : 소프트웨어 점증을 고객에게 인도해서, 고객에게 구현된 기능이 보여지고 평가될 수 있도록 한다. 데모에는 계획한 모든 기능이 포함되어 있지 않을 수 있지만, 설정된 타입-박스 안에는 인도될 수 있는 기능들이 포함되어 있다는 것을 아는 것이 중요하다.


5.2  동적 시스템 개발 방법(Dynamic Systems Development Method, DSDM)

 DSDM은 통제된 프로젝트 환경에서, 점증적 프로토타이핑을 통해 빠듯한 시간 제약조건 내에 시스템을 개발하고 유지보수하기 위한 프레임워크를 제공하려는 개발 방식이다. 또한, Rapid Application Development (RAD) 방법론에서 발전한 것으로, 초기부터 지속적으로 사용자의 적극적 참여를 통한 요구사항 즉시 반영 방식이다.


●   DSDM의 9개의 철학

●   적극적인 사용자 참여.

●   DSDM 팀은 결정을 내릴 수 있어야 한다.

●   수시로 제품을 인도해야 한다.

●   비즈니스 목적에 맞추는 것은 인도물의 필수 기준이다.

●   반복적이고 점증적인 개발은 정확한 비즈니스 솔루션으로 수렴

●   개발 동안 변경이 가능함

●   요구사항은 상위 수준에서 우선순위가 정해져야 한다.

●   생애주기를 통한 통합 테스팅

●   모든 이해관계자 간의 협업과 협조가 필수적이다.


●   DSDM의 5단계

●   Feasibility Study(타당성 분석)

●   Business Study(비즈니스 요구사항 분석)

●   Functional Model Iteration(기능 모델 반복)

●   Design and Build Iteration (설계와 구현통합)

●   Implementation(구현)


5.3  애자일 모델링(Agile Modeling)

 "애자일 모델링은 소프트웨어-기반 시스템의 효과적인 모델링과 문서화를 위한 실무-기반 방법론이다. 간단히 말하자면, 애자일 모델링은 소프트웨어 개발 프로젝트에 효과적이고 경량적인 방법으로 적용할 수 있는, 소프트웨어를 모델링하기 위한 가치, 원칙 그리고 실무의 모임이다. 애자일 모델은 전통적인 모델들보다 더 효과적이라. 왜냐하면 그것은 약간 좋은 것이고 완벽할 필요가 없기 때문이다. ", AM을 유일한 것으로 만들어주는 원칙들은 다음과 같다.

●   목적을 가진 모델 : 모델을 생성하기 전에 특정한 목표를 가지고 있어야 하며, 목표가 정해지면 어느 표기 유형을 사용할 것 인지와 요구되는 상세함의 수준이 더 명확해 질 것이다.

●   다중 모델 사용 : 필요한 통찰력을 제공하기 위해서 각 모델이 시스템의 다른 측면을 나타내야 하고, 대상으로 삼은 고객에게 가치를 제공해 주는 모델만 사용 하여야 한다는 것을 제안한다.

●   가벼운 여정 : 소프트웨어공학 작업이 진행됨에 따라, 장기적인 가치를 제공하는 모델만을 유지하고, 나머지는 폐기하라. 보관되는 모든 작업 산출물은 변경이 이루어지면 유지보수가 되어야 한다.

●   표현보다 컨텐츠가 더 중요 : 모델링은 대상으로 하는 고객에게 정보를 전달해 주어야 한다.

●   개발툴과 모델에 대해 알기 : 소프트웨어를 개발하기 위해 사용하는 각 모델의 강점과 약점을 이해하라.

●   부분 적 적용 : 모델링 방식은 애자일 팀의 필요에 따라 적응되어야 한다.


5.4  애자일 통합 프로세스(Agile Unified Process, AUP)

 AUP는 크게는 순차적, 작게는 반복적인 철학을 채택하였다. 전통적인 UP 단계 액티비티 -inception, elaboration, construction, transition-를 채택함으로써 순차적 오버레이를 제공한다. 각 액티비티동안 민첩성을 얻기 위해, 그리고 가능한 한 빨리 최종 사용자에게 점증을 인도하기 위해 팀은 반복 수행한다. AUP 반복에서는 다음과 같은 액티비티에 역점을 둔다.

●   모델링 : 비즈니스와 문제 영역에 대한 UML 표기를 생성한다. 하지만, 민첩성을 유지하기 위해 "단지 좋을 정도"이어야만 한다.

●   구현 : 모델은 소스코드로 변환 되어야 한다.

●   테스팅 : XP와 같이 에러를 발견하고 소스코드가 요구사항을 만족시킨다는 것을 확실히 하기 위해 팀은 일련의 테스트를 설계하고 실행시킨다.

●   배치 : 소프트웨어 점증의 인도와 최종 사용자부터의 피드백 획득에 초점을 맞춘다.

●   형상과 프로젝트 관리 : 형상관리는 변경관리, 리스트관리, 팀이 개발하는 것을 제어한다. 프로젝트 관리는 팀의 진척사항을 추적하고 관리하며 팀 액티비티를 조정한다.

●   환경 관리 : 팀에 가능한 표준, 도구, 다른 지원 기술을 포함하는 프로세스 인프라를 조정한다.


 애자일 프로세스 도구

  협력과 커뮤니케이션 "도구"들은 일반적으로 기술수준이 낮으며, 애자일 개발자간의 정보와 조화를 제공하는 매커니즘("물리적 근접, 화이트 보드, 포스트 시트, 인덱스 카드 그리고 스티커 메모지" 또는 최근 소셜 네트워킹 기술들)을 포함한다. 능동적 커뮤니케이션은 팀 역학(예를 들어, 페어 프로그래밍)을 통해 얻어지며, 반면에 수동적 커뮤니케이션은 "정보 라디에이터"에(예를 들어, 하나의 점증을 구성하는 서로 다른 컴포넌트들의 전체적인 상태를 나타내는 평범한 패널 디스플레이)에 의해 얻어진다. 애자일 프로세스를 지원하는 "도구 모음"은 기술적인 측면보다는 사람 측면에 더 초점을 맞추고 있다.




설치

Apache 설치

설치
$ sudo apt-get install apache2
소유권 설정
$ sudo chown pi -R /var/www
자동 실행
$ sudo update-rc.d apache2 defaults


MySQL 설치

$ sudo apt-get install mysql-server mysql-client libmysqlclient-dev
외부접속 가능하게하기(주석처리하기)
$ sudo vi /etc/mysql/my.cnf
#bind-address = 127.0.0.1

PHP 설치

$ sudo apt-get install php5

phpMyAdmin 설치

$ sudo apt-get install phpmyadmin


# 설정 공유

File > Export 에서 Preferences를 export하고 다른 워크스페이스에서 import.


1. 설정파일 수정

eclipse > eclipse.ini 파일을 수정하며, 아래 설정값을 자신의 사양에 맞춰 변경하여 사용한다. 세미콜론(;)은 주석이다.

; workspace의 경로를 윈도우 타이틀바에 출력
-showlocation

; 클래스 유효성 검사 생략, 그러나 나중에 어딘서 오류나는지 확인하기 위해 사용 추천
;-Xverify:none

; jdk 버전으로 설정하면 속도 향상
-Dosgi.requiredJavaVersion=1.6

;---------------------------------------------
; JVM 메모리 관리
;---------------------------------------------
; JVM 시작히 힙 영역 크기 : 최소(ms), 최대(mx)
-Xms64m
-Xmx1024m

; Permanent(영구) 영역 : JVM 클래스와 메소드를 위한 공간, 'Out of Memory' 에러 발생시 크기 조절 = PermSize
; New/Young 영역 :  새로 생성된 개체들을 위한 공간 = NewSize
; Old 영역 : 만들어진지 오래된 객체들의 공간(New영역에서 이동)
-XX:PermSize=64M
-XX:MaxPermSize=512M
-XX:NewSize=128M
-XX:MaxNewSize=512M

; Heap Shrinkage를 수행하는 임계치를 지정한다. 예를 들어 이 값이 70이면 Heap의 Free 공간이 70% 이상이 되면 Heap 크기가 축소된다. MinHeapFreeRatio 옵션과 함께 Heap의 크기 조정을 담당한다. 기본값 70
;-XX:MaxHeapFreeRatio=70

;---------------------------------------------
; Garbage Collection 방식에 따라 가능한 옵션
;---------------------------------------------
; 병렬 GC 사용
; 메모리가 충분하고 코어수 많을때 유리하다.
-XX:+UseParallelGC

; CMS GC 사용
; 응답속도가 중요할때 사용한다.
; GC Pause에 의한 사용자 응답시간 저하 현상을 줄인다.
-XX:-UseConcMarkSweepGC
;-XX:+CMSIncrementalPacing

; G1 GC(Garbage-First Garbage Collector) 사용
; 성능은 좋지만 더욱 안정화가 되었을때 사용하는 것이 좋다.
; JDK 1.7.0_4 이후 사용하는것이 안정적
;-XX:+UnlockExperimentalVMOptions
;-XX:+UseG1GC
;-XX:MaxGCPauseMillis=10

;---------------------------------------------

; out of space in codecache 오류 발생시 증가. 이 값은 permGenSpace 공간에 할당되므로 비례하게 커야한다.
-XX:ReservedCodeCacheSize=128m

; 컴파일러의 소수점 최적화 기능을 작동시켜 빨라진다.
-XX:+AggressiveOpts

; 개별 Thread의 Stack Size를 지정
; 대부분 기본값 사용, 어플리케이션의 스레드 스택에 의한 메모리 요구향이 높아지면 'Out Of Memory' 에러 발생
-Xss4m

-XX:+UseFastAccessorMethods
-XX:CompileThreshold=20000


2. 소스 자동 폴딩 해제

Preferences > Java > Editor > Folding 에서 Enable folding 해제

혹은 Coffee Bytes Java Folding 플러그인으로 기능 확장


3. 코드 자동완성기능 해제

(자동으로 실행되는 것을 해제하고, ctrl+space를 사용해서 동작시킬 수 있다.)

Preferences > Java > Editor > Content Assist 에서 Auto Activation - Enable auto activation 해제


4. 오른쪽 하단에 메모리 사용상태 표시

Preferences > General 에서 Show heap status 체크


5. Spell checking 해제

Preferences > General > Editors > Text Editors > Spelling 에서 Enable spell checking 해제


6. 인코딩 변경

Preferences > General > Workspace 에서 Text file encoding 는 UTF-8, New text file line delimite 값은 사용환경에 따라 변경


7. 줄번호 사용(이클립스 루나버전 이후로는 기본값으로 설정)

Perferences > General > Editors > Text Editors 에서 Show line numbers 체크


8. 이클립스 실행속도 개선

실행할때 로딩되는 플러그인을 제외한다.

Preferences > General > Startup and Shutdown 에서 필요없는 것 제외


9. Validation 유효성체크 해제

자신이 사용할 부분만 켜서 사용한다.

Preferences > Validation


10. 불필요한 플러그인 삭제

1) Preferences > Install/Update 에서 Uninstall or update 선택

2) 불필요한 것 Uninstall


11. Autometic Update Off

Preferences > Install/Updates > Automatic Updates 에서 체크해제


참고 사이트

설정파일 링크, 링크, 링크, 링크

위키, GC튜닝, 폴딩강화, GC플러그인, 가비지컬렉터





StringTokenizer 클래스 사용방법

토큰을 따로 지정하지 않으면 공백을 구분으로 나누어진다. 따로 구분문자를 지정하려면 생성자에 넣어준다.

StringTokenizer st = new StringTokenizer("this is a test");
while(st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}
StringTokenizer st = new StringTokenizer("a|b|c|d", "|");
while(st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}

String클래스의 split() 사용하기

String[] result = "this is a test.".split("\\s");
for(int i = 0; i < result.length; i++) {
    System.out.println(result[i]);
}


참고사이트 Link

'대학 생활 > JAVA' 카테고리의 다른 글

[JAVA] 쉘정렬(ShellSort)  (0) 2015.10.02
[JAVA] 달팽이 만들기  (0) 2015.06.23
[JAVA] 리스트와 배열 간 복사 방법  (0) 2015.04.08
[JAVA] String 인코딩  (0) 2015.04.01

문제점

안드로이드 스튜디오 베타버전에서 정식버전으로 교체하면서 기존의 프로젝트가 실행되지 않는다. 에러 메시지는 아래와 같다.

After Android Studio update: Gradle DSL method not found: 'runProguard()'

해결방안

아래 사진과 같이 runProguard를 minifyEnabled로 바꾸어 주어야 한다. gradle 버전이 바뀌면서 발생하는 에러같다.



참고사이트 Link

+ Recent posts