Oracle VM VirtualBox 드래그 앤 드롭으로 파일 옮기기
Oracle VM VirtualBox를 이용할 때는 드래그 앤 드롭(Drag And Drop)으로 간단하게 Host와 Guest 사이에 파일을 주고 받을 수 있습니다. 이를 설정하는 방법은 간단한데요. 먼저 Oracle VM VirtualBox에서 [머신] - [설정]으로 이동합니다. 그리고 [일반] - [고급] 탭으로 이동해주세요.

이제 [드래그 앤 드롭] 속성으로 [양방향]을 설정해주세요.

이제 호스트(Host) OS와 게스트(Guest) OS 사이에서 파일을 끌어다 놓는 방식으로 간단히 파일을 옮길 수 있습니다.

'기타' 카테고리의 다른 글
| (교수님/선생님/학생 모두를 위한 글) 온라인 시험 진행을 위한 무료 플랫폼 Exam.net 사용법 (0) | 2020.06.24 |
|---|---|
| Teensy HID 코어 라이브러리 개발 실습 (0) | 2020.06.22 |
| 아두이노 설치 경로의 하드웨어(Hardware) 폴더는 무슨 역할을 할까요? (0) | 2020.06.21 |
| 아두이노(Arduino)에서 나만의 사용자 라이브러리 만들기 (1) | 2020.06.21 |
| 한컴 입력기 삭제하는 방법 (0) | 2020.06.19 |
아두이노 설치 경로의 하드웨어(Hardware) 폴더는 무슨 역할을 할까요?
아두이노 설치 경로의 하드웨어(Hardware) 폴더는 아두이노 IDE를 이용하는 각기 다른 보드(Board) 하드웨어에 따라서 서로 다른 기능을 정의하고 있는 폴더입니다. 예를 들어 USB 장치 개발용 보드인 Teensy의 경우, 아두이노 IDE에서 개발이 가능하도록 지원하고 있습니다. 이 때 Teensy만의 기능들은 하드웨어 폴더 상에 정의가 되는 방식입니다.
실제로 아두이노 IDE를 먼저 설치한 뒤에, Teensyduino라는 이름의 플러그인을 설치하면 아두이노 IDE에서 소스코드상으로 Teensy 전용 기능을 불러와 사용할 수 있게 됩니다. Teensyduino를 설치한 뒤의 하드웨어 폴더는 다음과 같이 구성됩니다. 원래 아두이노 IDE를 설치하면 아래 그림에서 보이는 teensy라는 이름의 폴더가 없는데요, 플러그인을 설치한 뒤에 생기는 겁니다.

실제로 아두이노 상에서 [툴] - [보드]로 이동하면 하드웨어를 선택할 수 있습니다. 저는 Teensy 하드웨어 플러그 인을 설치했기 때문에, 이와 같이 Teensy를 선택할 수 있는 것을 확인할 수 있습니다.

그렇다면 각기 다른 하드웨어(Hardware)에 따른 라이브러리는 어디서 확인할 수 있을까요? 바로 다음과 같이 하드웨어 폴더의 libraries 폴더까지 들어 오시면, 여기에 각종 예제 소스코드와 라이브러리가 포함되어 있습니다.

실제로 위 라이브러리들은 아두이노 IDE를 실행했을 때 나오는 [예제] 소스코드들과 동일합니다.

또한 [파일] - [예제]에 들어가는 기본 예제 소스코드들은 어디에서 확인할 수 있을까요?

이 소스코드들은 예제(examples) 폴더 안에 있습니다.

'기타' 카테고리의 다른 글
| Teensy HID 코어 라이브러리 개발 실습 (0) | 2020.06.22 |
|---|---|
| Oracle VM VirtualBox 드래그 앤 드롭으로 파일 옮기기 (0) | 2020.06.22 |
| 아두이노(Arduino)에서 나만의 사용자 라이브러리 만들기 (1) | 2020.06.21 |
| 한컴 입력기 삭제하는 방법 (0) | 2020.06.19 |
| Teensy에서 쓰레드(Thread) 사용 방법 (0) | 2020.06.19 |
아두이노(Arduino)에서 나만의 사용자 라이브러리 만들기
기본적으로 이용할 모든 기능을 스케치 파일(.ino)에 하나의 소스코드로 작성하는 것은 비효율적인 경우가 많습니다. 그래서 자주 사용하는 기능을 분리하여 사용자 라이브러리로 만들어서 관리하면 좋은 점이 많습니다. 특히 라이브러리를 직접 만들게 되면, 내가 만든 라이브러리를 다른 사람에게 쉽게 공유할 수도 있기 때문에, 여러모로 좋은 점이 많습니다.
일반적으로 아두이노 라이브러리를 만들 때는 약속이 있습니다. 바로 다음의 위치(스케치북 위치)에 아두이노 라이브러리를 만든다는 것입니다.
▶ 아두이노 사용자 라이브러리 폴더: C:\Users\{사용자명}\Documents\Arduino\libraries
저는 다음과 같이 MyLibrary라는 이름으로 하나의 라이브러리 폴더를 생성해 보았습니다.

일반적으로 라이브러리 폴더는 다음과 같은 형식으로 구성됩니다. 아두이노 라이브러리 사용 경험이 많으신 분들에게는 익숙하실 수 있는데요, 라이브러리 폴더에는 소스코드 파일들을 제외하고도 examples라는 이름의 폴더도 포함하는 경우가 많습니다. examples 폴더는 어떤 라이브러리의 사용 방법 예시를 포함하는 폴더라고 할 수 있습니다. 그래서 보통 Hello World와 같은 코드를 담습니다.

※ 라이브러리 폴더의 구성 예시
* MyLibrary.cpp
* MyLibrary.h
* examples
* HelloWorld
* HelloWorld.ino
그러면 한 번 MyLibrary.h를 작성해 보겠습니다. 여기에서 사용되는 문법은 일반적인 C/C++과 같습니다. 저는 간단히 더하기 함수(add)와 빼기 함수(subtract)를 넣었습니다.
참고로 #ifndef ~ #endif는 C/C++에서 자주 사용되는 전처리문입니다. 일반적으로 헤더 파일이 중복되어 초기화되지 않도록 막기 위해 사용합니다. 아래 코드에서는 MyLibrary_H이 초기화 되어 있지 않을 때에만, MyLibrary_H를 초기화 한 뒤에 두 함수를 선언할 수 있도록 해주고 있습니다.
#ifndef MyLibrary_H
#define MyLibrary_H
int add(int a, int b);
int subtract(int a, int b);
#endif
이제 MyLibrary.cpp을 다음과 같이 작성할 수 있습니다. 헤더 파일에서 선언했던 함수를 실제로 구현한 것입니다.
#include "Arduino.h"
#include "MyLibrary.h"
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
참고로 .cpp 파일을 작성할 때는 "Arduino.h" 헤더파일을 추가하도록 합니다. "Arduino.h" 파일은 아두이노의 기본적인 함수, 상수, 표준 타입을 포함하고 있습니다. 그래서 아두이노의 기본적인 기능을 이용하도록 우리의 라이브러리를 작성할 수 있습니다.
일반적으로 아두이노 IDE를 이용해서 .ino 파일을 작성하여 코딩을 하면, 자동으로 "Arduino.h"가 추가됩니다. 하지만 우리가 만들 사용자 라이브러리 파일에서는 "Arduino.h" 헤더 파일이 자동으로 추가되지 않기 때문에, 소스코드상에서 직접 지정해주어야 합니다. 사실 아두이노의 기본적인 기능을 이용하지 않더라도, 관행적으로 "Arduino.h" 파일은 사용자 라이브러리에 포함될 수 있도록 합니다.
이제 최종적으로 다음과 같이 examples 폴더 안에 하나의 예시 소스코드를 넣어 주도록 합시다. 저는 HelloWorld.ino라는 이름으로 하나의 소스코드를 만들어 주었습니다.

