최근 ios 개발 공부를 하고있다.

 

오른손을 한 일을 왼손이 모르게 하라는 속담이 있지만

 

내가 공부하는건 나 혼자 하고있어서 이러다가 진짜 아무도 내가 ios공부한걸 모를 것 같아 블로그에 매일 공부 기록을 남기려고한다.

 

플랫폼은 Udemy, 강사는 Dr. Angela Yu

리뷰도 많고 평점도 높고 맛보기 강의를 들었을때 괜찮아보여서 세일중에 질렀다.

 

https://www.udemy.com/course/ios-13-app-development-bootcamp/

 

 

 

강의는 내내 영어로 진행된다.

 

하지만 한국어 자막이 잘 되어있어서 문제없다.

 

그리고 만약 영어에 언어장벽을 크게 느끼지 않는 사람이라면 그냥 봐도 무방하다.

 

나는 자막없이 그냥 듣는게 더 편해서 영어로만 공부중인데, 코딩 관련 영단어를 익힐 수 있어서 더 좋다.

 

 

현재 섹션 14까지 완료한 상태인데 (총 36섹션이다) 지금까지 수강한 코딩 강의중 단연 1등! 최고이며 

 

코딩을 잘 모르지만 아이폰 개발을 해보고 싶은 사람에게 무조건 추천하고 싶은 강의다.

 

이유 1: 강의를 따라하는 게 재밌다!

- 처음 코딩을 하게되면 내가 뭘 하는지 눈에 잘 안들어와서 반응이 바로 오는 작업을 하는 게 더 흥미롭다. 그런데 처음에는 iOS앱의 view를 직접 만들고 수정하며  재미를 느끼게 해준다. 재미는 공부를 할 때 아주 중요한 요인인데, 초반에 하는 섹션중에 실로폰 앱만들기가 있다.

앱에서 view를 누를때마다 음이 나오는 코드를 작성하게 만들어서 그럴듯한 작업물을 만들 수 있게 유도하는데 그 과정이 쉽고, import와 라이브러리같은 중요한 개념들을 자세히 설명해준다.

 

이유 2: 실습 위주의 강의

- 코딩을 그냥 시키는대로 따라치기만하면 실력이 절.대. 늘지 않는다. 하지만 안젤라는 계속해서 학생들에게 직업 시도하게 하는 시간을 주고 목표를 설정해서 직접 해보도록 유도한다. 그리고 git에 올라온 프로젝트를 클론 받아서 수업이 진행되기 때문에 리소스를 찾거나 다운로드 받아 적용해야하는 것과 같은 것들에 시간을 소비하지 않아도 된다! 그리고 git 사용법도 알려줘서 더욱 추천

 

이유 3: 실무위주의 세심한 팁

- 사실 이렇게 글을 쓰게 된 이유중 가장 큰 이유는 이 부분이다. 안젤라는 강의를 진행하면서 굉장히 자연스럽게 개발자의 필수 요소들을 모두 알려준다. stackOverFlow에서 검색을 하는 방법과 코딩이 막혔을때 해결하는 방법, 팁, 그리고 MVC패턴까지 굉장히 자연스럽게 알려준다. 나는 백엔드 개발을 하면서 땅에 헤딩하며 이렇게 하는 게 맞는지 한 구석에 의문을 가진채로 일해왔다. 그런데 이렇게 iOS강의를 통해 여러번의 실습을 하며 강사가 개발 방법을 자연스럽게 녹여서 알려주는 게 좋아서 이렇게 추천 글까지 남기게 되었다.

 

 

한국에도 다양한 IT교육 플랫폼이 있다는 것을 알고있다.

 

하지만 Udemy는 세계에서 실력있는 강사들이 모여있는 플랫폼이다.

그리고 무엇보다 가장 중요한건, 경제적으로 부담이 덜하다.

 

물론 아직 강의 하나만 수강하는 입장에서 섣부른 추천일 수 있겠지만, iOS를 공부하고 싶다면 이 강의를 추천한다!

 

최근 개발자 풀이 늘어나면서 git을 사용하는 사람들도 증가하고 있다.

 

하지만 그 유명하고 편하고 좋다는 git! 

어떻게 사용해야 더 잘 사용할 수 있을까?

 

현업에서 git을  사용하면서 많은 개발자들이 고민, 또 고민했던 문제이다.

 

이제 git branch 전략을 통해 (나보다)똑똑한 사람들은 어떻게 깃을 사용하는지 알아보자.

 

 

깃 브랜치 전략이란?

 

 

깃을 사용하다보면 branch라는 개념을 알 수 있다. 나무의 가지를 뜻하는 영어이기도 하고, 프랜차이즈의 분점을 지칭하기도 하는 branch는 메인으로 사용하는 마스터 외의 브랜치를 의미한다.

 

깃 브랜치 전략은 바로 그 브랜치들을 어떻게 활용하는지 그 관리하는 방법 혹은 지침이라고 할 수 있다.

코드의 컨벤션이 존재하듯 깃도 어떻게 브랜치들을 사용할지 개발자 선배님들이 정의해놓은 활용 방법이다.

 

 

깃 브랜치 전략의 종류

 

깃 브랜치 전략은 많이 있지만 주로 사용되는 전략들을 살펴보자.

 

1. Git Flow 

2. GitHub Flow 

3. GitLab Flow

 

 

 

Git Flow

Git Flow 전략은 master, develop, feature, release, hotfix 등 다양한 브랜치 유형을 사용하여 복잡한 프로젝트를 관리할 수 있는 구조이다. 장기 프로젝트에 적합하고 여러 사람들이 협업을 진행할 때 효과가 좋다. 각 브랜치마다 역할을 명확하게 나눠서 각자의 branch에서 업무를 진행하고 그 용도에 맞는 branch에 merge를 진행한 뒤 이전 개발하던 branch를 삭제하므로 꼬일 위험도 줄어든다.

 

 

GitHub Flow

GitHub Flow 전략은 main 브랜치를 주로 사용한다. 그러다가 각 작업이나 기능 개발을 위한 브랜치를 생성하여 작업을 진행한 후 main branch에 병합한다. 이후 작업했던 branch는 삭제한다.

단순한 구조로 되어있고 CI/CD와 관련있는 프로젝트에 적합한 전략이다.

 

 

 

GitLab Flow

GitLab Flow 전략은 GitFlow와 GitHub Flow를 섞은 전략으로 생각하면 이해하기 쉽다. GitLab은 웹 기반의 Git 리포지토리 관리 시스템으로 다양한 서비스를 제공하고 있다. GitLab Flow는 GitLab 환경에서 사용되는 전략으로 유연한 작업 흐름을 제공한다. production 브랜치가 있다는 것이 특징으로, production 브랜치는 배포를 위한 브랜치이다. 

담당자들은 feature branch에서 개발을 진행하고 완료되었을 경우, 의논을 통해 병합을 하는 방식으로 진행한다.

 

 

 

브랜치 전략은 프로젝트와 각 조직에 따라 변경될 수 있다. 따라서 어떤 브랜치 전략이 지금 진행하고 있는 프로젝트에 적합한지는 구성원들이 함께 노력해나가면서 만들고 변경해나가야 한다고 생각한다.

 

 

참고 사이트 

 

https://docs.github.com/en/get-started/quickstart/github-flow

 

GitHub flow - GitHub Docs

GitHub flow is a lightweight, branch-based workflow. The GitHub flow is useful for everyone, not just developers. For example, here at GitHub, we use GitHub flow for our site policy, documentation, and roadmap. To follow GitHub flow, you will need a GitHub

docs.github.com

 

https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/

 

What is GitLab Flow?

Code reviews ensure developers ship the highest quality code through systematic assessments designed to identify bugs.

about.gitlab.com

 

https://techblog.woowahan.com/2553/

 

우린 Git-flow를 사용하고 있어요 | 우아한형제들 기술블로그

{{item.name}} 안녕하세요. 우아한형제들 배민프론트개발팀에서 안드로이드 앱 개발을 하고 있는 나동호입니다. 오늘은 저희 안드로이드 파트에서 사용하고 있는 Git 브랜치 전략을 소개하려고 합

techblog.woowahan.com

 

'깃허브' 카테고리의 다른 글

[github] 깃으로 하는 협업: 코멘트 남기기  (0) 2022.08.02

 

클린코드, 그게 대체 뭐지?

 

말로는 참 많이 들어봤다. 클린코드.

중요한 것도 알고있다.

 

하지만 어떻게 해야하는지 전혀 감도 안 잡히고 대충 개념은 알겠는데 그래서 어떻게 하라고?

이런 상태로 있다가 알게된 곳이 있다. NEXTSTEP.

 

https://edu.nextstep.camp/

 

NEXTSTEP

 

edu.nextstep.camp

 

 

단위테스트와 클린코드 작성을 한번에 배울 수 있는 강의가 있다고 해서 바로 신청했다.

마침 가격도 나쁘지 않아 신청했는데 왠걸...

 

안드로이드와 간신히 웹개발 프론트삼총사 CSS, JS, HTTP를 공부하던 내게 신세계가 펼쳐졌다.

 

자바 플레이그라운드 with TDD, 클린코드

 

 

현재 모각코에서 만난 스터디원과 노션을 통해 일정을 관리하고 코드리뷰를 병행중에 있다.

junit을 처음 써봤는데 알면 알수록 정말 재밌다!!

 

아직 클린코드라고 하기에는 부족한 실력이지만 지향점이 어디인지, 어떻게 나아가야하는지 감을 잡아가기 좋은 강의라 적어본다. 

모두를 위한 파이썬 <PY4E 2022>

 

모두를 위한 파이썬 <PY4E 2022>

부스트코스 무료 강의

www.boostcourse.org

 

6주간의 여정이 드디어 끝났다!!

 

부스터로 참가했지만 리드부스터가 되어 이렇게 끝까지 완주를 할 수 있어서 정말 뿌듯하다.

 

짧다면 짧은, 길다면 긴 시간을 함께 해준 우리 팀원들과 코치님, 그리고 운영진에게 감사한 마음뿐이다.

 

 

어떤 경험을 했는가?
  1. 리더로서 스터디를 이끌어봤다.
  2. 새로운 언어를 다른 사람들과 함께 공부해봤다.
  3. 코드리뷰를 진행, 경험해봤다.
  4. 깃허브로 협업을 했다.
  5. 파이썬의 기초를 익힐 수 있었다.

 

 

경험을 통해 배운 점

 

1. 리더로서의 경험

 

나는 보통 팔로워에 가까웠기에 이렇게 적극적으로 리더 활동을 해본 경험은 많지 않았다.

하지만 이 경험을 통해 나는 팔로워와 리더 모두 제대로 수행해 낼 수 있는 사람이란 걸 깨닫게 되었다.

사람들에게 도움을 주는 행동은 내게 동기부여를 하게 해주었고 리더라는 타이틀이 그 시너지를 낼 수 있게 도와주었다.

 

그래서 더욱 리더로서 열심히 활동을 할 수 있었고 팀원들에게 배울 수 있음에 감사하며 더욱 적극적으로 행동할 수 있었다. 이 경험으로 나는 내가 팔로워 뿐만 아닌 리더로 활동하는 역할도 해낼 수 있다는 자신감과 확신을 얻게되었다.

 

 

 

2. 새로운 언어를 함께 공부한 경험

 

대부분의 경우, 새로운 언어를 공부한다면 대부분 강의를 통해 스스로 학습한다.

하지만 운 좋게도 나는 많은 사람들과 함께 같은 언어를 슬랙을 통해 소통하며 배울 수 있는 기회를 얻었다.

이를 통해 다양한 배경시직이 있는 사람들과 소통하며 새 언어를 배우는데 어떻게 접근을 하는지 알아볼 수 있었다.

 

새 언어를 습득할 때 가장 중요한 건 '구체적인 기능을 구현'해보는 것이다. 그것도 사람들과 함께 한다면 더욱 효율적이다!

