컴파일러(compiler): 고급 언어로 작성된 소스 코드를 저급 언어(기계어)로 번역하는 프로그램 - 코드 실행 전, 컴파일 타임에 소스 코드 전체를 한 번에 기계어로 변환 후 실행한다. - 실행 파일을 생성한다. - 컴파일 단계와 실행 단계가 분리되어 있다. - 컴파일은 한번만 수행한다. - 컴파일과 실행단계가 분리되어 있어, 실행 시에는 실행만 하면 되므로 코드 실행 속도가 빠르다. - 런타임: 컴파일 과정을 마친 컴퓨터 프로그램이 실행되고 있는 환경 또는 동작 시간이다. - C, C++, C#, JAVA
인터프리터(interpreter): 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 - 코드가 실행 단계인 런타임에 코드 한 줄씩 중간 코드인 바이트코드로 변환 후 실행한다. - 실행 파일을 생성하지 않는다. - 인터프리트 단계와 실행 단계가 분리되어 있지 않으므로, 한 줄씩 바이트 코드로 변환 후 즉시 실행한다. - 코드 실행할 때마다 인터프리트 과정을 반복 수행한다. - 인터프리트 단계와 실행 단계가 분리되어 있지 않아 반복 수행하므로 실행 속도가 느리다. - Python, Javascript, Ruby
파이썬의 실행 과정 소스코드.py ➡️ PVM을 통해 바이트 코드 변환.pyc ➡️ PVM이 바이트 코드를 해석 후 기계어 명령 *PVM: 파이썬 가상머신
메모리 구조: - 코드(Code) 영역 • 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부른다. • 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로, 함수, 제어문, 상수 등이 지정된다. • 끝날 때까지 메모리에 남아 있고 CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다. - 데이터(Data) 영역 • 프로그램의 전역 변수와 정적 변수가 저장되는 영역이다. • 프로그램의 시작하고 끝날 때까지 메모리게 계속 남아있는다. - 힙(Heap) 영역 • 사용자가 직접 관리할 수 있고 사용자에 의해 메모리 공간이 동적(Dynamic)으로 할당되고 해제된다. • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당되는 선입선출(FIFO) 구조이다. • 동적 할당으로 인해 메모리를 효율적으로 관리할 수 있다. • 런타임 시 크키가 결정된다. - 스택(Stack) 영역 • 함수희 호출과 관계되는 지역변수와 매개변수가 저장되는 영역이다. • 함수의 호출과 함께 할당되며 함수의 호출이 완료되면 소멸한다. • 메모리의 높은 주소부터 낮은 수조의 방향으로 할당되는 후입선출(LIFO) 구조이다. • 컴파일 시 크키가 결정된다.
- Heap VS Stack • Heap 영역과 Stack 영역은 사실 같은 공간을 공유한다. (Heap은 위부터, Stack은 아래부터 할당) • Heap/Stack Overflow: 각 영역이 상대 공간을 침범하는 일이 발생할 경우를 말한다. • Stack 영역이 클수록 Heap 영역이 작아지고, Heap 영역이 클수록, Stack 영역이 작아진다.
폭포수 방법론 - 비즈니스 애널리스트느 애플리케이션에 필요한 기능을 정리한 비즈니스 요구사항 문서 작성한다. *문서는 길고 세부적이다. (전체 전략부터 포괄적 기능 사양, 사용자 인터페이스, 시각 디자인 등) - 기술자는 비지니스 요구사항 문서를 사용하여 기술 요구 사항 문서를 작성한다. *애플리케이션의 아키텍처, 데이터 구조, 객체 지향 기능 설계, 사용자 인터페이스, 기타 비기능적 요구사항 - 비지니스와 기술 요구사항 문서를 바탕으로 개발자가 코딩한다. - 통합을 거쳐 마지막 테스트를 진행한다. - 애플리케이션 프로덕션 단계에 이르려면 모든 과정과 작업이 먼저 마무리되어야 한다. - 이 모든 프로세스는 완료되기까지 몇 년이 걸리기도 한다. - 사용 배경과 한계 • 초기 컴퓨팅 시스템과 애플리케이션은 일반적으로 복잡하고 일체직(monolithic)이었다. • 규율과 제공해야 할 명확한 결과물을 필요로 했다. • 요구사항의 변경 속도도 현재에 비하면 매우 느렸으므로 별다른 문제가 되지 않았다. • 몇 년에 이르는 타임 프레임은 소프트웨어 분야 외 업계에서도 일반적이었다. • 인터넷 시대로 접어들면서 폭포수의 엄격함은 단점이고, 속도와 유연성이 중요한 요소로 부상했다.
애자일 방법론 문서화보다는 협업을, 엄격한 관리보다는 자기 조직화를, 경직된 폭포수 개발 프로세스에 갇히기보다는 지속적인 변화를 관리하는 역량을 강조한 방법론이다.
애자일 성명서: 2001년 출범한 애자일 프로젝트 관리를 위한 4가지 주요 원칙 • 프로세스와 툴보다 개인과 상호작용이 우선 • 포괄적인 문서화보다 작동하는 소프트웨어가 우선 • 계약 협살보다 고객 협업이 우선 • 계획 추종보다 변화 대응이 우선
디자인 패턴: 소프트웨어를 설계 및 구현할 때 어떠한 공통된 구조를 띄는 형태
MVC 패턴: Model, View, Contraller 각각의 구성 요소가 다른 요소들에게 영향을 미치지 않아야 하는 패턴 - Model: 데이터를 정의하고 데이터 자체에 대한 로직을 처리하는 역할 - View: Model이 요청한 데이터를 보여주는 역할(유저와 어플리케이스 간 인터페이스) - Controller: Model과 View를 연결해주는 역할
MTV 패턴: MVC 패턴과 유사한 장고의 디자인 패턴 - Model: MVC의 Model에 대응되며 DB에 저장되는 테이터를 의미한다. • 클래스로 정의되며 하의 클래스가 하나의 DB table이다. • DB 사용은 SQL이 필요하지만 장고는 ORM 기능을 지원하므로 파이썬 코드로 DB를 조작할 수 있다. *ORM(Object Relational Mapping) - Template: MVC의 View에 대응되며 유저에게 보이는 화면을 의미한다. • 장고는 View에서 로직을 처리한 후 html 파일을 context와 함께 렌더링 한다. *여기서 생기는 html 파일을 template라고 한다. • Django Template 문법으로 html 파일 내에서 context로 받은 데이터를 활용할 수 있다. - View: MVC의 Controller에 대응되며 요청에 따라 적절한 로직을 수행하여 결과를 템플릿으로 렌더링 한다. *백엔드에서만 주고받는 경우도 있다. • 렌더링: 템플릿 시스템이 템플릿 코드 상태로 존재하는 페이지를 해석해 html, xml 등 템플릿 파일로 변환 - URLconf: MVC와는 다르게 장고는 URL을 설계하는 단계가 있다. • URL 패턴을 정의하여 해당 URL과 View를 매핑하는 단계 • 아래와 같이 path 함수를 이용해 URL을 View와 손쉽게 매핑할 수 있다.
MTV 패턴을 그림으로 정리하면 아래와 같다. 1. 유저가 특정 URL로 요청하면 URLconf을 통해 해당 URL과 매핑된 View 호출 2. 호출된 뷰는 요청에 따라 적절한 로직을 수행, 그 과정에서 Model에 CRUD를 지시 *CRUD: Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말 3. Model은 ORM을 통해 DB와 소통하여 CRUD 수행 4. View는 지정된 템플릿을 렌더링 5. 최종 결과를 응답으로 반환