#include <MyLibrary.h>
void setup() {
}
void loop() {
Serial.println(add(3, 4));
}
이제 실제로 소스코드를 업로드하여 프로그램을 실행해 보면, 다음과 같이 함수를 실행한 결과가 정상적으로 출력되는 것을 확인할 수 있습니다. 만약에 함수를 찾을 수 없다거나 하는 오류가 발생한다면, 라이브러리 소스코드를 다시 한 번 살펴보세요.

'기타' 카테고리의 다른 글
| Oracle VM VirtualBox 드래그 앤 드롭으로 파일 옮기기 (0) | 2020.06.22 |
|---|---|
| 아두이노 설치 경로의 하드웨어(Hardware) 폴더는 무슨 역할을 할까요? (0) | 2020.06.21 |
| 한컴 입력기 삭제하는 방법 (0) | 2020.06.19 |
| Teensy에서 쓰레드(Thread) 사용 방법 (0) | 2020.06.19 |
| 대학원생/유튜버/강사를 위한 종합소득세 납부 방법 (전체 과정 사진 첨부) (2) | 2020.05.22 |
한컴 입력기 삭제하는 방법
기본적으로 존재하는 [한컴 입력기] 때문에 불편할 때가 있습니다. 이를 삭제하는 방법은 간단한데요, 먼저 [언어 기본 설정]으로 이동하시면 됩니다.

이후에 [기본 설정 언어] 탭에 존재하는 [한국어] - [옵션]으로 들어갑니다.

이제 여기에서 [한컴 입력기]를 찾으신 뒤에 [제거]를 해주시면 깔끔하게 제거됩니다.

'기타' 카테고리의 다른 글
| 아두이노 설치 경로의 하드웨어(Hardware) 폴더는 무슨 역할을 할까요? (0) | 2020.06.21 |
|---|---|
| 아두이노(Arduino)에서 나만의 사용자 라이브러리 만들기 (1) | 2020.06.21 |
| Teensy에서 쓰레드(Thread) 사용 방법 (0) | 2020.06.19 |
| 대학원생/유튜버/강사를 위한 종합소득세 납부 방법 (전체 과정 사진 첨부) (2) | 2020.05.22 |
| 국세청 홈택스 종합소득세 신고를 잘못한 경우 신고서 수정 방법 (0) | 2020.05.22 |
Teensy에서 쓰레드(Thread) 사용 방법
※ 쓰레드(Thread) 사용 방법 ※
Teensy 버전 3과 4에서는 쓰레드(Thread) 기능을 제공한다. 쓰레드를 이용하기 위해서는 아두이노 IDE에서 [스케치] - [라이브러리 포함하기]를 확인하자.

여기에서 TeensyThreads를 선택하여 TeensyThread 라이브러리를 불러 올 수 있다.

이후에 다음과 같은 예시 소스코드를 작성하여 실행해보자.
#include <TeensyThreads.h>
volatile int count = 0;
void thread_function(int data){
while(1) {
count += data;
}
}
void setup() {
threads.addThread(thread_function, 1);
}
void loop() {
Serial.println(count);
}
실제로 업로드하여 프로그램을 실행하면, 다음과 같이 count 변수의 값이 증가하며 출력된다.