해당 기능을 구현하기위해 나는 리더로서 적극적으로 검색을 하며 기존 강의에서 알게된 지식보다 더 많은 것을 알게되었고, 다른 사람들의 그 기능을 구현하기 위해 어떻게 접근했는지 피드백을 통해 배울 수 있었다.

 

앞으로 내가 언어를 공부하게 된다면 기초 지식을 학습함과 더불어 같은 언어를 공부하는 사람을 모집하고, 함께 예제를 풀며 서로의 코드를 통해 발전해가는 것이 가장 이상적인 학습방법임을 알게되었다.

 

 

 

3.  코드리뷰

 

코드리뷰에 대해 많이 알아볼 수 있었다.

코드리뷰는 내가 리더가 되었을때 꼭 해야겠다고 마음먹은 팀활동이며 가장 신경쓴 부분이었다.

그렇기에 코드리뷰에 대해 다른 사람들의 경험담을 긴 시간 찾아보며 읽었고 다른 사람들에게 코드리뷰의 방향성과 진행 방안에 대해 자문도 구해보았다.

 

결과적으로 코드리뷰는 매 회를 거듭할수록 발전했다! 

학습은 결과도 중요하지만 '학습하는 법을 학습'하는 것이 중요하다고 생각한다.

우리 팀은 전부 코드리뷰를 처음해봤다. 처음에는 엉망이었는데 이후 개선 방안을 꾸준히 업데이트하며 우리 팀의 코드리뷰 시간은 시간이 지날 수록 더욱 서로에게 도움이 되는 시간이 되었다.

 

솔직히 부스트코스를 통해 내가 배웠던 것들 중 가장 값진 경험은 바로 코드리뷰 진행 경험이라 생각한다.

언제 또 이렇게 코드리뷰를 통해 내가 발전하고 있음을 느낄 수 있을까? 

 

서로를 존중하는 코드리뷰 - 피드백을 통한 발전 - 도움을 주고받음으로 인한 성취감 - 과업의 적극적 수행

 

위와 같은 절차를 경험할 수 있었다는 점에서 나는 정말 운이 좋았고 함께 개발하는 것이 얼마나 즐거운 일인지 알 수 있었다.

 

 

 

4. 깃허브를 통한 협업

 

우리팀의 과제 제출은 깃허브를 통해 이루어졌다.

a. 주차별 과제를 개별적으로 풀이한 다음, 깃허브에 업로드한다.

b. 시간을 정해 줌으로 코드리뷰를 진행한다.

c. 수정한 파일을 취합해 fin파일을 업로드한다.

d. 화요일에 해당 링크를 제출한다.

 

처음 깃허브는 내 개인 레포지토리에 올리도록 되어있었다. 하지만 공통의 과제 제출 파일들인데 개인 레포지토리로 업데이트 되는 것을 수정하기 위해 알아보다가 단체 레포지토리(Organization Repository)의 존재를 알게되었다.

 

나는 처음으로 깃허브 저장소를 단체 레포지토리로 바꿔 보았고, 우리의 팀 과제물 제출 저장소가 만들어졌다. 그 외에도 깃허브 사용법을 학습할 수 있는 기회를 가질 수 있었다.

 

 

 

5. 파이썬의 기초 학습

 

당연히 내가 참여한 부스트코스는 '모두를 위한 파이썬' 이므로 파이썬에 대해 배우게 되었다.

자바와 http, js, css 언어만 다뤄본 내게 파이썬은... 정말... 신세계였다.

 

없는 게 없고 안되는 게 없는데 심지어 짧고 쉽다!

 

게다가 딕셔너리는 정말 재밌는 타입이다. 자바만 다뤄봤던 내게 딕셔너리는 알면 알수록 신기한 타입이라 팀 과제를 수행할때 자주 활용해서 써봤다.

팀 과제를 수행하기 위해 강의 내용 외의 다양한 내장함수를 활용해 볼 수 있었는데, 그 경험을 통해 파이썬에 대해 더욱 많이 알 수 있었다.

 

 

 

코칭스터디를 마치며

 

과거의 내가 코칭스터디에 등록한 걸 매우 칭찬하고 싶다. 

나는 이 스터디를 진행하며 다양한 경험을 할 수 있었고 코딩을 어떻게 해야 즐겁게 할 수 있는지와 같은 방법도 알게되었다. 지난 6주간의 여정을 함께 해준 팀원들에게 정말 감사하다는 말을 전하고 싶다.

 

 

그리고 매번 섬세한 피드백을 주셨던 턴태코치님! 수고하셨어요! 

 

저같은 사람이 없길 바라며 적습니다.

 

갑자기 파이썬이 오류가 생겼다면,

입력input()이 안된다면,

비주얼 스튜디오 코드의 OUTPUT창으로 넘어가고 input()이 안된다면,

 

혹시 다른 언어의 코드를 vs코드에서 돌렸다면.

 

 

 

 

파이썬 파일로 지정했는지 확인하세요

 

컴퓨터를 업데이트 하고 났더니 갑자기 파이썬에 문제가 생겼다.

visual studio code를 실행하니 한글로 인한 UnicodeEncodeError가 발생.

한글이 들어가면 다 오류가 났다.

 

그런데 아무리 검색을 하고... 검색을 해도...

다들 파일을 열때 오류가 났지 나처럼 잘 쓰던 파일에서 오류가 나는 경우가 없었다.

 

알고보니 환경변수 설정 문제였다.

 

 

에러코드:

 

Python310\lib\encodings\cp1252.py 

 

UnicodeEncodeError: ‘charmap’ codec can’t encode characters

 

 

해결방법:

 

파이썬2를 쓰고있다면?

 

파일 가장 위에 다음 줄을 입력

 

#-*- coding: utf-8 -*-

 


 

파이썬3을 쓰고있다면?

 

1. 윈도우의 시스템 환경변수 편집 창을 연다

 

 

 

2. 환경변수로 들어간다.

 

 

 

3. 시스템 변수의 새로 만들기 클릭

 

 

 

4. 새 시스템 변수에 다음과 같이 입력한다.

 

이름:  PYTHONIOENCODING

값:  utf-8

 

 

반드시 완료를 눌러줄것.

 

 

5. VS코드의 설정창 (Ctrl + ,)에 들어가서 기본 인코딩을 utf-8로 설정한다.

 

 

 

 

같은 고통을 겪고있는 누군가에게 도움이 되길 바란다.

 

부스트코스 모두를 위한 파이썬 <PY4E 2022>

 

https://m.post.naver.com/viewer/postView.naver?volumeNo=33971140&memberNo=34635212 

 

[모집마감] 뜨거운 여름, 전국 어디서나 시원하게! 파이썬 스터디 (7/14~8/25)

[BY 부스트코스] 태양이 작열하는 2022년의 뜨거운 여름! 빠르게 변화하는 세상에 대한 호기심으로 새로...

m.post.naver.com

 

파이썬을 공부하자!

 

파이썬은 대체 왜 이렇게 흥하는것일까?

 

파이썬의 장점으로 빠지지 않은 요소는 바로 '배우기 쉽다' 였다.

나는 언어 공부를 C언어 - C# - JAVA  - kotlin 순서로 공부해와서 쉬운 언어라는 말을 믿을 수 없었다.

 

하지만 인공지능에 대한 관심이 뜨거워지면서 파이썬의 인기는 날이 갈수록 치솟았고... 

파이썬을 통해 백엔드를 구현, 관리하는 회사도 점점 증가하는 현재.

 

나는 드디어 파이썬을 공부하길 결심한다.

 

 

 

 

부스트코스? 코칭스터디?

 

검색의 검색을 통해 알게된 무료로 공부할 수 있는 부스트코스!!!

이미 알고 있는 사람들도 있겠지만, 나는 주변에 개발자 지인들이 부족해서 네트워크가 약하다.. ㅠㅠ

그래서 혼자 맨땅에 헤딩하며 공부해야하는 상황이라 검색을 하다 알게되었다.

 

 

부스트코스란 네이버의 관할아래 교육의 사각지대에 있는 사람들에게 무료로 양질의 교육을 제공하는 플랫폼이다. 

네이버의 이름에 맞게 등록된 강의 퀄리티가 무료인 것에 비해 상당히 높은 편!

 

 

게다가 코칭스터디는 부스터리더로 나눠 활동하게 되는 일종의 팀 스터디 활동이다. 각 팀별로 매주 팀 미션을 통해 팀에 배정된 코치님들에게 질문을 하며 스스로 성장할 수 있는 기회를 제공한다.

게다가 코칭스터디도 무료라는 점!!

 

 

 

 

공부를 하고싶어도 개발자 지인도, 경제적 여유도 부족했던 내겐 부스트코스는 정말 가뭄의 단비같았다.

 

 

 

그렇게 기다리고 기다리다가 오픈 당일.

 

부스트코스에서 제공하는 파이썬 무료강의

https://www.boostcourse.org/cs122/joinLectures/364485

 

모두를 위한 파이썬 (PY4E)

부스트코스 무료 강의

www.boostcourse.org

 

무료로 공부할 수 있는 높은 퀄리티의 파이썬 강의!!!

 

 

 

 

1강을 수강하고 수업 내용에 대한 간단한 질문, 지원동기 등을 제출하면 심사를 거쳐 뽑여야했다.

 

내가 어째서 이 공부를 하고싶은지, 파이썬을 배운 후 내가 어떤 방향으로 나아갈 것인지를 작성했다. 많은 인원이 신청해서 최대한 자세히 작성해야 멤버로 뽑힐 수 있다고 해서 정말... 구구절절 작성했다. ㅎㅎ;

 

 

결과는 합격이었다!

 

지원 동기와 질문에 대해 성실하고 길게 작성한 게 합격 요인이 아닌가 싶다.

 

 

 

 

1주차, 팀으로 첫 발을 떼다

 

약 2000여명이 선발된 코칭스터디.

선발이 완료되면 슬랙으로 본인의 팀에 배정되고, 처음 신청했던 역할인 부스터 혹은 리더로 활동을 시작하게된다.

 

 

그런데...

 

 

이렇게 많은 인원이 모였으니 다들 이야기가 끊이지 않아 처음엔 대화를 따라가기가 조금 벅찼다.

게다가  무료 수강이어서 그런지 탈주하는 사람들이 생각보다 많았다. ㅠ....

 

리더인데 활동이 없는 사람, 멘션에도 대답 없는 사람, 처음엔 의지를 보였지만 점점 사라지는 사람...

사람들이 참 많이 떠나갔다.

 

우리팀도 예외는 아니었다.

 

시작 첫 날에 팀 리더가 하차하게 된 것 ㅠㅠ!

 

 

 

 

 

가지 마세요 리더님... ㅠㅠㅠㅠ

 

 

팀 미션 제출 날짜는 다가오는데........

 

처음에는 총 5명으로 구성된 팀에서 인사를 하는 사람은 나 포함 한명뿐이었다.

 

ㅠㅠㅠㅠ 아찔하고 막막한 상황.

 

 

 

결국 나는 리더를 하겠다고 나섰다.

 

나는 파이썬의 쌩초보지만 그래도 안드로이드를 다뤄본 경험이 있어 나의 경험을 믿었다.

그리고 도전을 하기 전, 리더의 과업이 어떤것이 있는지 꼼꼼하게 확인도 마쳤다.

 

머릿속으로 시뮬레이션을 돌리고 돌리고... 그제서야 할 수 있겠다는 믿음이 생겨서 도전!

 

결과는 팀원의 응원으로 인해 리더라는 타이틀을 아이디에 달았고, 우리팀의 리더가 되었다.

 

 

 

 

 

 

리더 감투는 처음이에요

 

나는 내가 뛰어난 카리스마로 사람들을 이끄는 스타일이 아니라는 것을 잘 안다.

