# TIL 웹개발 - 소프트웨어 설계

자료

### 자료구조

데이터를 효과적으로 젖아하기 위해 어떤 논리나 규칙으로 자료를 모안호은 구조

- 선형 구조

    - 자료간의 관계가 1:1로 순차적으로 나열되어 있는 것

    - 배열 : 메모리상에 연속적인 공간에 데이터를 저장하는 방법

    - 리스트 : 메모리상에 임이의 위치에 데이터를 저장하지만 각 데이터들이 앞뒤 관계를 갖게 하는 방법 

    - 스택 : 선입후출 방식의 자료구조. 히스토리 기능을 구현할 때 유용하고 DFS(깊이우선탐색), 후위연산, 백트래킹, 유효성 검사 등 다양한 곳에 사용된다.

    - 큐 : 선입선출 방식의 자료구조. 작업스케쥴링 기능을 구현하거나 BFS(너비우선탐색), 티켓 시스템 등 다양한 곳에서 사용된다.

- 비션형 구조

    - 자료들 간 관계가 1:N으로 나열되어 있는 것을 의미한다.

    - 그래프: 노드와 간선으로 이루어진 자료구조

        - 무방향 그래프 / 방향 그래프 / 가중치 그래프

    - 트리: 그래프의 한 종류로 싸이클의 구조가 없어야 한다.

        - 이진트리 : 각 부모노드의 자식 노드가 최대 2개인 트리 

        - 편향트리 : 한쪽으로만 자식을 갖는 트리

        - 포화이진트리 : 이진트리에서 모든 부모가 2개의 자식노드를 갖는 이진트리 

        - 완전이진트리 : 이진트리에서 거의 모든 노드가 채워져 있으며 강한한 제일 왼쪽부터 채워져 있는 이진트리

### 프로그래밍 기본

- 컴파일러

    - 고급 프로그래밍 언어로 작성된 소스코드를 기계어로 번역 및 실행하기 위한 프로그램. 가장 큰 특징은 소스코드 전체를 분석하고 그 다음 기계어로 번역 후 실행한다.

- 인터프리터

    - 컴파일러와 마찬가지로 고급 프로그래밍 언어로 작성된 소스코드를 기계어로 번역 및 실행하기 위한 프로그램. 컴파일러와 차이는 한 줄씩 소스 코드를 번역하고 실핸한다는 것이다.

- 실행순서

    - 파이썬 소스코드 작성.py → PVM(파이썬 가상 머신)을 통해 바이트코드로 변환.pyc → PVM이 바이트코드를 해석하고 기계어로 명령을 실행

- 메모리 영역

    - 코드영역

        - 프로그램을 실행하기 위해 명령어들이 저장되는 공간

    - 데이터 영역

        - static 변수, 전역 변수와 같은 데이터들이 저장되는 공간. 프로그램 시작과 함께 할당되고 프로그램이 종료될 때 소멸된다.

    - Heap 영역

        - 동적 메모리 할당을 위한 곳. 프로그래머가 직접 사용 및 관리해야하는 메모리 영역으로 

    - Stack 영역

        - 

### OOP(Object-Oriented Programming) 객체지향 프로그래밍

- 추상화하고자하는 객체의 모습을 가상의 공간에 구체화하며 설계해 나가는 것

- 객체(instance)란? 현실세계에 있는 어떤 대상을 추상화한 것을 의미한다. 

- class 클래스가 항상 따라 나온다.

    - 상속

        - 만약 다른 클래스의 기능을 사용하고 싶다면 상속을 받아서 부모클래스와 자식 클래스의 관계를 만든다. 

    - 오버라이딩

        - 상속받은 클래스에서 어떤 기능을 재정의 하는 것을 의미한다. 

    - 오버로딩

        - 함수의 이름은 같으나 매개변수를 다르게 설정하여 사용 목적에 따라 다르게 불러오는 것

        - 파이썬에는 없다.

### 소프트웨어 개발 방법론

- 폭포수 방법론

    - 하향식 방법으로 가장 오래된 개발 방법

    - 계획 → 설계 → 개발 → 시험 → 유지보수

    - 순차적으로 진행하며 SDLC(소프트웨어 개발 생명 주기)가 굉장히 길다.

    - 매우 큰 규모의 큰 프로젝트에 적합하며 이미 진행된 작업에 대해서는 변경 및 수정이 어렵다는 단점도 있다.

- 애자일 방법론

    - 반복적이고 점진적으로 개발하는 방법

    - 계획 → 설계 → 개발 → 시험 → 유지보수

    - SDLC가 굉장히 짧기 때문에 여러번 반복하며 점진적으로 개발해 나간다.

    - 이해관계자의 피드백을 빠르게 반영할 수 있지만 개발 계획을 세우기 어려울 수 있다.

### 디자인 패턴

- 소프트웨어를 설계 및 구현할 때 어떠한 공통된 구조를 띄는 형태 

- MTV

    - 파이썬 기반의 웹 구현을 위한 프레임워크인 Django가 MTV 디자인 패턴을 지향합니다.

    - M 은 model을 의미하며 DB에 데이터를 적재하고 테이블을 정의한다.

    - T는 Template을 의미하며 사용자에게 보여지는 화면을 의미한다.

    - V는 view를 의미하며 요청에 따라 필요한 로직을 수행하는 역할을 의미한다.

### 형상관리

- 소프트웨어의 변경사항을 추적하고 통제하기 위한 작업을 의미한다.

- git, gerrit, jira 등등이 있다.

V&V (Verification & Validation) 검증과 확인

- 소프트웨어 완성도 및 신뢰도를 검증 및 확인하는 작업

- Verification 검증

    - 개발자 중심에서 제품이 요구사항에 만족하게 구현되었는지 검증

- Validation 확인

    - 사용자 중심에서 제품이 사용감에 만족하게 구현되었는지 검증

- Test 시험

    - 단위 → 통합 → 시스템 → 인수

    - Unit test 단위 시험

        - 최소 기능 단위로 시험

    - Integraiton test 통합 시험

        - 함수간, 클래스간, 모듈 간 등이 잘 작동하는지, 충돌이 없는지

    - System test 시스템 시험

        - 실제 적용하려는 하드웨어나 어떤 시스템에 개발한 소프트웨어를 탑재한 뒤 시험

    - Acceptance test 인수 시험

        - 출시 및 배포 전 최종 시험

- Test 종류

    - 정적 테스트

        - 소프투에어를 구동하지 않고 테스트하는 방법

        - 동료 검토, 코드 리뷰, 기술 

    - 동적 테스트

        - Black Box Test

        - White Box Test

For the site tree, see the [root Markdown](https://slashpage.com/kyugntae-ai.md).
