diff --git a/README.md b/README.md deleted file mode 100644 index 98cd2f1..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Backend_PowerBoost -코드잇 부트스 파워부스트 1기 스터디 diff --git "a/\354\261\204\354\234\240/Week1/git.md" "b/\354\261\204\354\234\240/Week1/git.md" new file mode 100644 index 0000000..256fdcc --- /dev/null +++ "b/\354\261\204\354\234\240/Week1/git.md" @@ -0,0 +1,573 @@ +# Git + +속성: 토픽 +교과목: 버전 관리 및 협업하기 +기한: 2024년 5월 14일 +상태: 진행 중 + +1. git이란? - 버전관리와 동시 협업, 다른 컴퓨터에 작업물 보내기 +- 코드 버전 관리 프로그램 +버전관리 장점: 지난 과정 확인 가능, 이전 버전으로 돌아갈 수 있음 +협업관리 +2. git의 역사 +- Git은 리누스 토발즈가 리눅스의 소스 코드를 관리하기 위해 만든 버전 관리 및 협업용 프로그램입니다. +3. 깃의 목표 + + - 빠른 속도 + - 단순한 디자인 + - 비선형적 개발 지원(수천 개의 브랜치를 병행할 수 있음, 브랜치가 뭔지는 나중 챕터에서 배웁니다.) + - 완전 분산형 시스템 + - 리눅스와 같은 거대한 프로젝트도 속도 저하의 문제없이 관리할 수 있는 시스템 + ⇒ 깃은 버전 관리(Version Control), 협업(Cooperation)에 필요한 여러 요소들이 고려됨 + +4. github이란? +git - 버전관리와 동시 협업, 다른 컴퓨터에 작업물 보내기 +다른 컴퓨터에 작업물 보내기 = 외부 컴퓨터에 백업본 만들기 +외부 컴퓨터=github=원격저장소 +git은 코드 버전관리 프로그램, git으로 관리하는 프로젝트를 올려두는 곳이 github +-> 코드 협업 가능 +5. git설치 +6. sublime 설치->vs로 +7. quiz +8. repository와 commit +- 레포지토리 +프로젝트 디렉토리 안에 레포지토리(.git 디렉토리, 숨겨진 디렉토리)생성 +버전별 프로젝트 모습과 버전별 변경 사항에 대한 설명 +커밋이 저장되는 곳 +ex) 사진저장소 +- 커밋 +프로젝트 디렉토리의 특정모습을 하나의 버전으로 남기는 행위&결과물 +ex) 사진찍기 +1. repository 만들기 +git init - 비어있는 레포지토리 생성 +2. 첫 커밋해보기 +commit에 필요한 것: 이름 이메일 커밋 메세지 +git config [user.name](http://user.name/) "@@" +git config user.email "@@" +git commit -m "Create [calculator.py](http://calculator.py/) and License this is the message" +->nothing added to commit but untracted files present +-> 깃에 의해 아직 추적x +-> 버전 관리의 대상x + +git add [calculator.py](http://calculator.py/) +git add License +->커밋할 파일을 미리 지정해줘야 함 +->수정된 파일의 모습이 커밋에 포함될 것이라 지정하는 것 +Q. +*git add License +warning: LF will be replaced by CRLF the next time Git touches it +-> $ git config --global core.autocrlf true + +📍 LF란? +LF는 Line-Feed의 약자이다. +단어가 타자기에서 비롯되었듯이, 커서는 그 자리에 둔 상태에서 종이만 한 줄을 올리는 동작을 말한다. + +Mac, Linux(Unix)에서 사용되는 줄바꿈 문자열(\n)이다. + +📍 CRLF란? +CRLF는 Carriage Return Line-Feed의 약자이다. +여기서 Carriage Return이란 문장이 끝에 다다르면 커서는 위아래 이동 없이 가장 앞으로 이동하는 동작을 말한다. +즉, CRLF는 커서를 다음 라인의 맨 앞으로 이동하는 동작이다. + +Windows에서 사용되는 줄바꿈 문자열(\r\n)이다. + +false : 파일에 있는 줄바꿈 문자를 그대로 반영 +true: 파일 체크인할때 crlf가 있으면 lf로 변경 +체크아웃할때 lf를 crlf로 변경 +intput: 파일 체크인할 때 crlf가 있으면 lf로 변경 +체크아웃할 때 저장소 텍스트를 그대로 가져옴 + +커밋관련 주의사항 + +1. 처음으로 커밋을 하기 전 이름과 이메일주소 설정 +2. 커밋 메세지 남기기(옵션 -m) +3. 커밋할 파일을 git add로 지정 +4. 파이썬 코드 설명 +5. 깃의 3가지 작업 영역 +6. 퀴즈 +Git은 내부적으로 크게 3가지 종류의 작업 영역을 두고 동작합니다. +각 작업 영역의 이름은 +1.working directory : mathtool dir +2.staging area : git add한 파일들이 존재하는 영역, 커밋하면 여기있는 파일들만 커밋에 반영됨 +3.repository : 커밋들이 저장되는 곳 + +참고로 working directory는 working tree라고 하기도 하고, staging area는 index라고 할 때도 있습니다. 혹시 다른 곳에서 working tree, index 이런 단어를 쓰더라도 결국 다 우리가 배운 작업 영역들이니까 당황하지 마세요! + +[07.gt](http://07.gt/) add 더 자세히 알아보기 +git status //깃이 인식하고 있는 프로젝트 디렉토리의 현재 상태를 보여줌 +git touch [파일이름] // 파일 만들기 +git add. //현재 프로젝트 디렉토리 내에서 변경사항이 생긴 모든 파일들을 staging area에 추가 +git commit -m "Add title comment and Create meeting-log" + +08.git이 보는 파일의 4가지 상태 +일단 Git에서 파일들은 크게 다음 2가지 상태를 가집니다. + +1. Untracked 상태 : Untracked는 '추적되지 않고 있는'이라는 뜻입니다. 이 상태는 파일이 Git에 의해서 그 변동사항이 전혀 추적되고 있지 않는 상태를 뜻합니다. 예를 들어, 파일을 새로 생성하고 그 파일을 한 번도 git add 해주지 않았다면 이 상태입니다. +2. Tracked 상태 +2-1. Staged 상태: 파일의 내용이 수정되고나서, staging area에 올라와있는 상태를 Staged(스테이징된, stage area에 올려진) 상태라고 합니다. 새로 생성한 파일에 내용을 쓰고 git add를 해주거나 한 번이라도 커밋에 포함됐었던 파일이라도 내용을 수정하고 git add를 해주면 이 상태입니다. +2-2. Unmodified 상태: 현재gi 파일의 내용이 최신 커밋의 모습과 비교했을 때 전혀 바뀐 게 없는 상태면 그 파일은 Unmodified(수정되지 않은, 변한 게 없는) 상태입니다. 커밋을 하고 난 직후에는 working directory 안의 모든 파일들이 이 상태가 됩니다. +2-3. Modified 상태: 최신 커밋의 모습과 비교했을 때 조금이라도 바뀐 내용이 있는 상태면 그 파일은 Modified(수정된) 상태입니다. 이렇게 Git에서 파일은 매 순간 4가지 상태 중 하나의 상태에 있게 됩니다. 이 내용을 그림으로 정리하면 아래와 같습니다. + +Add the file : Untracked 상태의 파일을 처음으로 git add 해주면 Staged 상태가 됩니다. +Edit the file : 최신 커밋과 비교했을 때 차이가 없는 Unmodified 상태의 파일의 내용을 수정하면 Modified 상태가 됩니다. +Stage the file : Modified 상태의 파일을 git add 해주면 Staged 상태가 됩니다. +Remove the file : 파일을 삭제하면 당연히 Git에서 더이상 인식하지 않겠죠? +Commit : 커밋을 하면 staging area에 있던 파일들이 커밋에 반영되고, 이제 모든 파일들은 최신 커밋과 차이가 없게 되니까 Unmodified 상태가 됩니다. + +1. git add 취소하기 +git reset 파일명 +-> staging area 에서 파일 제거, 변경된 새 모습은 그대로 working dir에 남아있음 +working tree(dir) clean (=no change) +2. 특정 git 커맨드의 사용법 알아보기[윈도우] +git [command] -h //커맨드 창에 간단히 출력 +git [command] --help 또는 git help add //매뉴얼 사이트 이동 +3. 퀴즈 +4. 깃써보기 정리노트 +git init : 현재 디렉토리를 Git이 관리하는 프로젝트 디렉토리(=working directory)로 설정하고 그 안에 레포지토리(.git 디렉토리) 생성 +git config [user.name](http://user.name/) 'codeit' : 현재 사용자의 아이디를 'codeit'으로 설정(커밋할 때 필요한 정보) +git config user.email 'teacher@codeit.kr' : 현재 사용자의 이메일 주소를 'teacher@codeit.kr'로 설정(커밋할 때 필요한 정보) +git add [파일 이름] : 수정사항이 있는 특정 파일을 staging area에 올리기 +git add [디렉토리명] : 해당 디렉토리 내에서 수정사항이 있는 모든 파일들을 staging area에 올리기 +git add . : working directory 내의 수정사항이 있는 모든 파일들을 staging area에 올리기 +git reset [파일 이름] : staging area에 올렸던 파일 다시 내리기 +git status : Git이 현재 인식하고 있는 프로젝트 관련 내용들 출력(문제 상황이 발생했을 때 현재 상태를 파악하기 위해 활용하면 좋음) +git commit -m "커밋 메시지" : 현재 staging area에 있는 것들 커밋으로 남기기 +git help [커맨드 이름] : 사용법이 궁금한 Git 커맨드의 공식 메뉴얼 내용 출력 +앞으로 각 챕터에서 새롭게 배운 커맨드들은 이렇게 정리하고 넘어가겠습니다. +5. github 계정과 remote repository 만들기 +6. 로컬 레포지토리의 내용을 리모트 레포지토리로 보내기 +로컬 레포지토리(내컴-MathTool) <-> 리모트 레포지토리(깃헙-Math_Box: MathTool의 복제본) + +//cf, git bash 붙여넣기 shift + insert +// 복사 : ctrl + insert + +1. 로컬 레포지토리에서 변경내용을 리모트 레포지토리에 반영하기 +로컬 레포지토리에서 내용 변경할 경우 +2. git add //staging area에 올리기 +3. git commit //로컬레포지토리에 커밋하기 +4. git push //로컬레포지토리에서 리모트 레포지토리로 반영하기 +5. 리모트 레포지토리에서 변경내용을 로컬 레포지토리에 반영하기 +6. git pull +리모트 레포지토리에서 pull하는 이유 +7. 안전성 : 내 컴퓨터를 쓰지 못하게 된 경우 +8. 협업가능 +9. 퀴즈 +10. git push 사용자 설정 +사실 git push는 리모트 레포지토리의 주인, 그러니까 본인만 할 수 있습니다. 만약 본인이 아닌 다른 사용자도 git push를 할 수 있게 하려면 GitHub에서 추가 작업을 해줘야 합니다. -> manage access로 불러오기 +11. 다른 프로젝트 가져오기 +git clone [html] +12. 오픈 소스 프로젝트(open source project) +장점 +무료로 사용할 수 있다. +여러 개발자들이 참여하기 때문에 폐쇄적으로 코드를 관리할 때보다 코드의 신뢰도가 더 높다.(이 부분은 사람마다 의견이 다를 수 있습니다) +오픈 소스 프로젝트에 참여 중인 다른 개발자들에게 질문을 할 수 있다. +어떤 프로그램을 개발할 때 특정 분야에서 사실상 표준처럼 사용되는 오픈 소스 프로그램을 많이 활용할수록 전체 개발 속도를 단축시킬 수 있다. + +반면에 단점은 +참여자 수가 많지 않거나, 참여자의 실력이 좋지 않으면 소스 코드의 신뢰성을 보장하기 어렵다. +해당 오픈 소스를 사용해서 문제가 생겼을 때 보상을 해주거나, 책임을 질 주체가 없다. + +1. [README.md](http://readme.md/) 파일 +이 프로젝트가 어떤 프로젝트인지 설명하거나 +프로그램의 주요 사용법을 알려주거나 +프로그램을 실행시키려면 어떤 사전 작업이 필요한지를 알려주는 내용 +마크다운 문법: [https://www.codeit.kr/topics/getting-started-with-data-science/lessons/975](https://www.codeit.kr/topics/getting-started-with-data-science/lessons/975) +2. 퀴즈 +3. 깃헙 시작하기 정리노트 +git push -u origin master : 로컬 레포지토리의 내용을 처음으로 리모트 레포지토리에 올릴 때 사용합니다.(-u origin master가 무슨 뜻인지는 'Git에서 브랜치 사용하기' 챕터에서 배울 거니까 걱정마세요!) +git push : 로컬 레포지토리의 내용을 리모트 레포지토리에 보내기 +git pull : 리모트 레포지토리의 내용을 로컬 레포지토리로 가져오기 +git clone [프로젝트의 GitHub 상 주소] : GitHub에 있는 프로젝트를 내 컴퓨터로 가져오기 +4. 커밋 히스토리 +git log // commit [커밋 아이디/커밋 해시] +git log --pretty=oneline + +git show [커밋아이디 4자리정도] // 해당 커밋과 그 다음 커밋이 어떻게 다른지 --(과거) 와 ++(현재)로 보여줌 + +1. m 옵션 없이도 커밋 메세지 남기기 +->vim이 뜸, 복잡하고 긴 메세지 작성 편함 +2. 최신 커밋 수정하기 +git commit --amend +Q: 최신만 가능함? +3. 커밋 생성, 커밋 메세지 작성 가이드라인 +4. 커밋 메시지 작성 가이드라인 + +(1) 커밋 메시지의 제목과 상세 설명 사이에는 한 줄을 비워두세요. +제목 + +상세설명 +(2) 커밋 메시지의 제목 뒤에 온점(.)을 붙이지 마세요. +(3) 커밋 메시지의 제목의 첫 번째 알파벳은 대문자로 작성하세요. +(4) 커밋 메시지의 제목은 명령조로 작성하세요.(Fix it / Fixed it / Fixes it) +(5) 커밋의 상세 내용에는 이런 걸 적으면 좋습니다. +왜 커밋을 했는지 +어떤 문제가 있었고 +적용한 해결책이 어떤 효과를 가지는지 +(6) 다른 사람들이 자신의 코드를 바로 이해할 수 있다고 가정하지 말고 최대한 친절하게 작성하세요. + +1. 커밋할 때 알아야할 가이드라인 +(1) 하나의 커밋에는 하나의 수정사항, 하나의 이슈(issue)를 해결한 내용만 남기도록 하세요. 다양하게 수정을 하고나서 하나의 커밋으로 남기는 것은 좋지 않습니다. 하나의 커밋이 하나의 사실만을 갖고 있어야 나중에 이해하기 쉽습니다. + +(2) 현재 프로젝트 디렉토리의 상태가 그 내부의 전체 코드를 실행했을 때 에러가 발생하지 않는 상태인 경우에만 커밋을 하도록 하세요. 나중에 동료 개발자가 특정 커밋의 코드로 실행했을 때 에러가 발생한다면 혼란을 줄 수 있습니다. + +커밋으로 보관된 특정 시점의 전체 코드는 항상 문제없이 실행되는 상태여야 합니다. 이미 과거의 커밋이 되어버렸다고 우리에게 쓸모없는 커밋이 되는 건 절대 아닙니다. 과거의 커밋이라도 + +과거 버전의 프로그램을 사용해야하거나 +과거 커밋을 시작점으로 한 다른 방향의 별도 프로젝트를 시작하거나 +아예 그 커밋으로 현재 프로젝트를 리셋할 수도 있습니다. + +1. 긴 커맨드에 alias 설정 +git config alias.history 'log --pretty=oneline' + +git log --pretty=oneline 대신 git history 사용 + +1. 두 커밋 간의 차이 보기 +git diff [이전 커밋 아이디] [이후 커밋 아이디] +2. 퀴즈 +3. HEAD의 의미 +보통 가장 최근에 한 커밋으로 매번 더 새로운 커밋을 가리킴 +head에 따라 그 때 상태 working dir가 바뀜 +4. 이전 커밋으로 git reset하기 +git reset --hard [커밋 아이디] +git reset : 과거 커밋으로 돌아가기 +5. git reset의 옵션을 배우기 전에 확실히 알아야 할 부분 +커밋을 하고 나면 staging area에 있던 파일들은 어떻게 될까요? 사라지는 걸까요? +그건 아닙니다. 그냥 그 상태 그대로 남아있습니다. 그러니까 커밋을 했다고 staging area가 초기화되거나 하지는 않는 겁니다. +계속 git add를 할 때마다 staging area에서는 새로운 파일이 추가되거나 원래 있던 파일이 더 새로운 버전의 것으로 교체되거나 할 뿐입니다. +원래 있던 게 사라지는 게 아니라요. staging area에 있던 것들은 커밋을 하더라도 그것과 상관없이 계속 남아있다는 점, 잘 기억하세요! +6. git reset의 3가지 옵션 +--soft +--mixed +--hard + +11-1. error:failed to push some refs to +github에 내 Local 에 없는 파일이 있고, 내 파일을 push 할 면 발생하는 오류이다. + +Pull is not possible because you have unmerged files 에러 + +git push -f origin [브랜치 이름] git branch 를 사용하면 현재 브랜치 확인 가능. +commit history를 강제로 push하기 때문에 -f 또는 --force 명령어를 붙여줘야 한다. +원격 저장소에서 삭제되기 전에 다른 사람이 해당 브랜치의 커밋을 누군가 pull request했다면, pull한 사람의 로컬 저장소에는 적용이 안된다. 즉, 꼬일 수 있음.. 때문에 소통이 필요! 혹은 혼자 작업할 때 편한 방식. + +1. head를 기준으로 git reset +git reset --hard HEAD^ +HEAD^는 현재 HEAD가 가리키고 있는 커밋의 바로 이전 커밋을 나타냅니다. 즉, 이 상황에서는 5번 커밋을 나타내죠. + +git reset --hard HEAD~2 +여기서 HEAD~2는 현재 HEAD가 가리키는 커밋보다 2단계 전에 있는 커밋을 나타냅니다. + +1. git tag +git tag [태그 이름] [커밋 아이디] //tag 달기 +git tag //전체 tag 조회 +git show [태그 이름] //특정 tag 조회 +git tag -d [태그 이름] //특정 tag 지우기 +2. 퀴즈 +3. 커밋 다루기 정리노트 +git log : 커밋 히스토리를 출력 + +git log --pretty=oneline : --pretty 옵션을 사용하면 커밋 히스토리를 다양한 방식으로 출력할 수 있습니다. --pretty 옵션에 oneline이라는 값을 주면 커밋 하나당 한 줄씩 출력해줍니다. --pretty 옵션에 대해 더 자세히 알고싶으면 이 링크를 참고하세요. + +git show [커밋 아이디] : 특정 커밋에서 어떤 변경사항이 있었는지 확인 + +git commit --amend : 최신 커밋을 다시 수정해서 새로운 커밋으로 만듦 + +git config alias.[별명] [커맨드] : 길이가 긴 커맨드에 별명을 붙여서 이후로 별명으로 해당 커맨드를 실행할 수 있도록 설정 + +git diff [커밋 A의 아이디] [커밋 B의 아이디] : 두 커밋 간의 차이 비교 + +git reset [옵션] [커밋 아이디] : 옵션에 따라 하는 작업이 달라짐(옵션을 생략하면 --mixed 옵션이 적용됨) + +(1) HEAD가 특정 커밋을 가리키도록 이동시킴(--soft는 여기까지 수행) + +(2) staging area도 특정 커밋처럼 리셋(--mixed는 여기까지 수행) + +(3) working directory도 특정 커밋처럼 리셋(--hard는 여기까지 수행) + +그리고 이때 커밋 아이디 대신 HEAD의 위치를 기준으로 한 표기법(예 : HEAD^, HEAD~3)을 사용해도 됨 + +git tag [태그 이름] [커밋 아이디] : 특정 커밋에 태그를 붙임, 태그는 커밋을 가르키는 포인터 + +cf) git diff Ver1 Ver2 가능 + +2~3 +5. 브랜치 사용하기 + +1. 브랜치란 +깃은 root commit을 기반으로 갈라지는 branch (ex:유료 무료) +branch main : 처음 생성되는 브랜치 +코드 관리 흐름: branch +2. 브랜치 다뤄보기 +git branch : 모든 브랜치 찾기 +git branch [name] : [name] 브랜치 생성하기 +git branch -d [name] : delete, [name] 브랜치 삭제하기 +3. 퀴즈 +Q. branch의 범위 할당 가능? +4. 브랜치 merge하기 +브랜치A에서 한 커밋을 B에도 반영할 수 있다 +브랜치 B에서 git merge A +//merge commit이라는 커밋이 새로 생성 +-> 다..? +5. merge할 때 conflict가 날 수 있어요 +main과 premium중 뭐로 정할지 정하기 +6. conflict가 났을 때 merge 자체를 취소해도 됩니다 +머지를 시도하기 이전의 상태로 돌아가고 싶다면 그냥 머지 자체를 취소하는 방법도 있는데요. +git merge --abort +7. 여러 파일에서 conflict가 나면? git status 커맨드를 사용하여 conflict 발생한 파일 확인 +8. 퀴즈 +9. Remote repository의 브랜치는 이렇게 보입니다! +10. origin이란? +먼저 첫 번째 커맨드를 봅시다. +git remote add origin [https://github.com/kyuri-dev/Math_Box.git](https://github.com/kyuri-dev/Math_Box.git) +이 커맨드에서 remote는 리모트 레포지토리에 관한 작업을 할 때 쓰는 커맨드입니다. +그리고 그 뒤의 add는 새로운 리모트 레포지토리를 등록하겠다는 뜻입니다. +그 다음에는 origin [https://github.com/kyuri-dev/Math_Box.git이라고](https://github.com/kyuri-dev/Math_Box.git%EC%9D%B4%EB%9D%BC%EA%B3%A0) 써있죠? +이 표현은 [https://github.com/kyuri-dev/Math_Box.git](https://github.com/kyuri-dev/Math_Box.git) 리모트 레포지토리를 origin이라는 이름으로 등록하겠다는 뜻입니다. +그러니까 이 커맨드를 실행하고 나면 [https://github.com/kyuri-dev/Math_Box.git를](https://github.com/kyuri-dev/Math_Box.git%EB%A5%BC) origin으로 간단하게 나타낼 수 있게 되는 거죠. +그럼 왜 하필 origin이라고 하는 걸까요? origin이 아닌 여러분이 원하는 다른 단어를 입력해도 큰 상관은 없습니다. 하지만 Git에서는 리모트 레포지토리를 최초로 추가할 때 origin이라는 이름으로 가리키는 것이 관례화되어 있습니다. +origin은 ‘근원’, ‘기원’이라는 뜻을 가집니다. 아마도 다른 사람의 리모트 레포지토리를 자신의 컴퓨터로 가져와서 작업을 하는 사람의 입장에서는 리모트 레포지토리가 프로젝트의 근원이 되는 존재이기 때문에 그런 관습이 생긴 것으로 추측됩니다. +사실 +git remote add hello [https://github.com/kyuri-dev/Math_Box.git](https://github.com/kyuri-dev/Math_Box.git) +처럼 origin 대신 우리가 원하는 단어(hello)를 써도 상관은 없지만, 되도록 관례에 따라 origin을 써주는 게 좋겠죠? +11. Remote Repositoy에 있는 브랜치 +이제 두 번째 커맨드를 설명해드릴게요. + +git push -u origin master + +이 커맨드의 뜻은 + +현재 로컬 레포지토리에 있는 master 브랜치의 내용(=master 브랜치와 관계된 모든 커밋들)을 +origin이라는 리모트 레포지토리로 보낸다는 뜻입니다. +이때 같은 이름의 브랜치로 전송하게 되는데 만약 origin이라는 리모트 레포지토리에 master 브랜치가 없으면 master 브랜치를 새로 생성하고 푸시합니다. +그런데 여기서 옵션 -u는 무슨 뜻일까요? -u는 --set-upstream이라는 옵션의 약자입니다. + +이렇게 --set-upstream(-u) 옵션을 주면 + +로컬 레포지토리에 있는 master 브랜치가 +origin에 있는 master 브랜치를 tracking(추적)하는 걸로 설정됩니다. +tracking이라는 건 로컬 레포지토리의 한 브랜치가 리모트 레포지토리의 한 브랜치와 연결되어 그것을 계속 바라보는 상태가 되는 것이라고 생각하시면 됩니다. 이렇게 맺어진 연결 상태를 tracking connection이라고 합니다. + +만약 + +로컬 레포지토리에 A라는 브랜치가 있고, +리모트 레포지토리에 B라는 브랜치가 있을 때 +이런 tracking connection이 서로 맺어진 경우, +B 브랜치를 A 브랜치의 upstream branch라고 합니다. +지금은 구별하기 위해서 A와 B라고 표현했지만 보통은 같은 이름인 경우가 대부분입니다. +이렇게 tracking connection이 한번 설정되고 나면, +사용자가 현재 master 브랜치에 위치해있을 때, git push +라고만 써도 자동으로 리모트 레포지토리의 master 브랜치를 대상으로 git push가 동작하고, + +git pull +라고만 써도 리모트 레포지토리의 master 브랜치를 대상으로 git pull이 동작합니다. + +사실 --set-upstream(-u) 옵션을 주지 않아도 그 후에 git push와 git pull을 할 수 있기는 합니다. 하지만 맨 처음에 이 옵션을 주지 않으면 tracking connection이 없기 때문에 나중에 git push를 하고 싶을 때 + +git push origin master:master +이런 식으로 적어줘야 합니다. 여기서 + +origin은 리모트 레포지토리를 나타내고, +master:master에서 더 먼저 나오는 master는 로컬 레포지토리의 master 브랜치(~에서)/더 뒤에 나오는 master는 리모트 레포지토리의 master 브랜치(~으로)를 나타냅니다. +그러니까 tracking connection이 없으면 매번 이런 식으로 git push를 해줘야 합니다. git pull도 마찬가지로 이런 식의 복잡한 표현이 필요하게 됩니다. + +그러니까 그냥 처음부터 tracking connection을 설정하고 그 이후부터는 git push, git pull이라고만 써서 편하게 푸시와 풀을 하는 게 좋겠죠? 이게 바로 제가 맨 처음에 로컬 레포지토리의 내용을 리모트 레포지토리로 보낼 때 -u라는 옵션을 썼던 이유입니다. + +1. origin/master의 의미 +자, 이제 + +로컬 레포지토리의 master 브랜치 +리모트 레포지토리의 master 브랜치 +이렇게 같은 이름이지만, 서로 다른 2개의 브랜치가 있다는 걸 알겠죠? + +그럼 리모트 레포지토리에 있는 master 브랜치는 어떻게 볼 수 있을까요? GitHub 페이지에서 보면 될 겁니다. +master가 로컬 레포지토리의 master 브랜치를 나타내고 +origin/master가 리모트 레포지토리의 master 브랜치를 나타냅니다. +이때까지 로컬 레포지토리의 master 브랜치에서 여러 커밋을 했지만 그러고나서 git push를 해준 적은 없었습니다. 그래서 위 그림처럼 origin/master가 master보다 이전의 커밋을 가리키고 있는 겁니다. + +다음 영상에서는 master, premium 브랜치 둘 다에서 리모트 레포지토리로 git push 하겠습니다. 그러고 나면 이제 origin/master도 master와 같은 커밋을 가리키게 될 것입니다. + +1. master 브랜치와 preminum 브랜치 둘 다 push하기 +Q push와 commit의 차이? +2. HEAD와 브랜치의 관계(사진) +브랜치 : 코드를 관리하는 하나의 흐름 -> 어떤 커밋을 가리키는 존재 -> 포인터 +헤드는 브랜치를 가르킴 +HEAD는 보통 본인이 직접 커밋을 가리키는 게 아니라 브랜치를 통해서 간접적으로 커밋을 가리킵니다. +3. git reset의 비밀 +과거의 커밋으로 git reset을 한다고 그 이후의 커밋들이 삭제되는 게 절대 아닙니다. 계속 남아있습니다. +git reset은 과거의 커밋뿐만 아니라 현재 HEAD가 가리키는 커밋 이후의 커밋으로도 할 수 있습니 +4. git reset과 git checkout의 차이 +Detached HEAD입니다. Detached는 우리말로 ‘~로부터 떨어진, 분리된’이라는 뜻을 갖는데요. 브랜치로부터 떨어진 상태이기 때문에 이렇게 부르는 겁니다. +이렇게 HEAD가 특정 커밋을 직접 가리키게 하는 이유는 여러가지가 있을 수 있는데요. +그 중에서 주된 이유 한 가지는 바로 과거의 특정 커밋에서 새로운 브랜치를 만들고 싶을 때입니다. + +git checkout master + +이 커맨드의 뜻은 다음과 같이 해석됩니다. + += master 브랜치로 이동하라 += HEAD가 master 브랜치를 가리키도록 하라 += HEAD가 master 브랜치가 가리키던 커밋을 간접적으로 가리키게 됨으로써 += working directory의 내부도 그 커밋에 맞게 변함으로써 += master 브랜치로 이동한 것을 사용자는 실감하게 됨 + +이렇게 되는 거죠. + +1. 새로운 커밋을 만들지 않는 merge도 있다 +새로운 커밋이 생기는 게 아니라 단지 브랜치가 이동하게 되는 머지를 Fast-forward 머지 +커밋 히스토리에서 같은 선(line) 상에 있는 브랜치를 머지할 때 Fast-forward 머지가 이루어집니다. 방금 전에는 master 브랜치와 premium 브랜치가 둘다 같은 선 상에 있었죠? 바로 이런 경우입니다. +두 브랜치가, 커밋 히스토리 상에서 분리된 2개의 선에 각각 존재할 때 머지를 하면 머지 커밋이 새롭게 생기는 거구요. 그리고 이런 머지는 3-way merge라고 합니다. 이름이 3-way인 이유는 지금 1, 2, 3 표시한 3가지 커밋을 고려해서 머지를 하기 때문입니다. 3-way merge는 base에서 변화가 발생한 것을 우선 채택 +[https://www.codeit.kr/topics/git/lessons/2931](https://www.codeit.kr/topics/git/lessons/2931) +2. 퀴즈 +3. 정리노트 +git branch [새 브랜치 이름]: 새로운 브랜치를 생성 +git checkout -b [새 브랜치 이름]: 새로운 브랜치를 생성하고 그 브랜치로 바로 이동 +git branch -d [기존 브랜치 이름]: 브랜치 삭제 +git checkout [기존 브랜치 이름]: 그 브랜치로 이동 +git merge [기존 브랜치 이름]: 현재 브랜치에 다른 브랜치를 머지 +git merge --abort: 머지를 하다가 conflict가 발생했을 때, 일단은 머지 작업을 취소하고 이전 상태로 돌아감 + +3~4 +6. 깃 협업하기 + +1. 지금부터 배울 git 실무지식 +2. git push 전에 git pull해야하는 경우가 많을 걸 +로컬 레포지토리(수정) <- 리모트 레포지토리(수정) +git pull: 리모트 레포지토리의 브랜치를 가져와서 현재 브랜치에 "merge"하는 동작 +누군가 깃푸시를 했다 +-> 나는 먼저 깃pull을 해서 merge conflict 해결 +-> git push +3. git pull말고 git fetch도 있오 +merge는 안하고 가져오기만 하는 git fetch +리모트 레포지토리에 있는 브랜치의 내용을 일단 가져와서 살펴본 후에 머지 하고 싶을 때 사용 +(git pull하기 의심스러울 때) +git fetch -> git diff [리모트 레포지토리] [로컬 레포지토리:origin/[name]] + +리모트 레포지토리에 있는 브랜치 내용과 내가 작성한 코드를 비교해서 잘못된 부분이 없는지 검토해야 할 때 + +1. 이 코드는 누가 작성했을까? +git blame [파일 명] or git show +2. 이미 remote repository에 올라간 커밋을 취소해야한다면? +커밋을 취소하는 커밋 +git revert [commitID] -> git push 해줘야 함 +리셋하면 안됨?? - 로컬만 가능, 리모트 있으면 안됨 +b/c 리모트가 더 최신이라 push가 안되고 pull해야 됨 +3. 여러 커밋 취소하기 +Q: 한꺼번에만 가능? +4. 퀴즈 +5. 깃 협업하기 정리노트 +git fetch: 로컬 레포지토리에서 현재 HEAD가 가리키는 브랜치의 업스트림(upstream) 브랜치로부터 최신 커밋들을 가져옴(가져오기만 한다는 점에서, 가져와서 머지까지 하는 git pull과는 차이가 있음) +git blame: 특정 파일의 내용 한줄한줄이 어떤 커밋에 의해 생긴 것인지 출력 +git revert: 특정 커밋에서 이루어진 작업을 되돌리는(취소하는) 커밋을 새로 생성 +6. 깃 자유자재로 활용하기 +7. git reset을 하고 나서 돌아오려면? +최신커밋을 알아야되는데?? +git reflog : 헤드가 가르켜온 커밋들을 알려줌 +8. 커밋 히스토리를 보는 다양한 방법 +현재 브랜치와 다른 브랜치까지 커밋 히스토리 보기 +git log --pretty=oneline --all --graph +//철자조심 +9. 깃을 gui환경에서 사용할 수 있게 해주는 프로그램 Sourcetree +[https://support.atlassian.com/bitbucket-cloud/docs/tutorial-learn-bitbucket-with-sourcetree/](https://support.atlassian.com/bitbucket-cloud/docs/tutorial-learn-bitbucket-with-sourcetree/) +10. 퀴즈 +11. 깔끔한 커밋 히스토리를 원할 땐 git merge 대신 git rebase +git rebase --continue // 커밋재배치한다. 프리미엄 브랜치의 베이스를 테스트 브랜치로 재지정 +//충돌 때문에 제대로 진행안된 리베이스 계속 진행 +새로운 커밋X +합쳤다는 정보가 필요한경우 - merge +좀 더 깔끔하게 사용하려면 - rebase +12. 작업 내용 임시 저장하기 +다른 브랜치로 가면 working directory가 재설정되니까 문제가 됨 +git stash: 안전한 곳에 보관하다, 넣어두다 => stack에 저장 +git stash list // 스택에 저장된 stash들 보여주기 +git stash apply //다시 가져오기(가장 최신 것) +13. 잘못된 브랜치에서 작업하고 있었다면? +git stash로 받아와서 apply //브랜치 상관 없음 +14. 적용한 작업내용은 스택에서 없애기 +git stash drop stash@{[num]} +git stash pop [작업 내용의 아이디] // 작업 내용을 적용하면서 동시에 스택에서 제거 +15. 퀴즈 +16. 필요한 커밋만 가져오는 git cherry-pick +git cherry-pick [커밋아이디] +//merge의 축소화 +17. 여러 커밋을 하나의 커밋으로 만들기 +git reset으로! +18. 깃이 무시하는 파일들 +.gitignore 파일은 +working directory 내에 존재하는 파일들 중에서 +마치 존재하지 않는 것처럼 +Git이 인식해야할 파일들의 목록이 적힌 파일입니다. +만약 여러분이 working directory에서 버전 관리를 할 필요가 없는 것들이 있다면 이렇게 .gitignore 파일에 그 이름을 추가하고 버전 관리를 시작하세요. 그럼 좀더 깔끔하게 버전 관리를 할 수 있습니다. +*.py[cod] +*$py.class +*.so +19. 퀴즈 +20. 내용 총정리 +21. Git 써보기 +git init : 현재 디렉토리를 Git이 관리하는 프로젝트 디렉토리(=working directory)로 설정하고 그 안에 레포지토리(.git 디렉토리) 생성 +git config [user.name](http://user.name/) 'codeit' : 현재 사용자의 아이디를 'codeit'으로 설정(커밋할 때 필요한 정보) +git config user.email 'teacher@codeit.kr' : 현재 사용자의 이메일 주소를 'teacher@codeit.kr'로 설정(커밋할 때 필요한 정보) +git add [파일 이름] : 수정사항이 있는 특정 파일을 staging area에 올리기 +git add [디렉토리명] : 해당 디렉토리 내에서 수정사항이 있는 모든 파일들을 staging area에 올리기 +git add . : working directory 내의 수정사항이 있는 모든 파일들을 staging area에 올리기 +git reset [파일 이름] : staging area에 올렸던 파일 다시 내리기 +git status : Git이 현재 인식하고 있는 프로젝트 관련 내용들 출력(문제 상황이 발생했을 때 현재 상태를 파악하기 위해 활용하면 좋음) +git commit -m "커밋 메시지" : 현재 staging area에 있는 것들 커밋으로 남기기 +git help [커맨드 이름] : 사용법이 궁금한 Git 커맨드의 공식 메뉴얼 내용 출력 +22. GitHub 시작하기 +git push -u(또는 --set-upstream) origin master : 로컬 레포지토리의 내용을 처음으로 리모트 레포지토리에 올릴 때 사용합니다. +git push : 위의 커맨드를 한번 실행하고 난 후에는 git push라고만 쳐도 로컬 레포지토리의 내용을 리모트 레포지토리에 올릴 수 있습니다. +git pull : 바로 위의 위에 있는 커맨드를 한번 실행하고 난 후에는 git pull이라고만 쳐도 리모트 레포지토리의 내용을 로컬 레포지토리로 가져옵니다. +git clone [프로젝트의 GitHub 상 주소] : GitHub에 있는 프로젝트를 내 컴퓨터로 가져오기 +23. Git에서 커밋 다루기 +git log : 커밋 히스토리를 출력 + +git log --pretty=oneline : --pretty 옵션을 사용하면 커밋 히스토리를 다양한 방식으로 출력할 수 있습니다. --pretty 옵션에 oneline이라는 값을 주면 커밋 하나당 한 줄씩 출력해줍니다. --pretty 옵션에 대해 더 자세히 알고싶으면 이 링크를 참고하세요. + +git show [커밋 아이디] : 특정 커밋에서 어떤 변경사항이 있었는지 확인 + +git commit --amend : 최신 커밋을 다시 수정해서 새로운 커밋으로 만듦 + +git config alias.[별명] [커맨드] : 길이가 긴 커맨드에 별명을 붙여서 이후로는 별명으로도 해당 커맨드를 실행할 수 있게 설정 + +git diff [커밋 A의 아이디] [커밋 B의 아이디] : 두 커밋 간의 차이 비교 + +git reset [옵션] [커밋 아이디] : 옵션에 따라 하는 작업이 달라짐(옵션을 생략하면 --mixed 옵션이 적용됨) + +(1) HEAD가 특정 커밋을 가리키도록 이동시킴(--soft는 여기까지 수행) + +(2) staging area도 특정 커밋처럼 리셋(--mixed는 여기까지 수행) + +(3) working directory도 특정 커밋처럼 리셋(--hard는 여기까지 수행) + +그리고 이때 커밋 아이디 대신 HEAD의 위치를 기준으로 한 표기법(예 : HEAD^, HEAD~3)을 사용해도 됨 + +git tag [태그 이름] [커밋 아이디] : 특정 커밋에 태그를 붙임 + +1. Git에서 브랜치 사용하기 +git branch [새 브랜치 이름] : 새로운 브랜치를 생성 +git checkout -b [새 브랜치 이름] : 새로운 브랜치를 생성하고 그 브랜치로 바로 이동 +git branch -d [기존 브랜치 이름] : 브랜치 삭제 +git checkout [기존 브랜치 이름] : 그 브랜치로 이동 +git merge [기존 브랜치 이름] : 현재 브랜치에 다른 브랜치를 머지 +git merge --abort : 머지를 하다가 conflict가 발생했을 때, 일단은 머지 작업을 취소하고 이전 상태로 돌아감 +2. Git 실전 I +git fetch : 로컬 레포지토리에서 현재 HEAD가 가리키는 브랜치의 업스트림(upstream) 브랜치로부터 최신 커밋들을 가져옴(가져오기만 한다는 점에서, 가져와서 머지까지 하는 git pull과는 차이가 있음) +git blame : 특정 파일의 내용 한줄한줄이 어떤 커밋에 의해 생긴 것인지 출력 +git revert : 특정 커밋에서 이루어진 작업을 되돌리는(취소하는) 커밋을 새로 생성 +3. Git 실전 Ⅱ +git reflog : HEAD가 그동안 가리켜왔던 커밋들의 기록을 출력 +git log --all --graph : 모든 브랜치의 커밋 히스토리를, 커밋 간의 관계가 잘 드러나도록 그래프 형식으로 출력 +git rebase [브랜치 이름] : A, B 브랜치가 있는 상태에서 지금 HEAD가 A 브랜치를 가리킬 때, git rebase B를 실행하면 A, B 브랜치가 분기하는 시작점이 된 공통 커밋 이후로부터 존재하는 A 브랜치 상의 커밋들이 그대로 B 브랜치의 최신 커밋 이후로 이어붙여짐(git merge와 같은 효과를 가지지만 커밋 히스토리가 한 줄로 깔끔하게 된다는 차이점이 있음) +git stash : 현재 작업 내용을 스택 영역에 저장 +git stash apply [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 working directory에 적용 +git stash drop [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 스택에서 삭제 +git stash pop [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 working directory에 적용하면서 스택에서 삭제 +git cherry-pick [커밋 아이디] : 특정 커밋의 내용을 현재 커밋에 반영 +! 그 밖에 알아야할 사실 + +(1) git commit이라고만 쓰고 실행하면 커밋 메시지를 입력할 수 있는 텍스트 에디터 창이 뜹니다. 거기서 커밋 메시지를 입력하고 저장하고 나면 커밋이 이루어집니다. + +(2) git push와 git pull은 그 작업 단위가 브랜치입니다. 예를 들어, master 브랜치에서 git push를 하면 master 브랜치의 내용만 리모트 레포지토리의 master 브랜치로 전송되지, premium 브랜치의 내용이 전송되는 것은 아닙니다.(git push에 --all이라는 옵션을 주면 모든 브랜치의 내용을 전송할 수 있기는 합니다.) + +자, Git 토픽에서 배운 커맨드들을 쭉 정리해봤는데요. 기억이 다 잘 나시나요? 이 커맨드들만 제대로 이해하고 사용해도 여러분이 어디에서 어떤 일을 하든 Git을 사용할 때 불편함이 없을 겁니다. 혹시라도 Git으로 아주 세밀한 작업 또는 여기서 배우지 않은 새로운 커맨드를 써야한다고 할지라도 겁낼 필요가 없습니다. 이 토픽에서는 커맨드 뿐만 아니라 Git의 내부 동작 원리도 제대로 배웠기 때문에 여러분이 조금만 노력하면 그런 것들도 금방 쉽게 할 수 있을 겁니다. + +이제 어디를 가도 '나 Git 쓸 줄 알아!' 라고 자신있게 말할 수 있게 되신 여러분, 축하합니다! \ No newline at end of file diff --git "a/\354\261\204\354\234\240/Week2/JS_basic.md" "b/\354\261\204\354\234\240/Week2/JS_basic.md" new file mode 100644 index 0000000..f3c47fe --- /dev/null +++ "b/\354\261\204\354\234\240/Week2/JS_basic.md" @@ -0,0 +1,293 @@ +# 자바스크립트 기초 + +속성: 토픽 +교과목: Node.js 백엔드 개발 기초 +기한: 2024년 5월 21일 +상태: 진행 중 + +배열 질문, splice : 뒤에서 부터 하면 꽤괜~? + +객체 질문, 프로퍼티 주소..?? + +*배열은 비교연산 불가 + +[QUIZ (1)](https://www.notion.so/QUIZ-1-4163ef7c081c4d9b919e86c72b9b9e94?pvs=21) + +# 💫 프로그래밍 시작하기 in javascript + +1. 세미콜론 / 없어도 무관 but 쓰는 것이 좋음 +2. 주석 // or /* */ +3. 자료형 +4. 추상화 : 구체적인 정보에서 꼭 필요한 핵만을 가져온 것, 복잡->단순, +5. 변수 +let variable= 3000; +console.log(variable); +6. 함수 +function 함수이름() { +명령; +} +7. 파라미터(매개변수) + +# 💫 프로그래밍 핵심 개념 in javascript + +## 1. 자료형 + +1. 숫자형 +거듭제곱 ** > * +2. 문자열 +3. 문자열 활용 +| : "를 쓰고싶을때 → `` : 백틱 +4. bool +=== : 엄격한 비교 / +js에서는 '2' == 2 //true +'2' === 2 //false +!== +&& || +!! (360도) +5. boolen형 +6. typeof 연산자 +type of 1 //'number' +type of 1.0 //'number' +type of '1' // 'string' +type of "1" // 'string' +type of `1` // 'string' +console.log(typeof 8 -3) //NAN +typeof가 연산자보다 우선순위가 높음 +typeof 8 = number +number - 3 = NAN +7. typeof는 string 리턴 +8. 형변환 +String(), Number(), Boolean() +Boolean()의 경우 0, '' NAN -> falsy값 그 외 True +9. 형변환 +console.log(4 + '2') //42 +console.log(4 - true) // 2 +console.log(4 / '2') //2 +10. 수식연산자>비교연산자 +11. 템플릿 문자열 +console.log(`안녕하세요 ${name*2} 입니다.`) +12. null 과 undefined +의도적으로 값이 없다는 말/값이 없다는걸 확인할 때 +선언 x -> undefined +let v = null +null == undefined //true +null === undefined //false + +## 2. 추상화 + +1. 할당 연산자 +2. 복합 할당 연산자 +3. 함수의 실행 순서 +4. return 문 이해하기 +절대 실행 안되는 코드 : dead code +ex) return 뒤에 있는 코드 +5. return vs console.log +6. 실습 +console.log('문자열' * '문자열') //nan +7. 옵셔널 파라미터 = default +옵셔널 파라미터는 맨 뒤에 위치 +8. 변수의 scope 범위 +지역변수, 전역변수 +9. 상수 +const NUM = 0; //변경불가, 선언 필수, 대문자_대문자 + +## 3. 제어문 + +1. if +2. else if +3. switch (?){ +case ? : +break; +defalut: +// switch는 자료형 따져서 === 써야됨 +4. for +5. 실습 +문자열 * 3 불가 +6. while +7. break vs continue + +js < < 가능? + +# 💫 프로그래밍 데이터 in Javascript + +## 1. 객체 + +1. 객체와 프로퍼티 + - 객체(object) 구성 + 프로퍼티 네임 : 프로퍼티 value + - 선언 let 객체이름 = {} + -property name 주의 사항 + 프로퍼터 네임의 자료형은 문자열이지만 반드시 따옴표로 감싸줘야 할 필요는 없다. + - 다만 첫 번째 글자는 반드시 문자, 밑줄(_), $ 중 하나로 시작/띄어쓰기 금지/ - 금지 + 의 경우는 따옴표로 감싸줘야 함 +- key : value +bestCourse : { title : '제목', language : 'java' } +1. 객체 접근 +2. 점표기법 객체이름.프로퍼티이름.프로퍼티이름['프로퍼티이름'] +3. 대괄호 표기법 객체이름['프로퍼티이름'] +없는 프로프터에 접근할 경우 undefined 나옴 +4. 객체 프로퍼티에 할당, 교체 가능. +delete 객체.프로퍼티 하면 삭제가능 + + console.log(객체.프로퍼티 !== undefined) // true : 존재 false 비존재 + console.log('name' in 객체); //객체 안에 프로퍼티가 있는지 확인 후 boolean 리턴 + 두 가지가 다름 undefined일 경우.. in 연산자 사용하는 것이 좋음 + 06. 실습 + 07. 객체와 메소드 + 메소드는 객체에 맞는 동작을 할 때(객체의 고유한 동작) + let 객체이름 = { + 함수이름 : function() { + 실행할 함수; + }, + 함수이름 : function() { + 실행할 함수; + } + }; + + 객체이름.함수이름() + 객체이름['함수이름'](notion://www.notion.so/'%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0'); + +5. 실습 +매개변수로 함수이름을 받을 경우 [] 로 사용 +그냥 대괄호 사용이 젤 맘 편할지도 +6. for in 반복문 +for (let key in 객체){ +함수 +} // 객체에 있는 모든 프로퍼티를 돌아라 +7. for in 주의사항 +객체는 정수형 프로퍼티 네임을 오름차순으로 먼저 정렬하고, 나머지 프로퍼티들은 추가한 순서대로 정렬하는 특징이 있습니다. +'2' : 'value2' +'1' : 'value1' +해도 '1'이 먼저 나옴 +8. 실습 +9. date 객체 +내장객체임. +let 객체 = new Date(1000); +1970년 1월 1일 00:00:00 utc + 1000ms(1초) +let 객체 = new Date('문자열'); +'YYYY-MM-DDThh:mm:ss' // hms 없으면 자정이 디폴트 +new Date(YYYY, MM, DD, hh, mm, ss, ms) //YYYY, MM은 필수, 디폴트는 1일 자정 +//month는 0부터 시작하므로 5월 = 4로 써야됨 +myDate.getTime() // myDate란 객체가 1970년 1월 1일 00:00:00 UTC 부터 얼마나 지났는지-> 타임스탬프 +10. date 객체 tip +month // 0부터 시작 +date // 일자 +day // 요일(일요일 0, 토요일 6) + + set으로 시작하는 다양한 메서드를 활용하면, 생성된 Date객체의 정보를 수정할 수도 있습니다. + + (대괄호로 감싸진 요소들은 선택적인 요소입니다.) + + setFullYear(year, [month], [date]) + setMonth(month, [date]) + setDate(date) + setHours(hour, [min], [sec], [ms]) + setMinutes(min, [sec], [ms]) + setSeconds(sec, [ms]) + setMilliseconds(ms) + setTime(milliseconds)(1970년 1월 1일 00:00:00 UTC부터 밀리초 이후를 나타내는 날짜를 설정) + + let myDate = new Date(); + + console.log(myDate.toLocaleDateString()); // myDate가 가진 날짜에 대한 정보 (년. 월. 일) + console.log(myDate.toLocaleTimeString()); // myDate가 가진 시간에 대한 정보 (시:분:초) + console.log(myDate.toLocaleString()); // myDate가 가진 날짜와 시간에 대한 정보 (년. 월. 일 시:분:초) + toLocaleDateString(), toLocaleTimeString(), toLocaleString() 메소드는 사용자의 브라우저에 설정된 국가의 표기에 맞춰 날짜와 시간을 보여줍니다. + + Date 객체엔 자동으로 날짜를 수정해주는 유용한 기능이 있습니다. 범위를 벗어나는 값을 설정하려고 하면 자동으로 날짜를 수정해줍니다. + let myDate = new Date(1988, 0, 32); // 1988년 1월 32일은 없습니다 + // 2월 1일로 자동고침 되는걸 확인할 수 있습니다. + console.log(myDate) // Mon Feb 01 1988 00:00:00 + + let myDate = new Date(); + console.log(Date.now() === myDate.getTime()); // true + 위 코드를 보시면 알 수 있듯이 새로운 객체를 만들어서 getTime 메소드를 호출한 값과 일치한다는 사실을 확인할 수 있는데요. + + let myDate = new Date(2017, 4, 18); + + console.log(typeof myDate); // object + console.log(String(myDate)); // Thu May 18 2017 00:00:00 GMT+0900 (Korean Standard Time) + console.log(Number(myDate)); // 1495033200000 + console.log(Boolean(myDate)); // true + 우리가 눈여겨 볼 부분은 number 타입으로 변환할 경우입니다. + 이 값은 아무 의미없는 단순한 숫자값이 아니라 getTime() 메소드를 활용한 것과 똑같은 수치의 타임스탬프 값 입니다. + + let myDate1 = new Date(2017, 4, 18); + let myDate2 = new Date(2017, 4, 19); + + let timeDiff = myDate2 - myDate1; + console.log(timeDiff); // 86400000 (ms) + console.log(timeDiff / 1000); // 86400 (sec) + console.log(timeDiff / 1000 / 60) // 1440 (min) + console.log(timeDiff / 1000 / 60 / 60) // 24 (hour) + console.log(timeDiff / 1000 / 60 / 60 / 24) // 1 (date) + + +## 2. 배열 + +1. 배열 let 배열이름 = [ , , , ,] +2. 배열 응용 +배열도 객체다! +배열이름.length or 배열이름['length] // 배열의 요소 개수 +존재하지 않는 값에 접근 -> undefined(empty) +delete 배열이름[인덱스] 하면 값은 사라지는데 메모리는 남음(empty) +3. 배열 메소드 splice +배열.splice(인덱스) // 인덱스 후부터 모두 삭제(메모리까지) +배열.splice(인덱스, 개수) // 인덱스 부터 개수만큼 삭제 +배열.splice(인덱스, 개수, item1, item2 ...) // 인덱스 부터 개수만큼 삭제 후 item 삽입 +개수가 0이면 추가도 가능 +4. 실습 +반복문으로 삭제할 때, +for ( i in 배열) 로 하면 할때마다 배열이 업데이트를 하기 때문에 제대로 work 하지 않음 +for (let i = 0; i < numbers.length; i++) { +if (numbers[i] % 2 !== 0) { +numbers.splice(i, 1); +i--; +} +} +for (let i = numbers.length - 1; i >= 0; i--){ +if (numbers[i]%2 == 1){ +numbers.splice(i, 1) +} +} +두가지 방법 +5. 배열 메소드 +배열.shift() // 맨 첫 요소 삭제 +배열.pop() // 맨 마지막 요소 삭제 +배열.unshift('요소') // 맨 앞에 요소 삽입 +배열.push('요소') // 맨 뒤에 요소 삽입 +6. 배열 메소드 tip +- 배열에서 특정 값 찾기 (indexOf / lastIndexOf) +배열에서 특정 값을 찾으려면 indexOf 메소드를 사용하면 됩니다. array.indexOf(item)을 하면 array 배열에 item이 포함되어 있는지 확인할 수 있습니다. +- 만약 포함되어 있다면, item이 있는 인덱스가 리턴됩니다. +포함되어 있지 않다면, -1이 리턴됩니다. +여러 번 포함되어 있으면, 처음 발견된 인덱스가 리턴됩니다. +- lastIndexOf라는 메소드가 있는데요. indexOf와는 반대로 탐색을 뒤에서 부터 하게 됩니다. +- array.includes(item)을 하게되면 array배열에 item이 있을 경우 true를, 없을 경우 false를 리턴합니다. +- reverse라는 메소드를 활용하면, 배열의 순서를 뒤집을 수도 있습니다. +1. for .. of 반복문 +for (let 요소 of 배열){ +//권장 +} +for (let index in 배열){ +//for in은 배열에 적합하지 않음 +} +2. 실습 +// votes 배열을 이용해서 voteCounter 객체를 정리하기 +for (let name of votes) { +// 여기에 코드를 작성하세요 +if (name in voteCounter) { +voteCounter[name]+= 1; +} else { +voteCounter[name] = 1; +} +} +3. error + + 다음 중 연산 결과가 false 인 보기를 모두 선택해 주세요. + + Boolean(0)// + null !== undefined + 3 !== 1 * '3'// + Number('5' + 3) < 10// + String(123) * 3 <= Number('369') * true// \ No newline at end of file diff --git "a/\354\261\204\354\234\240/Week2/unix.md" "b/\354\261\204\354\234\240/Week2/unix.md" new file mode 100644 index 0000000..dcd4603 --- /dev/null +++ "b/\354\261\204\354\234\240/Week2/unix.md" @@ -0,0 +1,77 @@ +# 실용적 유닉스 커맨드 + +속성: 토픽 +교과목: 버전 관리 및 협업하기 +기한: 2024년 5월 21일 +상태: 진행 중 + +유닉스는 어디 다 저장해놓고 하는게 좋을 듯?? + +우분투나 파워쉘~?/ 파워쉘: 단어 단위?? + +- **pwd (print working directory)** +현재 디렉토리 (working directory)의 경로를 출력 + +- **cd (change directory)** + + cd dir1: PATH 경로에 해당하는 디렉토리로 이동 + + 아무 아규먼트 없이 cd를 하면 사용자의 홈 디렉토리로 이동 + + cd path/to/foo (foo 디렉토리로 이동) + cd path/to/bar (bar 디렉토리로 이동) + cd - (다시 foo 디렉토리로 이동) + +- **ls (list)** + + ls [-al] [PATH] + + ls -al dir1 : PATH에 해당하는 디렉토리 / 파일 정보를 보여줌. PATH 아규먼트를 안 주면 현재 디렉토리 정보를 보여줌. + + - a 옵션: 숨겨진 파일을 포함한 모든 파일을 보여줌. + - l 옵션: long format을 사용해서 더 자세한 정보를 보여줌 + - cf) man ls : manual + +- **mkdir (make directory)** + - mkdir dir2 + 디렉토리를 생성합니다. 여러 경로를 한꺼번에 줘서 여러 디렉토리를 한꺼번에 만들 수도 있습니다. + - touch file.txt + 경로에 해당하는 파일을 생성 + +- **vim** + + vim file1.txt + + cat (concatenate) : 경로에 해당하는 파일들의 내용을 출력. 파일이 여러 개인 경우 내용을 모두 붙여서 출력 + + +- **less PATH** : PATH에 해당하는 파일을 페이지 단위로 나눠서 보여줌 + +- **단축키:** + - 줄 이동: 위쪽 / 아래쪽 방향키 + - 다음 페이지: space 아니면 f + - 이전 페이지: b + - 마지막 페이지: G + - 처음 페이지: g + +- head [-n count] PATH + - PATH에 해당하는 파일의 처음 n줄을 출력 + - n 옵션: 출력되는 줄 개수를 바꿉니다. +- tail [-n count] PATH + - PATH에 해당하는 파일의 마지막 n줄을 출력합니다. + - n 옵션: 출력되는 줄 개수를 바꿉니다. + +- mv [-i] SOURCE_PATH DEST_PATH + - 디렉토리/파일을 이동하거나 이름을 변경합니다. 두 번째 아규먼트(DEST_PATH) 가 이미 존재하는 디렉토리의 경로일 경우 SOURCE_PATH에 해당하는 디렉토리/파일을 그 안으로 이동하고, 그렇지 않으면 DEST_PATH로 이름 변경합니다. + - i 옵션: 이동/이름 변경을 할 때 똑같은 이름의 디렉토리/파일이 있으면 덮어씌워집니다. 확인을 하면서 mv를 하려면 i 옵션을 사용하면 됩니다. + +- cp [-ri] SOURCE_PATH DEST_PATH + - 디렉토리/파일을 복사합니다. 두 번째 아규먼트(DEST_PATH) 가 이미 존재하는 디렉토리의 경로일 경우 SOURCE_PATH에 해당하는 디렉토리/파일을 그 안으로 복사하고, 그렇지 않으면 DEST_PATH라는 이름으로 복사합니다. + - r 옵션: 디렉토리를 복사할 때는 꼭 r 옵션을 써야 합니다. + - i 옵션: 복사할 때 똑같은 이름의 파일이 있으면 덮어씌워집니다. 확인을 하면서 cp를 하려면 i 옵션을 사용하면 됩니다. + +- rm [-rif] PATH1 PATH2 ... + - 경로에 해당하는 파일/디렉토리들을 지워줍니다. + - r 옵션: 디렉토리를 삭제할 때는 꼭 r 옵션을 써야 합니다. + - i 옵션: 삭제할 때 각 파일을 정말 지울 것인지 물어봅니다. + - f 옵션: 지울 것인지 절대 확인하지 않고 바로 지웁니다. \ No newline at end of file diff --git "a/\354\261\204\354\234\240/Week3/Untitled 1.png" "b/\354\261\204\354\234\240/Week3/Untitled 1.png" new file mode 100644 index 0000000..0e86d3c Binary files /dev/null and "b/\354\261\204\354\234\240/Week3/Untitled 1.png" differ diff --git "a/\354\261\204\354\234\240/Week3/Untitled 2.png" "b/\354\261\204\354\234\240/Week3/Untitled 2.png" new file mode 100644 index 0000000..8ad3125 Binary files /dev/null and "b/\354\261\204\354\234\240/Week3/Untitled 2.png" differ diff --git "a/\354\261\204\354\234\240/Week3/Untitled.png" "b/\354\261\204\354\234\240/Week3/Untitled.png" new file mode 100644 index 0000000..8a8c79c Binary files /dev/null and "b/\354\261\204\354\234\240/Week3/Untitled.png" differ diff --git "a/\354\261\204\354\234\240/Week3/javascript_im.md" "b/\354\261\204\354\234\240/Week3/javascript_im.md" new file mode 100644 index 0000000..228751d --- /dev/null +++ "b/\354\261\204\354\234\240/Week3/javascript_im.md" @@ -0,0 +1,761 @@ +# 자바스크립트 중급 + +속성: 토픽 +교과목: Node.js 백엔드 개발 기초 +기한: 2024년 5월 28일 +상태: 진행 중 + +# 🍀 JavaScript 중급 + +## 1 장 | 인터랙티브 자바스크립트 + +--- + +### 1절. 인터랙티브 자바스크립트 시작하기 + +| 메소드 | 의미 | 결과 | +| --- | --- | --- | +| document.getElementById('id') | HTML id속성으로 태그 선택하기 | id에 해당하는 태그 하나 | +| document.getElementsByClassName('class') | HTML class속성으로 태그 선택하기 | class에 해당하는 태그 모음(HTMLCollection) | +| document.getElementsByTagName('tag') | HTML 태그 이름으로 태그 선택하기 | tag에 해당하는 태그 모음(HTMLCollection) | +| document.querySelector('css') | css 선택자로 태그 선택하기 | css 선택자에 해당하는 태그 중 가장 첫번째 태그 하나 | +| document.querySelectorAll('css') | css 선택자로 태그 선택하기 | css 선택자에 해당하는 태그 모음(NodeList) | +- **id로 태그 선택하기** + + `const myTag = document.getElementById('id');` + + - id : 다른 태그들과 구분하기 위해 붙여주는 고유한 값 + - getElementById : document 객체의 메소드 + - 'id'에 존재하지 않는 id가 들어갈 경우 `null` 리턴 + +- **class로 태그 선택하기** + + `const myTags = document.getElementsByClassName('id');` + + - 유사배열(array-like object) HTMLCollection 리턴 + - 숫자 형태의 indexing 가능(0부터 시작) + - length 프로퍼티가 있음 + - 배열의 기본 메소드(splice, push) 사용 불가능 + - Array.isArray(유사배열)은 false다. + - 유사 배열에서 태그의 순서는 깊이와 상관없이 위에서 차례대로! + - 배열에 원소(태그)가 1개라면 그 태그가 선택되는 것이 아니라, 0번 인덱스로 접근해줘야 함 + - 'class'에 존재하지 않는 class가 들어갈 경우 `HTMLCollection []` 리턴 + +- **TagName으로 태그 선택하기** + + `const myTags = document.getElementsByTagName('tagName');` + + - HTMLCollection 리턴 + - ‘*’ 으로 모든 태그 선택 + +- **css 선택자로 태그 선택하기** + + `const myTag = document.querySelector('css');` + + - css 선택자 : ‘#ID + - class 선택자 : ‘.CLASSNAME’ + - 클래스에 있는 태그들 중 가장 위에 있는 **하나**만 선택 + + `const myTags = document.querySelectorAll('css');` + + - 유사배열(NodeList) 리턴 + - 만약 존재하지 않는 요소를 선택할 경우, NodeList[] 리 + + + + +- **이벤트와 버튼 클릭** + - 이벤트 : 웹 페이지에서 발생하는 대부분의 일(사건)들 + + ex) 버튼 클릭, 스크롤, 키보드 입력 + + - 이벤트 핸들링(Event Handling) + + : 이벤트가 발생했을 때 어떤 특별한 동작을 하도록 함 + + - 이벤트 핸들러(Event Handler) + + : 동작을 구체적인 코드로 작성한 함수 부분, 이벤트 리스너(Event Listener)라고도 함 + + ```jsx + //JS에 작성 + const btn = document.querySelector('#myBtn'); + btn.onclick = function() { + console.log('Hello Codeit!'); + }; + + //HTML에 작 + + ``` + + - HTML : 웹페이지 구조 결정 + + JS : 동작 담당 + + - js코드를 html에 같이 작성할 수 있지만 권장X + +### 2절. 브라우저와 자바스크립트 + +- **window 객체** + - [전역 객체(Global Object)](https://developer.mozilla.org/ko/docs/Web/API/Window) + - window 객체의 property 응용 + + ```jsx + //window 객체는 window.을 붙이지 않아도 됨 + window.console.log(window.innerWidth); + window.document.querySelector('css') + + console.log(window.innerWidth); //윈도우 창 넓이 + console.log(window.innerWidth); //윈도우 창 높이 + + window.open() //새 윈도우 창 열기 + window.close() //현재 윈도우 창 닫기 + ``` + +- **DOM(Document Object Model)** + - 문서 객체 모델; **HTML 문서 전체를 객체로 표현**한 것 + - document의 타입은 object이지만 직접적으로 접근하게 된다면 HTML이 출력됨 + - console.dir(document) : document 객체의 property 출력 + - 문자열로 콘솔에 출력 + - 객체의 속성 출력 + - 여러 값을 전달하더라도 첫 번째 값만 출력 + - log 메소드는 대상을 HTML 형태로 출력하고, 객체의 속성에 좀 더 중점을 둔 dir 메소드는 대상을 객체 형태로 출력 + + - DOM을 사용하여 JS로 HTML 태그를 객체처럼 다룰 수 있다 + +- **DOM 트리** + - 요소노드(tag)와 텍스트 노드(txt) + + ![Untitled](%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%B8%E1%84%90%E1%85%B3%20%E1%84%8C%E1%85%AE%E1%86%BC%E1%84%80%E1%85%B3%E1%86%B8%20708f942b41ea44a1a2222901d051ed16/Untitled.png) + + - 노드 접근하기 + - 요소노드 접근하기 + + ```jsx + const myTag = document.querySelector('#content'); + + //자식 요소 노드 + console.log(myTag.children); //자식 노드 태그들을 담은 유사배열 리턴 + console.log(myTag.firstElementChild); //첫번째 자식 노드 선택 + console.log(myTag.lastElementChild); //마지막 자식 노드 선택 + + //부모 요소 노드 + console.log(myTag.parentElement); //body tag 선택 + + //형제 요소 노드 + console.log(myTag.previousElementSibiling); //없다면 null 출 + console.log(myTag.nextElementSibiling); + + console.log(myTag.parentElement.nextElementSibiling); //부모노드의 다음 형제노드 선택 + ``` + + - 텍스트노드 접근하기 + + + | 프로퍼티 | 유형 | 결과 | + | --- | --- | --- | + | node.childNodes | 자식 노드 | node의 자식 노드 모음(NodeList) | + | node.firstChild | 자식 노드 | node의 첫 번째 자식 노드 하나 | + | node.lastChild | 자식 노드 | node의 마지막 자식 노드 하나 | + | node.parentNode | 부모 노드 | node의 부모 요소 하나 | + | node.previousSibling | 형제 노드 | node의 이전(previous) 혹은 좌측(left)에 있는 노드 하나 | + | node.nextSibling | 형제 노드 | node의 다음(next) 혹은 우측(right)에 있는 노드 하나 | + + - 요소노드 프로퍼티 + - innerHTML + - `console.log(myTag.innerHTML);` + - 요소 노드 내부의 HTML 코드를 문자열로 리턴 + - 줄 바꿈이나 들여쓰기 모두 포함 + - `myTag.innerHTML = '
  • 새로운텍스트
  • ';` + - HTML 자체를 수정할 수 있음 → 내부에 있던 값을 완전히 새로운 값으로 교체 + - outerHTML + - `console.log(myTag.outerHTML);` + - 요소 노드 자체의 전체적인 HTML 코드를 문자열로 리턴 + - 내부에 있는 줄 바꿈이나 들여쓰기 모두 포함 + + - `myTag.outerHTML = '';` + - HTML 자체를 수정할 수 있음 → 요소 자체가 교체 + - textContent + - `console.log(myTag.textContent);` + - 요소 안의 내용들 중에서 HTML 태그 부분은 제외하고 텍스트만 가져옴 + - 내부에 있는 줄 바꿈이나 들여쓰기 모두 포함 + - `myTag.textContent = '
  • 새로운텍스트!
  • ';` + - 내부의 값을 새로운 값으로 교체 → 특수문자도 그냥 텍스트로 처리 + + - 요소노드 추가하기 + - 페이지가 동적으로 변할 수 있게 조작하기 위해서 + + - 요소 노드 만들기 + + `const first = document.createElement('태그이름')` + + - 요소 노드 꾸미기 + + `first.textContent = '처음'` + + - 요소노드 추가하기 + - append - 대상을 node 의 마지막에 삽입 + - prepend - 대상을 node 의 가장 앞에 삽입 + - before - 대상을 node 이전에 삽입 + - after - 대상을 node 다음에 삽입 + - 노드 삭제와 이동하기 + - 노드 삭제 + + `Node.remove()` + + - 노드 이동(append, prepend, before, after) + + `today.append(tommorrow.children[1]);` + + 내일 할 일의 2번째 요소를 오늘 할 일에 추가하기 + + + +- **HTML 속성 다루기** + - HTML의 속성과 dom의 property + - 일반적으로 HTML attribute 사용하여 초기 값을 설정하고 DOM property를 사용하여 요소의 상태를 동적으로 조작한다. + - HTML에서의 속성은 attribute + - element가 가지고 있는 것, 정적 + - `name="value"` 의 형태 + + ex) `` // attribute : `value="codeit"` + + + - Dom에서의 속성은 property + - HTML Dom 트리 안에 존재하고 JavaScript에 의해 생성되고 조작되는 값, 동적 + - ex) ``에 “Hi World!” 입력하면 “Hi World!”는 다른 값으로 대체 가능하고 변하기 때문에 property가 됨 + + - HTML의 속성 $\nrightarrow$ 요소노드(DOM)의 프로퍼티 + + ex) href : HTML 표준X + + + - 속성에 접근하기 `elem.getAttribute('속성')` + - class 속성 + + ```jsx + //property 이름으로 접근 + console.log(item.className); + + //속성으로 접근 + elem.getAttribute('class') + ``` + + + - 속성 추가(수정)하기 `elem.setAttribute('속성','값')` + - 속성 제거하기 `elem.removeAttribute('속성')` + - 3개의 메소드 모두 대소문자 상관X + + ex) `elem.removeAttribute('HRef')` == `elem.removeAttribute('href')` + +- **스타일 다루기** + - style 프로퍼티를 이용하기 보다는 클래스로 다루는 것이 좋다 + - elem.classList: add, remove, toggle + + ```jsx + // 요소 하나하나에 스타일 적용 -> 귀찮음 + object.children[0].style.textDecoration = 'line-through'; + object.children[3].style.textDecoration = 'line-through'; + + // class를 적용시키기 -> 원래 있던 클래스가 사라짐 + object.children[1].className = 'done' + + // elem.classList: add, remove, toggle + object.classList.add('done', 'other'); //done과 다른 클래스 추가 + object.classList.remove('done', 'other'); //done과 다른 클래스 삭제 + object.classList.toggle('done'); //done이 없으면 추가, 있으면 삭제 + object.classList.toggle('done', 'BOOLEAN'); //BOOLEAN이 true이면 추가, false이면 삭제 + ``` + +- 😦 비표준 속성 다루기 😦 + + [비표준 속성 다루기 - 인터랙티브 자바스크립트 | 코드잇](https://www.codeit.kr/topics/interactive-javascript/lessons/3829) + + +### 3절. 이벤트 살펴보기 + +### 4절. 다양한 이벤트 알아보기 + +## 2 장 | 모던 자바스크립트 + +--- + +### 1절. 정리한 내용 + +1. **모델링**: 현실세계를 추상화(모형화), 단순화, 명확화하기 위해 일정한 표기법에 의해 표현하는 기법 + - 모델링에 대한 다양한 정의 + - 웹스터 사전 + - 가설적 또는 일정 양식에 맞춘 표현 (a hypothetical or stylized representation) + - 어떤 것에 대한 예비표현으로 그로부터 최종 대상이 구축되도록 하는 계획으로서 기여하는 것 + - 복잡한 '현실세계'를 단순화해 표현하는 것이다. + - 모델이란 사물 또는 사건에 관한 양상(Aspect)이나 관점(Perspective)을 연관된 사람이나 그룹을 위하여 명확하게 하는 것이다. + - 모델이란 현실세계를 추상화한 반영이다. + - 특징 + - 추상화(모형화): 현실세계를 일정한 형식에 맞춰 표현함 + - 단순화: 복잡한 현실세계를 제한된 표기법이나 언어로 쉽게 표현함 + - 명확화: 이해가 쉽게 표현함 + + + + - 모델링의 세가지 관점 + - 데이터 관점(What, Data): 업무와 데이터 및 데이터 사이의 관계를 모델링 + - 프로세스 관점(How, Process): 업무가 실제로 하는 일을 모델링 + - 데이터와 프로세스의 상관 관점(Data vs Process, Interaction): 업무가 처리하는 일의 방법에 따라 데이터는 어떻게 영향받고 있는지 모델링 + +2. **데이터 모델링** +- 데이터 모델링이란? + - 정보시스템 구축을 위한 데이터 관점의 업무 분석 기법 + - 현실세계의 데이터(what)에 대해 약속된 표기법에 의해 표현하는 과정 + - 데이터베이스를 구축하기 위한 분석/설계의 과정 + +- 데이터 모델링의 기능 + - 가시화 + - 명세화 + - 구조화된 틀 제공 + - 문서화 + - 다양한 관점 제공 + - 구체화 + +1. **데이터 모델링의 중요성과 유의점** + - 데이터 모델링의 중요성 + - 파급효과(Leverage) + - 간결한 표현(Conciseness): 설계 도면; 데이터 정합성을 유지 + - 데이터 정합성 : 어떤 데이터들이 값이 서로 일치함. 중복 데이터를 많이 사용하면 데이터끼리 정합성을 맞추기 어렵다. 비정규형을 사용해 아노말리(Anomaly : 이상현상)가 발생하면 정합성이 깨진다. 정합성은 데이터가 서로 모순 없이 일관되게 일치해야 함을 의미함 + - 데이터 품질 + + - 데이터 모델링의 유의점 + - 중복 : 데이터베이스가 여러 장소에 같은 정보를 저장하는 잘못을 하지 않도록 한다. + - 비유연성 : 데이터의 정의를 데이터의 사용 프로세스와 분리함으로써 데이터 모델링은 데이터 혹은 프로세스의 작은 변화가 애플리케이션과 데이터베이스에 중대한 변화를 일으킬 가능성을 줄인다. + - 비일관성 : 데이터의 중복이 없더라도 비일관성(Inconsistency)은 발생한다. 데이터 모델링을 할때, 데이터와 데이터 간 상호 연관관계에 대한 명확한 정의는 이러한 위험을 예방할 수 있도록 해준다. (예) 개발자가 다른 데이터와 모순된다는 고려 없이 데이터를 수정할 가능성이 있음 + +2. **데이터 모델링의 3단계** + - 개념적 모델링: 추상화 수준 ⬆️ 업무 중심적이고 포괄적인 수준의 모델링 진행. 전사적 데이터 모델링, EA 수립, ERD 작성 + - 논리적 모델링: 식별자(key)를 도출하고 속성과 관계 등을 정의함, 정규화를 수행하여 데이터 모델의 독립성과 재사용성 확보, 논리 데이터 모델은 데이터 모델링 완료 상태 + - 물리적 모델링: 실제 DB를 구축할 수 있도록 성능 및 보안 등 물리적인 성격 고려 + +3. **프로젝트 생명주기에서 데이터 모델링** + +프로젝트 생명주기(Life Cycle): 계획 > 분석 > 설계 > 개발 > 테스트 > 전환/이행 단계로 구성 + +1) 계획과 분석 단계 - 개념적 모델링 + +2) 분석 단계 - 논리적 모델링 + +3) 설계 단계 - 물리적 모델링에 해당 + +단 현실 프로젝트에서는 개념적 데이터 모델이 생략된 개념/논리 데이터 모델링이 분석 단계 때 대부분 수행된다. + +1. **데이터 모델링에서 데이터 독립성의 이해** +- 데이터 독립성의 필요성 + - 데이터 중복성 증가 + - 데이터 복잡도 증가 + + 에 의한 + + - 유지보수 비용 증가 + - 요구사항 대응 저하 + + => 데이터 독립성이 필요 + + +- 데이터 독립성을 확보하면 다음과 같은 효과를 얻을 수 있다. + - 각 뷰(View)의 독립성을 유지하고 계층별 뷰에 영향을 주지 않고 변경할 수 있다. + - 단계별 스키마(Schema)에 따라 데이터 정의어 (DDL) 와 데이터 조작어 (DML)가 다름을 제공한다. + +- 데이터베이스 3단계 구조 : 데이터 독립성 확보를 목표로 함 + + ANSI/SPARC의 3단계 구성의 데이터 독립성 모델은 외부단계와 개념적 단계, 내부적 단계로 구성된 서로 간섭되지 않는 모델을 제시하고 있다. + + - 외부스키마 (External Schema) : View 단계의 여러 사용자 관점으로 구성. 개인적. DB개인사용자나 응용프로그래머가 접근 + - 개념스키마 (Conceptual Schema) : 모든 관점 통합. 조직 전체 관점. 조직 전체 DB 기술, 설계자 관점 데이터 모델링의 지향점, DB의 각 사용자나 응용프로그래머가 접근하는 DB의 정의 + - 내부스키마 (Internal Schema) : 내부단계 구성. DB가 물리적으로 저장된 형식. 실제로 저장된 방법 표현, 개발자 관점 + +- 두 영역의 데이터 독립성 + + 이렇게 3단계로 개념이 분리되면서 각각의 영역에 대한 독립성을 지정하는 용어가 바로 논리적인 독립성과 물리적인 독립성이다. + + - 논리적 독립성 : 개념 스키마가 변경되어도 외부 스키마에는 영향을 미치지 않도록 지원하는 것. 논리적 구조가 변경되어도 응용 프로그램에 영향 없음 + - 물리적 독립성 : 내부 스키마가 변경되어도 외부/개념 스키마는 영향을 받지 않도록 지원하는 것. 저장장치의 구조변경은 응용프로그램과 개념스키마에 영향 없음 + + ![Untitled](%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%B8%E1%84%90%E1%85%B3%20%E1%84%8C%E1%85%AE%E1%86%BC%E1%84%80%E1%85%B3%E1%86%B8%20708f942b41ea44a1a2222901d051ed16/Untitled%201.png) + + +- 사상(Mapping) + - 외부적/개념적 사상 (논리적 사상) : 외부적 뷰와 개념적 뷰의 상호 관련성을 정의함 + - 개념적/내부적 사상 (물리적 사상) : 개념적 뷰와 저장된 데이터베이스의 상호 관련성을 정의함. + +1. **데이터 모델링의 중요한 세 가지 개념** +- 데이터 모델링의 세 가지 요소 + + 1) 업무가 관여하는 어떤 것(Things) - 엔터티 + + 2) 어떤 것이 가지는 성격 (Attributes) - 속성 + + 3) 업무가 관여하는 어떤 것 간의 관계 (Relationships) - 관계 + +- 단수와 집합(복수)의 명명 + + ![Untitled](%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%B8%E1%84%90%E1%85%B3%20%E1%84%8C%E1%85%AE%E1%86%BC%E1%84%80%E1%85%B3%E1%86%B8%20708f942b41ea44a1a2222901d051ed16/Untitled%202.png) + + +1. **데이터 모델의 표기법인 ERD 이해** +- 데이터 모델 표기법 + - 1976년 피터첸(Peter Chen)에 의해 E-R Model (Entity-Relationship Model) 표기법이 만들어짐. + - 서로 다른 뷰를 충족시킬 수 있는 데이터 처리와 계약 조건 등의 요구사항을 정의하기 위함 + - 개체-관계 모델은 개체-관계 다이어그램(ERD)로 표현 + - ERD는 최종 사용자의 관점에서 데이터 구조를 그림 형태로 묘사하기 위해 개체, 관계, 속성 이라는 세 개의 기본요소를 사용하며, 엔터티와 이들간의 관계를 미리 약속된 도형을 사용하여 알기 쉽게 그림으로 표시한 것. + - 엔터티는 사각형 관계는 마름모 속성은 타원형으로 표현, 현실의 데이터 모두 표현 가능 + +- ERD 작업순서 + + 1. 엔터티를 도출, 그린다 + + 2. 엔터티를 적절하게 배치 + + 3. 엔터티간 관계 설정 + + 4. 관계명 기술 + + 5. 관계차수 표현: 1:1, 1:N, M:N + + 6. 관계선택사양 표현: 필수, 선택 + + +1. **좋은 데이터 모델의 요소** +- 완전성 : 업무에서 필요로하는 모든 데이터가 데이터 모델에 정의되어 있어야 한다. +- 중복 배제 : 하나의 데이터베이스 내에 동일한 사실은 반드시 한 번만 기록하여야 한다. +- 업무 규칙 : 데이터 모델에 업무규칙을 나타내야 한다. +- 데이터 재사용 : 데이터의 통합성과 독립성에 대해 충분히 고려하여 재사용성을 향상시켜야 한다. +- 의사소통 : 데이터 모델이 의사소통의 도구로서의 역할을 해야 한다. +- 통합성 : 공유 데이터에 대한 구조를 여러 업무 영역에서 공동으로 사용하기 용이하게 설계할 수 있어야 한다. + +## 3 장 | 자바스크립트 객체 지기 + +--- + +### 1절. 정리한 내용 + +1. **모델링**: 현실세계를 추상화(모형화), 단순화, 명확화하기 위해 일정한 표기법에 의해 표현하는 기법 + - 모델링에 대한 다양한 정의 + - 웹스터 사전 + - 가설적 또는 일정 양식에 맞춘 표현 (a hypothetical or stylized representation) + - 어떤 것에 대한 예비표현으로 그로부터 최종 대상이 구축되도록 하는 계획으로서 기여하는 것 + - 복잡한 '현실세계'를 단순화해 표현하는 것이다. + - 모델이란 사물 또는 사건에 관한 양상(Aspect)이나 관점(Perspective)을 연관된 사람이나 그룹을 위하여 명확하게 하는 것이다. + - 모델이란 현실세계를 추상화한 반영이다. + - 특징 + - 추상화(모형화): 현실세계를 일정한 형식에 맞춰 표현함 + - 단순화: 복잡한 현실세계를 제한된 표기법이나 언어로 쉽게 표현함 + - 명확화: 이해가 쉽게 표현함 + + + + - 모델링의 세가지 관점 + - 데이터 관점(What, Data): 업무와 데이터 및 데이터 사이의 관계를 모델링 + - 프로세스 관점(How, Process): 업무가 실제로 하는 일을 모델링 + - 데이터와 프로세스의 상관 관점(Data vs Process, Interaction): 업무가 처리하는 일의 방법에 따라 데이터는 어떻게 영향받고 있는지 모델링 + +2. **데이터 모델링** +- 데이터 모델링이란? + - 정보시스템 구축을 위한 데이터 관점의 업무 분석 기법 + - 현실세계의 데이터(what)에 대해 약속된 표기법에 의해 표현하는 과정 + - 데이터베이스를 구축하기 위한 분석/설계의 과정 + +- 데이터 모델링의 기능 + - 가시화 + - 명세화 + - 구조화된 틀 제공 + - 문서화 + - 다양한 관점 제공 + - 구체화 + +1. **데이터 모델링의 중요성과 유의점** + - 데이터 모델링의 중요성 + - 파급효과(Leverage) + - 간결한 표현(Conciseness): 설계 도면; 데이터 정합성을 유지 + - 데이터 정합성 : 어떤 데이터들이 값이 서로 일치함. 중복 데이터를 많이 사용하면 데이터끼리 정합성을 맞추기 어렵다. 비정규형을 사용해 아노말리(Anomaly : 이상현상)가 발생하면 정합성이 깨진다. 정합성은 데이터가 서로 모순 없이 일관되게 일치해야 함을 의미함 + - 데이터 품질 + + - 데이터 모델링의 유의점 + - 중복 : 데이터베이스가 여러 장소에 같은 정보를 저장하는 잘못을 하지 않도록 한다. + - 비유연성 : 데이터의 정의를 데이터의 사용 프로세스와 분리함으로써 데이터 모델링은 데이터 혹은 프로세스의 작은 변화가 애플리케이션과 데이터베이스에 중대한 변화를 일으킬 가능성을 줄인다. + - 비일관성 : 데이터의 중복이 없더라도 비일관성(Inconsistency)은 발생한다. 데이터 모델링을 할때, 데이터와 데이터 간 상호 연관관계에 대한 명확한 정의는 이러한 위험을 예방할 수 있도록 해준다. (예) 개발자가 다른 데이터와 모순된다는 고려 없이 데이터를 수정할 가능성이 있음 + +2. **데이터 모델링의 3단계** + - 개념적 모델링: 추상화 수준 ⬆️ 업무 중심적이고 포괄적인 수준의 모델링 진행. 전사적 데이터 모델링, EA 수립, ERD 작성 + - 논리적 모델링: 식별자(key)를 도출하고 속성과 관계 등을 정의함, 정규화를 수행하여 데이터 모델의 독립성과 재사용성 확보, 논리 데이터 모델은 데이터 모델링 완료 상태 + - 물리적 모델링: 실제 DB를 구축할 수 있도록 성능 및 보안 등 물리적인 성격 고려 + +3. **프로젝트 생명주기에서 데이터 모델링** + +프로젝트 생명주기(Life Cycle): 계획 > 분석 > 설계 > 개발 > 테스트 > 전환/이행 단계로 구성 + +1) 계획과 분석 단계 - 개념적 모델링 + +2) 분석 단계 - 논리적 모델링 + +3) 설계 단계 - 물리적 모델링에 해당 + +단 현실 프로젝트에서는 개념적 데이터 모델이 생략된 개념/논리 데이터 모델링이 분석 단계 때 대부분 수행된다. + +1. **데이터 모델링에서 데이터 독립성의 이해** +- 데이터 독립성의 필요성 + - 데이터 중복성 증가 + - 데이터 복잡도 증가 + + 에 의한 + + - 유지보수 비용 증가 + - 요구사항 대응 저하 + + => 데이터 독립성이 필요 + + +- 데이터 독립성을 확보하면 다음과 같은 효과를 얻을 수 있다. + - 각 뷰(View)의 독립성을 유지하고 계층별 뷰에 영향을 주지 않고 변경할 수 있다. + - 단계별 스키마(Schema)에 따라 데이터 정의어 (DDL) 와 데이터 조작어 (DML)가 다름을 제공한다. + +- 데이터베이스 3단계 구조 : 데이터 독립성 확보를 목표로 함 + + ANSI/SPARC의 3단계 구성의 데이터 독립성 모델은 외부단계와 개념적 단계, 내부적 단계로 구성된 서로 간섭되지 않는 모델을 제시하고 있다. + + - 외부스키마 (External Schema) : View 단계의 여러 사용자 관점으로 구성. 개인적. DB개인사용자나 응용프로그래머가 접근 + - 개념스키마 (Conceptual Schema) : 모든 관점 통합. 조직 전체 관점. 조직 전체 DB 기술, 설계자 관점 데이터 모델링의 지향점, DB의 각 사용자나 응용프로그래머가 접근하는 DB의 정의 + - 내부스키마 (Internal Schema) : 내부단계 구성. DB가 물리적으로 저장된 형식. 실제로 저장된 방법 표현, 개발자 관점 + +- 두 영역의 데이터 독립성 + + 이렇게 3단계로 개념이 분리되면서 각각의 영역에 대한 독립성을 지정하는 용어가 바로 논리적인 독립성과 물리적인 독립성이다. + + - 논리적 독립성 : 개념 스키마가 변경되어도 외부 스키마에는 영향을 미치지 않도록 지원하는 것. 논리적 구조가 변경되어도 응용 프로그램에 영향 없음 + - 물리적 독립성 : 내부 스키마가 변경되어도 외부/개념 스키마는 영향을 받지 않도록 지원하는 것. 저장장치의 구조변경은 응용프로그램과 개념스키마에 영향 없음 + + ![Untitled](%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%B8%E1%84%90%E1%85%B3%20%E1%84%8C%E1%85%AE%E1%86%BC%E1%84%80%E1%85%B3%E1%86%B8%20708f942b41ea44a1a2222901d051ed16/Untitled%201.png) + + +- 사상(Mapping) + - 외부적/개념적 사상 (논리적 사상) : 외부적 뷰와 개념적 뷰의 상호 관련성을 정의함 + - 개념적/내부적 사상 (물리적 사상) : 개념적 뷰와 저장된 데이터베이스의 상호 관련성을 정의함. + +1. **데이터 모델링의 중요한 세 가지 개념** +- 데이터 모델링의 세 가지 요소 + + 1) 업무가 관여하는 어떤 것(Things) - 엔터티 + + 2) 어떤 것이 가지는 성격 (Attributes) - 속성 + + 3) 업무가 관여하는 어떤 것 간의 관계 (Relationships) - 관계 + +- 단수와 집합(복수)의 명명 + + ![Untitled](%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%B8%E1%84%90%E1%85%B3%20%E1%84%8C%E1%85%AE%E1%86%BC%E1%84%80%E1%85%B3%E1%86%B8%20708f942b41ea44a1a2222901d051ed16/Untitled%202.png) + + +1. **데이터 모델의 표기법인 ERD 이해** +- 데이터 모델 표기법 + - 1976년 피터첸(Peter Chen)에 의해 E-R Model (Entity-Relationship Model) 표기법이 만들어짐. + - 서로 다른 뷰를 충족시킬 수 있는 데이터 처리와 계약 조건 등의 요구사항을 정의하기 위함 + - 개체-관계 모델은 개체-관계 다이어그램(ERD)로 표현 + - ERD는 최종 사용자의 관점에서 데이터 구조를 그림 형태로 묘사하기 위해 개체, 관계, 속성 이라는 세 개의 기본요소를 사용하며, 엔터티와 이들간의 관계를 미리 약속된 도형을 사용하여 알기 쉽게 그림으로 표시한 것. + - 엔터티는 사각형 관계는 마름모 속성은 타원형으로 표현, 현실의 데이터 모두 표현 가능 + +- ERD 작업순서 + + 1. 엔터티를 도출, 그린다 + + 2. 엔터티를 적절하게 배치 + + 3. 엔터티간 관계 설정 + + 4. 관계명 기술 + + 5. 관계차수 표현: 1:1, 1:N, M:N + + 6. 관계선택사양 표현: 필수, 선택 + + +1. **좋은 데이터 모델의 요소** +- 완전성 : 업무에서 필요로하는 모든 데이터가 데이터 모델에 정의되어 있어야 한다. +- 중복 배제 : 하나의 데이터베이스 내에 동일한 사실은 반드시 한 번만 기록하여야 한다. +- 업무 규칙 : 데이터 모델에 업무규칙을 나타내야 한다. +- 데이터 재사용 : 데이터의 통합성과 독립성에 대해 충분히 고려하여 재사용성을 향상시켜야 한다. +- 의사소통 : 데이터 모델이 의사소통의 도구로서의 역할을 해야 한다. +- 통합성 : 공유 데이터에 대한 구조를 여러 업무 영역에서 공동으로 사용하기 용이하게 설계할 수 있어야 한다. + +## 4 장 | 자바스크립트 웹 개발 기본기 + +--- + +### 1절. 정리한 내용 + +1. **모델링**: 현실세계를 추상화(모형화), 단순화, 명확화하기 위해 일정한 표기법에 의해 표현하는 기법 + - 모델링에 대한 다양한 정의 + - 웹스터 사전 + - 가설적 또는 일정 양식에 맞춘 표현 (a hypothetical or stylized representation) + - 어떤 것에 대한 예비표현으로 그로부터 최종 대상이 구축되도록 하는 계획으로서 기여하는 것 + - 복잡한 '현실세계'를 단순화해 표현하는 것이다. + - 모델이란 사물 또는 사건에 관한 양상(Aspect)이나 관점(Perspective)을 연관된 사람이나 그룹을 위하여 명확하게 하는 것이다. + - 모델이란 현실세계를 추상화한 반영이다. + - 특징 + - 추상화(모형화): 현실세계를 일정한 형식에 맞춰 표현함 + - 단순화: 복잡한 현실세계를 제한된 표기법이나 언어로 쉽게 표현함 + - 명확화: 이해가 쉽게 표현함 + + + + - 모델링의 세가지 관점 + - 데이터 관점(What, Data): 업무와 데이터 및 데이터 사이의 관계를 모델링 + - 프로세스 관점(How, Process): 업무가 실제로 하는 일을 모델링 + - 데이터와 프로세스의 상관 관점(Data vs Process, Interaction): 업무가 처리하는 일의 방법에 따라 데이터는 어떻게 영향받고 있는지 모델링 + +2. **데이터 모델링** +- 데이터 모델링이란? + - 정보시스템 구축을 위한 데이터 관점의 업무 분석 기법 + - 현실세계의 데이터(what)에 대해 약속된 표기법에 의해 표현하는 과정 + - 데이터베이스를 구축하기 위한 분석/설계의 과정 + +- 데이터 모델링의 기능 + - 가시화 + - 명세화 + - 구조화된 틀 제공 + - 문서화 + - 다양한 관점 제공 + - 구체화 + +1. **데이터 모델링의 중요성과 유의점** + - 데이터 모델링의 중요성 + - 파급효과(Leverage) + - 간결한 표현(Conciseness): 설계 도면; 데이터 정합성을 유지 + - 데이터 정합성 : 어떤 데이터들이 값이 서로 일치함. 중복 데이터를 많이 사용하면 데이터끼리 정합성을 맞추기 어렵다. 비정규형을 사용해 아노말리(Anomaly : 이상현상)가 발생하면 정합성이 깨진다. 정합성은 데이터가 서로 모순 없이 일관되게 일치해야 함을 의미함 + - 데이터 품질 + + - 데이터 모델링의 유의점 + - 중복 : 데이터베이스가 여러 장소에 같은 정보를 저장하는 잘못을 하지 않도록 한다. + - 비유연성 : 데이터의 정의를 데이터의 사용 프로세스와 분리함으로써 데이터 모델링은 데이터 혹은 프로세스의 작은 변화가 애플리케이션과 데이터베이스에 중대한 변화를 일으킬 가능성을 줄인다. + - 비일관성 : 데이터의 중복이 없더라도 비일관성(Inconsistency)은 발생한다. 데이터 모델링을 할때, 데이터와 데이터 간 상호 연관관계에 대한 명확한 정의는 이러한 위험을 예방할 수 있도록 해준다. (예) 개발자가 다른 데이터와 모순된다는 고려 없이 데이터를 수정할 가능성이 있음 + +2. **데이터 모델링의 3단계** + - 개념적 모델링: 추상화 수준 ⬆️ 업무 중심적이고 포괄적인 수준의 모델링 진행. 전사적 데이터 모델링, EA 수립, ERD 작성 + - 논리적 모델링: 식별자(key)를 도출하고 속성과 관계 등을 정의함, 정규화를 수행하여 데이터 모델의 독립성과 재사용성 확보, 논리 데이터 모델은 데이터 모델링 완료 상태 + - 물리적 모델링: 실제 DB를 구축할 수 있도록 성능 및 보안 등 물리적인 성격 고려 + +3. **프로젝트 생명주기에서 데이터 모델링** + +프로젝트 생명주기(Life Cycle): 계획 > 분석 > 설계 > 개발 > 테스트 > 전환/이행 단계로 구성 + +1) 계획과 분석 단계 - 개념적 모델링 + +2) 분석 단계 - 논리적 모델링 + +3) 설계 단계 - 물리적 모델링에 해당 + +단 현실 프로젝트에서는 개념적 데이터 모델이 생략된 개념/논리 데이터 모델링이 분석 단계 때 대부분 수행된다. + +1. **데이터 모델링에서 데이터 독립성의 이해** +- 데이터 독립성의 필요성 + - 데이터 중복성 증가 + - 데이터 복잡도 증가 + + 에 의한 + + - 유지보수 비용 증가 + - 요구사항 대응 저하 + + => 데이터 독립성이 필요 + + +- 데이터 독립성을 확보하면 다음과 같은 효과를 얻을 수 있다. + - 각 뷰(View)의 독립성을 유지하고 계층별 뷰에 영향을 주지 않고 변경할 수 있다. + - 단계별 스키마(Schema)에 따라 데이터 정의어 (DDL) 와 데이터 조작어 (DML)가 다름을 제공한다. + +- 데이터베이스 3단계 구조 : 데이터 독립성 확보를 목표로 함 + + ANSI/SPARC의 3단계 구성의 데이터 독립성 모델은 외부단계와 개념적 단계, 내부적 단계로 구성된 서로 간섭되지 않는 모델을 제시하고 있다. + + - 외부스키마 (External Schema) : View 단계의 여러 사용자 관점으로 구성. 개인적. DB개인사용자나 응용프로그래머가 접근 + - 개념스키마 (Conceptual Schema) : 모든 관점 통합. 조직 전체 관점. 조직 전체 DB 기술, 설계자 관점 데이터 모델링의 지향점, DB의 각 사용자나 응용프로그래머가 접근하는 DB의 정의 + - 내부스키마 (Internal Schema) : 내부단계 구성. DB가 물리적으로 저장된 형식. 실제로 저장된 방법 표현, 개발자 관점 + +- 두 영역의 데이터 독립성 + + 이렇게 3단계로 개념이 분리되면서 각각의 영역에 대한 독립성을 지정하는 용어가 바로 논리적인 독립성과 물리적인 독립성이다. + + - 논리적 독립성 : 개념 스키마가 변경되어도 외부 스키마에는 영향을 미치지 않도록 지원하는 것. 논리적 구조가 변경되어도 응용 프로그램에 영향 없음 + - 물리적 독립성 : 내부 스키마가 변경되어도 외부/개념 스키마는 영향을 받지 않도록 지원하는 것. 저장장치의 구조변경은 응용프로그램과 개념스키마에 영향 없음 + + ![Untitled](%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%B8%E1%84%90%E1%85%B3%20%E1%84%8C%E1%85%AE%E1%86%BC%E1%84%80%E1%85%B3%E1%86%B8%20708f942b41ea44a1a2222901d051ed16/Untitled%201.png) + + +- 사상(Mapping) + - 외부적/개념적 사상 (논리적 사상) : 외부적 뷰와 개념적 뷰의 상호 관련성을 정의함 + - 개념적/내부적 사상 (물리적 사상) : 개념적 뷰와 저장된 데이터베이스의 상호 관련성을 정의함. + +1. **데이터 모델링의 중요한 세 가지 개념** +- 데이터 모델링의 세 가지 요소 + + 1) 업무가 관여하는 어떤 것(Things) - 엔터티 + + 2) 어떤 것이 가지는 성격 (Attributes) - 속성 + + 3) 업무가 관여하는 어떤 것 간의 관계 (Relationships) - 관계 + +- 단수와 집합(복수)의 명명 + + ![Untitled](%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%B8%E1%84%90%E1%85%B3%20%E1%84%8C%E1%85%AE%E1%86%BC%E1%84%80%E1%85%B3%E1%86%B8%20708f942b41ea44a1a2222901d051ed16/Untitled%202.png) + + +1. **데이터 모델의 표기법인 ERD 이해** +- 데이터 모델 표기법 + - 1976년 피터첸(Peter Chen)에 의해 E-R Model (Entity-Relationship Model) 표기법이 만들어짐. + - 서로 다른 뷰를 충족시킬 수 있는 데이터 처리와 계약 조건 등의 요구사항을 정의하기 위함 + - 개체-관계 모델은 개체-관계 다이어그램(ERD)로 표현 + - ERD는 최종 사용자의 관점에서 데이터 구조를 그림 형태로 묘사하기 위해 개체, 관계, 속성 이라는 세 개의 기본요소를 사용하며, 엔터티와 이들간의 관계를 미리 약속된 도형을 사용하여 알기 쉽게 그림으로 표시한 것. + - 엔터티는 사각형 관계는 마름모 속성은 타원형으로 표현, 현실의 데이터 모두 표현 가능 + +- ERD 작업순서 + + 1. 엔터티를 도출, 그린다 + + 2. 엔터티를 적절하게 배치 + + 3. 엔터티간 관계 설정 + + 4. 관계명 기술 + + 5. 관계차수 표현: 1:1, 1:N, M:N + + 6. 관계선택사양 표현: 필수, 선택 + + +1. **좋은 데이터 모델의 요소** +- 완전성 : 업무에서 필요로하는 모든 데이터가 데이터 모델에 정의되어 있어야 한다. +- 중복 배제 : 하나의 데이터베이스 내에 동일한 사실은 반드시 한 번만 기록하여야 한다. +- 업무 규칙 : 데이터 모델에 업무규칙을 나타내야 한다. +- 데이터 재사용 : 데이터의 통합성과 독립성에 대해 충분히 고려하여 재사용성을 향상시켜야 한다. +- 의사소통 : 데이터 모델이 의사소통의 도구로서의 역할을 해야 한다. +- 통합성 : 공유 데이터에 대한 구조를 여러 업무 영역에서 공동으로 사용하기 용이하게 설계할 수 있어야 한다. + +# 🍀 스터디 진행 + +## 📚 강의 리뷰(질문 및 정보 공유) + +--- + +## 📚 코드잇에서 진행한 실습 및 과제 비교 + +--- + +# 🍀 다음 스터디까지 \ No newline at end of file diff --git "a/\354\261\204\354\234\240/Week4/Untitled.png" "b/\354\261\204\354\234\240/Week4/Untitled.png" new file mode 100644 index 0000000..60786ab Binary files /dev/null and "b/\354\261\204\354\234\240/Week4/Untitled.png" differ diff --git "a/\354\261\204\354\234\240/Week4/c.png" "b/\354\261\204\354\234\240/Week4/c.png" new file mode 100644 index 0000000..980ea43 Binary files /dev/null and "b/\354\261\204\354\234\240/Week4/c.png" differ diff --git "a/\354\261\204\354\234\240/Week4/sql.md" "b/\354\261\204\354\234\240/Week4/sql.md" new file mode 100644 index 0000000..78cafca --- /dev/null +++ "b/\354\261\204\354\234\240/Week4/sql.md" @@ -0,0 +1,620 @@ +# 개발자를 위한 SQL 데이터베이스 + +속성: 토픽 +교과목: 데이터베이스와 SQL +기한: 2024년 6월 4일 +상태: 진행 중 + +# 🍀 **개발자를 위한 SQL 데이터베이스** + +## 1 장 | **SQL로 하는 데이터 분석** + +--- + +### 0절. 단축키 + +- Windows SQL문 실행 : `Ctrl + Shift + Enter` +- ctrl + T : 새 쿼리창 열기 + +### 1절. **데이터베이스 기본 개념** + +- **테이블** : 표 형식으로 저장된 데이터의 집합 + - row(행) : 하나의 개체를 나타내는 것 + - column(열) : 개체의 각 속성을 나타내는 것 + +- **DBMS (Data Base Management System)** : 데이터베이스를 운영하고 관리하는 소프트웨어 + + ![Untitled](%E1%84%80%E1%85%A2%E1%84%87%E1%85%A1%E1%86%AF%E1%84%8C%E1%85%A1%E1%84%85%E1%85%B3%E1%86%AF%20%E1%84%8B%E1%85%B1%E1%84%92%E1%85%A1%E1%86%AB%20SQL%20%E1%84%83%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%90%E1%85%A5%E1%84%87%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%89%E1%85%B3%20ab1e2dce677845129206f5db596a784e/Untitled.png) + + - SQL (Structured Query Language) 사용 + - cf) Oracle은 '오라클'과 'MySQL'을 모두 갖고 있는 회사 + +- **서버-클라이언트 구조** : 서버 역할을 하는 하나의 프로그램이 실행되고 있고, 사용자는 클라이언트 역할을 하는 프로그램(DBMS)으로 해당 서버에 접속하고, 그 서버에 SQL을 전송해서 명령을 내리는 구조 + +### 2절. **테이블 생성하기** + +- 데이터베이스 생성하기 `CREATE DATABASE database_name` +- CSV: Comma Separated Values +- Primary Key(기본키) : 테이블에서 하나의 row를 고유하게 식별할 수 있도록 해주는 column(열쇠모양) + - Natural Key + + 실제로 어떤 개체가 갖고 있는 속성을 나타내는 컬럼이 Primary Key가 됐을 때 (ex, 주민등록번호, ISBN) + + - Surrogate Key + + 어떤 개체의 실제 속성은 아니지만 Primary Key로 쓰기 위해 추가한 컬럼. 주로 1부터 순차적으로 증가하는 숫자가 들어가게 됨 + + - NN : NOT NULL, 값이 무조건 존재해야 함 + - AI : Auto Increment +- NULL : 값이 존재하지 않은 상태 + +### 3절. **데이터 조회로 기본 다지기** + +- * : asterisk, 전체 +- **SELECT** + + USE copang_main; SELECT column FROM table WHERE 조건; + + SELECT column FROM database.table WHERE 조건; + +- **WHERE** + - **비교 연산** + - WHERE age NOT BETWEEN 30 AND 39; // 30대 가 아닌 경우의 나이칼럼 + - WHERE sign_up_day > '2019-01-01'; //2019년부터 가입한 사람들 + + - **논리연산** : AND의 우선순위가 OR보다 높다 + + - **유무 확인** IN + + ex) `WHERE age IN (20, 30)` + + + - **문자열 패턴 매칭** + - WHERE address LIKE '서울%'; //문자열에 서울+a이 있는 경우 + - WHERE address LIKE '%서울% '; //서울이 있는 경우 + - WHERE email LIKE 'c_____@%'; //c로 시작하는 6글자만, _:임의의 한 글자 + + -> [codeit@naver.com](mailto:codeit@naver.com) + + + - **DATE 타입 관련 함수** + - YEAR(birthday) //년도 + - MONTH(sign_up_day) //달 + - DAYOFMONTH(sign_up_day) //일 + - CURDATE() : 오늘 날짜 + - DATEDIFF(A, B) : A-B + - DATE_ADD(A, INTERVAL B DAY) : A에서 B일 이후의 날짜 + - DATE_SUB(A, INTERVAL B DAY) : A에서 B일 이전의 날짜 + - UNIX_TIMESTAMP(sign_up_day) : 1970년 1월 1일을 기준으로 sign_up_day가 총 몇 초가 지났는지 + - UNIXTIME(unix_timestamp) : total second -> DATETIME type (sec로 표현 됨) + + - **데이터 정렬하기 ORDER BY** + - ORDER BY height ASC; //오름차순, 디폴트 + + ORDER BY height DESC; //내림차순 + + - 정렬은 순서대로! - 가입연도 내림차순, 가입연도가 같으면 오름차순 정렬 + + ORDER BY YEAR(sign_up_day) DESC, email ASC; + + - **데이터 일부만 추리기 LIMIT** + - limit은 제일 마지막에 적는다 + - LIMIT 10 ; // 10개 만 + + LIMIT 8, 2; // 9,10번 째 row만 + + - **데이터 타입 일시적으로 변경하기 CAST()** + + CAST(data AS signed) // data를 signed (INT)로 변환 + + CAST(data AS decimal) // data를 decimal (floating point)로 변환 + + - **이스케이핑(escaping)** : 표현식을 일반 텍스트로 표현하고 싶을 때 앞에 \를 붙여줌 + + - **ci(case-insensitive)** : 문자열이 동일한지 확인할 때, 대소문자를 구별하지 않음 + → **BINARY** '%g%' 처럼 쓰면 대소문자 구분 가능 + +### 4절. 데이터 분석 단계로 나아가기 + +- **집계 함수(Aggregate Function)** + - COUNT(col) + - COUNT(*) : 전체 row + - null 개수는 제외하고 count함 + - AVG(col) + - null은 제외하고 구함 + - MAX(col), MIN(col) + - SUM() + - STD() - 표준편차 + +- **산술 함수(Mathematical Function)** + - ABS() 함수 - 절대값 + - SQRT() 함수 - 제곱근 + - CEIL() 함수 - 올림 + - FLOOR() 함수 - 내림 + - ROUND() 함수 - 반올림 + +- **NULL 처리** + - IS NOT NULL + - COALESECE(col, A) - col이 NULL 이라면 A 리턴, 아니면 원래 값 리턴 + - NULL에는 어떤 연산을 해도 NULL + - NULL은 어떤 값이 아니기 때문에 등호(=)를 사용해서 비교할 수 없음. + - cf) dbms마다 null이 가장 큰 값이 될 때도 있고 가장 작은 값이 될 때도 있음. + +- **산술 계산** / : 나누기(몫 계산) +- **ALIAS 붙이기** AS or ' '(공백) +- **요소 붙이기** + + `CONCAT(co1, 'com', ',' col2, 'kr') AS '키와 몸무게' // 결과 : col1com, col2kr` + +- **조건문** + + ```sql + (CASE + WHEN 조건 THEN 결과 + WHEN 조건 THEN 결과 + ELSE 결과 + END) AS 칼럼명 + ``` + + +- **고유값만 보기 DISTINCT(col)** +- **문자열 함수** + - SUBSTRING(col, a, b)) : a번째 글자부터 b글자 추출 + - LENGTH() : 문자열의 길이 + - UPPER() : 문자열 대문자로 바꾸기 + - LOWER() : 문자열 소문자로 바꾸기 + - LPAD(col, totalNUM, W) : col의 값을, 왼쪽에 W을 붙여서 총 totalNUM자리로 만드는 함수, ex) `RPAD(age,10, '!') // 29!!!!!!!!` + - TRIM(), LTRIM(), RTRIM() : 문자열에 존재하는 공백을 제거 + +- **그루핑 GROUP BY** + - SELECT 절에는 GROUP BY 뒤에서 사용한 컬럼들 또는 COUNT(), MAX() 등과 같은 집계 함수만 쓸 수 있다. GROUP BY 뒤에 쓰지 않은 컬럼 이름을 SELECT 뒤에 쓸 수는 없다. + - GROUP BY 절 뒤에 쓴 컬럼 이름들만, SELECT 절 뒤에도 쓸 수 있음 + - SELECT 절 뒤에서 집계 함수에 그 외의 컬럼 이름을 인자로 넣는 것은 허용 + - **HAVING ‘조건’** + - ex) `HAVING age >= 20 AND height >= 170` + - WHERE는 table에서 row를 조회할 때 사용, HAVING은 이미 조회된 row를 grouping해서 다시 조회할 때! + + - **WITH ROLL UP** + - GROUP BY 뒤의 그루핑 기준들의 등장 순서에 맞춰서 부분 총계를 보여줌 + + - **GROUPING()** + - 실제 NULL을 나타내기 위해 쓰인 NULL인 경우에는 0, 부분 총계를 나타내기 위해 표시된 NULL은 1 + +- **SQL 작성 순서와 실행 순서** + - 작성 순서 : SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY - LIMIT + - 실행 순서 : FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY - LIMIT + - WHERE: 해당 테이블에서 특정 조건(들)을 만족하는 row들만 선별합니다. + - GROUP BY: row들을 그루핑 기준대로 그루핑합니다. 하나의 그룹은 하나의 row로 표현됩니다. + +### 5절. **테이블 조인을 통한 깊이있는 데이터 분석** + +- **Foreign Key(외래키) :** 다른 테이블의 특정 row를 식별할 수 있게 해주는 컬럼 + + ![자식 테이블 - 참조를 하는 테이블인 stock 테이블 + 부모 테이블 - 참조를 당하는 테이블인 item 테이블](%E1%84%80%E1%85%A2%E1%84%87%E1%85%A1%E1%86%AF%E1%84%8C%E1%85%A1%E1%84%85%E1%85%B3%E1%86%AF%20%E1%84%8B%E1%85%B1%E1%84%92%E1%85%A1%E1%86%AB%20SQL%20%E1%84%83%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%90%E1%85%A5%E1%84%87%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%89%E1%85%B3%20ab1e2dce677845129206f5db596a784e/c.png) + + 자식 테이블 - 참조를 하는 테이블인 stock 테이블 + 부모 테이블 - 참조를 당하는 테이블인 item 테이블 + + - 설정 방법 : 자식 테이블의 foreign keys로 가서 자식-부모/자식-부모로 설정 후 apply + - Foreign key로 설정된 컬럼을 기준으로 조인하는 것이 일반적이나, 서로 다른 두 테이블의 컬럼이 같은 의미를 갖고 있다면 Foreign key 관계가 설정되어있지 않아도 조인 가능 (이때 두 컬럼의 데이터 타입은 같아야 함) + +- **결합 연산과 집합 연산** + - 결합 연산은 테이블을 가로 방향으로 합치는 것 : JOIN + - 집합 연산은 테이블을 세로 방향으로 합치는 것 : INTERSECT, MINUS/EXCEPT, UNION + +- **Alias 붙이기** + - FROM 절에서 테이블에 alias를 붙이면, 다른 모든 절에서 그 테이블은 그 alias로만 나타내야 한다. + + ```sql + SELECT + [i.id](http://i.id/), + [i.name](http://i.name/), + s.item_id, + s.inventory_count + FROM item AS i LEFT OUTER JOIN stock AS s + ON [i.id](http://i.id/) = s.item_id + + ``` + +- **USING** + - 두 테이블에서 조인 조건으로 사용되는 컬럼들의 이름이 같을때 USING(col)을 사용하는 것도 허용 + - `ON old.id = new.id` 대신 `USING(id)` + +- **결합 연산 : JOIN** + - OUTER JOIN + + ```sql + FROM item LEFT OUTER JOIN stock + ON new.id = stock.item_id + ``` + + - LEFT OUTER JOIN = > 기준이 되는 테이블이 left에 + - RIGHT OUTER JOIN = > 기준이 되는 테이블이 right에 있음 + - FULL OUTER JOIN = + + ```sql + SELECT * + FROM item LEFT OUTER JOIN stock + ON [item.id](http://item.id/) = stock.item_id + **UNION (ALL)** + SELECT * + FROM item RIGHT OUTER JOIN stock + ON [item.id](http://item.id/) = stock.item_id + ``` + + - INNER JOIN `FROM item INNER JOIN JOIN stock` + - 기준이 되는 테이블이 따로 없고 두 테이블 모두 기준 칼럼에 일치하는 값이 있는 로우들만 연결 + + - NATURAL JOIN `FROM item NATURAL JOIN stock` + - 두 테이블에서 같은 이름의 컬럼을 찾아서 자동으로 조인 조건을 설정하고, INNER JOIN 함 + + - CROSS JOIN `FROM item CROSS JOIN stock` + - 두 테이블의 Cartesian Product를 구하는 조인. + - 카르테시안 곱(Cartesian Product) : 모든 원소들의 조합을 나타내는 것 + - Non-Equi & Equi 조인 + - Equi 조인 : 조인 조건에 항상 등호(=)를 사용하는 조인; 동등 조건을 판단함. + - Non-Equi 조인 : 조인 조건에 등호(=)를 사용하지 않는 조인 + + ```sql + FROM member LEFT OUTER JOIN item + ON member.sign_up_day < item.registration_date + // 회원의 사이트 가입일 이후에 사이트에 올라온 상품 + ``` + + +- **집합 연산 : INTERSECT, MINUS 또는 EXCEPT, UNION** + - MySQL에서는 버전 8.0 기준으로 UNION 연산자만 지원 + + (다른 DBMS인 오라클에서는 3가지 연산자 모두 지원 + + 1. A ∩ B (INTERSECT 연산자 사용) + + ```sql + //INNER JOIN + SELECT * FROM member_A + INTERSECT + SELECT * FROM member_B + ``` + + 2. A - B (MINUS 연산자 또는 EXCEPT 연산자 사용) + + ```sql + SELECT * FROM member_A + MINUS + SELECT * FROM member_B + + //LEFT OUTER JOIN, JOIN하는 컬럼을 기준으로, 조인테이블의 값이 NULL인 경우 + SELECT * + FROM member_A a LEFT OUTER JOIN member_B b + ON ([a.ID](http://a.id/) = [b.ID](http://b.id/)) + WHERE [b.ID](http://b.id/) IS NULL; + ``` + + 3. A U B (UNION 연산자 사용) + - UNION ALL - 중복 제거 X + - 두 테이블의 칼럼 구조(총 컬럼의 수, 각 컬럼의 데이터 타입)가 다르면 연산 실패. + - SELECT <여러 칼럼의 공통 부분> FROM member_A 로 해결 가능 + + ```sql + SELECT * FROM member_A + UNION (ALL) + SELECT * FROM member_B + ``` + + + +### 6절. **서브쿼리와 뷰를 활용한 유연한 데이터 분석** + +- **서브쿼리** : SQL문 안에 '부품'처럼 들어가는 SELECT 문 + + sub(하위의, 일부분의), Query (데이터베이스에 보내는 요청) + +- **서브쿼리의 종류 : 리턴 결과에 따라** + - 스칼라 서브쿼리 : 단일값 리턴 + - 하나의 column에 여러 row들이 있는 형태의 결과를 리턴하는 서브쿼리 + - derived 테이블 리턴 : 하나의 테이블 형태의 결과(여러 column, 여러 row)를 리턴하는 서브쿼리 + - alias를 꼭 붙여주어야 함 + +- **서브쿼리의 종류 : 독립적인지에 따라** + - 비상관 서브쿼리 : 그 자체만으로도 실행이 가능한 서브쿼리, outer query와 별개로 독립적으로 실행 + - 상관 서브쿼리 : 서브쿼리가 outer query에 적힌 테이블 이름 등과 상관 관계를 갖고 있어서 그 단독으로는 실행되지 못하는 서브쿼리 + +- **서브쿼리와 함께 사용되는 키워드** + - IN + + ```sql + SELECT * FROM item + WHERE id IN( + SELECT item_id + FROM review + GROUP BY item_id HAVING COUNT(*) >= 3 + ); + ``` + + - ANY/SOME : 서브쿼리의 결과에 있는 각 row의 값들 중 하나라도 조건을 만족하는 경우가 있으면 TRUE 리턴 + - ALL : 모든 경우에 대해서 해당 조건이 성립해야 TRUE를 리턴 + - EXISTS, NOT EXISTS +- **뷰** : 조인 등의 작업을 해서 만든 '결과 테이블'이 가상으로 저장된 형태(가상 테이블) + - 자주 쓰는 결과를 table로 저장하지만 실제 테이블과 달리 데이터가 물리적으로 컴퓨터에 저장되어 있는 건 아님 + - 뷰 생성하기 `CREATE VIEW '뷰 이름' AS SELECT 문;` + - 뷰의 장점 + - 높은 편의성 : 복잡한 SQL문을 뷰로 저장해두면 재활용할 수 있어서 편리함 + - 각 직무별 데이터 수요에 알맞은, 다양한 구조의 데이터 분석 기반을 구축 : + + 기존의 테이블 구조를 건드리지 않고 직무에 따라, 상황에 따라, 필요로 하는 데이터의 종류와 그 구조를 준비할 수 있음 + + - 데이터 보안 : 분석가에게 민감 정보가 담긴 컬럼을 제외하고 보여줄 수 있음 + +- **데이터베이스 현황 파악** + - `SHOW DATABASES;` : 존재하는 데이터베이스 파악 + - `SHOW FULL TABLES IN database_name;` : 한 데이터베이스 안의 테이블(뷰도 포함)들 파악 + - `DESCRIBE table_name;` : 한 테이블의 컬럼 구조 파악 + - Foreign Key(외래키) 파악 : Foreign Key 관계가 성립한다고 해도 관리자가 그것을 Foreign Key로 설정하지 않는 경우도 많다. Foreign Key 관련 정보를 조회하는 SQL 문은 DBMS의 기본 데이터베이스에서 그 정보를 가져오는 것이기 때문에 DBMS마다 다르다. + +## 2 장 | **SQL로 하는 데이터 관리** + +--- + +### 1절. **데이터베이스와 테이블 구축** + +- **데이터베이스 생성하기** `CREATE DATABASE database` + - 'database'가 없는 경우를 확인한 후 생성하기 `CREATE DATABASE IF NOT EXIST database` + +- **사용하는 데이터베이스 지정하기** `USE database` + - 지정된 데이터베이스 안에 있는 존재를 SQL 문에서 가리킬 때, 데이터베이스 이름을 적어주지 않아도 됨 + +- 칼럼의 데이터 타입 [https://www.codeit.kr/topics/data-management-using-sql/lessons/3263](https://www.codeit.kr/topics/data-management-using-sql/lessons/3263) + +- **백틱(backtick)** : MySQL에서 백틱은 해당 단어가 identifier임을 나타내는 기호 + - DBMS에서는 데이터베이스, 테이블, 컬럼 등과 같은 구성요소를 object(객체)라고 하고 이런 object에 붙여준 이름을 identifier(식별자)라고 함 + +- **테이블 생성하기** + + ```sql + CREATE TABLE animal_info ( + id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(10) NOT NULL, + age TINYINT NOT NULL, + sex CHAR(1) NOT NULL, + weight DOUBLE NOT NULL, + feature VARCHAR(500) NULL, //null값이 들어와도 됨 + entry_date DATE NOT NULL, + PRIMARY KEY(id) + ); + ``` + +- **테이블에 row 추가하기** + + `INSERT INTO table (col1, col2, ... , coln)` + + `VALUES (v1, v2, ... , vn)` + + - 모든 칼럼의 값이 존재한다면 칼럼명을 생략해도 됨. + `INSERT INTO table VALUES (v1, v2, ... , vn)` + +- **테이블의 row 갱신하기** +`UPDATE table SET col1 = 'value1', col2 = 'value2' WHERE id = 2;` + + (ex) `UPDATE table SET score = score + 3` //score 칼럼에 있는 모든 값에 3 더하기 + +- **테이블의 row 삭제하기** + - 물리 삭제 vs 논리 삭제 + - 물리 삭제 : row를 바로 삭제 `DELETE FROM table WHERE id = 2;` + - 논리 삭제 : 삭제해야할 row를 삭제하지 않고, ‘삭제 여부’를 나타내는 별도의 컬럼에 값(Y/N)을 넣는 것 ⇒ `UPDATE` + +### 2절. **테이블 다루기** + +- **DESCRIBE 또는 DESC** + - Field : 컬럼의 이름 + - Type : 컬럼의 데이터 타입 + - Null : 컬럼의 Null 속성 유무 + - Key : Primary Key, Unique 속성 여부 + - Default : 컬럼의 기본값 + - Extra : AUTO_INCREMENT 등의 기타 속성 + +- **칼럼 추가하기** `ALTER TABLE table ADD col DATATYPE ATTRIBUTE` + + (ex) `ALTER TABLE student ADD gender CHAR(1) NULL;` + + +- **컬럼명 바꾸기** `ALTER TABLE table RENAME COLUMN col_old TO col_new;` + + (ex) `ALTER TABLE student RENAME COLUMN student_number TO registration_number;` + + +- **칼럼 삭제하기** `ALTER TABLE table DROP COLUMN col;` + + (ex) `ALTER TABLE student DROP COLUMN admission_date`; + + +- **칼럼 데이터 타입 변경하기** `ALTER TABLE table MODIFY col DATATYPE ATTRIBUTE;` + - **칼럼에 DEFAULT 값 넣기** + + `ALTER TABLE table MODIFY col DATATYPE ATTRIBUTE(N/NN) DEFAULT value;` + + - (ex) ALTER TABLE student MODIFY major INT NOT NULL DEFAULT 101; + - ATTRIBUTE을 명시해주지 않을 경우 NULL로 변경됨(default가 NULL) + +- **칼럼에 현재 시간 값 넣기** + + → 어떤 row가 추가되거나 갱신되었을 때 그 추가 혹은 갱신 시각을 저장해야할 때 + + (ex) 게시글 업로드 시각, 댓글이 달린 시각, 댓글을 수정한 시각 + + - **NOW() 함수** + - 각 row마다 시간값에 관한 처리를 다르게 해줘야하는 경우 + + (ex) 어떤 row는 현재 시간에서 +3시간, 어떤 row는 현재 시간에서 -5시간을 해줘야하는 경우) + + + ```sql + INSERT INTO post (title, content, upload_time, recent_modified_time) + VALUES ("요즘 고민", "집 가고 싶음", NOW(), NOW()); + + UPDATE post + SET content = "집에서 나오기 싫음", recent_modified_time = NOW() + WHERE id = 1; + //YYYY-MM-DD HH:MM:SS + ``` + + + - 컬럼에 **DEFAULT CURRENT_TIMESTAMP / ON UPDATE CURRENT_TIMESTAMP** 속성 설정하기 + - 굳이 날짜/시간 값을 별도로 신경쓰기가 싫을 경우 DBMS가 알아서 관리하도록 함 + - DEFAULT CURRENT_TIMESTAMP : 테이블에 새 row를 추가할 때 디폴트로 현재 시간이 설정 + - ON UPDATE CURRENT_TIMESTAMP : 기존 row에서 단 하나의 컬럼이라도 갱신되면 갱신될 때의 시간이 설정 + + ```sql + ALTER TABLE post + MODIFY upload_time DATETIME DEFAULT CURRENT_TIMESTAMP, + MODIFY recent_modified_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ON UPDATE CURRENT_TIMESTAMP + ``` + + +- **UNIQUE 속성주기** `ALTER TABLE table MODIFY col DATATYPE ATTRIBUTE(N/NN) UNIQUE;` + + → 각 row마다 고유한 값을 가져야 할 때 + + - Primary key vs Unique + - Primary key는 테이블당 오직 하나만 존재, 한 테이블에 여러 개의 Unique 속성들이 존재 가능 + - Primary Key는 NULL을 가질 수 없지만, Unique는 NULL을 허용한다 + +- **CONSTRAINT(제약사항)** + - CONSTRAINT 걸기 `ALTER TABLE table ADD CONSTRAINT constraint_name CHECK (조건)` + - CONSTRAINT 삭제 `ALTER TABLE table DROP CONSTRAINT constraint_name` + +- **칼럼 작업들** + - 컬럼 가장 앞으로 당기기 `ALTER TABLE table MODIFY col DATATYPE ATTRIBUTE FIRST;` + (ex) ALTER TABLE table MODIFY id INT NOT NULL AUTO_INCREMENT FIRST; + - 컬럼 간의 순서 바꾸기 `ALTER TABLE table MODIFY col1 DATATYPE ATTRIBUTE AFTER col2;` + - 컬럼의 이름(RENAME)과 컬럼의 데이터 타입 및 속성(MODIFY) 동시에 수정하기 + `ALTER TABLE table CHANGE col_old col_new DATATYPE_new ATTRIBUTE;` + - 여러 작업 동시에 수행하기 + - Modify랑 Change는 따로 작성하기 + + ```sql + ALTER TABLE table + RENAME COLUMN col_old TO col_new, + MODIFY col DATATYPE_new NOT NULL, + DROP COLUMN col2, + ADD col3 DOUBLE NOT NULL; + ``` + + +- **테이블 이름 변경** `RENAME TABLE table_old TO table_new;` +- **테이블 복사본 만들기** `CREATE TABLE copy_of_table AS SELECT * FROM table;` + - 테이블 컬럼 구조만 복사하기 `CREATE TABLE copy_of_table LIKE table;` + - 테이블의 row 복사하기 `INSERT INTO copy_of_table SELECT * FROM table WHERE (조건)` +- **테이블 삭제하기** `DROP TABLE table;` +- **테이블 컬럼 구조만 남기고 데이터 날리기** `TRUNCATE table;` or `DELETE FROM table;` + +- **safe update 관련** [https://www.codeit.kr/topics/data-management-using-sql/lessons/3277](https://www.codeit.kr/topics/data-management-using-sql/lessons/3277) + - safe update 사용 중일 경우, KEY column을 사용해서 테이블을 갱신 + +### 3절. **Foreign Key 제대로 사용하기** + +## 3 장 | **데이터베이스 모델링** + +--- + +### 1절. **데이터 모델링이란?** + +### 2절. **논리적 모델링** + +### 3절. **정규화** + +### 4절. **물리적 모델링** + +# 🍀 스터디 진행 + +## 📚 강의 리뷰(질문 및 정보 공유) + +--- + +- sql 1 + + 과제 1 + SQL로 하는 데이터 분석 + SQL로 데이터를 조회하고 분석하는 방법을 배워 봅시다 + 4 + 데이터 분석 단계로 나아가기 + + 칼럼 자유롭게 다루기 실습 + [https://www.codeit.kr/topics/data-analysis-using-sql/lessons/3193](https://www.codeit.kr/topics/data-analysis-using-sql/lessons/3193) + + BETWEEN 불가능 : if 나 switch같은 순서?? 아닌듯 + 실습 설명 + 코드잇 피자 가게에는 피자들의 가격과 원가를 관리하는 아래와 같은 pizza_price_cost 테이블이 있습니다. + + id name price cost + 1 Potato Bacon Pizza 22000 14000 + 2 Sweet Potato Pizza 24000 14000 + 3 Combination Pizza 25000 13000 + 4 Bacon Cheddar Pizza 32000 20000 + 5 Pineapple Pizza 25000 22000 + 6 Garlic Shrimp Pizza 26000 19000 + 7 Cheeze Pizza 23000 17000 + 8 Pepperoni Pizza 24000 13000 + 이 테이블에서 price 컬럼이 피자 가격, cost 컬럼이 피자를 만드는데 드는 비용(원가)를 나타내는데요. + 이 중에서 비용 대비 가격이 낮은, 그러니까 다른 말로 하면 효율이 떨어지는 메뉴는 각 메뉴의 원가를 절감할 수 있는 방법을 찾거나, 가격을 높이려고 합니다. + + 원가 대비 실제 가격의 비율은 (price/cost) 로 나타낼 수 있겠죠? + + pizza_price_cost 테이블을 가지고 다음 작업을 해보세요. + + pizza_price_cost 테이블의 name, price, price/cost(원가 기준 가격의 비율) 컬럼을 조회하세요. + + 대신 마지막 price/cost 컬럼을 사용해서 그 값이 + + 1 <= 값 < 1.5 인 경우, ‘C. 저효율 메뉴’ + 1.5 <= 값 < 1.7 인 경우, ‘B. 중효율 메뉴’ + 1.7 <= 값 인 경우, ‘A. 고효율 메뉴’ + 라고 그 값을 변환해서 표시하는 추가적인 컬럼도 함께 조회하고 대신 이 컬럼에는 efficiency라는 alias를 붙여주세요. + + 그리고 전체 row를 efficiency 컬럼을 기준으로 내림차순, 그 다음 기준으로 price 컬럼을 기준으로 오름차순 정렬하세요. + + 이 중에서 가장 첫 번째 row 부터 6개만 추리세요. + + 직접 SQL 문을 작성해서 효율이 떨어지는 메뉴들을 찾아봅시다. + + SELECT + (CASE + WHEN age = NULL THEN 'true' + WHEN age != NULL THEN 'false' + END) AS 'IS NULL?' + + FROM copang_main.member + + => NULL + + - foreign key 설정 안하고도 조인 가능한데 굳이 설정한느 이유는? + +- EXISTS와 IN의 차이 + +먼저 말씀하신 것 처럼 EXISTS 와 IN 의 결과는 동일한게 맞습니당. +다만 EXISTS 가 IN 보다 조금 더 연산이 빠를 수 있습니다. +EXISTS 는 상관 서브쿼리에서 쓰이게 되는데, 서브쿼리의 실행 결과가 하나라도 있으면 True 를 반환합니다. + +SELECT * +FROM item +WHERE EXISTS (SELECT item_id FROM review WHERE [item.id](http://item.id/) = review.item_id); + +위 코드를 실행하게 되면 메인쿼리의 각 행마다 서브쿼리를 실행하게 됩니당. +즉 메인쿼리의 1행이 있다면 item 테이블 1행에서 id 를 가져와서 review 의 item_id 와 비교하게 됩니당. +그래서 만약 서브쿼리의 결과가 True 라면 그 행은 WHERE 에 의해 선택되겠죵 +그리고 2행이 있다면 똑같이 item 테이블 2행에서 id 를 가져와 비교하게 되고요. +이제 차이가 있다면 아까 말씀드린 실행결과가 하나라도 있으면 True 를 반환한다는 것인데 +만약 1행에서 서브쿼리를 실행할 때 item 의 id(여러개가 있겠죵?)와 review 의 item_id(review 의 첫번째 행 id)가 일치하는게 여러개가 나올 수 있다고 하더라도 +서브쿼리 실행 결과 가장 먼저 만족하는 행, 즉 [item.id](http://item.id/) 와 review.item_id 가 되는 행이 발견된다면 그 뒤에 또 만족하는 행이 있더라도 바로 True 를 반환되며 +다시 메인쿼리 2행에서 서브쿼리를 실행하게 될 것입니다. +반면 IN 의 경우엔 모든 행을 다 보게 되는 것이고용. +[https://choihyuunmin.tistory.com/93](https://choihyuunmin.tistory.com/93) 확인 + +- sql + +## 📚 코드잇에서 진행한 실습 및 과제 비교 + +--- + +# 🍀 다음 스터디까지 \ No newline at end of file