그래서 나는 함께 성장하는 팀을 강조하기로 했다.

 

"어설퍼도 괜찮다. 우리는 서로를 도우며 그로인해 배우고, 성장하는 팀이다!"

 

이 말을 꾸준히... 세뇌시키듯 ㅋㅋㅋㅋㅋㅋㅋㅋ 정말 꾸준히 말했고, 현재 우리팀의 분위기는 꽤 양호하다.

 

 

 

 

 

 

...팀원들은 모두 우리 팀이 좋다고 했다.

 

 

 

어쨌든, 리더.

 

나는 개인적으로 리더는 팀원들을 위해 봉사할 수 있는 사람이어야 한다고 생각한다.

 

 

 

조금 해이해지거나 뒤쳐지는 팀원들을 위해 방향을 가리켜주는 사람, 이게 내가 되고 싶은 리더였다.

 

리더는 존경받는다. 왜? 사람들이 귀찮고 힘들어하는 일을 해내는 사람이니까.

 

 

팔로워로, 앞장서는 누군가의 뒤를 따라 그 사람이 제시하는 길을 따라 걷는 일은 편안하고 안정적이다.

나는 지금까지 팔로워로 살았지만 몇번쯤은 속으로 '내가 더 잘하겠다'는 생각을.. ㅋㅋㅋ 했었다.

그리고 그 생각이 쌓이고 쌓여, 오늘의 내가 리더를 하겠다는 말을 용기내서 하게 된 것이다.

 

누구에겐 별거 아닌 일 일수도 있지만, 내겐 사실 커다란 변화다.

 

나는 사람들에게 도움이 될 때 기쁘고 성취감을 느낀다.

그래서 매번 누군가의 뒤에서 서포터의 역할을 하며 지내왔지만 내심 잘 못하는 리더를 볼 때 불만을 쌓아왔다.

 

그러다 이렇게 리더로서 활동하게 되며 코칭스터디에 정말  몰입하게 되었다.

 

 

 

 

그래서 코칭스터디로 뭘 했는데?

 

내가 리더가 되기 전, 팀 스터디를 하게되면 꼭 해보고 싶었던 것 두가지가 있었다.

 

1. 코드리뷰

2. 깃헙으로 협업

 

그리고 현재 3주차를 보내며 이 두가지는 확실하게 제대로 진행되고 있다!

 

코드리뷰는 사실 팀 미션을 진행하기 위한 미팅으로 시작했다.

그러다가 서로의 코드를 보여주고, 읽고, 더 나은 방향을 제시하는 시간이 되었다.

 

첫째, 코드리뷰

코드리뷰를 2회차 진행해본 경험을 얘기해보자면...

 

코드리뷰, 너무 어렵다!!!!

 

 

 

 

 

 

- 리뷰어로서

1+1을 모르는 사람에게 답을 가르쳐주는 것은 쉽다.

하지만 왜 1+1을 해야하는지를 알려주는 것은 어렵다.

그리고 왜 1+1은 2로 되어있는지, 어째서 11은 될 수 없는지도 설명해야한다.

 

나는 처음에 팀원의 코드를 보며 아, 그건 2에요. 하고 대답했다.

하지만 그건 정말 좋은 코드리뷰가 아닌 '내 지식 뽐내기 시간'일 뿐이었다. ㅠㅠ 반성!!

 

오히려 안되는 이유를 가르쳐주는 것이 더 스터디에 도움이 되었다.

 

나는 다시 개념을 복습할 수 있었고 그 과정에서 또 새로 알게되는 지식들이 생겼다.

 

 

- 리뷰이이로서

나는 내 코드를 작성해서 이게 어떤 동작을 하는지 함수 위에 기능설명만 하면 된다고 생각했다.

 

ex)

# 동그라미 그리는 함수 

A

# 네모 그리는 함수

B

# 세모 그리는 함수

C

 

보통 이렇게 올리고 끝이었다.

 

하지만 정해진 시간 내에 내 코드를 읽는 사람에게는 충분하지 않은 설명이었다.

게다가 '별 그리는 함수가 작동이 안됩니다.. 이유가 뭘까요?' 하고 코드 리뷰 시간에 질문을 하게되면 다들 난감을 표했다.

 

그러다 코드리뷰는 '다른 사람의 코드를 강제로 읽게 만드는 시간'의 역할만 해내도 반은 성공이란 말을 들었다.

 

 

그제서야 나는 코드리뷰에 대한 환상..같은 게 있었다는 것을 깨달았다.

 

지금까진 코드리뷰를 통해 반드시 성장해야한다, 아웃풋이 개선되어야한다는 생각을 했었다.

하지만 그냥 다른 사람의 코드를 읽는 것 자체가 내 성장에 기여하는 것이었다.

 

 

사람이 공부하는 방법은 다양하고 팀으로 성장하는 방법도 다양하다. 

우리팀은 우리팀만의 공부 방식이 있는법!

 

아직 발전해나가는 단계고 지난주보다 이번주 더 발전하고 있으니 내 불안과 압박을 타인에게 전염시키지 않도록 노력해야겠다.

 

 

효율적인 코드리뷰를 위한 우리팀의 룰(개선중)을 여기서 공유한다.

 

*  코드 발표시 확인 요소:
      - 코드 구현 방법 / 목표 / 설명
      - 코드 실행
      - 예외처리 및 오류 테스트

* 코드 리뷰시 확인 요소:
      - 기능 동작 확인
      - 구조 확인
      - 로직 확인
      - 네이밍 확인
      - 중복, 불필요한 코드 확인
      - 칭찬 하기

 

 

둘째, 깃헙으로 협업

 

나는 정말 잘 한 일로 꼽는것이, 깃을 통해 협업을 진행하기로 결정했던 것.

 

과거의 나 칭찬해~ 

 

코칭스터디의 팀미션을 진행하기 위해 깃허브에 개인 작업물을 올리고 코드리뷰를 진행한다.

 

나는 이런 루틴 학습을 통해 깃헙을 그냥 사용하던 수준에서 협업을 통한 도구로써 접근하기 시작했는데,

그 과정을 통해 다음과 같은 활동을 해냈다:

1. 개인 깃허브 프로필 꾸미기 

2. 개인 레포지토리에서 팀 레포지토리로 변경

3. 협업을 하기 위해 깃허브의 어떤 기능을 활용해야하는지 테스트, 공부

 

 

아직 부족하지만 이전에 비해서 점점 발전하고 있는 깃허브!

https://github.com/jmnl225

 

jmnl225 - Overview

Android software engineer. jmnl225 has 28 repositories available. Follow their code on GitHub.

github.com

 

 

 

 

 

 

그래서 결론이 뭔데?

 

 

결론!

리더로 활동하게 된 코칭스터디가 너무 재밌고 유익하고 개인이 노력할 수록 배우는 것이 정말 무궁무진하다!

 

 

내가 공부한 게 다른 사람에게 도움이 되어서 재밌고 즐겁다.

그러다보니 더욱 열심히 하게되고 결국 나의 지식으로 돌아온다.

 

이게 바로 이상적인 배움의 흐름이 아닐까?

 

그걸 내가 실천하고 있는게 놀랍고 이런 기회를 잡게 되어 부스트코스를 참가한 과거의 나를 매우매우 칭찬한다.

 

아직 끝까지 완수한 건 아니지만, 총 6주차인 코칭스터디의 반을 진행한 지금 시점에서

나의 경험을 중간점검 겸 기록하고싶었다.

 

미래의 내가 이 글을 읽고 이런 경험을 했다는 것을 잊지 않길 바라며 3주차 회고록을 마친다.

 

 

 

 

 

 

 

팀 과제를 하면서 깃으로 각자 파일을 올려 코드리뷰를 진행하고 있다.

코드리뷰는 깃으로 올린 파일을 zoom으로 화면 공유를 해서 팀원들과 코드를 함께 보고 질문, 답변, 발전 방향 제시 등으로 이뤄지고 있었다.

 

하지만 zoom을 통해 실시간으로 코드리뷰를 하는 데에 한계점들을 발견했다.

- 긴 코드를 읽으려면 화면 공유로는 어려움이 많음

- 오류 해결을 위해 컴파일, 테스트할 시간 부족

- 디테일한 코드 수정의 어려움

 

깃으로 협업을 하고있었지만 아직 활용도가 낮은 상태였던 우리 팀이었기에 깃을 활용할 수 있는 방안을 찾다가...

코멘트 기능을 사용하기로 했다.

 

 

깃헙으로 코멘트 남기는 방법

 

 

 

코멘트는 깃허브에 올린 파일이 아니라 PR에서 남길 수 있다!

 

따라서 깃허브에 올릴 때 commit의 타이밍이 아주 중요하다.

 

'깃허브' 카테고리의 다른 글

[git] 깃 브랜치 전략이란?  (0) 2023.11.02

 

* 인터넷

: TCP / IP 프로토콜을 기반으로 하여 전 세계 수많은 컴퓨터와 네트워크들이 연결된 광범위한 컴퓨터 통신망

 

* IP주소

: 인터넷에 연결된 모든 컴퓨터 자원을 구분하기 위한 고유한 주소

 

* 서브네팅(Subnetting)

: 네트워크 주소를 여러 개의 작은 네트워크로 나누어 사용하는 것

 

* 네트워크

: 원하는 정보를 원하는 수신자 또는 기기에 정확히 전송하기 위한 기반 인프라

 

* 프로토콜 

: 서로 다른 시스템이나 기기들 간의 데이터 교환을 원활히 하기 위한 표준화된 통신규약.

데이터 처리 기능, 제어기능, 관리적 기능을 포함한다.

 

* TCP/IP(Transmission Control Protocol / Internet Protocol)

: 서로 다른 기종의 컴퓨터들이 데이터를 주고받을 수 있도록 하는 표준 프로토콜

 

* OSI 참조모델:

다른 시스템간의 원활한 통신을 위해 ISO(국제표준기구)에서 제안한 통신 규약.

 

* OSI 7계층:

1~3 계층을 하위계층, 4~7 계층을 상위 계층이라 한다.

계층 순번 계층 이름 설명 관련 장비
1계층 물리 계층
(Physical Layer)
- 물리적 전송 매체와 전송 신호 방식 정의
- 두 장치간의 실제 접속과 절단 등 기계적, 전기적, 기능적, 절차적 특성에 대한 규칙 정의
리피터, 허브
2계층 데이터 계층
(DataLink Layer)
- 두 개의 인접한 개방 시스템들 간에 신뢰성있고 효율적인 정보 전송을 할 수 있도록 시스템간 연결 설정과 유지 및 종료를 담당
- 프레임의 시작과 끝을 구분하기 위한 프레임 동기화 기능
- 프레임의 순서적 전송을 위한 순서 제어 기능
- 속도 차이 해결을 위한 흐름 제어 기능
- 오류 검출과 회복을 위한 오류 제어 기능
랜카드, 브리지, 스위치
3계층 네트워크 계층
(Network Layer)
- 개방 시스템들 간의 네트워크 연결을 관리하는 기능과 데이터의 교환 및 중계 기능
- 네트워크 연결을 설정, 유지, 해제하는 기능
- 경로설정(Routing), 데이터 교환 및 중계, 트래픽 제어, 패킷 정보 전송을 수행
- X.25, IP 등의 표준이 있다.
라우터
4계층 전송 계층
(Transport Layer)
- 논리적 안정과 균일한 데이터 전송 서비스를 제공함으로써 종단 시스템(End -to-End)간 투명한 전송 보장
- 종단시스템간의 전송 연결 설정, 데이터 전송, 연결 해제 기능
- 하위 3계층과 상위 3계층의 인터페이스 담당
- 주소설정, 다중화(분할 및 재조립), 오류 제어, 흐름 제어 수행
- TCP, UDP
게이트웨이
5계층 세션 계층
(Session Layer)
- 송,수신 측 간의 관련성을 유지하고 대화 제어 담당
- 대화 구성 및 동기 제어, 데이터 교환 관리 기능
- 동기점은 오류가 있는 데이터의 회복을 위해 사용하는 것으로 종류에는 소동기점과 대동기점이 있다.
호스트 (PC 등)
6계층 표현 계층
(Presentation Layer)
- 응용 계층으로부터 받은 데이터를 세션 계층에 보내기 전 형태를 변환, 세션 계청에서 받은 데이터는 응용 계층에 맞게 변환하는 기능
- 서로 다른 데이터 표현 형태를 갖는 시스템간의 상호 접속을 위해 필요
- 코드 변환, 데이터 암호화, 데이터 압축, 구문 검색, 정보 형식 변환, 문맥 관리
7계층 응용 계층
(Application Layer)
- 사용자가 OSI 환경에 접근할 수 있도록 서비스 제공
- 응용 프로세스간의 정보 교환, 전자 사서함, 파일전송, 가상 터미널 등 서비스 제공

 

 