※ 라이브러리가 없는 경우 ※
혹시나 TeensyThread 라이브러리가 없다는 오류가 나온다면, 해당 라이브러리를 아두이노 라이브러리로 등록해주면 된다. 라이브러리 경로(https://github.com/ndb796/python-for-coding-test)로 접속하여 프로젝트 소스코드를 다운로드 할 수 있다. 아래와 같이 TeensyThreads.zip을 확인할 수 있다.

압축 파일(zip)을 라이브러리로 포함시킬 때에도 마찬가지로 [스케치] - [라이브러리 포함하기]로 이동하면 된다.

다음과 같은 경로의 압축 파일을 등록하면 된다.

'기타' 카테고리의 다른 글
| 아두이노(Arduino)에서 나만의 사용자 라이브러리 만들기 (1) | 2020.06.21 |
|---|---|
| 한컴 입력기 삭제하는 방법 (0) | 2020.06.19 |
| 대학원생/유튜버/강사를 위한 종합소득세 납부 방법 (전체 과정 사진 첨부) (2) | 2020.05.22 |
| 국세청 홈택스 종합소득세 신고를 잘못한 경우 신고서 수정 방법 (0) | 2020.05.22 |
| 하나의 아두이노 USB 장치(Device)가 여러 기능(Interface)를 제공하는 방법 (1) | 2020.05.18 |
대학원생/유튜버/강사를 위한 종합소득세 납부 방법 (전체 과정 사진 첨부)
※ 본 글은 2021년 05월 31일 기준으로 업데이트되었습니다. 또한 이 글은 2020년, 2021년 두 차례에 걸쳐 업데이트 되어서 내용이 다소 섞여 있습니다. 저는 세무 전문가가 아니므로 참고용으로만 보세요. ※
종합소득세를 납부하려면 홈택스(Hometax)에 가야 합니다.
▶ 홈택스: https://www.hometax.go.kr/
매년 5월은 종합소득세 신고 기간이니까, 이 기간에 작년의 수입에 대해서 종합소득세를 신고해야 합니다. 일반적으로 신고해야 하는 소득의 종류로는 기타소득, 근로소득, 사업소득 등이 있습니다. 저의 경우 대학원생이면서 유튜버이고, 이전에 사기업에서 강의 활동을 한 적도 있습니다. 그래서 저는 다음과 같이 3가지 종류의 소득을 납부해야 합니다. 아마 일반적인 대학원생이라면 '대학원 인건비'에 해당하는 기타소득만 신고할 겁니다.
▶ 기타소득: 대학원 월급이 있습니다. (feat. 유튜브/블로그 광고 수익)
▶ 근로소득: 대학원 입학 전에 회사에서 근로한 적이 있습니다.
▶ 사업소득: 사기업에서 강의 활동을 한 적이 있어서, 강의료를 받은 게 있습니다. (feat. 유튜브/블로그 광고 수익)
참고로 방송을 하시는 분들은 투네이션 수입이 있을 수 있는데, 투네이션(Toonation) 수익은 '사업소득'에 들어가는 것으로 알려져 있습니다.
이제 한 번 종합소득세 납부를 해보겠습니다. 기본적으로 종합소득세를 신고하기 위해서는 가장 먼저 로그인을 해주셔야 합니다. 이때 가능하면 [공인인증서 로그인]을 통해 로그인을 해주세요. 인증서 없이 일반 아이디 로그인을 하는 경우, 신고 과정에서 오류를 만나는 경우가 있습니다.

기본적으로 로그인 이후에는 지급명세서부터 확인하도록 합니다. [My 홈택스] 탭으로 이동한 뒤에, [지급명세서 등 지출내역] 링크를 들어가서 내용을 확인합니다. 2020년 기준으로 화면은 다음과 같습니다.

2021년에는 다음과 같이 화면 UI가 바뀌었네요.

자신이 지급을 받은 내역이 여기에서 나열되는데요. 일단 '지급명세서'에 나와 있는 내용은 기본적으로 당연히 소득세로 신고해야 한다고 보시면 됩니다. (단, 2019년 기준 일용 근로자의 경우 평균 일급이 약 187,000원 미만일 때는 소득세를 납부하지 않아도 됩니다. 이처럼 지급명세서에 나와 있지만, 소득세로 신고하지 않아도 되는 경우도 있으므로, 잘 확인하시는 것이 중요합니다. 물론 기본적으로 대학원 월급, 강사 활동과 같은 활동은 거의 다 소득세 신고가 필요하다고 보시면 됩니다.)
아무튼 현재 2020년 5월이므로, 저는 다음과 같이 2019년에 있었던 모든 소득에 대해서 신고를 해야 합니다.

이 중에서 한 번 예시로 대학원생 인건비 (기타소득)을 확인해 보도록 하겠습니다. [보기] 버튼을 눌러줍니다.

그러면 다음과 같이 지급을 받았던 금액이 나오게 됩니다. 참고로 오른쪽에 있는 "원천징수 세액"의 경우에는, 이미 제가 다니고 있는 대학원 측에서 국가에 납부한 세금(기납부세액)이라고 보시면 됩니다. 우리가 만약에 내야 할 결정세액이 적다면, 이 원천징수 금액에 따라서 돈을 환급받을 수 있는 겁니다. 일반적으로 기타소득만 존재하는 대학원생들은 이러한 원천징수 금액을 환급받게 됩니다.

아무튼 저는 지급명세서상으로만 9개나 존재하네요. 이제 이것들을 신고하러 가야 합니다. 따라서 [신고/납부] 탭에서 [종합소득세] 탭으로 가면 종합소득세를 납부할 수 있습니다.

사람들은 자신의 소득 금액, 소득 유형에 따라서 "납부 유형"이 나누어집니다. 기본적으로 자신의 납부 유형을 알기 위해서는 [신고도움 서비스]를 누르시면 됩니다.

그러면 다음과 같이 납부 유형을 알려 줄 겁니다. 참고로 여기에서 '추계신고'라는 단어가 있는데요. 추계신고란 세무 장부를 직접 작성해서 사업 비용을 계산하는 게 아니라, 업종별로 경비율을 적용해서 특정 비율만큼 총 수입금액에서 비용을 추정하여 계산하는 것을 말합니다. 저도 장부 등을 작성할 시간이 없어서, 추계신고를 고려했던 적이 있습니다. (다만 저는 2020년에는 단순경비율이었으나, 2021년에는 기준경비율로 신고했습니다.)
※ 2020년 - 단순경비율 ※
필자의 경우 2020년에는 단순경비율이었습니다. 일정 금액 이하로 돈을 번 경우 단순경비율을 적용하여 경비를 인정받을 수 있습니다.

※ 2021년 - 기준경비율 ※
필자는 2021년에는 기준경비율 적용 대상자가 되었습니다. 필자는 여전히 영세하기 때문에 별도로 장부를 작성하지 않았으며, 추계신고를 고려해야하는 상황이었습니다. (참고로 기준경비율은 단순경비율에 비하여 추계신고 시 경비율이 낮기 때문에, 기준경비율 적용대상자부터는 경비를 인정받기 위한 서류상의 노력 작업이 많이 필요합니다. 거의 60% 정도에 가까운 경비율이 20%로 떨어지는 일이 흔하게 벌어집니다. 그러면 당연히 실질적으로 소득이 많이 잡혀서 세금이 매우 증가할 수 있겠죠? 그래서 결과적으로는 세무사 님께 문의를 했습니다. 단순경비율의 경우에는 유튜브를 보면서 따라하는 게 나을 수 있으나, 기준경비율부터는 세무사를 이용하는 것을 추천합니다.)

또한 2021년의 경우에는 [신고시 유의할 사항] 항목이 추가되어 다음과 같은 내용이 들어가 있습니다. 유튜브를 통해 얻은 수익이 있기 때문에, 구글(Google)로부터 외화를 수취한 사실이 있다고 나오는 것을 확인할 수 있습니다.

또한 필자의 경우 사업소득 외에도 기타소득이 존재하기 때문에, 다음과 같이 기타소득도 존재한다는 내용도 같이 출력되는 것을 알 수 있습니다.

유튜버나 대학원생은 기본적으로 대부분 [일반신고서]로 신고를 하시게 될 거예요. 저 역시 유튜버이면서 대학원생이기 때문에 [일반신고서]로 신고를 해야 합니다. 2021년 기준으로 다음과 같은 화면이 나옵니다.

기본적으로 [기본사항]부터 입력하게 됩니다. 그래서 [조회] 버튼을 누른 뒤에 조회된 정보를 확인하시면 됩니다.

[조회] 버튼을 눌렀을 때, 작년 1년간의 소득 정보에 따라서 자동으로 다음과 같이 소득을 선택하도록 안내가 제시됩니다. 사업소득의 경우 바로 수입 금액이 얼마인지 나오는 것을 확인할 수 있습니다.

저는 사업소득이 있기 때문에 다음과 같이 추가적으로 사업장을 명세하라는 내용이 나옵니다. 저는 강의 활동을 했기 때문에, 업종코드가 940909로 나오고, 이 경우 사업자 등록번호 [없음]을 선택합니다. (앞서 말씀드렸듯이, 방송을 하시는 분이라면 투네이션 수익도 '사업소득'으로 잡히게 됩니다. 물론 저는 해당사항 없습니다.)

그러면 다음과 같이 등록할 수 있습니다. 버는 금액이 많지 않으면, [간편장부대상자] 이면서 [단순경비율]이 적용됩니다. (필자는 2020년과 달리 2021년에는 소득이 더 생겨 [기준경비율]을 선택했습니다.)

저는 아무튼 결과적으로, 맨 처음 말씀드렸듯이 다음과 같이 세 개의 소득 종류가 있습니다.
▶ 부동산임대업외의 사업소득: 사기업 강의료
▶ 근로소득: 회사 생활
▶ 기타소득: 유튜브, 대학원 인건비
드디어 기본사항 명시가 완료되었네요. 이제 다음으로 넘어가면 됩니다.

기본적인 내용들은 그냥 다 정보를 [불러오기] 이후에 [확인]하는 식으로 그냥 반복하면 된다고 보시면 됩니다. 생각보다 복잡하지 않습니다. 일단 하나씩 따라가면 됩니다.
※ 2020년 - 단순경비율 사업소득금액명세서 ※
이제 사업소득 명세를 해야 하는데요. 일단 2020년에는 단순경비율이 적용되는 사업소득이 있었습니다. [업종별 총수입금액 및 소득금액 계산]을 누릅니다. (실제로 많은 경우, 강의료는 사업소득으로 잡히게 됩니다. 혹은 기타소득입니다.)

이후에 직접 "총수입금액"을 적어주셔야 합니다. 혹시 방송을 하시는 분들 중에서 투네이션을 받으시는 분은 기본적으로 사업소득으로 잘힐 테니까, 여기에 넣어주셔야 합니다. 저는 투네이션은 아니고, 사기업에서 강의했던 금액이 사업소득으로 잡힌 금액을 모두 넣어주었습니다.

이제 사업소득 금액 명세가 완료되었습니다. 넘어가겠습니다.

※ 2020년 - 기준경비율 사업소득금액명세서 ※
2020년에는 기준경비율이 적용되었으며, 다음과 같이 업종코드별로 수익금액이 얼마인지 확인하여 정확한 금액을 기입했습니다.

참고로 이때 "주요경비"와 같은 경비 요소가 있다면 이를 기입하여 세금을 줄일 수 있습니다. 기준경비율에서 사용되는 주요경비로는 대표적으로 3가지가 있습니다.
▶ 매입비용: 원료, 전기료, 상품, 제품과 같은 비용을 의미합니다.
▶ 임차료: 사업을 위해 사용하는 건축물과 같은 고정자산을 빌려 쓰는 비용을 의미합니다.
▶ 인건비: 직원에게 주는 급여와 같은 비용을 의미합니다.
기본적으로 인건비는 지급명세서와 같은 증명 서류가 요구되고, 임차료 또한 세금계산서와 같은 증명 서류가 요구될 수 있습니다. 다만 개인적으로 집에서 유튜브와 같은 플랫폼으로 수익을 얻는 경우에 그 집이 거주 목적으로 임차한 주택이라면, 가사 관련 경비로 보이므로 임차료(필요 경비) 적용이 어려운 경우가 많다고 합니다. 필자 또한 기숙사에 살고 있기 때문에, 임차료는 필요 경비로 넣을 수 없다고 판단하여 비워두었습니다.
이후에 넘어가면, 아까 입력한 사업소득에 대해서 미리 납부한(원천징수한) 세금이 있는지 정보가 나옵니다. 미리 납부한 세금이 있으면, 그만큼은 세금을 내지 않아도 되는 겁니다. 다음과 같이 [사업소득 원천징수내역 불러오기] 버튼을 누른 뒤에 내용을 확인하면 됩니다. (제 2020년 기준 화면은 다음과 같습니다.)

이제 이어서 [근로, 기타, 연금소득] 항목을 작성합니다. 어차피 기타 소득이나, 근로 소득 등은 국세청에서 우리의 정보를 알고 있습니다. 그래서 근로, 기타, 연금소득 확인 부분에서는 [근로/연금/기타(종교인)소득 불러오기] 버튼을 누른 다음에 적용하면 됩니다. 간혹 버튼이 안 눌리는경우가 있는데 저의 경우에는 로그아웃 이후에 [공인인증서 로그인]을 하면 버튼이 눌리더라고요. 그러므로 당황하지 마세요.

※ 애드센스(Adsense)를 기타소득으로 넣는 경우 ※
모든 소득 내역을 불러온 뒤에, 기록되어 있지 않은 내용 중에서 존재하는 소득도 기입해야 합니다. 저자의 경우 유튜브/티스토리 블로그의 애드센스 수익이 있습니다. 따라서 이를 적었습니다. 구글(Google) 애드센스의 경우 사업자 등록번호로 120-86-65164를 입력하면 된다고 합니다. 작년 유튜브 총 수익을 원화 기준으로 입력하면 됩니다. 저자의 경우 2020년에는 애드센스 수익이 매우 적었기 때문에, 단순하게 기타 소득으로 넣었습니다. (이때 당시 경비를 0원으로 넣어서 사실상 어떠한 세금 혜택도 받지 않고, 소득에 따른 세금을 모두 납부했습니다. 아마 사업소득으로 했으면 세금을 더욱 절약할 수 있었을 텐데, 당시에는 그냥 기타소득으로 했습니다.)

※ 애드센스(Adsense)를 사업소득으로 넣는 경우 ※
필자의 경우 2021년에는 애드센스에 따른 수익이 커짐에 따라서 사업소득으로 넣었습니다. 이때 1인미디어 창작자(940306)는 유튜버와 같이 영상 콘텐츠를 생산하는 사람에게 해당되는 업종코드입니다. 참고로 1인미디어 창작자가 영상 편집자를 쓰고, 사업장과 같은 물리시설을 갖추는 경우에는 과세사업자로 분류됩니다. (국세청 참고 링크) 과세사업자의 경우 미디어 콘텐츠 창작업(921505)가 됩니다.
필자의 경우 영세한 1인 유튜버이므로 업종코드 940306 사업소득을 선택했습니다. 이는 면세사업자로 분류되기 때문에 부가가치세를 신고할 의무는 없습니다. 아무튼, 필자의 경우 업종코드 940306 사업소득으로 유튜브 수익을 넣었습니다. 자세한 내용은 위에 있는 [국세청 참고 링크]에서 확인하세요. (개인적으로는, 규모가 큰 분들은 그냥 세무사를 거쳐서 자세하게 상담하는 것을 추천합니다.)
아무튼 결과적으로 모든 기타 소득, 근로 소득을 반영하면 다음과 같은 모습이 됩니다.

이후에 이원결손금 등을 명시하는데, 저의 경우에는 해당이 없습니다.

이제 소득공제 명세를 합니다. 가장 먼저 근로소득이 있다면, 이 내용부터 넣게 됩니다. [근로소득(연말정산) 불러오기] 버튼을 눌러서 선택해주세요.

저는 다음과 같이 선택했습니다.

이후에 진행하면 됩니다. 참고로 여기에서 [특별공제 보험료]나 [신용카드] 항목에 대해서 반드시 [계산하기] 버튼을 눌러서 반영하도록 합니다. (누르지 않으면 공제가 적용되지 않습니다. 생돈을 엄청 날리게 될 수도 있어요.)

이제 다음과 같이 소득공제 내용이 반영됩니다. 저는 이것저것 많이 사 먹어서 그런지, 신용카드 쓴걸로도 많이 공제가 되었네요.

다음으로 넘어가면 기부금 관련 명세 내용도 확인할 수 있습니다. 기부금이 있다면 공제를 받을 수 있는데요, 저는 작년에 기부한 내용이 없어서 넘어갔습니다.

이후에 세액감면이 되는 여부가 있는지 체크합니다. 사실 아래 항목들은 웬만해서 해당되기 어려운 것 같습니다.

세액공제신청서도 넘어갑니다.

이제 기다리던 세액 공제입니다. 근로자로 활동한 이력이 있는 등, 다양한 요인에 의하여 공제를 받을 수 있습니다.

특히 의료비, 교육비로 지출하신 게 있다면 [자동계산] 버튼을 눌러서 꼭 계산해주셔야 합니다. 만약에 학비로 500만 원을 썼는데, 이거 버튼 안 눌러서 세액 공제가 안 되면 엄청난 낭패겠죠.

저는 결과적으로 꽤 많은 돈을 공제 받을 수 있었습니다. (특히나 대학원생이라서요.) 또한 기본적으로 전자신고에대한세액공제 이거 하나만으로도 20,000원이나 공제받을 수 있습니다.

이후에 가산세 명세서를 확인할 수 있습니다.

이후에 기납부세액 명세서를 확인할 수 있습니다. 말 그대로 이미 낸 돈들을 의미합니다.

이제 최종적으로 세액을 계산합니다. 마지막에 나오는 "신고기한이내 납부할 세액"이 양수(+) 값이라면, 그만큼 돈을 납부해야 합니다. 반면에 음수(-)라면, 그만큼 환급을 받을 수 있습니다.

이제 신고서 작성 완료를 하면 됩니다.

최종적으로 다음과 같이 신고 접수가 완료된 것을 알 수 있습니다.

이제 아래 쪽에 있는 [신고내역] 탭으로 이동하도록 합니다.

제 신고 내역은 다음과 같이 나옵니다. 참고로 "부속서류 제출여부"가 N으로 나온다면, 추가적인 서류를 제출할 필요가 없다는 의미입니다. 저는 환급을 받는게아니라 납부할 금액이 있으므로 먼저 [납부할 세액 조회납부]를 눌러서 납부하도록 하겠습니다. (참고로 2020년 기준 지방소득세는 별도로 납부를 해야 합니다.)

결과적으로 다음과 같이 납부할 금액과 납부 계좌번호가 나옵니다. 여기로 계좌이체를 해서 납부하면 됩니다.

이제 지방소득세도 연달아 납부하시면 됩니다. 납부서 [보기] 버튼을 누릅니다.

다음과 같이 [개인지방소득세 신고하기] 버튼을 눌러서 지방소득세를 신고하시면 됩니다.

그러면 다음과 같이 별도의 창이 나오면서 지방소득세 금액을 알려줍니다. 저는 환급이 아니라 세금을 내야 하는 입장이기 때문에, [신고] 버튼을 눌러서 신고할 수 있도록 하겠습니다.

다음과 같이 납부를 진행하시면 됩니다.

결과적으로 지방소득세까지 납부를 마치셨으면, 종합소득세 신고가 끝난 겁니다.
'기타' 카테고리의 다른 글
| 한컴 입력기 삭제하는 방법 (0) | 2020.06.19 |
|---|---|
| Teensy에서 쓰레드(Thread) 사용 방법 (0) | 2020.06.19 |
| 국세청 홈택스 종합소득세 신고를 잘못한 경우 신고서 수정 방법 (0) | 2020.05.22 |
| 하나의 아두이노 USB 장치(Device)가 여러 기능(Interface)를 제공하는 방법 (1) | 2020.05.18 |
| MTP(Media Transfer Protocol) 라이브러리를 이용하여 Teensy를 USB Storage처럼 사용해보자! (0) | 2020.05.12 |
국세청 홈택스 종합소득세 신고를 잘못한 경우 신고서 수정 방법
종합소득세 신고 완료 버튼을 누르자마자 종합소득세 신고를 잘못했다는 것을 깨달았다면 어떻게 할까요? 신고를 한 지 오랜 시간이 지났다면, 절차가 복잡해질 수 있습니다. 하지만 종합소득세 신고 직후에 실수를 깨달았다면, 그냥 다시 바로 신고서를 작성하면 됩니다. 바로 [종합소득세 신고] 탭으로 이동해서 [정기신고 작성] 버튼을 눌러 신고서를 다시 작성합시다.

종합소득세 신고서를 처음부터 다시 작성을 하면되는데요. 기본적으로 [신고서 불러오기] 버튼을 눌러서 이전 신고서가 저장되어 있다면, 이를 참고해서 더욱 간편하게 재작성을 할 수 있습니다.

일단 이미 "신고서 작성완료"라고 나오는 제출된 신고서의 경우에는 이전에 처리가 완료된 신고서라고 보시면 됩니다. 한 번 이 신고서를 [열기] 하려고 시도해보겠습니다.

그러면 다음과 같이 안내 메시지가 나옵니다. "신고기한 내에 신고서를 수정하여 다시 제출하고자 하는 경우에는 [작성화면]에서 사업자(주민)등록번호와 과세기간으로 조회하여 재작성"하면 된다고 나오는 것을 확인할 수 있습니다.

쉽게 말하면, 그냥 작성 자체를 다시하면 됩니다. 따라서 한 번 처음부터 작성을 다시 해보겠습니다.

여차저차 해서 다시 신고서 제출까지 완료하게 되면 다음과 같은 화면이 나옵니다. 정상적으로 새롭게 작성된 신고서로 신고가 완료된 것을 확인할 수 있습니다.

이후에 [신고내역] 탭을 확인하면 다음과 같이, 신고한 내용이 성공적으로 변경된 것을 알 수 있습니다.

'기타' 카테고리의 다른 글
| Teensy에서 쓰레드(Thread) 사용 방법 (0) | 2020.06.19 |
|---|---|
| 대학원생/유튜버/강사를 위한 종합소득세 납부 방법 (전체 과정 사진 첨부) (2) | 2020.05.22 |
| 하나의 아두이노 USB 장치(Device)가 여러 기능(Interface)를 제공하는 방법 (1) | 2020.05.18 |
| MTP(Media Transfer Protocol) 라이브러리를 이용하여 Teensy를 USB Storage처럼 사용해보자! (0) | 2020.05.12 |
| USB(Universal Serial Bus) 프로토콜의 기초 지식 (0) | 2020.05.11 |
하나의 아두이노 USB 장치(Device)가 여러 기능(Interface)를 제공하는 방법
USB 장치(Device)는 기본적으로 동시에 여러 개의 인터페이스(Interface)를 제공할 수 있다. 여기에서 인터페이스라는 것은 하나의 기능을 의미한다. 예를 들어 하나의 USB 기기가 동시에 마우스이면서 키보드가 되도록 할 수 있다. 실제로 USB 장치를 꽂기만 하면 마우스(Mouse)가 마음대로 동작하고, 그와 동시에 키보드(Keyboard)로 무작위로 아무 내용이나 입력이 되도록 할 수도 있다.
아두이노(Arduino) IDE를 따르는 Teensy Board를 기준으로 설명하겠다. Teensy Board는 아두이노 IDE에서 [USB Type]을 설정할 수 있다. [USB Type]으로 [Keyboard]를 설정하는 경우, Teensy Board가 "Keyboard" 인터페이스를 가지는 USB 기기가 되는 것이다. 이를 선택하면 자동으로 USB Descriptor에 Keyboard 인터페이스 정보가 담기게 된다.

예를 들어 다음과 같이 [USB Type]으로 [All of the Above]를 설정하는 경우, 동시에 10개가 넘는 인터페이스를 제공할 수 있다. 호스트(Host) PC는 Teensy Board의 각 인터페이스와 통신하면서 Teensy Board가 의도했던 기능이 수행되는 것이다.

그렇다면, 이러한 인터페이스 정보는 어디에 기록되어 있는 것을까? Teensy Board의 경우 아두이노 IDE 위에서 동작하기 때문에, 기본적인 설정 정보는 다 아두이노(Arduino)가 설치된 폴더에 존재한다.
구체적으로 인터페이스 환경설정 내용은 usb_desc.h에 기록되어 있는데, 이것은 다음의 경로에 존재한다.
C:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy3

실제로 usb_desc.h 파일을 열어 보면, "USB_EVERYTHING"으로 정의된 매크로를 확인할 수 있다. 실제로 Teensy Board의 [USB Type]을 "All of the Above"로 설정하면 "USB_EVERYTHING" 매크로가 활성화된다.

이 경우 Keyboard, Serial, Mouse 등 다양한 라이브러리를 사용할 수 있다. 바로 다음과 같이 코드를 작성해도 정상 동작하는데, 말 그대로 마우스/키보드/시리얼 등이 동시에 동작하는 하나의 USB 장치를 만들 수 있는 것이다.
void setup() {
}
void loop() {
int i;
for (i = 0; i < 40; i++) {
Mouse.move(2, -1);
delay(100);
}
delay(1000);
Serial.println("Hello");
Keyboard.print("Hello World");
}
'기타' 카테고리의 다른 글
| 대학원생/유튜버/강사를 위한 종합소득세 납부 방법 (전체 과정 사진 첨부) (2) | 2020.05.22 |
|---|---|
| 국세청 홈택스 종합소득세 신고를 잘못한 경우 신고서 수정 방법 (0) | 2020.05.22 |
| MTP(Media Transfer Protocol) 라이브러리를 이용하여 Teensy를 USB Storage처럼 사용해보자! (0) | 2020.05.12 |
| USB(Universal Serial Bus) 프로토콜의 기초 지식 (0) | 2020.05.11 |
| USB 프로토콜의 전송 형태(Transfer Type)에 대해서 알아보자! (0) | 2020.05.11 |
MTP(Media Transfer Protocol) 라이브러리를 이용하여 Teensy를 USB Storage처럼 사용해보자!
Teensy Board는 USB 디바이스 개발을 위한 소형 보드(Board)이다. 사실 Teensy에 올라갈 펌웨어 개발 자체를 아두이노(Arduino) IDE를 이용해서 진행하므로, 아두이노 보드랑 사실상 유사하다. Teensy는 USB 디바이스 개발과 관련한 것에 초점이 더 맞추어져 있긴 한데, 아무튼 아두이노랑 기능적으로 비슷한 일을 할 수 있다.
Teensy 3.5나 3.6 버전의 경우 SD 카드 슬롯(Slot)이 있기 때문에 SD 카드를 꽂을 수 있다. 그래서 SD 카드에 있는 파일을 읽거나, 혹은 SD 카드에 파일을 쓰는 것이 가능하다.

그렇다면 Teensy Board 자체를 USB Storage처럼 사용할 수 있을까? Teensy Board를 우리의 호스트(PC)에 꽂으면, 호스트 PC가 이를 USB Storage로 인식하여 파일을 주고 받도록 하고 싶다고 가정해보자. 이 때 사용할 수 있는 라이브러리 중에서 MTP (Media Transfer Protocol)이 있다.
MTP란 일종의 USB 클래스 중 하나이다. 하는 역할 자체는 MSC (Mass Storage Class)와 유사한데, 호스트 PC와 많은 양의 데이터를 주고 받기 위해 사용한다. 다만, 기본적으로 Mass Storage는 호스트 PC가 마운트를 하고 나면, 해당 USB 저장 장치에 대해서 절대적인 제어권을 가지게 된다. MSC는 블록 인터페이스 수준에서 동작하기 때문이다. 반면에 MTP는 논리적인 파일 수준의 송수신이 가능하다. 심지어 특정한 파일에 접근할 때는 암호를 입력하도록 설정할 수도 있다. 그래서 호스트 PC에서 특정한 파일만 가져가도록 할 수도 있는 것이다.
아무튼 기본적으로 MTP는 미디어 파일 같은 것을 옮기기 위한 목적으로 설계되었다. Teensy의 경우에는 MTP 라이브러리가 있어서, 이를 이용할 수 있다. 한 번 Teensy Board를 USB 저장 장치처럼 사용해보자.
※ Teensyduino에서 MTP Disk 타입 설정 ※
아두이노에서 보드(Board)를 Teensy로 설정하자. 이후에 이러한 Teensyduino에서는 USB Type으로 MTP Disk를 선택할 수 있다. 아래 그림을 확인해보자. 하지만 정작 이렇다할 MTP 라이브러리 사용 예제는 보이지 않는다.

애초에 MTP 기능을 이용하기 위해서는 관련 라이브러리가 존재해야 한다. 아두이노 설치 경로인 C:\Program Files (x86)\Arduino에 MTP 라이브러리가 있는지 확인을 해보면, 존재하지 않는다. 그러면 MTP 기능은 어떻게 사용하라는 건지 궁금해진다. 바로 MTP 라이브러리를 '사용자 라이브러리'로 추가해주어야 한다.
기본적으로 다음의 두 라이브러리가 필요하다.
* SDFat 라이브러리: 아두이노 SDFat 라이브러리는 아두이노 기기에 꽂혀 있는 SD 카드의 FAT16/FAT32 파일 시스템에 접근하도록 해주는 기능을 제공하는 라이브러리다.
* MTP 라이브러리: 아두이노 MTP 라이브러리는 아두이노 기기에 꽂혀 있는 SD 카드에 호스트(Host) PC가 접근할 수 있도록 해주는 인터페이스 기능을 제공하는 라이브러리다.
따라서 두 작업을 해주자.
1) 아두이노 사용자 라이브러리에 SDFat 라이브러리 추가
2) 아두이노 사용자 라이브러리에 MTP 라이브러리 추가
일단 두 라이브러리는 별도로 GitHub에 올려 놓았으니, 이를 받아줄 수 있도록 한다.
https://github.com/ndb796/Teensy-MTP-Library
이제 이 두 라이브러리 폴더를 아두이노 스케치북 위치에 저장해주면 된다. 여기에서 스케치(Sketch)란, 아두이노 IDE를 이용해 작성된 프로그램을 의미한다. 사용자 라이브러리 경로(스케치북 경로)는 어디일까? 바로 아두이노에서 [파일] - [환경설정]에 들어가면 된다.

