원자적 커밋
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
원자적 커밋은 데이터베이스 시스템과 버전 관리 시스템에서 중요한 개념으로, 작업의 완전성을 보장하는 것을 목표로 한다. 데이터베이스 시스템에서 원자적 커밋은 ACID 특성 중 원자성과 일관성을 충족하며, 2단계 커밋 프로토콜과 3단계 커밋 프로토콜과 같은 기법을 사용하여 구현된다. 버전 관리 시스템에서는 저장소의 일관성을 유지하며, 작은 단위의 변경(원자적 커밋)을 통해 이해도 향상, 롤백 용이성, 버그 추적 용이성 등의 이점을 제공한다.
더 읽어볼만한 페이지
- 분산 컴퓨팅 문제 - 교착 상태
교착 상태는 둘 이상의 프로세스가 자원을 점유하고 서로의 자원을 요청하여 더 이상 진행할 수 없는 상태를 의미하며, 상호 배제, 점유 대기, 비선점, 순환 대기 네 가지 조건이 모두 충족되어야 발생하고, 운영 체제는 이를 예방, 회피, 무시, 발견하는 방법으로 관리한다. - 분산 컴퓨팅 문제 - 비잔티움 장애 허용
비잔틴 장애 허용(BFT)은 분산 컴퓨팅 시스템에서 일부 구성 요소가 오류나 악의적인 행위를 하더라도 시스템 전체가 정상적으로 작동하도록 보장하는 속성으로, 비잔틴 장애에 대한 대응책으로 합의 알고리즘을 통해 신뢰성을 확보하며, 블록체인, 항공, 군사, 암호화폐 등 다양한 분야에서 활용된다. - 버전 관리 시스템 - 미디어위키
미디어위키는 위키백과 등 위키미디어 재단 프로젝트에서 사용되는 PHP 기반의 자유 소프트웨어 위키 엔진으로, 확장성, 다양한 기능, 사용자 지정 용이성 등을 바탕으로 위키 기반 웹사이트 구축 및 관리에 기여한다. - 버전 관리 시스템 - 깃 (소프트웨어)
깃은 리누스 토르발스가 개발한 분산 버전 관리 시스템으로, 빠른 분기 및 병합, 분산 개발 환경 지원, 대규모 프로젝트 처리 효율성 등의 특징을 가지며, 깃허브, 깃랩 등에서 서비스되며 소프트웨어 개발 분야에서 널리 사용된다. - 트랜잭션 처리 - 2단계 커밋 프로토콜
2단계 커밋 프로토콜은 분산 컴퓨팅 환경에서 트랜잭션의 원자성을 보장하는 분산 알고리즘으로, 조정자와 참가자로 구성되어 모든 참가자가 트랜잭션을 완료하거나 아무도 완료하지 못하도록 하며, 커밋 요청 및 커밋 단계를 거쳐 모든 참가자의 동의를 얻어야 커밋된다. - 트랜잭션 처리 - 온라인 트랜잭션 처리
온라인 트랜잭션 처리(OLTP)는 실시간 데이터베이스 트랜잭션 처리 방식으로, 가용성, 속도, 동시성, 내구성을 목표로 은행, 항공사, 전자 상거래 등에서 활용된다.
원자적 커밋 | |
---|---|
개요 | |
정의 | 여러 분산 시스템에서 트랜잭션이 모두 완료되거나, 아니면 전혀 완료되지 않도록 보장하는 작업 |
설명 | '데이터베이스, 메시지 큐, 파일 시스템과 같은 여러 리소스 관리자가 관여하는 트랜잭션에서 데이터 일관성을 유지하기 위해 사용됨. "All-or-Nothing" 속성을 보장하며, ACID 속성(원자성, 일관성, 격리성, 지속성)을 유지하는 데 중요한 역할 수행' |
동작 방식 | |
조정자 | 트랜잭션의 성공 또는 실패를 결정하는 중앙 집중식 구성 요소 |
참여자 | 트랜잭션에 참여하는 리소스 관리자 (예: 데이터베이스) |
단계 1 (준비 단계) | 조정자는 모든 참여자에게 준비 메시지를 보냄. 각 참여자는 트랜잭션을 커밋할 준비가 되었는지 확인하고, 준비가 되었다면 트랜잭션을 로그에 기록하고 조정자에게 긍정 응답을 보냄. 준비가 되지 않았다면 부정 응답을 보냄 |
단계 2 (커밋/롤백 단계) | 조정자는 모든 참여자로부터 긍정 응답을 받으면 모든 참여자에게 커밋 메시지를 보냄. 참여자들은 트랜잭션을 커밋하고 결과를 로그에 기록. 만약 하나 이상의 참여자가 부정 응답을 보냈다면, 조정자는 모든 참여자에게 롤백 메시지를 보냄. 참여자들은 트랜잭션을 롤백하고 결과를 로그에 기록 |
주요 프로토콜 | |
2단계 커밋 (2PC) | 가장 일반적인 원자적 커밋 프로토콜. 조정자와 참여자 간의 준비 및 커밋/롤백 단계로 구성 |
3단계 커밋 (3PC) | 2PC의 단점을 보완하기 위해 개발된 프로토콜. 준비 단계 이후에 사전 커밋 단계를 추가하여 조정자의 장애 상황에 대한 복원력을 높임 |
Paxos | 분산 합의 알고리즘으로, 원자적 커밋을 구현하는 데 사용될 수 있음 |
장점 | |
데이터 일관성 유지 | 여러 시스템에 걸쳐 데이터의 일관성을 보장 |
장애 복구 | 트랜잭션 실패 시 롤백을 통해 시스템을 일관된 상태로 유지 |
단점 | |
복잡성 | 구현 및 관리가 복잡하며, 추가적인 오버헤드 발생 |
성능 저하 | 여러 시스템 간의 통신으로 인해 성능 저하가 발생할 수 있음 |
조정자 장애 | 조정자에 장애가 발생하면 전체 시스템이 멈출 수 있음 (특히 2PC의 경우) |
2. 데이터베이스 시스템
데이터베이스 시스템에서 원자적 커밋은 ACID 속성 중 원자성과 일관성을 보장하는 핵심 메커니즘이다.[4] 원자적 커밋 내의 각 변경 사항이 일관성을 유지해야만 이 두 속성이 보장된다.
하지만 현대적인 하드웨어 설계의 한계로 인해 데이터베이스가 저장되는 물리 디스크에서는 진정한 원자적 커밋이 불가능하다. 디스크에 쓰기 가능한 가장 작은 단위는 디스크 섹터인데, 단일 데이터베이스 항목은 여러 섹터에 걸쳐 있을 수 있지만 한 번에 하나의 섹터만 쓸 수 있기 때문이다. 이러한 제약 때문에 진정한 원자적 커밋은 불가능하다.[4]
메모리의 데이터베이스 항목이 수정된 후 디스크에 기록되기 위해 대기열에 추가될 때, 동일한 문제가 다시 발생한다. 이 문제는 어떤 알고리즘을 사용하더라도 두 장군의 문제를 겪게 되어 완전한 해결이 불가능하다. 이러한 문제를 부분적으로 해결하기 위해 2단계 커밋 프로토콜과 3단계 커밋 프로토콜이 사용된다.
2. 1. 원자성과 일관성
데이터베이스 시스템에서 원자적 커밋은 ACID의 핵심 속성인 원자성과 일관성을 충족한다.[4] 원자성은 트랜잭션 내의 모든 작업이 완전히 성공하거나 완전히 실패해야 함을 의미한다. 일관성은 트랜잭션이 데이터베이스를 항상 유효한 상태로 유지해야 함을 의미하며, 원자적 커밋 내의 각 변경 사항이 일관될 경우에만 달성된다.예를 들어, X 계좌에서 Y 계좌로 10000JPY을 송금하는 트랜잭션 도중에 Y 계좌의 잔액을 확인하는 트랜잭션이 발생하면 복잡한 문제가 발생할 수 있다. 10000JPY이 X 계좌에서 먼저 삭제되고, 그 후 10000JPY이 Y 계좌에 추가되는 과정에서 시스템에 장애가 발생하면 10000JPY이 사라질 수 있다. 또한 Y 계좌에 10000JPY이 추가되기 전에 잔액을 확인하면 잘못된 잔액이 보고될 수 있다.
원자적 커밋은 이러한 문제를 방지한다. 시스템 장애 발생 시 원자적 커밋이 롤백되어 돈이 X 계좌로 반환된다. Y 계좌의 잔액 요청은 원자적 커밋이 완전히 완료될 때까지 발생하지 않는다.[16]
하지만 현대적인 하드웨어 설계로 인해 데이터베이스가 존재하는 물리 디스크상에서 진정한 원자적 커밋은 존재할 수 없다. 디스크에 쓸 수 있는 최소 영역은 디스크 섹터인데, 하나의 데이터베이스 항목은 여러 섹터에 걸쳐 있을 수 있지만 한 번에 하나의 섹터만 쓸 수 있기 때문이다. 이러한 쓰기 제한은 진정한 원자적 커밋을 불가능하게 만든다. 메모리 내의 데이터베이스 항목이 변경된 후 디스크에 기록되기 위해 대기열에 추가되는데, 이 과정에서 동일한 문제가 다시 발생한다. 이 문제는 어떤 알고리즘을 사용하더라도 두 장군의 문제에 직면하게 되어 완전한 해결이 불가능하다. 2단계 커밋 프로토콜과 3단계 커밋 프로토콜은 이러한 원자적 커밋과 관련된 문제들을 부분적으로 해결하기 위해 시도된다.[17]
2. 2. 원자적 커밋의 중요성
원자적 커밋은 여러 단계로 데이터를 업데이트하는 데 필수적이다. 이는 두 개의 당좌 예금 계좌 간의 송금이라는 간단한 예에서 명확하게 보여줄 수 있다.[3][16]예를 들어, 계좌 X에서 Y로 100USD를 이체하는 동안 계좌 Y의 잔액을 확인하는 트랜잭션이 있다고 가정해 보자. 또는 계좌 X에서 Y로 10000JPY을 이체하는 경우를 생각해 보자. 먼저 계좌 X에서 100USD (혹은 10000JPY)를 인출한다. 다음으로 계좌 Y에 100USD (혹은 10000JPY)를 추가한다. 만약 이 전체 작업이 하나의 원자적 커밋으로 완료되지 않으면 여러 문제가 발생할 수 있다. 작업 중에 시스템 오류가 발생하여 X에서 돈을 인출하고 Y에 추가하기 전에 시스템이 실패하면 100USD (혹은 10000JPY)가 사라질 수 있다. 또 다른 문제는 100USD (혹은 10000JPY)가 추가되기 전에 Y의 잔액을 확인하면 Y에 대한 잘못된 잔액이 보고된다는 것이다.
원자적 커밋을 사용하면 이러한 경우 중 어느 것도 발생할 수 없다. 시스템 오류의 첫 번째 경우, 원자적 커밋이 롤백되고 돈은 X로 반환된다. 두 번째 경우, 원자적 커밋이 완전히 완료될 때까지 Y의 잔액 요청이 발생할 수 없다.
2. 3. 물리적 한계와 해결 방안
물리적 디스크의 현대적인 하드웨어 설계상 디스크 섹터 단위로만 쓰기가 가능하여 진정한 원자적 커밋은 불가능하다. 단일 데이터베이스 항목이 여러 섹터에 걸쳐 있을 수 있지만, 한 번에 하나의 섹터만 쓸 수 있기 때문이다. 이러한 쓰기 제한은 진정한 원자적 커밋을 불가능하게 만든다.[4]이러한 물리적 한계를 극복하기 위해 2단계 커밋 프로토콜 (2PC)과 3단계 커밋 프로토콜 (3PC)과 같은 방법들이 사용된다. 2PC는 조정자가 필요하며, 투표와 커밋 단계로 구성된다.[5][6] 3PC는 2PC의 문제점을 개선하기 위해 커밋 준비 단계를 추가한다.[7] 하지만, 이러한 방법들도 두 장군의 문제와 같은 근본적인 한계는 여전히 가지고 있다.
2. 3. 1. 2단계 커밋 프로토콜 (2PC)
2단계 커밋 프로토콜(2PC)은 조정자를 사용하여 모든 참여 노드의 커밋 또는 롤백을 조정하는 방식이다. 2PC는 크게 투표 단계와 커밋 단계로 나뉜다.투표 단계 (Voting Phase)각 노드는 원자적 커밋의 변경 사항을 자신의 디스크에 기록하고, 조정자에게 상태를 보고한다. 노드가 보고하지 않거나 상태 메시지가 손실되면, 조정자는 해당 노드의 쓰기가 실패했다고 가정한다.
커밋 단계 (Commit Phase)모든 노드가 성공을 보고하면, 조정자는 각 노드에게 커밋 메시지를 보내 개별 로그에 기록하도록 한다. 이 메시지가 로그에 추가될 때까지 모든 변경 사항은 불완전한 것으로 간주된다. 노드 중 하나라도 실패를 보고하면, 조정자는 롤백 메시지를 보내 노드가 디스크에 기록한 모든 변경 사항을 제거한다.[5][6]
2. 3. 2. 3단계 커밋 프로토콜 (3PC)
3단계 커밋 프로토콜(3PC)은 2단계 커밋 프로토콜(2PC)의 주요 문제점을 해결하기 위해 도입되었다. 2PC에서는 커밋 단계 도중 조정자와 노드가 동시에 실패하면 어느 쪽도 어떤 작업을 수행해야 하는지 알 수 없는 문제가 발생한다. 3PC는 이 문제를 해결하기 위해 커밋 준비 단계를 추가했다.[7]3PC의 단계는 다음과 같다.
단계 | 설명 |
---|---|
투표 단계 (Voting Phase) | 2PC와 동일하게, 조정자는 각 노드에 커밋 준비 여부를 묻는다. 노드 실패 시 조정자는 시간 초과 후 중단 메시지를 보낸다. |
커밋 준비 단계 (Prepare to Commit Phase) | 조정자는 각 노드에 준비 메시지를 보내고, 노드는 준비 상태를 응답한다. 응답이 없거나 준비되지 않았다는 응답이 오면 조정자는 중단 메시지를 보낸다. |
커밋 단계 (Commit Phase) | 모든 노드가 준비되면 조정자는 커밋 메시지를 보낸다. 메시지 손실 또는 조정자 실패 시, 노드는 시간 초과 후 커밋을 수행한다. |
원자적 커밋은 버전 관리 시스템에서 저장소의 일관성을 유지하고 변경 사항을 추적하는 데 중요한 역할을 한다. 대부분의 버전 관리 소프트웨어는 실패한 커밋의 일부를 적용하지 않는다. 예를 들어, 버전 관리 소프트웨어가 자동으로 해결할 수 없는 병합 충돌이 발생하면 변경 집합의 어느 부분도 병합되지 않는다. 대신 개발자에게 변경 사항을 되돌리거나 수동으로 충돌을 해결할 기회가 주어진다.
3PC는 2PC의 블로킹 문제를 완화하지만, 여전히 두 장군의 문제와 같은 근본적인 한계는 존재한다.
3. 버전 관리 시스템
이러한 기능은 부분적으로 적용된 변경 집합으로 인해 프로젝트 전체가 손상된 상태가 되는 것을 방지한다. 커밋에서 한 파일은 성공적으로 커밋되지만, 종속 변경 사항이 있는 다른 파일은 실패할 수 있기 때문이다.[23]
하지만, CVS, VSS, IBM Rational ClearCase (UCM 모드일 때)와 같은 예외적인 버전 관리 소프트웨어도 존재한다.[9]
3. 1. 원자적 커밋의 이점
버전 관리 시스템을 사용할 때 작은 커밋을 하는 것이 일반적인 관례이다. 이러한 커밋은 (이상적으로) 시스템의 단일 측면에만 영향을 미치기 때문에 원자적 커밋이라고도 한다. 원자적 커밋은 이해도를 높이고, 변경 사항을 롤백하는 노력을 줄이며, 버그를 쉽게 식별할 수 있게 해준다.[11]
원자적 커밋은 다음과 같은 이점을 제공한다.
3. 2. 모노레포 (Monorepo)
원자적 커밋은 모노레포라고 불리는 버전 관리 소프트웨어 개발 전략을 사용하여, 버전 관리 소프트웨어에서 여러 프로젝트에 걸쳐 동시에 변경을 단일 작업으로 수행할 수 있는 기능을 지칭하기도 한다.[8][24]4. 커밋 운영 방법으로서의 원자적 커밋
버전 관리 소프트웨어의 일반적인 기능인 원자적 커밋은 저장소에서 일관된 상태를 유지하는 데 매우 중요하다.[8] 대부분의 버전 관리 소프트웨어는 실패한 커밋의 일부를 적용하지 않는다. 주목할 만한 예외는 CVS, VSS 및 IBM Rational ClearCase (UCM 모드일 때)이다.[9]
예를 들어, 버전 관리 소프트웨어가 자동으로 해결할 수 없는 병합 충돌을 감지하면 변경 집합의 어느 부분도 병합되지 않는다. 대신 개발자에게 변경 사항을 되돌리거나 수동으로 충돌을 해결할 기회가 주어진다. 이렇게 하면 커밋의 한 파일은 성공적으로 커밋되지만 종속 변경 사항이 있는 다른 파일은 실패하는 부분적으로 적용된 변경 집합으로 인해 전체 프로젝트가 손상된 상태가 되는 것을 방지할 수 있다.[10]
원자적 커밋은 모노레포라고 하는 버전 관리 소프트웨어 개발 전략을 사용하여 단일 작업으로 버전 관리 소프트웨어에서 여러 프로젝트에 걸쳐 동시에 변경할 수 있는 기능을 나타낼 수도 있다.[8]
4. 1. 작은 커밋의 중요성
버전 관리 시스템을 사용할 때 일반적인 관례는 작은 커밋을 사용하는 것이다. 이것은 때때로 원자적 커밋이라고도 하는데, 이는 (이상적으로) 시스템의 단일 측면에만 영향을 미치기 때문이다. 이러한 원자적 커밋은 이해도를 높이고, 변경 사항을 롤백하는 노력을 줄이며, 버그를 쉽게 식별할 수 있게 해준다.[11]이해도가 높아지는 것은 커밋의 작은 크기와 집중된 특성에서 비롯된다. 하나의 변경 사항만 찾는 경우 변경된 사항과 변경 사항 뒤에 숨겨진 이유를 훨씬 쉽게 이해할 수 있다. 이는 소스 코드의 형식 변경을 할 때 특히 중요하다. 형식 변경과 기능 변경이 결합되면 유용한 변경 사항을 식별하기가 매우 어려워진다. 파일의 간격이 탭에서 세 개의 공백으로 변경되면 파일의 모든 탭이 변경된 것으로 표시된다고 상상해 보라. 검토자가 기능 변경 사항을 보지 못할 수 있으므로 일부 기능 변경 사항도 이루어진 경우 이는 매우 중요해진다.[12][13]
원자적 커밋만 이루어지는 경우 오류를 발생시키는 커밋을 훨씬 쉽게 식별할 수 있다. 오류의 원인이 커밋인지 확인하기 위해 모든 커밋을 살펴볼 필요 없이 해당 기능과 관련된 커밋만 조사하면 된다. 오류를 롤백해야 하는 경우 원자적 커밋은 작업을 훨씬 간단하게 만든다. 되돌리기로 문제의 개정으로 되돌리고 이후 변경 사항을 통합하기 전에 변경 사항을 수동으로 제거하는 대신 개발자는 식별된 커밋의 모든 변경 사항을 단순히 되돌릴 수 있다. 또한 개발자가 동일한 커밋에 포함된 관련 없는 변경 사항을 실수로 제거할 위험도 줄어든다.
원자적 커밋은 또한 단일 버그 수정 사항만 한 번에 커밋하는 경우 버그 수정을 쉽게 검토할 수 있도록 해준다. 잠재적으로 관련 없는 여러 파일을 확인하는 대신 검토자는 수정하려는 버그에 직접적인 영향을 미치는 파일 및 변경 사항만 확인하면 된다. 이는 또한 버그를 수정하는 변경 사항만 커밋에 포함되어 있으므로 버그 수정을 테스트를 위해 쉽게 패키징할 수 있다는 것을 의미한다.
4. 2. 원자적 커밋의 이점
원자적 커밋은 다음과 같은 이점을 제공한다.[11]- 이해도 향상: 작고 집중된 변경 사항은 이해하기 쉽고, 코드 리뷰를 용이하게 한다. 특히 형식 변경과 기능 변경을 분리하는 것이 중요하다. 예를 들어, 파일의 공백을 탭에서 세 개의 공백으로 변경하는 형식 변경과 기능을 추가하는 변경을 함께 커밋하면, 코드 리뷰를 하는 사람이 기능 변경 사항을 놓칠 수 있다.[12][13]
- 롤백 용이성: 오류 발생 시, 문제가 되는 커밋만 쉽게 되돌릴 수 있어 이후 변경 사항 통합이 용이하다. 또한, 관련 없는 변경 사항을 실수로 제거할 위험도 줄어든다.
- 버그 수정 용이성: 버그 수정과 관련된 변경 사항만 포함되어 있어 검토 및 테스트가 용이하다. 검토자는 관련 없는 여러 파일을 확인할 필요 없이, 버그에 직접적인 영향을 미치는 파일과 변경 사항만 확인하면 된다. 또한, 버그 수정을 테스트하기 위해 쉽게 패키징할 수 있다.
참조
[1]
서적
A Process Calculus of Atomic Commit
[2]
서적
Database Systems The Complete Book
https://archive.org/[...]
Prentice Hall
[3]
서적
Database Systems The Complete Book
https://archive.org/[...]
Prentice Hall
[4]
서적
Fundamentals of Database Systems 5th Edition
Addison Wesley
[5]
서적
Fundamentals of Database Systems 5th Edition
Addison Wesley
[6]
서적
Concurrency Control and Recovery in Database Systems
http://research.micr[...]
Addison Wesley Publishing Company
[7]
서적
Three-Phase Commit Protocol
http://ei.cs.vt.edu/[...]
[8]
웹사이트
Why Google Stores Billions of Lines of Code in a Single Repository
https://cacm.acm.org[...]
2018-07-20
[9]
서적
Java Power Tools
https://books.google[...]
"O'Reilly Media, Inc."
2008
[10]
서적
Essential CVS.
https://books.google[...]
O'Reilly Media, Inc.
2009
[11]
웹사이트
Subversion Best Practices
http://svn.apache.or[...]
Apache
[12]
서적
Atomic Commits to Version Control
http://www.barneyb.c[...]
[13]
웹사이트
The Benefits of Small Commits
http://www.conifersy[...]
Conifer Systems
2010-07-28
[14]
서적
A Process Calculus of Atomic Commit
[15]
서적
Database Systems The Complete Book
https://archive.org/[...]
Prentice Hall
[16]
서적
Database Systems The Complete Book
https://archive.org/[...]
Prentice Hall
[17]
서적
Fundamentals of Database Systems 5th Edition
Addison Wesley
[18]
서적
Fundamentals of Database Systems 5th Edition
Addison Wesley
[19]
서적
Concurrency Control and Recovery in Database Systems
http://research.micr[...]
Addison Wesley Publishing Company
[20]
서적
Three-Phase Commit Protocol
http://ei.cs.vt.edu/[...]
[21]
웹사이트
Why Google Stores Billions of Lines of Code in a Single Repository
https://cacm.acm.org[...]
2018-07-20
[22]
서적
Java Power Tools
https://books.google[...]
"O'Reilly Media, Inc."
2018-07-26
[23]
서적
Essential CVS.
https://books.google[...]
O'Reilly Media, Inc.
2009
[24]
웹사이트
Why Google Stores Billions of Lines of Code in a Single Repository
https://cacm.acm.org[...]
2018-07-20
[25]
웹사이트
Subversion Best Practices
http://svn.apache.or[...]
Apache
2020-12-21
[26]
서적
Atomic Commits to Version Control
http://www.barneyb.c[...]
[27]
웹사이트
The Benefits of Small Commits
http://www.conifersy[...]
Conifer Systems
2020-12-21
[28]
서적
A Process Calculus of Atomic Commit
[29]
서적
Database Systems The Complete Book
https://archive.org/[...]
Prentice Hall
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com