Part 1
요약·해설
공식 v3.7 review 등급, approval·assignee 책임, checkpatch 예외와 issue/PR label 전체를 보존합니다.
4h · 2d · 3d · 1w
assignee · two reviews
9 · 8 · 14 rows
Part 2
접을 수 있는 영어 원문 전체
영어 원문 전체 펼치기
7B078B457AAB3C3E0ADF96E1799D4A8E00D1A41F2CF8E5C1CAB2712A40EBD827
.. _dev-environment-and-tools:
Development Environment and Tools
#################################
Code Review
************
GitHub is intended to provide a framework for reviewing every commit before it
is accepted into the code base. Changes, in the form of Pull Requests (PR) are
uploaded to GitHub but don't actually become a part of the project until they've
been reviewed, passed a series of checks (CI), and are approved by maintainers.
GitHub is used to support the standard open source practice of submitting
patches, which are then reviewed by the project members before being applied to
the code base.
Pull requests should be appropriately :ref:`labeled<gh_labels>`,
and linked to any relevant :ref:`bug or feature tracking issues<bug_reporting>`
.
The Zephyr project uses GitHub for code reviews and Git tree management. When
submitting a change or an enhancement to any Zephyr component, a developer
should use GitHub. GitHub Actions automatically assigns a responsible reviewer
on a component basis, as defined in the :zephyr_file:`MAINTAINERS.yml` file
stored with the code tree in the Zephyr project repository. A limited set of
release managers are allowed to merge a pull request into the main branch once
reviews are complete.
.. _review_time:
Give reviewers time to review before code merge
================================================
The Zephyr project is a global project that is not tied to a certain geography
or timezone. We have developers and contributors from across the globe. When
changes are proposed using pull request, we need to allow for a minimal review
time to give developers and contributors the opportunity to review and comment
on changes. There are different categories of changes and we know that some
changes do require reviews by subject matter experts and owners of the subsystem
being changed. Many changes fall under the "trivial" category that can be
addressed with general reviews and do not need to be queued for a maintainer or
code-owner review. Additionally, some changes might require further discussions
and a decision by the TSC or the Security working group. To summarize the above,
the diagram below proposes minimal review times for each category:
.. figure:: ../../../project/pull_request_classes.png
:align: center
:alt: Pull request classes
:figclass: align-center
Pull request classes
Workflow
---------
- An author of a change can suggest in his pull-request which category a change
should belong to. A project maintainers or TSC member monitoring the inflow of
changes can change the label of a pull request by adding a comment justifying
why a change should belong to another category.
- The project will use the label system to categorize the pull requests.
- Changes should not be merged before the minimal time has expired.
Categories/Labels
-----------------
Hotfix
++++++
Any change that is a fix to an issue that blocks developers from doing their
daily work, for example CI breakage, Test breakage, Minor documentation fixes
that impact the user experience.
Such fixes can be merged at any time after they have passed CI checks. Depending
on the fix, severity, and availability of someone to review them (other than the
author) they can be merged with justification without review by one of the
project owners.
Trivial
+++++++
Trivial changes are those that appear obvious enough and do not require maintainer or code-owner
involvement. Such changes should not change the logic or the design of a
subsystem or component. For example a trivial change can be:
- Documentation changes
- Configuration changes
- Minor Build System tweaks
- Minor optimization to code logic without changing the logic
- Test changes and fixes
- Sample modifications to support additional configuration or boards etc.
Maintainer
+++++++++++
Any changes that touch the logic or the original design of a subsystem or
component will need to be reviewed by the code owner or the designated subsystem
maintainer. If the code changes is initiated by a contributor or developer other
than the owner the pull request needs to be assigned to the code owner who will
have to drive the pull request to a mergeable state by giving feedback to the
author and asking for more reviews from other developers.
Security
+++++++++++
Changes that appear to have an impact to the overall security of the system need
to be reviewed by a security expert from the security working group.
TSC and Working Groups
++++++++++++++++++++++
Changes that introduce new features or functionality or change the way the
overall system works need to be reviewed by the TSC or the responsible Working
Group. For example for :ref:`breaking API changes <breaking_api_changes>`, the
proposal needs to be presented in the Architecture meeting so that the relevant
stakeholders are made aware of the change.
A Pull-Request should have an Assignee
=======================================
- An assignee to a pull request should not be the same as the
author of the pull-request
- An assignee to a pull request is responsible for driving the
pull request to a mergeable state
- An assignee is responsible for dismissing stale reviews and seeking reviews
from additional developers and contributors
- Pull requests should not be merged without an approval by the assignee.
Pull Request should not be merged by author without review
===========================================================
All pull requests need to be reviewed and should not be merged by the author
without a review. The following exceptions apply:
- Hot fixes: Fixing CI issues, reverts, and system breakage
- Release related changes: Changing version file, applying tags and release
related activities without any code changes.
Developers and contributors should always seek review, however there are cases
when reviewers are not available and there is a need to get a code change into
the tree as soon as possible.
Reviewers shall not 'Request Changes' without comments or justification
=======================================================================
Any change requests (-1) on a pull request have to be justified. A reviewer
should avoid blocking a pull-request with no justification. If a reviewer feels
that a change should not be merged without their review, then: Request change
of the category: for example:
- Trivial -> Maintainer
- Assign Pull Request to yourself, this will mean that a pull request should
not be merged without your approval.
Pull Requests should have at least 2 approvals before they are merged
======================================================================
A pull-request shall be merged only with two positive reviews (approval). Beside
the person merging the pull-request (merging != approval), two additional
approvals are required to be able to merge a pull request. The person merging
the request can merge without approving or approve and merge to get to the 2
approvals required.
Reviewers should keep track of pull requests they have provided feedback to
===========================================================================
If a reviewer has requested changes in a pull request, he or she should monitor
the state of the pull request and/or respond to mention requests to see if his
feedback has been addressed. Failing to do so, negative reviews shall be
dismissed by the assignee or an owner of the repository. Reviews will be
dismissed following the criteria below:
- The feedback or concerns were visibly addressed by the author
- The reviewer did not revisit the pull request after 2 week and multiple pings
by the author
- The review is unrelated to the code change or asking for unjustified
structural changes such as:
- Split the PR
- Can you fix this unrelated code that happens to appear in the diff
- Can you fix unrelated issues
- Etc.
Closing Stale Issues and Pull Requests
=======================================
- The Pull requests and issues sections on Github are NOT discussion forums.
They are items that we need to execute and drive to closure.
Use the mailing lists for discussions.
- In case of both issues and pull-requests the original poster needs to respond
to questions and provide clarifications regarding the issue or the change.
After one week without a response to a request, a second attempt to elicit
a response from the contributor will be made. After one more week without a
response the item may be closed (draft and DNM tagged pull requests are
excluded).
Continuous Integration
***********************
All changes submitted to GitHub are subject to tests that are run on
emulated platforms and architectures to identify breakage and regressions that
can be immediately identified. Testing using Twister additionally performs build tests
of all boards and platforms. Documentation changes are also verified
through review and build testing to verify doc generation will be successful.
Any failures found during the CI test run will result in a negative review
assigned automatically by the CI system.
Developers are expected to fix issues and rework their patches and submit again.
The CI infrastructure currently runs the following tests:
- Run ``checkpatch`` for code style issues (can vote -1 on errors; see note)
- Gitlint: Git commit style based on project requirements
- License Check: Check for conflicting licenses
- Run ``twister`` script
- Run kernel tests in QEMU (can vote -1 on errors)
- Build various samples for different boards (can vote -1 on errors)
- Verify documentation builds correctly.
.. note::
``checkpatch`` is a Perl script that uses regular expressions to
extract information that requires a C language parser to process
accurately. As such it sometimes issues false positives. Known
cases include constructs like:
.. code-block:: c
static uint8_t __aligned(PAGE_SIZE) page_pool[PAGE_SIZE * POOL_PAGES];
IOPCTL_Type *base = config->base;
Both lines produce a diagnostic regarding spaces around the ``*``
operator: the first is misidentified as a pointer type declaration
that would be correct as ``PAGE_SIZE *POOL_PAGES`` while the second
is misidentified as a multiplication expression that would be correct
as ``IOPCTL_Type * base``.
Maintainers can override the -1 in cases where the CI infrastructure
gets the wrong answer.
.. _gh_labels:
Labeling issues and pull requests in GitHub
*******************************************
The project uses GitHub issues and pull requests (PRs) to track and manage
daily and long-term work and contributions to the Zephyr project. We use
GitHub **labels** to classify and organize these issues and PRs by area, type,
priority, and more, making it easier to find and report on relevant items.
All GitHub issues or pull requests must be appropriately labeled.
Issues and PRs often have multiple labels assigned,
to help classify them in the different available categories.
When reviewing a PR, if it has missing or incorrect labels, maintainers shall
fix it.
This saves us all time when searching, reduces the chances of the PR or issue
being forgotten, speeds up reviewing, avoids duplicate issue reports, etc.
These are the labels we currently have, grouped by applicability:
Labels applicable to issues only
================================
.. list-table::
:header-rows: 1
* - Label
- Description
* - :guilabel:`priority: {high|medium|low}`
- To classify the impact and importance of a bug or
:ref:`feature <feature-tracking>`.
Note: Issue priorities are generally set or changed during the bug-triage or TSC
meetings.
* - :guilabel:`Regression`
- Something, which was working, but does not anymore (bug subtype).
* - :guilabel:`Enhancement`
- Changes/Updates/Additions to existing :ref:`features <feature-tracking>`.
* - :guilabel:`Feature request`
- A request for a new :ref:`feature <feature-tracking>`.
* - :guilabel:`Feature`
- A :ref:`planned feature<feature-tracking>` with a milestone.
* - :guilabel:`Hardware Support`
- Covers porting an existing feature (including Zephyr itself) to new hardware.
* - :guilabel:`Duplicate`
- This issue is a duplicate of another issue (please specify).
* - :guilabel:`Good first issue`
- Good for a first time contributor to take.
* - :guilabel:`Release Notes`
- Issues that need to be mentioned in release notes as known issues with
additional information.
Any issue must be classified and labeled as either *Bug*, *Enhancement*, *RFC*,
*Feature*, *Feature Request* or *Hardware Support*. More information on how
feature requests are handled and become features can be found in :ref:`Feature
Tracking<feature-tracking>`.
Labels applicable to pull requests only
=======================================
The issue or PR describes a change to a stable API.
.. list-table::
:header-rows: 1
* - Label
- Description
* - :guilabel:`Hotfix`
- Fix for an issue blocking development.
* - :guilabel:`Trivial`
- Simple changes that can have shorter review time and be reviewed by anyone, i.e. typos,
straightforward one-liner bug fixes, etc.
* - :guilabel:`Maintainer`
- Maintainer review required.
* - :guilabel:`Security Review`
- To be reviewed by a security expert.
* - :guilabel:`DNM`
- This PR should not be merged (Do Not Merge). For work in progress, GitHub
"draft" PRs are preferred.
* - :guilabel:`Needs review`
- The PR needs attention from the maintainers.
* - :guilabel:`Backport`
- The PR is a backport or should be backported.
* - :guilabel:`Licensing`
- The PR has licensing issues which require a licensing expert to review it.
.. note::
For all labels applicable to PRs: Please note that the label, together with
PR complexity, affects how long a merge should be held to ensure proper
review. See :ref:`review process <review_time>` for details.
Labels applicable to both pull requests and issues
==================================================
.. list-table::
:header-rows: 1
* - Label
- Description
* - :guilabel:`area: {area-name}`
- Indicates Zephyr subsystems (e.g, :guilabel:`area: Kernel`, :guilabel:`area: I2C`,
:guilabel:`area: Memory Management`), project functions (e.g., :guilabel:`area: Debugging`,
:guilabel:`area: Documentation`, :guilabel:`area: Process`), or other categories (e.g.,
:guilabel:`area: Coding Style`, :guilabel:`area: MISRA-C`) affected by the bug or the pull request.
An area maintainer should be able to filter by an area label and find all issues
and PRs which relate to that area.
* - :guilabel:`platform: {platform-name}`
- An issue or PR which affects only a particular platform.
* - :guilabel:`dev-review`
- The issue is to be discussed in the following `dev-review`_ if time
permits.
.. _`dev-review`: https://github.com/zephyrproject-rtos/zephyr/wiki/Zephyr-Committee-and-Working-Group-Meetings#zephyr-dev-meeting
* - :guilabel:`TSC`
- TSC stands for Technical Steering Committee. The issue is to be discussed in the
following `TSC meeting`_ if time permits.
.. _`TSC meeting`: https://github.com/zephyrproject-rtos/zephyr/wiki/Zephyr-Committee-and-Working-Group-Meetings#technical-steering-committee-tsc
* - :guilabel:`Breaking API Change`
- The issue or PR describes a breaking change to a stable API. See additional information
in :ref:`breaking_api_changes`.
* - :guilabel:`bug`
- The issue is a bug, or the PR is fixing a bug.
* - :guilabel:`Coverity`
- A Coverity detected issue or its fix.
* - :guilabel:`Waiting for response`
- The Zephyr developers are waiting for the submitter to respond to a question, or
address an issue.
* - :guilabel:`Blocked`
- Blocked by another PR or issue.
* - :guilabel:`Stale`
- An issue or a PR which seems abandoned, and requires attention by the author.
* - :guilabel:`In progress`
- For PRs: is work in progress and should not be merged yet. For issues: Is being
worked on.
* - :guilabel:`RFC`
- The author would like input from the community. For a PR it should be considered
a draft.
* - :guilabel:`LTS`
- Long term release branch related.
* - :guilabel:`EXT`
- Related to an external component.
Part 3
한국어 전문 번역
Code Review
GitHub는 모든 commit이 code base에 받아들여지기 전에 review하는 framework를 제공합니다. Pull Request(PR) 형태의 change는 GitHub에 upload되지만 review를 받고 CI check를 통과하고 maintainer 승인을 받아야 project 일부가 됩니다. 이는 patch를 제출하고 project member가 review한 뒤 code base에 적용하는 standard open-source practice를 지원합니다.
PR에는 적절한 label을 붙이고 관련 bug 또는 feature-tracking issue를 연결해야 합니다.
Zephyr project는 code review와 Git tree management에 GitHub를 사용합니다. Component change나 enhancement를 제출할 때도 GitHub를 사용해야 합니다. GitHub Actions는 repository의 MAINTAINERS.yml에 정의된 component owner를 기준으로 responsible reviewer를 자동 지정합니다. Review가 끝나면 제한된 release manager만 PR을 main branch에 merge할 수 있습니다.
Code merge 전에 reviewer에게 시간을 주기
Zephyr는 특정 지역이나 time zone에 묶이지 않은 global project입니다. 전 세계 developer와 contributor가 change를 review하고 comment할 기회를 얻도록 PR에는 최소 review time을 보장해야 합니다. 일부 change는 subject-matter expert와 subsystem owner review가 필요하고, trivial change는 general review로 충분합니다. 더 큰 change는 TSC 또는 Security Working Group의 논의와 결정이 필요할 수 있습니다.
CI 통과 뒤 언제든 merge 가능
최소 4시간
최소 2일
최소 3일
최소 1주
Zephyr 3.7.0 공식 Pull request classes 그림의 등급과 시간을 구조화했습니다.
Workflow
- Author는 PR에서 change category를 제안할 수 있습니다. Inflow를 보는 project maintainer나 TSC member는 다른 category가 적합한 이유를 comment로 남기고 label을 바꿀 수 있습니다.
- Project는 label system으로 PR을 분류합니다.
- 정해진 최소 시간이 지나기 전에 merge하면 안 됩니다.
Categories/Labels
Hotfix
CI breakage, test breakage, user experience에 영향을 주는 작은 documentation fix처럼 developer의 일상 작업을 막는 issue의 fix입니다. CI check를 통과하면 언제든 merge할 수 있습니다. Fix와 severity, author 외 reviewer availability에 따라 justification을 남기고 project owner review 없이 merge할 수도 있습니다.
Trivial
명백해서 maintainer·code-owner involvement가 필요 없는 change입니다. Subsystem·component logic이나 design을 바꾸면 안 됩니다.
- Documentation change
- Configuration change
- Minor build-system tweak
- Logic을 바꾸지 않는 작은 code optimization
- Test change와 fix
- 추가 configuration·board를 지원하는 sample modification
Maintainer
Subsystem·component의 logic 또는 original design에 손대는 change는 code owner나 designated subsystem maintainer가 review해야 합니다. Owner가 아닌 contributor가 시작한 PR은 code owner에게 assign하고, owner가 author에게 feedback을 주고 다른 developer review를 요청해 mergeable state까지 이끌어야 합니다.
Security
System 전체 security에 영향을 줄 것으로 보이는 change는 Security Working Group의 security expert가 review해야 합니다.
TSC and Working Groups
새 feature·functionality를 도입하거나 system 전체 동작을 바꾸는 change는 TSC 또는 responsible Working Group이 review해야 합니다. Breaking API change proposal은 Architecture meeting에 제시해 relevant stakeholder가 change를 알게 해야 합니다.
Pull Request에는 Assignee가 있어야 함
- PR assignee는 author와 같은 사람이면 안 됩니다.
- Assignee는 PR을 mergeable state까지 이끌 책임이 있습니다.
- Stale review를 dismiss하고 추가 developer·contributor review를 구해야 합니다.
- Assignee approval 없이는 PR을 merge하면 안 됩니다.
Author는 review 없이 자기 PR을 merge하면 안 됨
모든 PR은 review가 필요하고 author가 review 없이 merge하면 안 됩니다. 예외는 CI issue·revert·system breakage를 고치는 hotfix와, code change 없이 version file·tag 등을 바꾸는 release activity입니다. Reviewer를 구할 수 없는데 change를 급히 tree에 넣어야 하는 상황이 있어도 developer와 contributor는 항상 review를 먼저 구해야 합니다.
Reviewer는 설명 없이 Request Changes를 하면 안 됨
PR의 change request(-1)는 모두 justification이 필요합니다. 설명 없이 PR을 block하면 안 됩니다. 자기 review 없이 merge해서는 안 된다고 판단하면 category를 Trivial에서 Maintainer로 올리거나 자신을 assignee로 지정해 approval이 필요함을 표시합니다.
Merge 전 최소 2개 approval
PR은 positive review 두 개를 받아야 merge할 수 있습니다. Merge하는 사람의 행위 자체는 approval이 아니므로 별도 approval 두 개가 필요합니다. Merger는 승인하지 않고 두 approval 뒤 merge하거나, 자신도 approve하고 merge해 두 개를 채울 수 있습니다.
Reviewer는 feedback을 남긴 PR을 추적해야 함
Change를 요청한 reviewer는 PR state를 확인하고 mention request에 응답해 feedback 반영 여부를 봐야 합니다. 그러지 않으면 assignee나 repository owner가 다음 기준으로 negative review를 dismiss할 수 있습니다.
- Author가 feedback이나 concern을 명백히 해결했습니다.
- Author가 여러 번 ping했는데도 reviewer가 2주 동안 다시 방문하지 않았습니다.
- Review가 change와 무관하거나 PR 분할, diff에 우연히 보이는 unrelated code 수정, unrelated issue 수정처럼 근거 없는 structural change를 요구합니다.
Stale Issue와 Pull Request 닫기
- GitHub PR·issue section은 discussion forum이 아니라 실행하고 종료해야 할 item입니다. Discussion에는 mailing list를 사용합니다.
- Issue·PR original poster는 질문에 답하고 clarification을 제공해야 합니다. Request 뒤 1주 동안 응답이 없으면 한 번 더 요청하고, 다시 1주 동안 응답이 없으면 닫을 수 있습니다. Draft와 DNM PR은 제외합니다.
Continuous Integration
GitHub에 제출한 모든 change는 emulated platform·architecture test를 받아 즉시 breakage와 regression을 찾습니다. Twister는 모든 board·platform의 build test도 수행합니다. Documentation change도 review와 build test로 generation 성공 여부를 확인합니다.
CI failure가 있으면 CI system이 negative review를 자동 지정합니다. Developer는 issue를 고치고 patch를 다시 작성해 재제출해야 합니다.
현재 CI infrastructure는 다음 test를 실행합니다.
- Code style용
checkpatch: error에 -1 vote 가능 - Gitlint: project requirement 기반 Git commit style
- License Check: 충돌하는 license 검사
twister- QEMU kernel test: error에 -1 vote 가능
- 여러 board용 sample build: error에 -1 vote 가능
- Documentation build 성공 여부 확인
static uint8_t __aligned(PAGE_SIZE) page_pool[PAGE_SIZE * POOL_PAGES];
IOPCTL_Type *base = config->base;두 줄 모두 * 주변 space diagnostic을 냅니다. 첫 줄은 pointer declaration로 오인해 PAGE_SIZE *POOL_PAGES가 맞다고 하고, 둘째 줄은 multiplication으로 오인해 IOPCTL_Type * base가 맞다고 합니다. CI가 틀린 경우 maintainer가 -1을 override할 수 있습니다.
GitHub Issue와 Pull Request Labeling
Project는 GitHub issue와 PR로 daily·long-term work와 contribution을 추적합니다. Area, type, priority 등의 label로 분류해 관련 item을 쉽게 찾고 보고합니다. 모든 issue와 PR에 적절한 label을 붙여야 하며 여러 category를 나타내려고 label 여러 개를 사용할 수 있습니다. Review 중 label이 빠졌거나 잘못됐으면 maintainer가 고쳐야 합니다. 이는 search 시간을 줄이고 item 누락과 duplicate report를 줄이며 review를 빠르게 합니다.
Issue에만 적용되는 Label
| Label | 설명 |
|---|---|
| priority: {high|medium|low} | Bug 또는 feature의 impact와 importance를 분류합니다. Priority는 보통 bug-triage 또는 TSC meeting에서 정하거나 변경합니다. |
| Regression | 이전에 동작하던 것이 더는 동작하지 않는 bug subtype입니다. |
| Enhancement | 기존 feature의 change·update·addition입니다. |
| Feature request | 새 feature 요청입니다. |
| Feature | Milestone이 지정된 planned feature입니다. |
| Hardware Support | Zephyr 자체를 포함한 기존 feature를 새 hardware에 port하는 작업입니다. |
| Duplicate | 다른 issue와 중복입니다. 중복 대상을 명시해야 합니다. |
| Good first issue | 첫 contributor가 맡기 좋은 issue입니다. |
| Release Notes | Known issue로 release note에 추가 정보와 함께 언급해야 하는 issue입니다. |
모든 issue는 Bug, Enhancement, RFC, Feature, Feature Request, Hardware Support 중 하나로 분류하고 label을 붙여야 합니다.
Pull Request에만 적용되는 Label
Issue 또는 PR은 stable API change를 설명할 수 있습니다.
| Label | 설명 |
|---|---|
| Hotfix | Development를 막는 issue의 fix입니다. |
| Trivial | Typo나 명백한 one-line bug fix처럼 review time이 짧고 누구나 review할 수 있는 단순 change입니다. |
| Maintainer | Maintainer review가 필요합니다. |
| Security Review | Security expert가 review해야 합니다. |
| DNM | Do Not Merge. Merge하면 안 되는 PR입니다. Work in progress에는 GitHub draft PR을 권장합니다. |
| Needs review | Maintainer의 주의와 review가 필요합니다. |
| Backport | Backport PR이거나 backport해야 하는 PR입니다. |
| Licensing | Licensing expert가 검토해야 할 license issue가 있습니다. |
Pull Request와 Issue 모두에 적용되는 Label
| Label | 설명 |
|---|---|
| area: {area-name} | Bug·PR이 영향을 주는 Zephyr subsystem(Kernel, I2C, Memory Management), project function(Debugging, Documentation, Process), 또는 category(Coding Style, MISRA-C)를 표시합니다. Area maintainer가 이 label로 관련 issue와 PR을 모두 찾을 수 있어야 합니다. |
| platform: {platform-name} | 특정 platform에만 영향을 주는 issue 또는 PR입니다. |
| dev-review | 시간이 허용되면 다음 dev-review meeting에서 논의할 issue입니다. |
| TSC | Technical Steering Committee를 뜻하며 시간이 허용되면 다음 TSC meeting에서 논의할 issue입니다. |
| Breaking API Change | Stable API를 깨뜨리는 change입니다. |
| bug | Issue가 bug이거나 PR이 bug를 고칩니다. |
| Coverity | Coverity가 찾은 issue 또는 그 fix입니다. |
| Waiting for response | Zephyr developer가 submitter의 질문 답변이나 문제 해결을 기다립니다. |
| Blocked | 다른 PR 또는 issue에 의해 막혔습니다. |
| Stale | 방치된 것으로 보여 author의 attention이 필요한 issue 또는 PR입니다. |
| In progress | PR은 작업 중이라 아직 merge하면 안 되고, issue는 현재 작업 중입니다. |
| RFC | Author가 community input을 원합니다. PR이라면 draft로 봐야 합니다. |
| LTS | Long-term release branch 관련입니다. |
| EXT | External component 관련입니다. |
Source
출처
영어 원문에는 문단, 문서 지시문, 표, 코드, 코드 심벌, 경로를 그대로 보존했습니다.