필자의 경우에는 C:\Users\dongbin\Documents\Arduino\libraries에 라이브러리를 넣어주면 된다.

이제 해당 경로에 다음과 같이 MTP 라이브러리, SdFat 라이브러리 폴더를 놓아 두었다. 각 라이브러리 폴더에는 규격에 맞게 라이브러리의 내용이 구현되어 있다.

이제 다음의 예제 소스코드를 아두이노 IDE에 넣고 실행할 수 있다.
/*
This example demonstrates MTP with blinky using systick interrupt.
This example tests MTP and SdFat
*/
#include <MTP.h>
MTPStorage_SD storage;
MTPD mtpd(&storage);
volatile int status = 0;
volatile bool sdfound = 0;
volatile int count = 1;
void rtc_seconds_isr() {
if (count-- == 0) {
digitalWrite(LED_BUILTIN, status);
Serial.println("I should be commented out");
status = !status;
if (sdfound)
count = 2;
else
count = 1;
}
}
void setup() {
Serial.begin(19200);
pinMode(LED_BUILTIN, OUTPUT);
RTC_IER |= 0x10; // Enable seconds IRQ from RTC peripheral
NVIC_ENABLE_IRQ(IRQ_RTC_SECOND); // Enable seconds IRS function in NVIC
}
void loop() {
if (SD.begin()) {
sdfound = true;
mtpd.loop();
}
else {
sdfound = false;
}
}
다음과 같이 [스케치] - [업로드]를 눌러서 업로드를 진행할 수 있다. 업로드를 진행하면 경고 메시지가 나올 수 있지만, 다음과 같이 정상적으로 Teensy 프로그램이 업로드된다.