* 계층별 네트워크 장비 및 프로토콜:

 

- 계층 1, 물리 계층

  • 물리 계층 장비
장비 이름 설명
허브
(Hub)
- 여러대의 컴퓨터를 연결하는 장치로 각각의 회선을 통합하여 관리
- 신호 증폭 기능을 하는 리피터의 역할을 포함
- 더미허브: 네트워크에 흐르는 모든 데이터를 단순히 연결하는 기능만 제공
- 스위칭 허브: 네트워크상에 흐르는 데이터의 유무 및 흐름을 제어하여 각각의 노드가 허브의 최대 대역폭을 사용할 수 있는 지능형 허브
리피터
(Repeater)
- 거리가 증가할수록 감쇠하는 디지털 신호의 장거리 전송을 위해 수신한 신호를 재생시키거나 출력 전압을 높여 전송하는 장치

 

  • 물리계층 프로토콜
프로토콜 설명
RS-232 - 1960년도 도입된 프로토콜
- PC와 음향 커플러, 모뎀 등을 접속하는 직렬 방식의 인터페이스

 

 

 

- 계층 2, 데이터 링크 계층

  • 데이터 링크 계층 장비
장비이름 설명
브리지
(Bridge)
- 두개의 근거리 통신망(LAN)을 서로 연결해주는 통신망 연결장치
- 트래픽 병목현상을 줄일 수 있음
- 네트워크를 분산적으로 구성하여 보안성 향상
- 전송 가능한 회선 수: 브리지가 n개일때, n(n-1)/2
NIC
(Network Interface Card)
- 외부 네트와크와 접속하여 가장 빠른 속도로 데이터를 주고받을 수 있도록 컴퓨터 내에 설치
스위치
(Switch)
- 느린 전송속도의 브리지, 허브의 단점을 개선
- 출발지에서 들어온 프레임을 목적지 MAC주소 기반으로 빠르게 전송
- 스위치 전송방식: cut-through 방식, store-and-forward 방식, Fragment Free 방식

 

  • 데이터 링크 계층 프로토콜
프로토콜 설명
HDLC
(High-level Data Link Control)
- 점대점 방식이나 다중 방식의 통신에 사용되는 ISO에서 표준화한 동기식 비트 중심의 데이터 링크 프로토콜
PPP
(Point-to-Point Protocol)
- 네트워크 분야에서 두 통신 노드 간의 직접적인 연결을 위해 일반적으로 사용되는 데이터 링크 프로토콜
프레임 릴레이
(Frame Relay)
- 프로토콜 처리를 간략화하여 단순히 데이터 프레임들의 중계(Relay)기능과 다중화 기능만 수행
- 데이터 처리속도의 향상 및 전송지연 감소, 고속 데이터 전송 기술
ATM
(Asynchronous Transport Model)
- 정보전달의 기본단위를 52바이트 셀 단위로 전달하는 비동기식 시분할 다중화 방식의 패킷형 전송 기술

 

 

 

- 계층 3, 네트워크 계층

  • 네트워크 계층 장비
장비이름 설명
라우터
(Router)
- 데이터 통신의 최적 경로를 선택하는 기능
- 서로 다른 네트워크 대역의 호스트들을 상호 통신이 가능하게 만드는 기능
- 패킷의 위치를 추출하여 그 위치에 대한 최적의 경로를 지정, 그 경로를 따라 데이터 패킷을 다음 장치로 전송
- 지정된 데이터가 안전하게 전달되도록 함

 

  • 네트워크 계층 프로토콜
프로토콜 설명
IP
(Internet Protocol)
- 송신, 수신 간의 패킷 단위로 데이터를 교환하는 네트워크에서 정보를 주고받는 데 사용하는 표준 통신규약.
ARP
(Address Resolution Protocol)
- IP 네트워크상에서 IP주소를 MAC주소(물리주소)로 변환하는 프로토콜
RARP
(Reverse Address Resolution Protocol)
- IP호스트가 자신의 물리 네트워크 주소(MAC)는 알지만 IP주소를 모르는 경우 IP 주소를 요청하기 위해 사용하는 프로토콜
ICMP
(Internet Control Message Protocol)
- IP패킷을 처리할 때 발생되는 문제를 알려주는 프로토콜
- 메시지 형식은 8바이트와 헤더, 가변 길이의 데이터 영역으로 분리
- 수신지 도달 불가 메시지는 수신지 또는 서비스에 도달할 수 없는 호스트를 통지하는 데 사용
- ping 유틸리티 구현
IGMP
(Internet Group Management Protocol)
- 인터넷 그룹 관리 프로토콜은 호스트 컴퓨터와 인접 라우터가 멀티캐스트 그룹 멤버십을 구성하는 데 사용하는 통신 프로토콜
- 화상회의, IPTV에서 활용
- IGMP기능에는 그룹 가입, 멤버십 감시, 멤버십 응답, 멤버십 탈퇴가 있다
라우팅 프로토콜 - 내부 라우팅 프로토콜 대표: RIP, OSPF
- 외부 라우팅 프로토콜 대표: EGP, BGP

 

 

 

 

- 계층 4, 전송 계층

  • 전송계층 프로토콜
프로토콜 설명
TCP
(Transmission Control Protocol)
- 양방향 연결형 서비스 제공
- 가상회선 연결 형태의 서비스 제공
- 패킷 단위의 스트림 위주의 전달
- 신뢰성 있는 경로를 확립하고 메시지 전송을 감독
- 순서제어, 오류제어, 흐름제어 기능
- TCP 프로토콜의 헤더는 20~60Byte를 사용 가능하지만 선택적으로 최대 100Byte까지 크기 확장이 가능
- 근거리 통신망, 인트라넷, 인터넷이 연결된 컴퓨터에서 실행되는 프로그램간 일련의 옥텟을 안정적, 순차적, 에러없이 교환할 수 있게 해주는 표준 프로토콜
UDP
(User Datagram Protocol)
- 데이터 전송 전 연결을 설정하지 않는 비연결형 서비스
- 단순한 헤더 구조로 오버헤드가 적고 흐름 제어, 순서제어가 없어 전송 속도가 빠름
- 실시간 전송에 유리하며 신뢰성보다 속도가 중요시되는 네트워크에 사용
RTCP
(Real-Time Control Protocol)
- RTP(Real-time Transport Protocol) 패킷의 전송 품질을 제어하기 위한 제어 프로토콜
- 세션에 참여한 각 참여자들에게 주기적으로 제어 정보를 전송
- 데이터 전송을 모니터링하고 최소한의 제어와 인증 기능 제공
- 패킷이 항상 32비트의 경계로 끝남

 

 

 

- 계층 5, 세션 계층

  • 세션계층 프로토콜
프로토콜 설명
RPC
(Remote Procedure Cell)
- 원격 프로시저 호출
- 별도의 우너격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있는 프로세스 간 통신에 사용되는 프로토콜
NetBIOS
(Network Basic Input/Output System)
- 응용계층(7계층)의 애플리케이션 프로그램에게 API를 제공하여 상호 통신할 수 있도록 해주는 프로토콜

 

 

- 계층 6, 표현 계층

  • 표현계층 프로토콜
프로토콜 설명
JPEG 이미지를 위해 만들어진 표준 규격
MPEG 멀티미디어(비디오, 오디오)를 위해 만들어진 표준 규격

 

- 계층 7, 응용 계층

  • 응용계층 프로토콜
프로토콜 설명
HTTP
(HyperText Transfer Protocol)
- 텍스트 기반의 통신규약으로 인터넷에서 데이터를 주고받을 수 있는 프로토콜
- 하이퍼 텍스트를 빠르게 교환하기 위한 프로토콜
FTP
(FileTransfer Protocol)
-TCP/IP 프로토콜을 가지고 서버와 클라이언트 사이의 파일을 전송하기 위한 원격 파일 전송 프로토콜
Telnet - 멀리 있는 컴퓨터에 접속하여 자신의 컴퓨터처럼 사용할 수 있게 해주는 서비스 제공
- 프로그램을 실행하는 등 시스템 관리 작업을 할 수 있는 가상의 터미널(Virtual Terminal) 기능 제공
SMTP
(Simple Mail Transfer Protocol)
- 인터넷에서 TCP포트 번호 25번을 사용하여 이메일을 보내기 위해 사용
SNMP
(Simple Network Management Protocol)
- TCP/IP의 네트워크 관리 프로토콜
- 라우터, 허브등 네트워크 기기의 네트워크 정보를 네트워크 관리 시스템에 보내는데 사용되는 표준 통신 규약
DNS
(Domain Name System)
- 도메인 네임을 IP주소로 매핑하는 시스템
SSH
(Secure Shell)
- Telnet보다 강력한 보안을 제공하는 원격접속 프로토콜
- 연결되어있는 컴퓨터간 원격 명령 실행이나 쉘 서비스등 수행
- 키를 통한 인증은 클라이언트의 공개키를 서버에 등록해야 하고 전송되는 데이터는 암호화됨
- 인증, 암호화, 압축, 무결성 제공
- 기본 네트워크 포트 22번 사용

 

 

 

* 운영체제(OS; Operating System):

  • 하드웨어를 쉽게 사용할 수 있도록 인터페이스를 제공해주는 소프트웨어
  • 컴퓨터 시스템의 자원들을 효율적으로 관리, 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 프로그램의 모임

 

* 운영체제의 목적:

  • 처리능력 : 일정 시간 내 시스템이 처리하는 일의 양
  • 반환 시간: 시스템에 작업을 의뢰한 시간부터 처리가 완료될때까지 걸린 시간
  • 사용 가능도: 시스템을 사용할 필요가 있을 때 즉시 사용 가능한 정도
  • 신뢰도: 시스템이 주어진 문제를 정확하게 해결하는 정도

 

* 운영체제의 종류

 

1. Windows

  • 1990년대 마이크로소프트 사가 개발한 운영체제

 

- Windows의 주요 특징

