├── .github
└── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── CONTRIBUTING.md
├── README.md
├── learn
├── git
│ └── cli
│ │ ├── 1. 시작.md
│ │ ├── 2. 기초.md
│ │ └── 3. 기초 실습.md
├── github
│ ├── 1. Issue template.md
│ └── cli
│ │ ├── 1. Github CLI란.md
│ │ └── 2. 리포지토리 명령어.md
├── gitlab
│ └── cli
│ │ └── 1. Gitlab CLI란.md
├── kotlin
│ ├── 1. 시작.md
│ └── 2. 기초 문법.md
├── spring
│ ├── 1. spring boot
│ │ ├── 1. 시작.md
│ │ └── 2. 설치하기.md
│ ├── 2.spring data
│ │ └── 1. 시작.md
│ └── spring data
│ │ └── jpa
│ │ └── 1. 내부속성 접근 방법.md
└── sql
│ ├── 1. SQL의 시작.md
│ ├── 2. 명령어의 분류.md
│ └── 3. 데이터 타입.md
├── pr.js
└── public
├── contributing-1.PNG
├── contributing-2.PNG
├── contributing-3.PNG
├── contributing-4.PNG
├── contributing-5.PNG
├── git-github-issue-template-1.png
├── git-github-issue-template-2.png
├── git-github-issue-template-3.png
├── git-github-issue-template-4.png
├── git-github-issue-template-5.png
├── git-github-issue-template-6.png
├── git-github-issue-template-7.png
├── git-github-issue-template-8.png
├── github-cli-1.png
├── lean-git-cli-3-1.PNG
├── learn-spring-1.png
├── learn-spring-2.png
├── learn-spring-3.png
├── spring-springboot-1.png
└── spring-springdata-1.png
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | ## 🎲 개요
2 |
3 | ## 📚 작업내용
4 |
5 | ## 🔀 변경사항
6 |
7 | ## 🤔 사용방법
8 |
9 | ## 🎸 기타
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .obsidian
2 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # 기여 가이드
2 |
3 | ## 주의사항
4 | ### PR 요청에 응답이 늦더라도 이해해주세요.
5 | 메인테이너가 프로젝트를 항상 확인하고 있을 수 없습니다.
6 |
7 | ### 다른 사람의 컨텐츠를 무단으로 복제하지 마세요.
8 | 다른 사람이 작성한 포스팅을 무단으로 그대로 복사해 올리지 마세요.
9 | 다른 사람의 컨텐츠를 옮길때는 작성한 사람의 허가를 구하고 작성해주세요.
10 |
11 | ## 기여
12 | 오픈소스 컨트리뷰션은 꼭 대단한 일을 할 필요가 없습니다.
13 | 문서의 오타, 잘못된 번역을 고치는 것도 기여이며
14 | 더욱 많은 사람이 참여할 수 있도록 가이드 문서 작성이나 개선하는 것도 좋은 기여가 될 수 있습니다.
15 |
16 | ## 기여 방법
17 | 1. 자신의 계정으로 Repository 를 포크(Fork) 하는것으로 시작합니다.
18 | 
19 |
20 | 2. 자신의 계정에 포크(Fork) 했다면 해당 Repository 를 클론(Clone)합니다.
21 | 
22 |
23 | 3. 문서를 작성하거나 수정하며 이미지 파일 첨부가 필요하다면 public 폴더에 추가합니다.
24 |
25 | 4. PR 요청 전에 자신의 Repository가 원본 Repositry 보다 최신 상태인지 확인합니다.
26 | 최신 상태라면 수정된 내용을 Push 하고 Pull requests 탭에서 New pull request 를 클릭합니다.
27 | 
28 |
29 | 5. 다시 확인 후 Create pull request 를 클릭합니다.
30 | 
31 |
32 | 6. PR 양식에 맞게 작성한 내용을 간략하게 작성하고 Create pull request 를 클릭합니다.
33 | 
34 |
35 | 7. 메인테이너의 검토를 기다립니다. 메인테이너가 확인 후 main 브랜치에 병합됩니다.
36 | 여러분의 기여에 감사합니다.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | # Tutorics
3 | ## 오픈소스 강의 서비스
4 |
5 | **Tutorics**는 오픈소스 강의 서비스로써
6 | 모든 개발자들에게 동등한 배움의 기회를 주기 위해 만들어졌습니다.
7 |
8 | 실제로 모두가 PR을 통해 강의 서비스에 기여할 수 있으며
9 | 이를 통해 가르침의 경험 또한 얻을 수 있습니다.
10 |
11 | 우리 Qilte 팀은 개발자의 가치를 창출하고 가치를 높이기 위해
12 | 다양한 활동을 앞으로도 이어나갈 예정입니다.
13 |
14 | 해당 리포지토리에서 새로운 경험을 시작해 보세요.
15 | https://github.com/xolving/tutorics-docs
16 |
17 | ## 참고
18 | 윈도우 OS 를 사용할 경우 파일명에 ? 가 있어 클론에 실패 할 수 있습니다.
19 | (예시 github/cli/1. Github CLI를 아시나요?.md)
20 |
21 | # 기여
22 | [CONTRIBUTING.md](./CONTRIBUTING.md)를 참고해주세요.
--------------------------------------------------------------------------------
/learn/git/cli/1. 시작.md:
--------------------------------------------------------------------------------
1 | # 1. Git 시작
2 |
3 | ## 1.1 Git 이란?
4 | VCS (Version Control System, 버전 관리 시스템) 중 하나로 파일의 변경사항을 기록(commit)하고 원격 서버에 반영(push)함으로써 다수의 사용자가 효율적으로 최신 소스를 유지할 수 있습니다.
5 | 커밋 메시지 컨벤션을 정해두면 히스토리 관리가 용이하고 브랜치를 분리함으로 메인 개발과 버그 픽스를 동시에 진행 할 수 있는 등의 이점이 있습니다.
6 |
7 | ## 1.2 Git 과 깃허브의 관계
8 | 깃허브와 Git을 혼용해서 사용하는 경우도 있지만 보통 Git은 위에서 설명하듯 버전 관리 시스템(프로그램) 이며 깃허브는 그 버전 관리 파일 (.git) 을 호스팅해주는 Git 호스팅 서비스 입니다.
9 | Git 의 버전관리를 위해서 깃허브가 꼭 필요한 것은 아니며 Gitlab 등 다른 Git 호스팅을 사용하거나 보안상 외부 네트워크 접속이 불가능한 폐쇄망에서도 내부에 Git 호스팅 서버를 설치할 경우 동일하게 여러 사람이 원격저장소에 접근해서 최신 소스 코드를 유지 할 수 있습니다.
10 |
11 | ## 1.3 깃을 사용하기 위한 준비
12 | git 은 기본 제공되는 프로그램이 아니기 때문에 별도의 설치가 필요합니다.
13 | [git-scm downloads](https://git-scm.com/downloads) 페이지에서 OS 에 맞는 파일을 다운받아 설치하면 됩니다.
--------------------------------------------------------------------------------
/learn/git/cli/2. 기초.md:
--------------------------------------------------------------------------------
1 | # 2. Git 기초
2 |
3 | Git 사용시 필요한 최소한의 커멘드를 학습합니다.
4 |
5 | ## Init
6 | 현재 디렉터리에 Git 저장소를 초기화 합니다. (.git 생성)
7 | 대부분 커멘드는 로컬 저장소가 초기화 되어야 사용 가능합니다.
8 |
9 | ```
10 | git init
11 | ```
12 |
13 | ## Remote add
14 | 원격 저장소를 추가합니다.
15 | 원격저장소 별칭으로 origin 을 주로 사용합니다.
16 |
17 | ```
18 | git remote add {remote_alias} {remote_url}
19 | ```
20 |
21 | ## Clone
22 | 원격 저장소를 현재 디렉터리에 내려받습니다.
23 | 이미 생성된 Git 저장소를 내려받기 때문에 git init 이 필요하지 않습니다.
24 |
25 | ```
26 | git clone {remote_url}
27 | ```
28 | ## Add
29 | workspace 에서 작업중인 파일을 index(stage)에 추가합니다.
30 |
31 | ```
32 | git add {filePath}
33 | ```
34 | ## Commit
35 | index(stage) 에 추가된 파일을 로컬 저장소에 반영합니다.
36 |
37 | ```
38 | git commit -m {commit message}
39 | ```
40 | ## Push
41 | 로컬 저장소의 변경사항을 원격 저장소에 반영(업로드) 합니다.
42 |
43 | ```
44 | git push
45 | ```
46 | ## Pull
47 | 원격 저장소의 변경사항을 로컬 저장소에 반영(다운로드) 합니다.
48 |
49 | ```
50 | git pull
51 | ```
52 | ## Config user
53 |
54 | Git 커밋에 사용할 사용자 이름과 이메일을 설정합니다.
55 |
56 | ```
57 | git config user.name {user_name}
58 | git config user.email {user_email}
59 | ```
60 |
61 | Git 커밋에 사용되는 사용자 이름과 이메일을 확인합니다.
62 | ```
63 | git config user.name
64 | git config user.email
65 | ```
--------------------------------------------------------------------------------
/learn/git/cli/3. 기초 실습.md:
--------------------------------------------------------------------------------
1 | # 3. Git 기초 실습
2 |
3 | ## 3.1 Init
4 |
5 | 실습을 위해 git-test 라는 디렉터리를 생성합니다.
6 | ```
7 | @:~/workspace$ mkdir git-test
8 | ```
9 |
10 | 생성한 git-test 디렉터리로 이동합니다.
11 | ```
12 | @:~/workspace$ cd git-test
13 | ```
14 |
15 | 새로 생성된 디렉터리 내부를 보면 아무 파일도 없습니다.
16 | ```
17 | @:~/workspace/git-test$ ls -al
18 | total 8
19 | drwxr-xr-x 2 abc abc 4096 Oct 17 13:42 .
20 | drwxr-xr-x 4 abc abc 4096 Oct 17 13:42 ..
21 | ```
22 |
23 |
24 | 깃을 초기화 합니다.
25 | ```
26 | @:~/workspace/git-test$ git init
27 | ```
28 |
29 | 깃 저장소(로컬)를 초기화하면 디렉터리 내부에 .git 파일이 생성된 것을 확인할 수 있습니다.
30 | 이 .git 파일 내부에 실제 버전관리를 위한 REF, COMMIT, TERE, BLOB 파일들이 위치하게 됩니다.
31 |
32 | 실제 파일 구조를 알 필요는 없습니다만 .git 은 버전관리를 위해 꼭 필요한 파일이므로 삭제할 경우 다시 초기화 할때까지 버전관리를 할 수 없고 기존 기록이 삭제됩니다.
33 | ```
34 | @:~/workspace/git-test$ ls -al
35 | total 12
36 | drwxr-xr-x 3 abc abc 4096 Oct 17 13:43 .
37 | drwxr-xr-x 4 abc abc 4096 Oct 17 13:42 ..
38 | drwxr-xr-x 7 abc abc 4096 Oct 17 13:43 .git
39 | ```
40 |
41 | ## 3.2 Remote add
42 |
43 | 리포지터리(로컬)이 초기화된 직후에는 원격서버가 등록되어 있지 않기 때문에 push 를 할 수 없습니다.
44 |
45 | 많은 사람들이 Git에 대해 설명하라고 하면 Github 특징을 설명하는 경우도 보이는데 원격서버 없이 .git 파일만으로 버전관리를 할 경우 원격서버(깃허브 등)를 등록할 필요는 없습니다.
46 |
47 | git remote add 로 원격 저장소 주소를 등록할 수 있습니다.
48 |
49 | 먼저 원격서버를 호스팅해줄 깃허브(깃랩, 비트버킷 등)에서 빈 저장소를 생성하도록 합니다.
50 |
51 | github cli 를 사용해서 생성할 수도 있고 웹페이지에서 생성할 수 있습니다.
52 |
53 | 
54 |
55 | 등록시 remote_url 은 실제 저장소 위치를 작성해야 하며 remote_alias(별칭)은 자유롭게 작성 할 수 있지만 대부분 영문으로 작성하며 origin 이라는 이름을 많이 사용합니다.
56 |
57 | ```
58 | git remote add {remote_alias} {remote_url}
59 | ```
60 |
61 | 당장의 변화는 없지만 .git/config 파일에 remote url 이 설정됩니다.
62 |
63 | 등록된 원격 저장소 주소는 pull, push, fetch 등에 사용됩니다.
64 |
65 | ## 3.3 Clone
66 |
67 | 원격 저장소 파일을 자신의 로컬에 복제합니다.
68 |
69 | 기본적으로 원격 저장소를 복제하고 참조하므로 init, remote add 가 필요하지 않습니다.
70 |
71 | ```
72 | git clone {remote_url}
73 | ```
74 |
75 | ## 3.4 Add
76 |
77 | 정리중
78 |
79 | ## 3.5 Commit
80 |
81 | 정리중
82 |
83 | ## 3.6 Push
84 |
85 | 정리중
86 |
87 | ## 3.7 Pull
88 |
89 | 정리중
--------------------------------------------------------------------------------
/learn/github/1. Issue template.md:
--------------------------------------------------------------------------------
1 | 1. 이슈 템플릿을 추가할 리포지토리의 Settings에 들어간다.
2 |
3 | 
4 |
5 | 2. General 탭에서 밑으로 스크롤하면 Features - Issues - Set up templates를 클릭한다.
6 |
7 | 
8 |
9 | 3. Add template를 누르고 원하는 유형을 선택한다.
10 |
11 | 
12 |
13 | # Cusom template의 경우
14 | Preview and edit을 클릭하고 연필 모양을 눌러서 편집할 수 있다.
15 |
16 | 
17 |
18 | 
19 |
20 | 다음은 예시로 작성한 템플릿이다. 다 작성했다면 초록색 버튼(Propose changes)를 눌러주자.
21 | 그리고 커밋을 진행하면 된다.
22 |
23 | 
24 |
25 | 이제 해당 리포지토리에서 Issues를 누르고 new Issue를 해보면 우리가 만든 템플릿을 볼 수 있다.
26 |
27 | 
28 |
29 | 
30 |
--------------------------------------------------------------------------------
/learn/github/cli/1. Github CLI란.md:
--------------------------------------------------------------------------------
1 | 기존에 Github Desktop을 사용해서 클론하거나 푸시하는 것은 많이 봤지만, Github CLI는 많이 쓰이지 않는 것 같아서 강의를 만들게 되었습니다.
2 |
3 | # 1.1. Github CLI 설치하기
4 | [여기](https://github.com/cli/cli/releases/tag/v2.36.0)를 클릭해서 다운로드 사이트로 들어갈 수 있습니다.
5 | 
6 | 자신의 컴퓨터에 맞는 버전을 골라서 다운로드하고 나면
7 | 이제 ```gh```라는 명령어를 사용해서 Github CLI를 사용할 수 있습니다.
8 |
9 | # 1.2. 명령어 사용해보기
10 |
11 | 터미널을 실행해서 한번 리포지토리를 클론해보겠습니다. 그전에 로그인을 해야합니다.
12 | ```gh auth login```을 통해 로그인을 진행해주세요.
13 |
14 | 다음의 명령어를 통해 리포지토리를 복사해올 수 있습니다. 리포지토리 이름만 입력한다면 자기 계정의 리포지토리로 인식하고 내아이디/TIL과 같이 인식됩니다.
15 | ```
16 | gh repo clone TIL
17 | ```
18 |
19 | 만약에 다른 사람이나 팀의 리포지토리를 가져오고 싶다면 앞에 아이디나 팀의 이름을 적어주면 됩니다.
20 | ```
21 | gh repo clone xolving/tutorics
22 | ```
23 | 이렇게 입력한다면 xolving 팀의 tutorics 리포지토리를 가져오게 되는 겁니다.
--------------------------------------------------------------------------------
/learn/github/cli/2. 리포지토리 명령어.md:
--------------------------------------------------------------------------------
1 | # gh status
2 | 계정의 상태를 확인할 수 있습니다. (이슈, 리뷰 요청, 멘션 등)
3 | # gh repo view
4 | 해당 리포지토리를 보여주는 명령어로 README 등이 표시됩니다.
5 | 1편에서와 같이 ```gh repo view TIL``` 와 같이 자신의 리포지토리라면 리포지토리만 입력해주고, 다른 사람, 팀의 리포지토리라면 TEAM/REPO 형태로 입력해주면 됩니다. Ex) ```gh repo view xolving/tutorics```
6 | - --view: 웹으로 이동하여 리포지토리 정보를 보여줍니다..
7 | # gh repo create
8 | 리포지토리를 만들 수 있습니다.
9 |
--------------------------------------------------------------------------------
/learn/gitlab/cli/1. Gitlab CLI란.md:
--------------------------------------------------------------------------------
1 | Github CLI와 명령어가 비슷하지만 Gitlab에서 쓰이는 CLI입니다.
2 |
3 | # 1.1. Gitlab CLI 설치하기
4 | ```brew install glab```을 통해서 다운로드할 수 있습니다. 윈도우도 다운로드할 수 있는 방법이 있다면 추가로 작성하겠습니다.
5 |
6 | 자신의 컴퓨터에 맞는 버전을 골라서 다운로드하고 나면
7 | 이제 ```glab```라는 명령어를 사용해서 Github CLI를 사용할 수 있습니다.
8 |
9 | # 1.2. 명령어 사용해보기
10 |
11 | 터미널을 실행해서 한번 리포지토리를 클론해보겠습니다. 그전에 로그인을 해야합니다.
12 | ```glab auth login```을 통해 로그인을 진행해주세요.
13 |
--------------------------------------------------------------------------------
/learn/kotlin/1. 시작.md:
--------------------------------------------------------------------------------
1 | 이 글은 코틀린 공식 문서를 확인하여 제작되었습니다.
2 |
3 | # 어떤 곳에서 쓰이나요?
4 | 백엔드와 안드로이드 등에서 쓰입니다.
5 |
6 |
--------------------------------------------------------------------------------
/learn/kotlin/2. 기초 문법.md:
--------------------------------------------------------------------------------
1 | ```kotlin
2 | fun main(args: Array) {
3 | print("Hello")
4 | println(", world!")
5 | }
6 | ```
7 | - 코틀린 애플리케이션에서 제일 먼저 시작되는 main 함수입니다.
8 | - 함수의 파라미터는 위의 예시 혹은 생략할 수 있습니다.
9 | - print는 출력을 할때 쓸 수 있습니다.
10 | - println는 출력을 하고 줄을 바꿉니다.
11 |
12 | # 변수
13 | ```kotlin
14 | val/var myValue: Type = someValue
15 | ```
16 | - var - 값이 변경될 수 있습니다. ```var speed: Int = 5```
17 | - val - 값을 한번 지정하고 나면 바꿀 수 없습니다. ```val PI: Double = 3.1415```
18 | - myValue - 변수의 이름입니다. ```var myName: String = "김동학"```
19 | - Type - 타입을 지정할 수 있습니다. ```var typeOne: Int = 1```
20 | - someValue - 변수에 들어갈 값을 지정합니다. ```var exValue: String = "some"```
21 |
22 | ```kotlin
23 | var name = "6283hz"
24 | ```
25 | - 변수 타입이 생략될 수도 있습니다.
26 | - 하지만 타입 추론을 위해서는 변수를 생성할 때 반드시 초기화를 해주어야 합니다.
27 |
28 | # 함수
29 | ```kotlin
30 | // a, b 두개의 파라미터를 받고 Int 타입으로 반환한다.
31 | fun sum(a: Int, b: Int): Int {
32 | return a + b
33 | }
34 |
35 | // a, b 두개의 파라미터를 받고 a * b를 반환한다.
36 | fun mul(a: Int, b: Int) = a * b
37 |
38 | // Unit은 생략될 수 있으며, 아무것도 반환하지 않는다.
39 | fun printMul(a: Int, b: Int): Unit {
40 | println(mul(a, b))
41 | }
42 |
43 | fun printMul1(a: Int = 1, b: Int) { // 파라미터 안에서 초기화 할 수 있다.
44 | println(mul(a, b))
45 | }
46 |
47 | // a, b 두 개의 파라미터를 받고 (Unit) 아무것도 반환하지 않는다.
48 | fun printMul2(a: Int, b: Int = 1) = println(mul(a, b))
49 | ```
50 |
--------------------------------------------------------------------------------
/learn/spring/1. spring boot/1. 시작.md:
--------------------------------------------------------------------------------
1 | 시작하기에 앞서 모든 강의는 검색도 직접 해보면서 하는 것을 추천드립니다.
2 | Gradle, Maven에 대한 지식이 없다면 듣는데 어려움이 있을 수도 있습니다.
3 |
4 | # 1.1. 스프링이란
5 | 스프링은 서버 개발을 쉽게 하기 위한 오픈소스 프레임워크입니다.
6 |
7 | # 1.2. 이 강의에서는
8 | 이번 강의에서는 주로 스프링에 대해 기초적인 용어와 구조에 대해서 알아보는 시간이 될 것입니다.
--------------------------------------------------------------------------------
/learn/spring/1. spring boot/2. 설치하기.md:
--------------------------------------------------------------------------------
1 | 이번에는 스프링 부트를 간단하게 설치해보겠습니다.
2 |
3 | # 2.1. 스프링 설치하기
4 | 먼저 [링크](https://start.spring.io)를 통해 들어가주세요.
5 | 
6 |
7 | 그럼 다음과 같은 창이 뜹니다.
8 | 여기서 실습을 위해 다음과 같은 설정을 따라와주세요.
9 |
10 | 1. Project에서 Gradle - kotlin을 선택한다. 이것은 스프링 코드를 코틀린으로 만든다는 것이 아니라, 빌드 코드를 코틀린으로 짜겠다고 정하는겁니다.
11 | 2. Language에서 Java를 선택해주세요.
12 | 3. Spring Boot에서 3.1.4 버전을 선택해주세요. (만약 해당 버전이 없다면 Issue를 남겨주세요.)
13 | 4. Project Metadata는 프로젝트의 제목과 내용 같은 부분을 설정하는 것입니다. 예제이므로 그냥 사용하겠습니다.
14 | 5. Dependencies에서는 ADD DEPENDENCIES 버튼을 눌러서 ```Spring Web```과 ```Lombok```을 추가해주세요.
15 | 6. 그다음 하단의 GENERATE 버튼을 눌러주시면 ZIP 파일로 받을 수 있습니다.
16 | 7. 그럼 압축을 푸시고 자신이 사용하는 IDE에서 압축을 푼 파일을 열어주세요.
17 |
18 | # 2.2. 다음에는
19 | 다음에는 URL을 입력하면 스프링에서 받아서 화면을 보여주는 것을 만들어보겠습니다.
--------------------------------------------------------------------------------
/learn/spring/2.spring data/1. 시작.md:
--------------------------------------------------------------------------------
1 | 이제 자바의 문법과 Gradle에 익숙하다고 생각하고 강의하겠습니다.
2 |
3 | # 1. 의존성
4 | ```kotlin
5 | implementation("org.springframework.data:spring-data-jpa")
6 | ```
7 | 다음과 같은 코드를 통해 스프링 데이터를 시작할 수 있습니다.
8 |
9 | # 2. 핵심적인 내용
10 | 스프링 데이터의 가장 상위 인터페이스는 Repository입니다. 스프링에서 리포지토리란, 객체를 데이터베이스에 저장하기 위해서 쓰입니다. 이는 다른 인터페이스로 확장되기 위한 기본 인터페이스로서 사용됩니다. Repository의 서브 클래스는 CrudRepository, JpaRepository가 있으며 이것들은 엔티티에 대한 CRUD 기능을 제공합니다.
11 |
12 | 다음은 Repository의 구현체인 CrudRepository입니다.
13 |
14 | 
15 |
16 | CrudRepository는 **Create Read Update Delete** 4가지와 관련된 기능들을 지원합니다.
17 |
18 | 우리는 다음 강의에서 CrudRepository에 대해 실습을 해볼 것입니다.
19 |
--------------------------------------------------------------------------------
/learn/spring/spring data/jpa/1. 내부속성 접근 방법.md:
--------------------------------------------------------------------------------
1 | JPA Repository에서는 _(underscore)를 통해 내부 속성값에 접근할 수 있다.
2 | ```java
3 | List findByAddress_ZipCode(String zipcode);
4 | ```
5 |
--------------------------------------------------------------------------------
/learn/sql/1. SQL의 시작.md:
--------------------------------------------------------------------------------
1 | ```sql
2 | SELECT * FROM xolving.userInfo
3 | ```
4 | > xolving이라는 Database의 usreInfo Table에서 모든 컬럼을 가져오겠다.
5 |
6 | - Database: 논리적으로 연관된 데이터들을 모아 저장해둔 것
7 | - Table: 자료가 실제로 저장되는 곳으로 row와 column으로 구성된다.
8 |
9 | # 1.1 SQL 실행 순서
10 | 1. 쿼리를 실행한다.
11 | 2. 문법이 맞는지 확인한다.
12 | 3. 객체 및 권한이 있는지 확인한다.
13 | 4. Cache에 쿼리가 있는지 확인하고 있다면 기존의 쿼리를 사용한다.
14 | 5. 최적화된 쿼리 실행 계획이 만들어진다.
15 | 6. 5.에서 만들어진 쿼리 실행 계획을 실제로 사용할 수 있는 형태로 바꿔준다.
16 | 7. 실행한다.
17 | # 1.2. SQL의 분류
18 | SQL 언어는 크게 DDL, DML, DCL, TCL로 구성된다.
19 | ## 1.2.1. DDL
20 | 테이블의 컬럼을 정의하는 명령어로 삭제, 수정 등의 기능을 한다.
21 | **명령어를 입력하면 바로 반영이 되어서 주의가 필요합니다.**
22 |
23 | |명령어|내용|
24 | |---|---|
25 | |**CREATE**|테이블을 생성한다.|
26 | |**ALTER**|테이블을 수정한다.|
27 | |**DROP**|테이블을 삭제한다.|
28 | |**RENAME**|테이블의 이름을 변경한다.|
29 | |**TRUNCATE**|테이블을 초기화한다.|
30 |
31 | - ALTER 문법
32 |
33 | |명령어|내용|
34 | |---|---|
35 | |**ADD COLUMN**|컬럼을 추가하는 역할|
36 | |**DROP COLUMN**|컬럼을 삭제하는 역할|
37 | |**MODIFY COLUMN**|컬럼을 수정하는 역할|
38 | |**RENAME COLUMN**|컬럼 이름을 변경하는 역할|
39 | |**DROP CONSTRAIN**|컬럼을 제약조건을 기반해서 삭제하는 역할|
40 |
41 | ## 1.2.2. DML
42 | 데이터베이스의 내부 데이터를 관리하기 위한 언어로, 데이터의 조회, 추가 등의 작업을 진행한다.
43 | **DDL과 달리 변경된 것을 다시 ROLLBACK하는 것이 가능하다. 또한 바로 실행되지 않으며, Transactional을 종료해야 반영이 된다.**
44 |
45 | |명령어|내용|
46 | |---|---|
47 | |**SELECT**|데이터베이스에서 데이터를 검색한다.|
48 | |**INSERT**|테이블에 데이터를 추가한다.|
49 | |**UPDATE**|테이블 내에 존재하는 데이터를 수정한다|
50 | |**DELETE**|테이블에서 데이터를 삭제한다.|
51 |
52 | ## 1.2.3. DCL
53 | 데이터 관리를 위해서 쓰이며 데이터를 읽거나 쓰는 것을 제한하는 등의 권한 관리가 가능하다.
54 |
55 | |명령어|내용|
56 | |---|---|
57 | |**GRANT**|권한을 정의한다.|
58 | |**REVOKE**|권한을 삭제한다.|
59 |
60 | ## 1.2.4. TCL
61 | 데이터가 아닌 트랜젝션을 제어할 때 사용된다. 논리적으로 작업을 묶어서 DML이 조작한 결과를 트랜젝션 별로 제어한다.
62 |
63 | - Transcation
64 | > 작업단위를 트랜젝션이라고 하며, 다음은 트랜젝션의 예시이다.
65 | > 1. 정보를 입력하고 회원가입을 진행한다.
66 | > 2. 데이터베이스에 정보가 등록되고, 다시 메인으로 돌아와진다.
67 | > 3. 그러면 비밀번호 찾기와 같은 기능을 사용할 수 있다.
68 |
69 | - Transcation의 특징
70 | 1. Atomicity: 트랜젝션은 전부 반영되거나, 아니면 반영되지 않아야 한다.
71 | 2. Consistency: 트랜젝션의 결과가 항상 일관적이어야 한다. 데이터 타입이 갑자기 바뀌는 결과가 있어서는 안된다.
72 | 3. Isolation: 트랜젝션은 서로 독립적이며, 서로 참조할 수 없다.
73 | 4. Dutability: 트랜젝션이 완료되었다면 결과는 영구적이어야 한다.
74 |
75 | - Transcation의 상태
76 | 1. Active: Transcation이 실행되고 있는 상태
77 | 2. Failed: Transcation에 오류가 발생해 중단된 상태
78 | 3. Aborted: Transcation이 비정상으로 실행되어 Rollback된 상태
79 | 4. Partially Committed: 연산이 끝나고 Commit이 되기 전의 상태
80 | 5. Commited: Transcation이 끝나서 정상적으로 Commit이 된 상태
81 |
82 | |명령어|내용|
83 | |---|---|
84 | |**COMMIT**|모든 작업을 정상적으로 처리한다.|
85 | |**ROLLBACK**|모든 작업을 다시 돌려 놓는다.|
86 | |**SAVEPOINT**|Commit 전에 특정 시점까지만 반영하거나 Rollback하겠다.|
87 |
--------------------------------------------------------------------------------
/learn/sql/2. 명령어의 분류.md:
--------------------------------------------------------------------------------
1 | ## 2.1. DDL
2 | 테이블의 컬럼을 정의하는 명령어로 삭제, 수정 등의 기능을 한다.
3 | **명령어를 입력하면 바로 반영이 되어서 주의가 필요합니다.**
4 |
5 | |명령어|내용|
6 | |---|---|
7 | |**CREATE**|테이블을 생성한다.|
8 | |**ALTER**|테이블을 수정한다.|
9 | |**DROP**|테이블을 삭제한다.|
10 | |**RENAME**|테이블의 이름을 변경한다.|
11 | |**TRUNCATE**|테이블을 초기화한다.|
12 |
13 | - ALTER 문법
14 |
15 | |명령어|내용|
16 | |---|---|
17 | |**ADD COLUMN**|컬럼을 추가하는 역할|
18 | |**DROP COLUMN**|컬럼을 삭제하는 역할|
19 | |**MODIFY COLUMN**|컬럼을 수정하는 역할|
20 | |**RENAME COLUMN**|컬럼 이름을 변경하는 역할|
21 | |**DROP CONSTRAIN**|컬럼을 제약조건을 기반해서 삭제하는 역할|
22 |
23 | ## 2.2. DML
24 | 데이터베이스의 내부 데이터를 관리하기 위한 언어로, 데이터의 조회, 추가 등의 작업을 진행한다.
25 | **DDL과 달리 변경된 것을 다시 ROLLBACK하는 것이 가능하다. 또한 바로 실행되지 않으며, Transactional을 종료해야 반영이 된다.**
26 |
27 | |명령어|내용|
28 | |---|---|
29 | |**SELECT**|데이터베이스에서 데이터를 검색한다.|
30 | |**INSERT**|테이블에 데이터를 추가한다.|
31 | |**UPDATE**|테이블 내에 존재하는 데이터를 수정한다|
32 | |**DELETE**|테이블에서 데이터를 삭제한다.|
33 |
34 | ## 2.3. DCL
35 | 데이터 관리를 위해서 쓰이며 데이터를 읽거나 쓰는 것을 제한하는 등의 권한 관리가 가능하다.
36 |
37 | |명령어|내용|
38 | |---|---|
39 | |**GRANT**|권한을 정의한다.|
40 | |**REVOKE**|권한을 삭제한다.|
41 |
42 | ## 2.4. TCL
43 | 데이터가 아닌 트랜젝션을 제어할 때 사용된다. 논리적으로 작업을 묶어서 DML이 조작한 결과를 트랜젝션 별로 제어한다.
44 |
45 | ## 2.4.1. Transcation
46 | > 작업단위를 트랜젝션이라고 하며, 다음은 트랜젝션의 예시이다.
47 | > 1. 정보를 입력하고 회원가입을 진행한다.
48 | > 2. 데이터베이스에 정보가 등록되고, 다시 메인으로 돌아와진다.
49 | > 3. 그러면 비밀번호 찾기와 같은 기능을 사용할 수 있다.
50 |
51 | ### 2.4.2. Transcation의 특징
52 | 1. Atomicity: 트랜젝션은 전부 반영되거나, 아니면 반영되지 않아야 한다.
53 | 2. Consistency: 트랜젝션의 결과가 항상 일관적이어야 한다. 데이터 타입이 갑자기 바뀌는 결과가 있어서는 안된다.
54 | 3. Isolation: 트랜젝션은 서로 독립적이며, 서로 참조할 수 없다.
55 | 4. Dutability: 트랜젝션이 완료되었다면 결과는 영구적이어야 한다.
56 |
57 | ### 2.4.3 Transcation의 상태
58 | 1. Active: Transcation이 실행되고 있는 상태
59 | 2. Failed: Transcation에 오류가 발생해 중단된 상태
60 | 3. Aborted: Transcation이 비정상으로 실행되어 Rollback된 상태
61 | 4. Partially Committed: 연산이 끝나고 Commit이 되기 전의 상태
62 | 5. Commited: Transcation이 끝나서 정상적으로 Commit이 된 상태
63 |
64 | |명령어|내용|
65 | |---|---|
66 | |**COMMIT**|모든 작업을 정상적으로 처리한다.|
67 | |**ROLLBACK**|모든 작업을 다시 돌려 놓는다.|
68 | |**SAVEPOINT**|Commit 전에 특정 시점까지만 반영하거나 Rollback하겠다.|
69 |
--------------------------------------------------------------------------------
/learn/sql/3. 데이터 타입.md:
--------------------------------------------------------------------------------
1 | # 3. 데이터 타입
2 | 물론 SQL에도 프로그래밍 언어와 비슷하게 데이터 타입이 있습니다. 정해진 데이터 타입에 따라 저장이 됩니다. 3번째 강의에서는 Oracle 데이터베이스를 기준으로 합니다. 다 외울 필요도 없으며 이런게 있다는 것을 알기를 바랍니다.
3 |
4 | ## 3.1. 문자형 데이터 타입
5 | 문자열을 저장하기 위한 방법입니다.
6 |
7 | |데이터 타입|의미|
8 | |---|---|
9 | |CHAR(n)|최대 2000 Byte의 고정 길이 문자열이며, 지정된 n보다 데이터가 짧다면 나머지는 공백으로 채운다.|
10 | |VARCHAT2(n)|최대 4000 Byte의 가변 길이 문자열이며, 지정된 n보다 데이터가 짧다면 나머지 공간을 채우지 않는다.|
11 | |NCHAR(n)|고정된 길이의 유니코드 인코딩 방식의 문자열이며, 최대 2000 Byte까지 가능하다.|
12 | |NVARCHAR2(n)|가변 길이의 유니코드 인코딩 방식의 문자열이며, 최대 4000 Byte까지 가능하다.|
13 | |LONG|가변 길이의 문자열이며, 최대 2 GByte까지 가능하다.|
14 | |CLOB|거대한 텍스트 문자열이며, 최대 4 GByte까지 가능하다.|
15 | |NCLOB|거대한 유니코드 인코딩 방식의 문자열이며, 최대 4 GByte까지 가능하다.|
16 |
17 | ## 3.2. 숫자형 데이터 타입
18 |
19 | |데이터 타입|의미|
20 | |---|---|
21 | |NUMBER(P, S)|P: 1부터 38자리로 Default는 38자리며, S는 소수점 이하 자리로 Default는 0이다.|
22 | |BINARY_FLOAT|부동 소수형의 데이터 타입으로 4 Byte이며 32 Bit 부동 소수이다.|
23 | |BINARY_DOUBLE|부동 소수형의 데이터 타입으로 4 Byte이며 62 Bit 부동 소수이다.|
24 |
25 | ## 3.3. 날짜형 데이터 타입
26 |
27 | |데이터 타입|의미|
28 | |---|---|
29 | |DATE|고정 길이의 날짜 데이터 타입이다.|
30 | |INTERVAL_YEAR|날짜(YY, MM) 형태의 시간 표현이다.|
31 | |INTERVAL_DAY|날짜 및 시간(요일, hh, mm, ss) 형태의 시간 표현이다.|
32 | |TIMESTAMP|밀리초(ms) 단위까지 표현한다.|
33 | |TIMESTAMP_WITH TIME ZONE|날짜 및 시간대 형태의 타입이다.|
34 | |TIMESTAMP_WITH LOCAL TIME ZONE|데이터베이스의 시간대를 따르므로, 조회할 때 시간대를 감안해서 조회한다.|
35 |
36 | # 3.4. 이진 데이터 타입
37 |
38 | |데이터 타입|의미|
39 | |---|---|
40 | |RAW(n)|가변 길이의 이진 데이터 타입이며, 최대 2 GByte까지 저장할 수 있다.|
41 | |LONGRAW|가변 길이의 이진 데이터 타입이며, 최대 4 GByte까지 저장할 수 있다.|
42 | |BLOB|거대한 바이너리 데이터를 저장하기 위한 데이터 타입이며, 최대 4 GByte까지 저장할 수 있다.|
43 | |BFILE|거대한 바이너리 데이터를 파일형태로 저장하기 위해 사용하는 데이터 타입이며, 최대 4 GByte까지 저장할 수 있다.|
44 |
--------------------------------------------------------------------------------
/pr.js:
--------------------------------------------------------------------------------
1 | /**
2 | * gh 를 사용해 PR 요청시 템플릿이 적용되지 않는 문제를 해결하기 위한 확장 스크립트
3 | * 깃허브 웹페이지가 아닌 CLI 에서 PR 요청을 작성하기 위한 스크립트 입니다.
4 | *
5 | * 호출 방법 (Node.js 가 설치되어 있어야 합니다)
6 | *
7 | * 도움말
8 | * node pr --help
9 | *
10 | * node pr [flags]
11 | *
12 | * node pr --title:"오타 수정" --overview:"오타 수정" --change:"README.md"
13 | *
14 | * --title
15 | * PR 제목을 설정합니다.
16 | *
17 | * --overview
18 | * 개요 내용을 작성합니다
19 | *
20 | * --detail
21 | * 작업 내용을 작성합니다.
22 | *
23 | * --change
24 | * 변경사항을 작성합니다
25 | *
26 | * --how
27 | * 사용방법을 작성합니다.
28 | *
29 | * --other
30 | * 기타를 작성합니다.
31 | *
32 | * author : kyutorials
33 | * create date : 2023-11-28
34 | *
35 | */
36 | const { execSync } = require('child_process');
37 | const { writeFileSync, rmSync } = require('fs');
38 | const { join, resolve } = require('path');
39 |
40 | try {
41 | const argv = process.argv.slice(2);
42 |
43 | if (['--help', '-help', 'help', '/help', '/?', '?'].some(pattern => argv.includes(pattern))) {
44 | console.log([
45 | 'node pr 도움말',
46 | '',
47 | '--title',
48 | 'PR 제목을 설정합니다.',
49 | '',
50 | '--overview',
51 | '개요 내용을 작성합니다',
52 | '',
53 | '--detail',
54 | '작업 내용을 작성합니다.',
55 | '',
56 | '--change',
57 | '변경사항을 작성합니다',
58 | '',
59 | '--how',
60 | '사용방법을 작성합니다.',
61 | '',
62 | '--other',
63 | '기타를 작성합니다.'
64 | ].join('\n'));
65 | return;
66 | }
67 |
68 | const args = argv.filter(item => item.startsWith('--') && item.includes(':')).reduce((result, current) => {
69 | let array = current.substring(2).split(':');
70 | const key = array[0].trim();
71 | const value = array.slice(1).join(':').trim().replaceAll('\\n', '\n');
72 |
73 | if (value.trim().length != 0) {
74 | result[key.trim()] = value.trim();
75 | }
76 | return result;
77 | }, {});
78 |
79 | let body = {
80 | overview: '',
81 | detail: '',
82 | change: '',
83 | how: '',
84 | other: ''
85 | };
86 |
87 | if (args['title'] == null) {
88 | throw new Error('--title:"제목" 은 필수로 입력해주세요.');
89 | }
90 |
91 | Object.keys(body).forEach(param => {
92 | const v = args[param];
93 | if (v !== undefined && v.trim().length > 0) {
94 | body[param] = v;
95 | }
96 | });
97 |
98 | let bodyStr = '';
99 |
100 | bodyStr = [
101 | '## 🎲 개요',
102 | body.overview,
103 | '',
104 | '## 📚 작업내용',
105 | body.detail,
106 | '',
107 | '## 🔀 변경사항',
108 | body.change,
109 | '',
110 | '## 🤔 사용방법',
111 | body.how,
112 | '',
113 | '## 🎸 기타',
114 | body.other,
115 | ''
116 | ].join('\n');
117 |
118 | const file = 'gh-temp-' + require('crypto').randomBytes(16).toString('hex');
119 | console.log(file);
120 |
121 | let err = null;
122 |
123 | writeFileSync(join(resolve(), file), bodyStr, { encoding: 'utf-8' });
124 |
125 | try {
126 | const cmd = 'gh pr create ' + ['--title', JSON.stringify(args['title']), '--body-file', file].join(' ');
127 | console.log(cmd);
128 |
129 | const result = execSync(cmd, { encoding: 'utf-8' });
130 | console.log(result);
131 | } catch (reason) {
132 | err = reason;
133 | }
134 |
135 | rmSync(join(resolve(), file), { force: true, recursive: true });
136 |
137 | if (err) throw err;
138 |
139 | } catch (reason) {
140 | console.log('Error', reason.message);
141 | }
--------------------------------------------------------------------------------
/public/contributing-1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/contributing-1.PNG
--------------------------------------------------------------------------------
/public/contributing-2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/contributing-2.PNG
--------------------------------------------------------------------------------
/public/contributing-3.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/contributing-3.PNG
--------------------------------------------------------------------------------
/public/contributing-4.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/contributing-4.PNG
--------------------------------------------------------------------------------
/public/contributing-5.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/contributing-5.PNG
--------------------------------------------------------------------------------
/public/git-github-issue-template-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/git-github-issue-template-1.png
--------------------------------------------------------------------------------
/public/git-github-issue-template-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/git-github-issue-template-2.png
--------------------------------------------------------------------------------
/public/git-github-issue-template-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/git-github-issue-template-3.png
--------------------------------------------------------------------------------
/public/git-github-issue-template-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/git-github-issue-template-4.png
--------------------------------------------------------------------------------
/public/git-github-issue-template-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/git-github-issue-template-5.png
--------------------------------------------------------------------------------
/public/git-github-issue-template-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/git-github-issue-template-6.png
--------------------------------------------------------------------------------
/public/git-github-issue-template-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/git-github-issue-template-7.png
--------------------------------------------------------------------------------
/public/git-github-issue-template-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/git-github-issue-template-8.png
--------------------------------------------------------------------------------
/public/github-cli-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/github-cli-1.png
--------------------------------------------------------------------------------
/public/lean-git-cli-3-1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/lean-git-cli-3-1.PNG
--------------------------------------------------------------------------------
/public/learn-spring-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/learn-spring-1.png
--------------------------------------------------------------------------------
/public/learn-spring-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/learn-spring-2.png
--------------------------------------------------------------------------------
/public/learn-spring-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/learn-spring-3.png
--------------------------------------------------------------------------------
/public/spring-springboot-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/spring-springboot-1.png
--------------------------------------------------------------------------------
/public/spring-springdata-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xolving/tutorics-docs/35db9f8c5730130a02025e25a6e280d9d6b747dd/public/spring-springdata-1.png
--------------------------------------------------------------------------------