이제 이 Teensy Board를 PC에 꽂으면 다음과 같이 MTP 디바이스로 인식하게 된다.

만약 컴파일(Compile) 단계에서 다음과 같은 경고 메시지가 나온다면, 경고 메시지를 지우기 위해서는 어떻게 해야 되는지 알아보자.

우리가 추가한 MTP.h 라이브러리 파일에서 OpenFileByIndex 함수 부분의 uint8_t mode = O_RDONLY를 oflag_t mode = O_RDONLY로 변경하면 경고 메시지가 사라진다.

위와 같이 MTP.h 내용을 수정한 뒤에 다시 컴파일을 하면 다음과 같이 깔끔하게 컴파일이 진행된다.

※ Teensy에서 MTP 라이브러리가 동작하는 원리 ※
이제 간단히 MTP 라이브러리의 동작 원리를 알아보자. MTP 라이브러리는 동작 과정에서 SDFat 라이브러리를 이용하며, 호스트 PC에서 Teensy Device에 접근하도록 했을 때 호스트 PC 입장에서는 마치 USB Mass Storage와 유사한 기능을 이용하는 것처럼 느끼게 해준다. (실제로는 Teensy의 MTP Interface를 거치는 것이므로, Teensy 입장에서는 공개하고 싶은 파일만 호스트 PC가 접근할 수 있도록 처리할 수 있는 것이다.)
실제로 MTP 라이브러리의 코드 (MTP.h)를 뜯어 보면, USB 관련 헤더 (이 라이브러리는 아두이노 설치 폴더의 hardware/avr/cores 폴더에 구현되어 있다.)에서 USB 주요 기능을 가져와서 USB 패킷을 주고 받는 방식으로 동작하도록 구현되어 있다. (정확히는 usb_dev.h 파일을 참조한다.)