특징 설명
그래픽 사용자 인터페이스
(GUI; Graphic User Interface)
마우스로 아이콘이나 메뉴를 선택하여 작업을 수행하는 그래픽 기반의 인터페이스 방식
선점형 멀티태스킹
(Preenptive Multi-Tasking)
동시에 여러 개의 프로그램을 실행하면서 운영체제가 각 작업의 CPU이용 시간을 제어
자동 감지 기능
(PnP; Plug and Play)
하드웨어를 설치했을 때 필요한 시스템 환경을 운영체제가 자동으로 구성해주는 자동감지 기능 제공
OLE
(Object Linking and Embedding)
개체를 현재 작성 중인 문서에 자유롭게 연결 또는 삽입하여 편집할 수 있게 하는 기능 제공
255자의 긴 파일명 \/*?"<>| 를 제외한 모든 문자 및 공백을 사용하여 최대 255자 파일 이름을 지정 가능
Single-User 시스템 컴퓨터 한 대를 한 사람만 독점해서 사용함

 

 

 

2. UNIX

  • AT&T 벨 연구소,  MIT, General Electric이 공동 개발한 운영체제

 

- UNIX의 주요 특징

특징 설명
 대화식 운영체제 프롬프트가 나타난 상태에서 사용자가 명령을 입력하면 시스템은 명령을 수행하는 명령 기반의 대화식 운영체제
다중작업 기능 제공 다수의 작업이 CPU(중앙처리장치)와 같은 공용자원을 나누어 사용하여 한 번에 하나 이상의 작업을 수행하는 기능 제공
다중 사용자 기능 제공 여러 대의 단말이 하나의 컴퓨터에 연결되어서 여러 사람이 동시에 시스템을 사용하여 각각의 작업을 수행할 수 있는 기능 제공
이식성 제공 90% 이상 C언어로 작성되어있어 이식성이 높으며 장치, 프로세스간의 호환성이 높다
계층적 트리 구조 파일 시스템 제공 유닉스는 계층적 트리 구조를 가짐으로써 통합적인 파일 관리가 용이

 

 

- UNIX의 시스템 구성

 

커널(Kernel) :

  •  하드웨어 보호, 프로그램-하드웨어 간의 인터페이스 역할 담당.
  • UNIX의 핵심 부분
  • 프로세스 관리, 기억장치 관리, 파일 관리, 입/출력 관리, 프로세스간 통신, 데이터 전송 및 변환 등 수행

쉘(Shell): 

  • 사용자의 명령어를 인식하여 프로그램을 호출, 명령 수행하는 명령어 해석기
  • 시스템과 사용자 간의 인터페이스 담당
  • 종류: Bourne Shell, C Shell, Korn Shell

유틸리티 프로그램 (Utility Program):

  • 일반 사용자가 작성한 응용 프로그램을 처리하는 데 사용
  • DOS애서의 외부 명령어에 해당됨
  • 종류: 에디터, 컴파일러, 인터프리터, 디버거

 

 

3. LINUX

  • 리누스 토발즈(Linus Torvalds)가 UNIX를 기반으로 개발한 운영체제

 

- 리눅스의 주요 특징

  • 소스 코드가 공개된 오픈 소스 기반의 운영체제
  • 다양한 플랫폼에 설치하여 사용이 가능하며 재배포가 가능
  • UNIX와 호환가능하며 유닉스가 갖는 운영체제, 다중 작업 기능, 다중 사용자 기능, 이식성, 계층적 트리 구조 파일 시스템을 갖는다.

 

4. MacOS

  • 1980년대 애플(Apple) 사가 UNIX를 기반으로 개발한 그래픽 사용자 인터페이스 기반 운영체제
  • 드라이버 설치 및 인스톨, 언인스톨의 과정이 단순하다.
  • 클라이언트 버전, 서버 제품 등으로 제품군을 확대 하였으며 지속적으로 업데이트를 하고있다.

 

5. 안드로이드(Android)

  • 휴대전화를 비롯한 휴대용 장치를 위한 운영체제와 미들웨어, 사용자 인터페이스, 표준 응용 프로그램을 포함하는 운영체제
  • Google사에서 개발한 모바일 운영체제

 

- 안드로이드 특징

특징 설명
리눅스 기반 리눅스 커널 위에서 동작
자바와 코틀린 언어 고수준 언어를 통해 응용프로그램 작성. 생산성이 높으며 전문 지식 없어도 개발 가능
런타임 라이브러리 컴파일된 바이트 코드 구동 가능
안드로이드 소프트웨어 개발 키트; SDK 응용 프로그램을 개발하는 데 필요한 각종 도구와 API를 제공
개방형 소프트웨어 모든 코드가 공개된 개방형 소프트웨어

 

 

 

* 운영체제 핵심 기능

- 기억장치 관리: 한정된 주기억장치의 공간을 효율적으로 사용

- 프로세스 관리: CPU와 데이터를 송수한 하는 상황에서 프로세스에 대한 종합적 관리 기법. 

ex) 동기화, 통신, 일시 중지 및 재실행, 교착상태 처리, 프로세스 생성 삭제

 

* 기억장치 관리의 종류

  • 반입 Fetch 전략
  • 배치 Placement 전략
  • 교체 Replacement 전략

 

* 반입 전략: 프로그램이나 데이터를 언제 주기억장치로 적재할 것인지 결정 (When)

  • 요구 반입(Demand Fetch): 실행중인 프로그램이 데이터 등의 참조를 요구할 때 적재하는 방법
  • 예상 반입(Anticipatory Fetch): 실행중인 프로그램에 의해 참조될 프로그램이나 데이터를 미리 예상하여 적재

 

* 배치 전략: 프로그램이나 데이터를 주기억장치의 어디에 위치시킬것인지 결정 (Where)

  • 최초 적합(First Fit): 프로그램이나 데이터가 들어갈 수 있는 크기의 빈 영역중 첫번째 분할 영역에 배치
  • 최적 적합(Best Fit): 프로그램이나 데이터가 들어갈 수 있는 크기의 빈 영역중 단편화를 가장 작게 남기는 영역에 배치
  • 최악 적합(Worst Fit): 프로그램이나 데이터가 들어갈 수 있는 크기의 빈 영역중 단편화를 가장 많이 남기는 영역에 배치

 

* 교체 전략: 이미 사용되고 있는 영역 중에서 어느 영역을 교체하여 사용할 것인지 결정 (Who)

  • FIFO, OPT, LRU, LFU, NUR, SCR

 

 

* 주기억장치 할당: 프로그램이나 데이터를 실행시키기 위해 어떻게 할당할것인지에 대한 내용

 

* 주기억장치 할당 기법의 분류:

1. 연속 할당 기법: 프로그램을 주기억장치에 연속으로 할당하는 기법

 

- 단일 분할 할당 기법:

  • 한순간에는 오직 한 명의 사용자만이 주기억장치의 사용자 영역을 사용
  • 가장 단순한 기법으로 초기 운영체제에서 많이 사용
  • 운영체제 보호를 위해 운영체제 영역, 사용자 영역을 구분하는 경계 레지스터 사용
  • 프로그램의 크기가 작을수록 사용자 영역 낭비
  • 종류:
  • 오버레이 기법(Overlay): 주기억장치보다 큰 사용자 프로그램을 실행하기 위한 기법
  • 스와핑 기법(Swapping): 하나의 프로그램 전체를 주기억장치에 할당하여 필요에 따라 다른 프로그램과 교체

 

- 다중 분할 할당 기법:

  • 고정분할 할당 기법(정적 할당 기법): 프로그램을 할당하기 전에 운영체제가 주기억장치의 사용자 영역을 여러 개의 고정된 크기로 분할하고 준비상태 큐에서 준비중인 프로그램을 각 영역에 할당하여 수행
  • 가변 분할 할당 기법(동적 할당 기법): 고정 분할 할당 기법의 단편화를 줄이기 위해 사용. 프로그램을 주기억장치에 적재하며 필요한 만틈의 크기로 영역 분할

 

 

2. 분산 할당 기법: 가상기억장치 관리 기법. 가상기억장치의 내용을 주기억장치에 할당하기 위한 기법. 프로그램을 특정 단위의 조각으로 나누어 주기억장치 내에 분산하여 할당

 

- 페이징(Paging)기법:

  • 프로그램과 주기억장치의 영역을 동일한 크기로 나눈 후, 주기억장치의 영역에 적재시켜 실행
  • 주소 변환을 위해 페이지의 위치 정보를 갖고있는 페이지 맵 테이블(Page Map Table)이 필요.
  • 페이지 맵 테이블 사용으로 비용 증가, 처리 속도 감소.
  • 외부 단편화는 없지만 내부 단편화 발생 가능.

 

- 세그먼테이션(Segmentation) 기법:

  • 프로그램을 다양한 크기의 논리적인 단위로 나눈 후 주기억장치에 적재시켜 실행.
  • 기억공간을 절약하기 위해 사용.
  • 주소변환을 위해 세그먼트 존재 위치 정보를 갖고 있는 세그먼트 맵 테이블(Segment Map Table)이 필요.
  • 내부 단편화는 없지만 외부 단편화 발생 가능.

 

* 가상기억장치(Virtual Memory):

  • 보조기억장치의 일부를 주기억장치처럼 사용하는 것.
  • 용량이 작은 주기억장치를 마치 큰 용량을 가진 것처럼 사용.
  • 프로그램을 여러 개의 작은 블록 단위로 나누어서 가상기억장치에 보관 후, 프로그램 실행 시 요구되는 블록만 주기억장치에 불연속적으로 할당하여 처리.
  • 주기억장치의 이용률과 다중 프로그래밍의 효율을 높일 수 있다.
  • 블록 단위로 나누어 사용. 
  • 연속 할당 방식에서 발생할 수 있는 단편화 해결.

 

* 주소변환:

  • 주소 사상 / 주소 매핑(Mapping)
  • 가상기억장치에 있는 프로그램이 주기억장치에 적재되어 실행될 때 논리적인 가상주소를 물리적인 실기억주소로 변환하는 것.
  • 인위적 연속성: 연속적인 가장주소가 반드시 연속적인 실기억주소로 변환되지 않아도 됨

 

* 페이지(Page):

  • 프로그램을 일정한 크기로 나눈 단위

 

* 페이지 프레임(Page Frame):

  • 페이지 크기로 일정하게 나누어진 주기억장치의 단위

 

* 세그먼트(Segment):

  • 배열이나 함수 등과 같은 논리적인 크기로 나눈 단위.
  • 각 세그먼트는 고유한 이름과 크기를 갖는다.

 

* 페이지 교체 알고리즘

:  페이지 부재(Page Fault)가 발생하면 어떤 페이지 프레임을 선택, 교체할것인지 결정하는 기법.

 

종류 설명
FIFO(First In First Out) - 가장 먼저 들어와서 가장 오래 있었던 페이지를 교체
LRU(Least Recently Used) - 최근에 가장 오랫동안 사용하지 않은 페이지 교체

- 각 페이지마다 계수기(Counter)나 스택(Stack)을 두어 현시점에서 가장 오래전에 사용한 페이지를 교체
LFU(Lesat Frequently Used) - 사용 빈도가 가장 적은 페이지를 교체

- 활발히 사용되는 페이지는 사용횟수가 많아 교체하지 않는다
NUR(Not Used Recently) - 최근에 사용하지 않은 페이지를 교체

- 최근 사용 여부를 확인하기 위해 각 페이지마다 두 개의 비트(참조비트; Referemce Bit)와 변형 비트(Modified Bit, Dirty Bit)가 사용된다

- LRU에서 나타나는 시간적인 오버헤드를 줄일 수 있음

- 참조비트 0, 변형비트 1 vs 참조비트 1, 변형비트 0 일때는 변형비트가 1일때 우선순위.
SCR(Second Chance Replacement, 2차 기회 교체) - 가장 오랫동안 주기억장치에 있던 페이지중 자주 사용되는 페이지의 교체를 방지

- FIFO 기법의 단점 보완

 

* 참조비트: 페이지가 호출되지 않았을때는 0, 호출되었을 때는 1로 지정됨

 

* 변형비트: 페이지 내용이 변경되지 않았을 때는 0, 변경되었을 때는 1로 지정됨

 

 

* 페이지 크기에 따른 영향

페이지 크기가 작을 경우 - 페이지 단편화 감소

- 한 페이지를 주기억장치로 이동시키는 시간 감소

- 불필요한 내용이 주기억장치에 적재될 확률이 적으므로 효율적인 워킹셋 유지 가능

- 페이지 정보를 갖는 페이지 맵 테이블 크기가 커지고 매핑속도가 느려짐

- 디스크 접근 횟수가 많아져 전체적 입/출력 시간은 늘어남

페이지 크기가 클 경우 - 페이지 단편화 증가

- 한 페이지를 주기억장치로 이동시키는 시간이 늘어남

- 페이지 정보를 갖는 페이지 맵 테이블의 크기가 작아지고, 매핑 속도가 빨라짐

- 디스크 접근 횟수가 줄어들어 전체적인 입/출력의 효율성이 증가

 

 

* Locality(국부성, 지역성, 구역성, 국소성):

  • 프로세스가 실행되는 동안 주기억장치를 참조할 때 일부 페이지만 집중적으로 참조하는 성질.
  • 스레싱을 방지하기 위한 워킹 셋 이론의 기반이 됨
  • 가상기억장치 관리와 캐시 메모리 시스템의 이론적인 근거
  • 데닝(Denning) 교수가 개념 증명

 

- Locality의 종류

  • 시간 구역성(Temporal Locality): 한번 참조한 페이지는 가까운 시일 내에 계속 참조할 가능성이 높음
  • 공간 구역성(Spatial Locality): 한 페이지를 참조하면 그 근처의 페이지를 계속 참조할 가능성이 높음

 

* 워킹 셋(Working Set)

  • 프로세스가 일정 시간 동안 자주 참조하는 페이지들의 집합
  • 데닝(Denning)이 제안한 프로그램의 움직임에 대한 모델
  • 프로그램의 Locality 특징을 이용
  • 자주 참조되는 워킹 셋을 주기억장치에 상주시킴으로써 페이지 부재 및 페이지 교체현상이 줄어들어 프로세스의 기억장치 사용이 안정됨

 

* 스레싱(Thrashing)

  • 프로세스의 처리 시간보다 페이지 교체에 소요되는 시간이 더 많아지는 현상
  • 시스템에서 하나의 프로세스 수행 과정 중 자주 페이지 부재(Page Fault)가 발생함으로써 나타남
  • 전체 시스템의 성능 저하 야기
  • 다중 프로그래밍의 정도가 높아짐에 따라 CPU 이용률은 높아지지만 특정 시점 이후 스래싱이 나타나면 CPU 이용률이 급격히 감소

 

* 페이지 부재(Page Fault)

: 프로세스 실행 시 참조할 페이지가 주기억장치에 없는 현상. 

 

*페이지 부재 빈도(Page Fault Frequency)

: 페이지 부재가 일어나는 횟수

 

*다중 프로그래밍의 정도

: 얼마나 많은 프로그램이 동시에 수행되는지의 정도.

 

 

 

* 프로세스(Process)

  • PCB를 가진 프로그램
  • 실기억장치에 저장된 프로그램
  • 프로세서가 할당되는 실체로서 디스패치가 가능한 단위
  • 프로시저가 활동중인 것
  • 비동기적 행위를 일으키는 존재
  • 목적 또는 결과에 따라 발생되는 사건들의 과정

 

 

* 프로시저: 부프로그램. 분할된 작은 프로그램

 

* 비동기적 행위: 다수의 프로세스가 서로 규칙적/연속적이지 않고 독립적으로 실행되는 것

 

 

* PCB(Process Control Block, 프로세스 제어 블록)

: 운영체제가 프로세스에 대한 중요한 정보를 저장해놓는 곳. 각 프로세스가 생성될 때 고유의 PCB이 생성되고 프로세스 완료시 제거됨.

 

- PCB에 저장되어 있는 정보

  • 프로세스의 현재 상태
  • 포인터
  • 프로세스 고유 식별자
  • 스케줄링 및 프로세스의 우선순위
  • 주기억장치 관리 정보
  • 입/출력 상태 정보
  • 계정 정보

 

* 프로세스의 상태 전이

: 프로세스가 시스템 내 존재하는 동안 프로세스의 상태가 변하는 것

 

- 프로세스 상태:

  • 제출 (Submit) - 작업을 처리하기 위해 시스템에 제출된 상태
  • 접수 (Hold) - 제풀된 작업이 스풀 공간인 디스크의 할당 위치에 저장된 상태
  • 준비 (Ready) - 프로세스가 프로세서를 할당받기 위해 기다리는 상태
  • 실행 (Run) - 준비상태 큐에 있는 프로세스가 프로세서를 할당받아 실행되는 상태
  • 대기 / 블록 (Wait/Block) - 프로세스에 입/출력 처리가 필요하면 현재 실행중인 프로세스 중단, 입/출력 처리가 완료될 때까지 대기하는 상태
  • 종료 (Terminated,Exit) - 프로세스의 실행이 끝나고 프로세스 할당이 해제된 상태

 

- 프로세스 상태 전이 관련 용어:

  • Dispatch : 준비상태의 프로세스가 프로세서를 할당받아 실행 상태로 전이되는 과정
  • Wake Up: 입/출력 작업이 완료되어 프로세스가 대기 상태에서 준비상태로 전이 되는 과정
  • Spooling: 입/출력 장치의 처리속도 보완, 다중 프로그래밍 시스템 성능 향상을 위해 디스크에 저장하는 과정
  • Timer run out 타이머 런 아웃: CPU를 할당받은 프로세스는 시간 초과시 스케줄러에 의해 PCB저장, CPU반납 후 실행상태에서 준비상태로 전이
  • Traffic Controller 교통량 제어기: 프로세스의 상태에 대한 조사와 통보 담당

 

 

* 스레드 (Thread)

  • 경량 프로세스
  • 시스템의 여러 자원을 할당받아 실행하는 프로그램의 단위
  • 스레드 기반 시스템에서 독립적인 스케줄링의 최소 단위로서 프로세스의 역할을 담당
  • 단일 스레드 : 하나의 프로세스에 하나의 스레드가 존재
  • 다중 스레드 : 하나의 프로세스에 하나 이상의 스레드가 존재

 

 

* 스케줄링(Scheduling)

: 시스템의 여러 자원을 해당 프로세스에게 할당하는 작업

 

- 스케줄링의 종류

  • 장기 스케줄링: 어떤 프로세스가 시스템의 자원을 차지할 수 있도록 할 것인지를 결정하여 준비상태 큐로 보내는 작업
  • 중기 스케줄링: 어떤 프로세스들이 CPU를 할당받을 것인지 결정하는 작업
  • 단기 스케줄링: 프로세스가 실행되기 위해 CPU를 할당받는 시기와 특정 프로세스를 지정하는 작업

 

- 스케줄링 주요 용어

용어 설명
서비스 시간 프로세스가 결과를 산출하기까지 소요되는 시간
응답 시간 - 작업을 지시, 반응하기 시작하는 시간
- 응답시간 = 대기시간 + 수행시간
반환 시간 프로세스를 제출한 시간부터 실행이 완료될 때까지 걸리는 시간
대기 시간 - 프로세스가 대기 큐에서 대기하는 시간
- 프로세스가 도착 즉시 프로세서에 할당되면 대기시간은 '0'이 됨
종료 시간 요구되는 Processing time을 모두 수행하고 종료된 시간
시간 할당량 한 프로세스가 프로세서를 독점하는 것을 방지하기 위해 서비스되는 시간 할당량
응답률 - (대기시간 + 서비스 시간) / 서비스시간
- HRN(Highest Responce ratio Next) 스케줄링에서 사용
- HRN 스케줄에서 응답률이 높으면 우선순위가 높다고 판단

 

 

- 프로세스 스케줄링 유형

 

1. 선점형 스케줄링

  • 우선 순위가 높은 프로세스가 진행중인 프로세스를 중단시키고 CPU를 점유하는 스케줄링 방식 
  • 빠른 응답 시간을 요구하는 대화식 시분할 시스템에 적합
  • 실시간 응답환경 , Deadline 응답 환경에 적합
  • 많은 오버헤드(Overhead) 초래
  • 알고리즘:
알고리즘 유형 설명
라운드 로빈
(Round Robin)
- 프로세스는 같은 크기의 CPU 시간을 할당
- 프로세스가 할당된 시간 내에 처리 완료를 못하면 분비 큐 리스트의 가장 뒤로 보내지고 CPU는 대기중 다음 프로세스로 넘어감
- 균등한 CPU 점유시간
- 시분할 시스템 사용
 SRT
(Shortest Remaining Time First)
- 가장 짧은 수행시간 프로세스 우선 수행
- 남은 처리시간이 더 짧다고 판단되는 프로세스가 준비 큐에 생기면 프로세스 선점
 다단계 큐
(Multi-Level Queue)
- 독립된 스케줄링 큐
- 여러개의 큐를 이용하여 상위 단계 작업에 의한 하위 단계 작업이 선점
다단계 피드백 큐
(Multi-Level Feedback Queue)
- 프로세스의 특성에 따라 큐마다 서로 다른 CPU 시간 할당량 부여
- FCFS와 라운드 로빈 스케줄링 기법을 혼합
- 마지막 단계는 라운드 로빈 처리

 

 

 

2. 비선점형 스케줄링

  • 한 프로세스에게 할당된 CPU는 작업 종료 후 CPU 반환 전 까지 다른 프로세스에게 점유가 불가능한 스케줄링 방식
  • 프로세스 응답 시간의 예측이 용이
  • 일괄 처리방식에 적합
  • 처리시간 편차가 적은 특정 프로세스 환경에 적합
  • 짧은 작업을 수행하는 프로세스가 긴 작업 종료시까지 대기함
  • 알고리즘:  
알고리즘 유형 설명
우선순위
(Priority)
- 주요/긴급 프로세스에 대한 우선 처리
- 설정, 자원 상황에 따른 우선순위 선정
- 동일 순위는 FCFS
기한부
(Deadline)
- 요청에 명시된 시간 내 처리를 보장
- 작업들이 명시된 시간, 기한 내에 완료되도록 계획
FCFS
(First Come First Service)
= FIFO (First In First Out)
- 준비상태 큐에 도착한 순서에 따라 차례로 CPU 할당
- 가장 간단한 알고리즘
HRN
(Highest Response ratio Next)
- 대기시간과 서비스 시간을 이용하는 기법
- 우선순위를 계산하여 숫자가 높은것부터 낮은 순으로 우선순위 부여
- 우선순위 계산식: (대기 시간 + 서비스 시간) / 서비스 시간
- SJF의 기아현상 보완
 SJF(Shortest Job First, 단기 우선 작업) - 준비상태 큐에서 실행 시간이 가장 짧은 프로세스에게 먼저 CPU 할당
- 가장 적은 평균 대기 시간을 제공하는 알고리즘
- CPU 요구 시간이 긴 작업과 짧은 작업간의 불평등으로 인해 기아현상 발생 가능

 

 

 

* 시분할 시스템(Time Sharing System)

: 각 사용자들에게 컴퓨터 자원을 시간적으로 분할하여 사용할 수 있게 해주는 대화식 시스템

 

 

* 소프트웨어 개발 보안 설계:

요구사항 분석 - 설계 - 구현 - 테스트 - 유지보수

 

*소프트웨어 개발 보안 요소:

- 기밀성 Confidentiality :

  • 정보가 전송 중 노출되더라도 데이터를 읽을 수 없음.
  • 시스템 내의 자원은 인가된 사용자에게만 접근 허용

- 가용성 Availability:

  • 권한을 가진 사용자나 애플리케이션의 원하는 서비스를 지속 사용할 수 있도록 보장하는 특성

- 무결성 Integrity:

  • 정당한 방법을 따르지 않고선 데이터가 변경될 수 없음
  • 데이터의 정확성 및 완전성, 고의/악의로 변경되거나 훼손 또는 파괴되지 않음

 

* SW 개발 보안 용어:

- 자산 Asset : 서버의 하드웨어, 기업의 중요 데이터.

- 위협 Threat : 해킹, 삭제, 자산의 불법적 유출, 위/변조, 파손

- 취약점 Vulnerability: 평문전송, 입력값 미검증, 비밀번호 공유

- 위험 Risk : 위협이 취약점을 이용하여 조직의 자산 손실 피해를 가져올 가능성

 

* 입력데이터 검증 및 표현: 입력데이터로 인해 발생하는 문제들을 예방하기 위해 구현 단계에서 검증해야 하는 보안 점검 항목들

 

* 공격기법 이해

1. DoS (Denial of Service) 서비스 거부 공격

: 대량의 데이터를 한 곳의 서버에 집중적으로 전송함으로써 서버의 정상적인 기능을 방해

 

 - Dos 공격의 종류: 

SYN 플러딩 SYN Flooding - TCP 프로토콜의 구조적 문제를 이용한 공격
- 서버의 동시 가용 사용자 수를 SYN 패킷만 보내 점유하여 다른 사용자가 서버 사용을 불가능하게 하는 공격
- 3-way-handshake 과정을 의도적으로 중단시킴
UDP 플러딩 UDP Flooding - 대량의 UDP패킷을 만들어 임의의 포트 번호로 전송하여 응답메시지 ICMP를 생성하게 하여 자원 고갈
- ICMP 패킷은 변조되어 공격자에게 전달되지 않아 대기
스머프/스머핑 Smurf(ing) - 출발지 주소를 공격 대상의 IP로 설정하여 네트워크 전체에 ICMP Echo 패킷을 직접 브로드캐스팅 하여 마비
- 바운스 사이트라고 불리는 제3의 사이트를 이용해서 공격
- 대비책: 각 네트워크 라우터에서 브로드캐스트 주소를 사용할 수 없게 미리 설정
죽음의 핑 Ping of Death - 패킷의 크기를 인터넷 프로토콜 허용 범위 이상으로 전송하여 네트워크를 마비 시킴
- 수신 측에서는 단편화된 패킷을 처리하는 과정에서 많은 부하, 재조합 버퍼의 오버플로우가 발생하여 서비스 불가능
랜드어택 Land Attack - 출발지의 IP와 목적지 IP를 같은 패킷 주소로 만들어 보냄
- 수신자가 자기 자신에게 무한으로 응답을 보내도록 하는 공격.
- 대비책: 송신 IP 주소와 수신 IP 주소의 적절성 검사
티어 드롭 Tear Drop - IP 패킷의 재조합 과정에서 잘못된 Fragment Offset 값을 전송
- 수신측에서 패킷을 재조합하는 과정에서 과부하, 오류 발생.
봉크/ 보잉크 Bonk/Boink - 프로토콜의 오류 제어를 이용한 방법으로 시스템의 패킷 재전송과 재조립이 과부하 유발.
ex) 봉크: 같은 시퀀스 번호를 계속 보냄
      보잉크: 일정한 간격으로 시퀀스 번호에 빈 공간 생성
핑 플로드 Ping Flood - 특정 사이트에 많은 ICMP Echo를 보내면 응답을 하기위해 시스템 자원을 고갈시켜 시스템 정상가동을 방해.

 

2. DDoS(Distributed DoS) 공격

: DoS 공격을 여러대의 공격자로 분산 배치하여 동시 동작하도록 특정 사이트 공격

 

- DDoS 공격 구성요소:

  • 핸들러 Handler - 마스터 시스템의 역할을 수행하는 프로그램
  • 에이전트 Agent - 공격 대상에 직접 공격을 가하는 시스템
  • 마스터 Master - 공격자에게 직접 명령하는 시스템. 여러대의 에이전트를 관리.
  • 공격자 Attacker - 공격을 주도하는 해커의 컴퓨터
  • 데몬 프로그램 Daemon - 에이전트 시스템의 역할을 수행하는 프로그램

- DDoS 공격 도구:

  • Trin00: 가장 초기 형태 데몬으로 UDP Flooding 공격을 수행. 몇개의 마스터들과 많은 수의 데몬들로 구성.
  • TFN (Tribe Flood Network): UDP Flooding, TCP SYN Flooding 공격, ICMP 응답요청, 스머핑 공격 등을 수행.
  • Stacheldraht : 공격자, 마스터, 에이전트가 쉽게 노출되지 않도록 암호화된 통신 수행

 

- DDoS 공격 대응방안:

  • 차단 정책 업데이트
  • 좀비PC IP 확보 : IP 위변조 여부 확인
  • 보안 솔루션 운영: 방화벽, 침입탐지 시스템 등
  • 홈페이지 보안 관리: 모의해킹등을 수행하여 보안 유지
  • 시스템 패치: 시스템 취약점 패치

 

3. DRDoS (Distributed Reflection DoS) 공격

: 공격자가 출발지 IP를 공격 대상 IP로 위조하여 다수의 반사 서버로 요청 정보를 전송하고 공격 대상자는 반사 서버로부터의 다량 응답을 받아 서비스 거부 상태가 되는 공격.

 

- DRDoS 대응방안

  • ISP (인터넷 서비스 사업자)가 직접 차단
  • 반사 서버에서 연결을 완료하지 않은 Syn 출처 IP를 조사하여 블랙리스트 운용
  • 공격 대상 서버  IP와 Port를 변경, 필터링하여 운영

 

4. 애플리케이션 공격 종류

HTTP GET 플러딩 - Cache Control Attack 공격
- 과도한 GET 메시지를 이용해 웹 서버의 과부하 유도
- HTTP 캐시 옵션을 조작하여 캐싱 서버가 아닌 웹 서버가 처리하도록 유도
Slowloris (Slow HTTP Header DoS) - HTTP GET 메서드를 사용하여 헤더의 끝 문자열이 아닌 \r\n(Hex: 0d 0a)만 전송하여 연결상태 유지
RUDY (Slow HTTP POST DoS) - 요청 헤더의 Content-Length를 비정상적으로 크게 설정, 메시지 바디 부분은 소량으로 보내 연결 상태를 유지
Slow HTTP Read DoS - TCP 윈도 크기와 데이터 처리율을 감소시킨 상태에서 다수 HTTP 패킷을 지속적으로 전송하여 대상 웹 서버의 연결상태 장시간 지속
Hulk DoS - 공격자가 공격대상 웹 사이트 웹 페이지 주소(URL)을 지속적으로 변경하며 다량으로 GET 요청
Hash DoS - 많은 수의 파라미터를 POST 방식으로 웹 서버로 전달하여 다수의 해시 충돌 유도

 

 

5. 네트워크 서비스 공격 종류

네트워크 스캐너(Scanner),
스니퍼(Sniffer)
- 네트워크 하드웨어 및 소프트웨어 구성의 취약점 파악을 위해 공격자가 사용하는 도구
패스워드 크래킹
(Password Cracking)
- 사전(Dictionary) 크래킹:
ID와 패스워드가 될 가능성이 있는 단어를 파일로 만들어놓고 대입

- 무차별 크래킹 (Brite Force):
패스워드로 사용될 수 있는 문자들을 무작위로 대입

- 패스워드 하이브리드(Password Hybrid Attack)
사전 공격과 무차별 대입공격을 결합하여 공격

- 레인보우 테이블 공격 (Rainbow Table Attack):
패스워드별로 해시값을 미리 생성해서 테이블에 저장, 크래킹 하려는 해시값을 테이블에서 검색하여 역으로 패스워드를 찾는 기법
IP 스푸핑 (IP Spoofing) - 서버에 대한 인증되지 않은 액세스 권한을 입수하는데 사용하는 기법
- 침입자가 패킷 헤더 수정을 통해 인증된 호스트의 IP 어드레스 위조
- 타깃 서버로 메시지 발송 후 패킷은 유입된것처럼 표시
ARP 스푸핑 (ARP Spoofing) - 공격자가 특정 대상의 물리적 주소(MAC)를 자신의 주소로 위조한 ARP Reply를 만들어 희생자에게 지속적으로 전송.
- 희생자의 ARP Cache table에 특정 호스트의 MAC 정보를 공격자의 MAC 정보로 변경

ICMP Redirect 공격 - 3계층에서 스니핑 시스템을 네트워크에 존재하는 또 다른 라우터라고 알림으로써 패킷의 흐름 변경
- ICMP Redirect 메시지를 공격자가 원하는 형태로 변경, 특정 목적지로 가는 패킷을 스니핑하는 기법
세션 하이재킹 (Session Hijacking) - 케빈 미트닉이 사용했던 공격 방법 중 하나로 TCP의 세션 관리 취약점을 이용한 공격 기법

 

 

6. 시스템 보안 위협

 

시스템 보안 공격 기법 설명 탐지 / 대응 방안
버퍼 오버플로우(Buffer Overflow) 공격  메모리에 할당된 버퍼 크기를 초과하는 양의 데이터를 입력하여 프로세스 흐름을 변경시켜 악성 코드 실행

* 스택 버퍼 오버플로우 공격:
- 메모리 영역 중 Local Value나 함수의 Return Address가 저장되는 스택 영역에서 발생.
- 스택 영역에 할당된 버퍼 크기를 초과하는 데이터를 입력, 복귀주소를 변경하여 공격자가 원하는 임의의 코드 실행 공격

* 힙 버퍼 오버플로우 공격:
- 프로그램 실행 시 동적으로 할당되는 힙 영역의 버퍼 크기를 초과하는 데이터를 실행하여 메모리 데이터, 함수 주소등을 변경, 공격자가 원하는 임의의 코드 실행 공격
- 인접한 메모리(Linked-list)의 데이터가 삭제될 수 있고 포인터 주소를 악용하여 관리자 권한 파일에 접근

- 스택가드(Stack Guard) 활용:
카나리(Canary)로 불리는 무결성 체크용 값을 두고 버퍼 오버플로우 발생 시 카나리 값 체크

- 스택 쉴드(Stack Shield) 활용:
함수 시작 시 복귀 주소를 Global RET라는 특수 스택에 저장, 함수 종료시 저장된 값과 스택의 RET 값을 비교해 다를 경우 프로그램 실행 중단

- ASLR(Address Space Layout Randomization) 활용:
주소 공간 배치를 난수화하고, 메모리 주소를 변경시켜 버퍼 오버플로우를 통한 특정 주소 호출 차단. 리눅스에서 설정 가능.

- 안전한 함수 활용:
ex) strncat(), strncpy(), fgets(), fscanf(), vfscanf(), snprintf(), vsnprintf()
백도어 (Backdoor) - 암호시스템 혹은 알고리즘에서 정상적인 절차를 우회하는 기법.
- 허가받지 않고 시스템에 접속하는 권리 취득
- 고정된 형태가 아니라 프로그램 일부 혹은 독자적인 프로그램이나 하드웨어일 수 있다.
- 프로세스 및 열린 포트 확인:
TCPView로 열린 포트를 확인하고 백도어 탐지. 리눅스에서 ps -ef (동작 중인 프로세스 확인), Netstat -an(열린 포트 확인)을 통해 백도어 확인

- SetUid 파일 검사:
새로 생성된 SetUid 파일이나 변경된 파일 확인을 통해 감지

- 백신 및 백도어 탐지 툴 활용

- 무결성 검사
: 리눅스에서 Tripwire 툴을 이용한 무결성 검사 실시. "No such file or directory"메시지 출력시 정상

- 로그분석
:
wtmp, secure, lastlog, paccot, history, messages 사용하여 로그 분석 후 탐지
포맷 스트링 공격 
(Format String Attack)
- 포맷 스트링을 인자로 하는 함수의 취약점을 이용한 공격. 외부로부터 입력된 값을 검증없이 입출력 함수의 포맷 스트링을 그대로 사용하는 경우 발생하는 취약점 공격 기법
- Printf(argv[1]) 을 포맷 스트링을 인자로 하는 함수 사용 시 포맷 스트링을 지정하지 않고 사용자 입력값을 통해 메모리 내용을 참조하거나 특정 영역의 값을 변경 가능
 
레이스 컨디션 공격
(Race Condition Attack)
- 레이스 컨디션은 둘 이상의 프로세스나 스레드가 공유자원을 동시에 접근할 때 접근 순서에 따라 비정상적인 결과가 발생하는 조건/ 상황
- 프로세스가 임시파일을 만드는 경우 악의적인 프로그램을 통해 그 프로세스의 실행중에 끼어들어 임시파일을 심볼릭 링크하여 악의적인 행위 수행을 유도
 
키로거 공격
(Key Logger Attack)
- 컴퓨터 사용자의 키보드 움직임을 탐지하여 개인 정보를 빼가는 해킹 공격
- 키보드 활동을 기록하는 것을 키로깅 / 키스트로크 로킹 이라고 함
 
루트킷 (Rootkit) - 시스템 침입 후 백도어, 트로이 목마 설치, 원격 접근, 내부 사용 흔적 삭제, 관리자 권한 획득 등 주로 불법적인 해킹에 사용되는 기능 제공 프로그램 모음  

 

 

 

7.  보안 공격 기법

피싱 (Fishing) 소셜 네트워크에서 지인, 특정 유명인으로 가장하여 불특정 다수의 정보 탈취
스피어 피싱 (Spear Phishing) 특정 대상을 선정한 후 일반적 이메일로 위장한 메일을 지속적으로 발송, 클릭을 유도하여 사용자의 개인정보 탈취
큐싱 (Qshing) - 큐알코드를 통해 악성 앱을 내려받도록 유도, 금융 정보 등을 빼내는 피싱공격
- 제로페이 확산에 따라 피해 증가
스미싱 (Smishing) - SMS와 피싱의 합성어
- 신뢰할 수 있는 사람/기업처럼 가장하여 개인 정보, 결제를 유도하는 공격
애드웨어 (Adware) 특정 소프트웨어를 실행, 설치 후 자동적으로 광고가 표시되는 프로그램
웜 (Worm) - 스스로를 복제하여 전파하는 악성 소프트웨어 프로그램
- 바이러스와 달리 웜은 독자적으로 실행된다.
악성 봇 (Malicious Bot) - 해커의 명령에 의해 원격에서 제어/실행 가능한 프로그램 혹은 코드
- 스팸 메일 정송이나 DDoS에 활용
- '좀비PC'는 악성 봇에 의해 감염된 PC
봇넷 (Botnet) 악성 프로그램에 감염되어 이용될 수 있는 다수의 컴퓨터들이 네트워크로 연결된 상태
랜섬웨어 (Ransomware ) Snake, Darkside 등 시스템을 잠그거나 데이터를 암호화해 사용할 수 없도록 만들고 이를 인질로 금전 요구
논리 폭탄 (Logic Bomb) 특정 날짜,시간 등 조건 충족시 악의적인 기능을 유발할 수 있게 만든 코드의 일부로 소프트웨어 시스템에 의도적으로 삽입된 악성 코드
APT 공격 (Advanced Persistent Threat) 특정 타깃을 목표로 다양한 수단을 통한 지속적이고 지능적인 맞춤형 공격
공급망 공격 (Supply Chain Attack) - 소프트웨어 개발사의 네트워크에 침투, 코드 삽입 혹은 파일 변경으로 사용자 PC에 소프트웨어를 설치, 업데이트 시 감염되도록 하는 공격
제로데이 공격 (Zero Day Attack ) - 보안 취약점이 발견되어 공표 전 해당 취약점을 악용하는 공격
- 공격의 신속성을 의미. 대응책이 공표되기 전에 공격하는 것이라 대응책이 없다
이블 트윈 공격 (Evil Twin Attack) 무선 wifi 피싱기법으로 wifi 제공자처럼 행세하며 핫스팟에 연결한 무선 사용자들의 정보를 탈취
사이버불링 (Cyberbullying) 인터넷 관련 공간에서 특정인을 집단적으로 따돌리거나 집요하게 괴롭히는 행위
트로이 목마 (Trojan Horses) 겉보기엔 정상적인 프로그램으로 보이지만 실행하면 악성코드 실행

 

* 보안 방어 기법

- 사이버 킬체인 (Cyber Kill Chain)

: 록히드 마틴의 사이버 킬체인은 7단계 프로세스별 공격분석 및 대응을 체계화한 APT 방어 분석 모델

 

- 난독화 (Obfuscation)

: 코드의 가독성을 낮춰 역공학에 대한 대비를 위해 코드 일부, 혹은 전체를 변경.

 

 

* 개발 보안을 위한 암호화 알고리즘

- 대칭 키 암호방식: 암호화와 복호화에 같은 암호키를 사용.

  • 블록 암호 방식: 고정 길이의 블록을 암호화. ex) DES, AES, SEED
  • 스트림 암호 방식: 긴 주기의 난수열을 발생시켜 평문과 더물어 암호문 생성. ex) RC4

- 비대칭 키 암호방식: 공개 키, 개인 키가 존재하며 공개키는 누구나 알 수 있지만 개인키는 소유자만 알 수 있어야함.

 

 

- 해시 방식: 단방향 알고리즘으로서 임의의 데이터를 고정된 길의의 데이터로 매핑하는 함수.

원본 데이터를 유추하기 어려운 것을 이용. 연산 시간이 빠르다.

ex) SHA, MD5

 

 

* 시큐어 코딩: 잼재적인 보안 취약점을 사전에 제거하고 보안 요소들을 고려하며 개발하는 기법

 

* 시큐어 코딩 가이드

- 입력 데이터 검증 및 표현

- 보안 기능

- 시간 및 상태

- 에러 처리

- 코드 오류

- 캡슐화

- API 오용

 

 

 

* 입력데이터 검증 및 표현

보안 약점 설명 대응방안
SQL삽입 ( SQL Injection )
  • 웹 응용 프로그램에 SQL을 삽입하여 내부 데이터베이스 서버의 데이터를 유출 및 변조하고 관리자 인증을 우회하는 보안 약점
동적 쿼리에 사용되는 입력 데이터에 예약어 및 특수문자가 입력되지 않게 필터링 되도록 설정하여 방지
경로 조작 및 자원 삽입
  • 데이터 입출력 경로를 조작하여 서버 자원을 수정/삭제가 가능
  • 외부 입력 값의 사전검증 부재, 잘못 처리된 경우
  • 사용자 입력값을 식별자로 사용
  • 경로 순회 공격 위험이 있는 문자(" / \ ) 제거 필터 사용
크로스 사이트 스크립트 (XSS)
  • 검증되지 않은 외부 입력값에 의해 브라우저에서 악의적 코드 실행
  • 웹 페이지에 악의적 스크립트 삽입하여 방문자 정보 탈취 및 비정상적인 기능 수행
HTML 태그 사용을 제한, 혹은 < , > , & 등의 문자를 다른 문자로 치환
운영체제 명령어 삽입
  • 운영체제 명령어 파라미터 입력값을 필터없이 사용될 때 악용 가능
  • 외부 입력값을 통해 시스템 명령어 실행 유도
웹 인터페이스를 통해 시스템 명령어 전달 방지.
위험한 형식 파일 업로드
  • 악의적인 명령어가 포함된 스크립트 파일 업로드, 시스템에 손상을 주거나 제어 가능
업로드 되는 파일의 확장자 제한, 파일명의 암호화, 웹사이트 파일 서버의 경로 분리, 실행 속성 제거 
신뢰하지 않는 URL주소로 자동접속 연결
  • 입력 값으로 사이트 주소를 받는 경우 방문자를 피싱 사이트로 유도
 연결되는 외부 사이트의 주소를 화이트 리스트로 관리함으로써 방지

 

* 취약점 분석/평가:

- 취약점 분석/평가 계획 수립 - 취약점 분석/평가 대상 선별 - 취약점 분석 수행 - 취약점 평가 수행

 

* 보안 인증: 로그인을 요청한 사용자의 정보를 확인하고 접근 권한을 검증하는 보안 절차.

 

* 보안 인증의 유형

- 지식 기반 인증: password, Passphrase, 아이핀

- 소유 기반 인증: 신분증, 토큰, 스마트카드, OTP

- 생체 기반 인증: 지문, 얼굴, 음성, 홍채

- 위치 기반 인증: 콜백, GPS나 IP주소

- 특징(행위)기반 인증: 서명, 동작

 

* 접근 통제: 데이터가 저장된 객체와 사용하려는 주체 사이의 정보흐름 제한

 

* 접근 통제 기법

- 식별(Identification): 인증 서비스에 스스로를 확인시키기 위해 정보를 공급하는 주체활동

- 인증(Authentication): 주체의 신원을 검증하기 위함

- 인가(Authorization): 인증을 통해 식별된 주체에게 접근을 허용하는 활동

- 책임추적성(Accountability): 주체의 접근을 추적하고 행동을 기록하는 활동

 

* 접근 통제 유형:

 

- 임의적 접근통제 (DAC)

: 사용자/ 그룹 신분 기반으로 접근 제한. 정보의 소유자가 보안 레벨을 결정, 이에 대한 정보의 접근 제어를 설정. 

유연한 접근 제어 서비스 제공. 객체별로 세분된 접근제어 가능

 

- 강제적 접근통제 (MAC)

:  주체가 갖는 접근 허가 권한에 근거하여 접근 제한. 시스템 정보의 허용 등급을 기준으로 제한. 중앙에서 정보를 수집, 분류하여 보안레벨 결정. 정책적으로 접근 제어 수행. 

기밀성이 중요한 조직에서 사용.

 

- 역할 기반 접근 통제 (RBAC)

: 중앙 관리자가 조직 내 맡은 역할에 기초하여 접근 제한. 직책에 대해 권한을 부여해서 효율적인 권한 관리 가능

 

 

* 보안 솔루션: 외부로부터의 불법적인 침입을 막는 기술 및 시스템

 

- 방화벽 (Firewall): 내부의 네트워크와 인터넷 간에 전송되는 정보를 선별하여 수용/거부/수정하는 기능을 가진 침입 차단 시스템

 

- 침입 탐지 시스템(IDS; Intrusion Detection System): 컴퓨터 시스템의 비정상적인 사용, 오용, 남용 등을 실시간으로 탐지하는 시스템.

  • 오용 탐지(Misuse Detection): 미리 입력해둔 공격 패턴이 감지되면 알려준다.
  • 이상 탐지(Anomaly Detection): 비정상적인 행위나 자원의 사용이 감지되면 알려준다.

- 침입 방지 시스템(IPS; Intrusion Prevention System)

: 비정상적인 트래픽을 능동적으로 차단, 격리하는 보안 솔루션.

방화벽과 침입탐지 시스템을 결합한 것. 패킷을 하나씩 검사 후 비정상적인 패킷이 탐지되면 방화벽 기능으로 차단.

 

- 데이터 유출 방지(DLP; Data Leakage/Loss Prevention)

: 내부 정보의 외부 유출을 방지하는 보안 솔루션

PC와 네트워크상의 모든 정보를 검색하고 행위를 탐지,통제하여 유출을 사전 방지

 

- 웹 방화벽(Web Firewall)

: 웹 기반 공격을 방어할 목적으로 만들어진 특화된 방화벽. 웹 관련 공격을 감시하고 서버에 도달하기 전에 차단.

 

- VPN(Virtual Private Network, 가상 사설 통신망)

: 공중 네트워크와 암호화 기술을 이용하여 사용자가 자신의 전용 회선을 사용하는 것 처럼 도와주는 보안 솔루션.

비용 부담을 줄일 수 있으며 지역적 제한이 없다.

 

- NAC(Network Access Control)

: 네트워크에 접속하는 내부 PC의 일관된 보안 관리 기능을 제공하는 보안 솔루션

 

- EMS(Enterprise Security Management)

: 로그 및 보안 이벤트를 통합하여 관리하는 보안 솔루션. 보안 솔루션간 상호 연동을 통해 종합적 보안 관리 체계 수립 가능.

 

 

 

+ Recent posts