전남대학교 인공지능학부 2025학년도 2학기 오픈소스소프트웨어(SAI0003-2) 강의 요약 및 학습 정리
교과목명: 오픈소스소프트웨어(SAI0003-2) 담당교수: 최광훈 강의시간: 화1목1 강의실: AI융합-301 학점: 3.0
이 과목은 3가지 목표를 지향합니다:
- 오픈소스소프트웨어 개발 기초
- 소스코드 버전 컨트롤
- 패키지 관리
- 프로젝트 빌드
- 애자일 기반 개발 방법론
- 짝 프로그래밍
- 테스트 주도 개발
- 클라우드 기반 데브옵스
- 자기주도 학습 능력
- 새로운 개발환경 적응
- 협력적 소프트웨어 개발 주도
| 역량 | 세부 목표 |
|---|---|
| 컴퓨팅사고 | 함수형 프로그래밍 언어 스타일 익히기 |
| 융합 | LLM/ChatGPT를 새로운 프로그래밍 학습에 활용 |
| 글로컬 | Git/Github를 통한 협업 방식 학습 |
| 문제해결능력 | 오픈소스 소프트웨어 기본 개념과 도구 습득 |
플립러닝 방식으로 진행:
- 사전 동영상 학습
- 매 강의 시작 시 10분 퀴즈
- 요약 강의 및 연습문제 풀이
- 중간고사: 30%
- 기말고사: 40%
- 개별과제: 20%
- 수업참여도: 10%
참고: 모든 시험은 지필고사로 진행되며, 개별과제는 주로 프로그래밍 과제입니다.
- 주교재: 별도 교재 없이 강의 자료 사전 배포
- 부교재: Haskell MOOC - Joel Kaasinen & John Lang
- 참고자료: YouTube 강의
오픈소스 소프트웨어란 소프트웨어 저작권 소유자가 모든 사람에게 소스 코드를 게시, 사용, 복사, 수정 및 배포할 권리를 부여한 소프트웨어.
- 라이선스 방식 - 상용 SW: 개별 이용허락 (EULA) - OSS: 일괄 사전 이용허락
- 비용
- 상용 SW: 로열티 지급 필요
- OSS:
비용 부담→ 무료 - 소스코드 - 상용 SW: 바이너리만 제공 - OSS: 소스코드 공개
- 수정 권한 - 상용 SW: 복제, 배포, 수정 불가 - OSS: 복제, 배포, 수정 허용
| 구분 | 상용 소프트웨어 | 오픈소스 소프트웨어 |
|---|---|---|
| 라이선스 | 개별 이용허락(EULA) | 일괄 사전 이용허락 |
| 비용 | 로열티 지급 | 무료 |
| 소스코드 | 바이너리만 제공 | 소스코드 공개 |
| 수정권한 | 수정 허용 |
글로벌 기업들의 OSS 기여:
| 라이선스 | 상용SW 연동 | 수정시 공개의무 | 특허보호 |
|---|---|---|---|
| GPL 2.0 | ❌ | ✅ | ❌ |
| LGPL | ✅ | ✅ | ❌ |
| MIT/BSD | ✅ | ❌ | ❌ |
| Apache 2.0 | ✅ | ✅ | ✅ |
| MPL 1.0/1.1 | ✅ | ✅ | ✅ |
- GPL (GNU General Public License)
- 강력한 카피레프트
- GPL 코드와 링크된 소프트웨어는 전체가 GPL을 따라야 함
- LGPL (GNU Lesser General Public License)
- 라이브러리 수준에서 링크 허용
- 수정한 부분만 공개하면 됨
- MIT/BSD License
- 매우 자유로운 라이선스
- 상업적 이용 가능
버전 관리 없이 작업하면:
- 단순 백업 복사본 생성 (
파일명_v1.doc,파일명_v2.doc) - 파일명에 버전 번호나 날짜 추가
- 공유 폴더에서 동시 편집으로 인한 충돌
문제점: 파일 충돌, 변경 이력 추적 어려움
- 체크인/체크아웃: 파일 수정 이력 관리
- 브랜치: 별도 개발 라인 생성
- 머지: 브랜치 간 변경사항 통합
- 충돌 해결: 동시 수정 시 충돌 처리
- 태깅: 특정 버전에 라벨 부여 (
Release 1.0)
- 특징: 하나의 중앙 저장소
- 예시: CVS, SVN
- 장점: 단순한 구조, 관리 용이
- 단점: 중앙 서버 의존성, 오프라인 작업 제한
- 특징: 개별 로컬 저장소 보유
- 예시: Git, Mercurial, Darcs
- 장점: 오프라인 작업 가능, 빠른 속도
- 추가 기능:
fork,pull request
Joe와 Sue의 협업 시나리오:
- Joe와 Sue가 동일한 파일 r3를 체크아웃
- Joe: -Eggs, +Cheese 수정
- Sue: -Eggs, +Hot Dog 수정
- Joe가 먼저 커밋하여 r4 생성
- Sue는 충돌로 인해 커밋 불가
⚠️
충돌 해결 방법:
- Sue의 변경사항을 Joe의 r4에 재적용
- Joe의 변경사항을 Sue의 것으로 덮어쓰기
특정 리비전에 라벨을 부여하여 쉽게 참조할 수 있게 함
- 예시:
r4→Release 1.0 - 중요한 버전이나 마일스톤에 의미있는 이름 부여
Microsoft Windows Media Player 11과 Internet Explorer 7 통합:
- Forward Integration (FI): 브랜치에서 메인으로 통합
- Reverse Integration (RI): 메인에서 브랜치로 역통합
개발자: Linus Torvalds (Linux 커널 창시자) 목적: Linux 커널 공동 개발을 위한 도구 특징: 분산 버전 관리 시스템
- Workspace (작업 디렉토리)
- 실제로 작업 중인 파일들
- Index/Stage (스테이징 영역)
- 다음 커밋에 포함될 파일들
- Local Repository (로컬 저장소)
- 로컬에 커밋된 파일들
- Remote Repository (원격 저장소)
- GitHub 등 원격 서버에 푸시된 파일들
git init # 로컬 저장소 초기화
git clone <repository-url> # 원격 저장소 복제git add <filename> # 특정 파일을 스테이징
git add . # 모든 변경 파일을 스테이징
git commit -m "메시지" # 커밋 생성
git commit -a # 수정된 모든 파일 자동 add + commitgit remote add origin <url> # 원격 저장소 추가
git push origin main # 로컬 → 원격 업로드
git fetch origin # 원격 → 로컬 다운로드 (병합 X)
git pull origin main # fetch + merge 동시 실행git status # 현재 상태 확인
git log # 커밋 히스토리 확인
git diff # 변경사항 비교
git diff HEAD # 워크스페이스와 최신 커밋 비교단계별 데이터 흐름:
git clone- 원격 저장소를 로컬로 복제git add- 워크스페이스에서 스테이징 영역으로git commit- 스테이징 영역에서 로컬 저장소로git push- 로컬 저장소에서 원격 저장소로git fetch- 원격 저장소에서 로컬 저장소로 (병합 X)git merge- 가져온 변경사항을 현재 브랜치에 병합git pull- fetch + merge를 한 번에 실행
GitHub은 Git 기반의 소셜 코딩을 위한 소스코드 호스팅 서비스입니다.
주요 기능:
- Fork, Pull Request, Code Review 기능
- Issue 추적 및 프로젝트 관리
- 협업을 위한 소셜 네트워킹
- Fork: 원본 저장소를 내 계정으로 복사
- Clone: Fork한 저장소를 로컬로 가져오기
- Branch: 새로운 기능을 위한 브랜치 생성
- Commit: 로컬에서 변경사항 커밋
- Push: Fork한 저장소에 변경사항 업로드
- Pull Request: 원본 저장소에 변경사항 제안
1.Fork한 저장소 클론
git clone https://github.com/내아이디/oss_git_example.git2.원본 저장소를 upstream으로 추가
git remote add upstream https://github.com/kwanghoon/oss_git_example.git3.최신 변경사항 가져오기
git fetch upstream4.충돌 해결 후 리베이스
git rebase upstream/main5.내 Fork에 푸시
git push origin mainPull Request의 장점:
- 코드 품질 향상: 동료 검토를 통한 버그 발견
- 지식 공유: 팀원 간 기술 및 도메인 지식 공유
- 표준화: 일관된 코딩 스타일 유지
리뷰 방법:
- 라인별 댓글을 통한 구체적 피드백
- 전체적인 설계 및 아키텍처 검토
- 테스트 코드 및 문서화 확인
과제: https://github.com/kwanghoon/oss_git_example을 fork하여 본인의 원격 저장소를 만들고, 이를 로컬로 가져와 수정한 다음 다시 올린 후 kwanghoon의 저장소에 pull request
다른 개발자들의 변경사항을 내 저장소에 반영:
1. git remote add pb https://github.com/kwanghoon/oss_git_examples
2. git fetch pb
3. git diff pb/master # 충돌 확인
4. git rebase pb/master
5. git commit -a -m "merge 3rd party contributions"
6. git push origin masterA---B---C topic
/
D---E---F---G main- 브랜치들을 통합하며 머지 커밋(G) 생성
- 기존 커밋 이력 완전 보존
- 복잡한 그래프 형태의 히스토리
A---B---C topic
/
D---E---F main
↓ git rebase main
A'--B'--C' topic
/
D---E---F main- 커밋들을 재배치하여 선형 이력 생성
- 깔끔하고 읽기 쉬운 프로젝트 히스토리
- 주의: 공유된 커밋은 리베이스 금지!
git rebase -i HEAD~3 # 최근 3개 커밋 수정pick → edit, squash, drop 등으로 변경 가능
git blame filename.c # 각 줄의 최종 수정자 확인
git log -p filename.c # 특정 파일의 상세 변경 이력git stash # 현재 변경사항 임시 저장
git stash list # 저장된 stash 목록 확인
git stash pop # 가장 최근 stash 적용 및 삭제표준 브랜치 구조:
- main/master: 배포 가능한 안정 버전
- develop: 개발 진행 중인 브랜치
- feature/기능명: 새로운 기능 개발 브랜치
- release/버전: 배포 준비 브랜치
- hotfix/버그명: 긴급 수정 브랜치
main ──●────●────●────●──
╲ ╱ ╱
develop ───●──●──●──●──●───
╱ ╲
feature/A ●─●─●─● ╲
╱
feature/B ●─●─●git commit --amend # 직전 커밋 메시지 수정 git rebase -i HEAD~3 # 여러 커밋 메시지 수정
git reset --soft HEAD1 # 커밋 취소, 변경사항 보존
git reset --hard HEAD1 # 커밋 및 변경사항 완전 삭제 (주의)
- git reset: 커밋 히스토리 자체를 변경 (위험)
- git revert: 이전 커밋을 취소하는 새로운 커밋 생성 (안전)
- Git과 Github의 차이는?
- Git은 각 컴퓨터(local)에 설치되어 소스코드관리가 가능한 프로그램
- Github는 remote 저장소가 있는 외부서버를 지칭
- Commit과 Pushd의 차이는?
- commit은 local 작업폴더에 history를 쌓는 것이어서 외부망을 사용하지 않음
- push는 remote 저장소에 history를 쌓는 것이어서 외부망이 필요함
- Fetch와 Pull의 차이는?
- fetch는 가져와서 임시폴더(.git)에 저장
- pull은 바로 현재 branch에 merge 작업을 동반함
- Remote 저장소로부터 최신 commit 정보들을 가져오는 것은 매한가지
- Rebase와 Merge의 차이는?
- rebase는 합치기 전에 되감기(rewinding)를 함
- merge는 되감기를 안하고 합침
- 두 branch의 차이점(commits)를 합치는 것은 매한가지
Markdown은 존 그루버(John Gruber)와 아론 스워츠(Aaron Swartz)가 2004년에 개발한 경량 마크업 언어입니다.
주요 특징:
- 일반 텍스트 에디터로 작성 가능
- GitHub README 파일에서 널리 사용
- HTML로 쉽게 변환 가능
- 배우기 쉽고 사용하기 편함
# H1 제목 (가장 큰 제목)
## H2 제목 (두 번째 크기)
### H3 제목 (세 번째 크기)
#### H4 제목 (네 번째 크기)- 이탤릭체:
*이탤릭체* - 볼드체:
**볼드체** - 볼드 이탤릭:
***볼드 이탤릭*** 취소선:~~취소선~~
- 순서 없는 목록 (
- 항목) - 순서 있는 목록 (
1. 항목)
- 항목 1
- 항목 2
- 하위 항목 2-1
- 하위 항목 2-2
- 항목 3- 링크:
[텍스트](https://example.com) - 이미지:

> 이것은 인용문입니다.
> 여러 줄에 걸쳐 작성할 수 있습니다.
> 중첩 인용문도 가능합니다.# 여러 줄 코드 블록은 backtick 3개로 감쌉니다.
git status
git log| 항목 | 가격 | 수량 |
|---|---|---|
| 사과 | 1000원 | 10개 |
| 바나나 | 1500원 | 5개 |
| 오렌지 | 2000원 | 8개 |
- VSCode
- Edit and preview(Ctrl + Shift + V)
- StackEdit