아무튼 이렇게 다른 사람이 만들어 놓은 MTP.h 라이브러리가 있어서, 내 Teensy Board를 손쉽게 MTP 디바이스처럼 만들어 사용할 수 있었다. 이 밖에도 다양한 외부 라이브러리가 있으므로 필요한 것들은 찾아서 붙이면 된다. (만약 없다면, 직접 코어 라이브러리를 작성하면 될 것이다.)
'기타' 카테고리의 다른 글
| 국세청 홈택스 종합소득세 신고를 잘못한 경우 신고서 수정 방법 (0) | 2020.05.22 |
|---|---|
| 하나의 아두이노 USB 장치(Device)가 여러 기능(Interface)를 제공하는 방법 (1) | 2020.05.18 |
| USB(Universal Serial Bus) 프로토콜의 기초 지식 (0) | 2020.05.11 |
| USB 프로토콜의 전송 형태(Transfer Type)에 대해서 알아보자! (0) | 2020.05.11 |
| SD 카드의 파일(이미지, 동영상)이 삭제되어 있고 정체 불명의 파일(깨진 파일)이 존재할 때, 복구 방법 (6) | 2020.05.06 |
USB(Universal Serial Bus) 프로토콜의 기초 지식
USB(Universal Serial Bus)란?
USB는 어떠한 주변기기(Device)라도 우리의 PC에 쉽게 붙여서 동작하도록 지원해주는 규격이다. 예를 들어 마우스, 키보드, 이어폰 등은 일반적으로 공통적으로 USB 프로토콜을 쓰고 있다. 또한 스토리지(Storage), 스마트 폰 등도 USB 규격을 이용해서 연결하도록 제공이 되는 것을 생각해보면 된다.
USB 2.0 버전 이상에서는 초당 수십 MB 단위의 데이터를 송수신할 수 있으며, 하나의 PC에 매우 많은 USB 디바이스를 연결해도 문제가 없다. 우리는 흔히 컴퓨터를 이용할 때, PC에 마우스, 키보드, 이어폰을 모두 연결하여 사용하곤 한다. 그럼에도 불구하고 전혀 문제는 점을 떠올리면 된다.
심지어 각 기기에 전원을 공급할 필요도 없다. USB를 꽂기만 하면, PC에서 마우스나 키보드에 전원도 공급해주기 때문이다. 또한 PC에 USB 포트의 개수가 적다고 하더라도, USB 허브를 별도로 구매해서 포트의 개수를 늘리면 그만이다. 이러한 장점들이 있기 때문에 USB는 두루 쓰이고 있는 것이다.
USB의 전원 공급
앞서 USB는 꽂기만 해도 PC에서 USB 장치에 전원을 공급한다고 했는데, 이것이 가능한 이유는 USB에는 4가지 선이 있기때문이다. 2개의 선(D+, D-)은 호스트와 디바이스 간의 데이터를 주고 받기 위해 사용하고, 2개의 선(Vbus, GND)은 전원을 공급하기 위해 사용한다.

디바이스 클래스(Device Class)
USB 디바이스를 식별할 때는 벤더(Vendor) ID와 프로덕트(Product) ID를 가지고 식별한다. 하지만, 별도로 클래스로 묶어서 이를 처리하는 경우가 대부분이다. 예를 들어 마우스, 키보드 등의 디바이스를 개발할 때는 처음부터 디바이스 드라이버를 다 작성할 필요는 없고, 이미 존재하는 HID (Human Interface Device) 클래스의 기능을 그대로 이용하면 된다.
예를 들어서 Arduino나 Teensy 등을 이용해서 자체제작 키보드를 만들거나 할 수 있는데, 이 경우 HID 클래스의 기능을 그대로 이용해서 개발하는 것이 편할 것이다.
기본 용어 정리
▶ 패킷(Packet): 호스트와 디바이스간의 통신에서 가장 작은 통신 데이터 단위
▶ 트랜잭션(Transaction): 패킷들의 모임을 의미한다. SETUP 패킷, DATA 패킷, HANDSHAKE 패킷 세가지의 종류가 있다. 이렇게 3가지를 모두 묶어서 한 번씩 데이터가 오가는데, 이러한 패킷 묶음을 트랜잭션이라고 한다.
▶ 전송(Transfer): 트랜잭션의 모임을 의미한다. 예를 들어 Bulk Transfer는 한 번의 트랜잭션으로 끝날 수 없고, 여러 번 트랜잭션을 반복해야 한다. 이 경우 보내야 할 데이터가 크기 때문에 여러 프레임(Frame)으로 나누어서 전송하거나 할 수 있다.
USB 디스크립터(Descriptor)
USB 디바이스(Device)에 대한 기본적인 정보는 디스크립터(Descriptor)가 가지고 있다. USB를 PC에 꽂으면, 설정(Configuration) 정보를 주고 받는데, 이 때 Descriptor 정보를 보내게 되는 것이다. 이로써 호스트는 연결된 디바이스의 종류를 알게 되고, 디바이스의 특성에 맞게 데이터의 전송 양이나 폴링 주기를 설정하게 된다.
디스크립터(Descriptor)에는 여러 종류가 있다. USB 정보를 호스트 PC에 디스크립터 정보를 보내는 데에, 왜 이렇게 많은 종류가 필요한지 궁금할 수 있다. 이것은 USB가 다양한 기능을 지원할 수 있다는 점에서 기인한다. 실제로 하나의 USB 장치는 동시에 마우스이면서, 동시에 키보드이면서, 동시에 조이스틱이 될 수도 있다.
Device Descriptor, Configuration Descriptor, Interface Descriptor, Endpoint Descriptor 이렇게 네 가지 종류가 있다고 보면 된다. 아래 그림과 같이 트리(Tree) 구조로 되어 있다. Device Descriptor는 오직 하나만 존재하고, 이는 여러 개의 Interface Descriptor (마우스, Stroage, 키보드 등)를 가질 수 있다. 또한 하나의 Interface는 여러 개의 Endpoint (데이터를 주고 받는 통로)를 가지게 된다.

▶ 디바이스 디스크립터(Device Descriptor): 디바이스에 대한 가장 기본적인 정보를 담고 있음
* USB 디바이스는 하나의 Device Descriptor를 가진다.
* ProductID와 VenderID 정보가 담겨 있다.
* 얼마나 많은 Configuration을 가지고 있는지에 대한 정보가 담겨 있다.
* 클래스(Class) 정보가 담겨 있다.
▶ 환경설정 디스크립터(Configuration Descriptor): 환경 설정 관련 정보를 가지고 있음
* USB 디바이스는 여러 개의 Configuration Descriptor를 가질 수 있다.
* 인터페이스(Interface)의 개수, 전력 소비 정보 등의 정보가 담겨 있다.
* 하나의 USB 디바이스는 일반적으로 하나의 Configuration을 가지고 있다.
* 여러 개의 전원 공급망을 가진 특별한 USB 디바이스의 경우 여러 개의 Configuration이 존재하는 경우가 있다.
▶ 인터페이스 디스크립터(Interface Descriptor): 한 가지 기능에 대한 정보를 가지고 있음
* 하나의 USB 디바이스는 여러 개의 기능을 제공할 수 있다. (마우스 + 키보드 + 스캐너)
* 각 기능마다 하나의 인터페이스(Interface)를 할당한다.
* 인터페이스 번호, 엔드포인트의 개수 등의 정보가 담겨 있다.
* 하나의 인터페이스는 여러 개의 엔드포인트(Endpoint)를 가질 수 있다.
* 예를 들어 마우스이면서 Mass Storage의 기능을 제공하려면 Interface는 2개가 될 것이다.
▶ 엔드포인트 디스크립터(Endpoint Descriptor): 하나의 엔드포인트에 대한 정보를 가지고 있음
* 실제로 호스트와 디바이스간의 통신이 이루어지는 통로 (소켓과 유사함)
* 통로라는 의미에서 파이프(Pipe)라고 말하기도 한다.
* 엔드포인트(Endpoint)의 번호, 전송 타입(Transfer Type), 방향성 등의 정보가 담겨 있다.
* 엔드포인트의 전송 타입: Control, Interrupt, Isochronous or Bulk와 같은 타입이 있다.
* 기본적으로 엔드포인트 0번은 디폴트로 Control 타입으로 사용된다.
USB Enumeration
USB Enumeration이란 새로운 디바이스(Device)가 Bus에 연결이 되었는지 감지한 뒤에 그 디바이스를 인식하고, 적절한 드라이버를 로드하는 작업을 의미한다. 이를 위해 당연히 적절한 USB Driver를 Host 쪽에서 가지고 있어야 한다.
USB Device가 PC에 꽂히게 되면, Host Controller는 Device의 0번 엔드포인트에게 정보를 요청한다. (이 때는 임시 Address를 이용한다.) 이 때 호스트는 디바이스 디스크립터(Device Descriptor) 정보를 받게 된다. 이후에 해당 Device에게 적절한 Address를 할당하고, 그 Address를 이용하여 나머지 Descriptor 정보를 요청한다. 결과적으로 모든 Descriptor 정보를 받고 나면 Enumeration 과정이 종료된다.
'기타' 카테고리의 다른 글
| 하나의 아두이노 USB 장치(Device)가 여러 기능(Interface)를 제공하는 방법 (1) | 2020.05.18 |
|---|---|
| MTP(Media Transfer Protocol) 라이브러리를 이용하여 Teensy를 USB Storage처럼 사용해보자! (0) | 2020.05.12 |
| USB 프로토콜의 전송 형태(Transfer Type)에 대해서 알아보자! (0) | 2020.05.11 |
| SD 카드의 파일(이미지, 동영상)이 삭제되어 있고 정체 불명의 파일(깨진 파일)이 존재할 때, 복구 방법 (6) | 2020.05.06 |
| 가상 번호 만들어서 카카오톡 계정 2개 사용하기 (+ 카카오톡 계정 전화번호 교체 방법) (2) | 2020.05.05 |
