Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Nonamed Develog

[TIL][240726] 소프트웨어 설계 나머지 공부 본문

WHAT I LEARN/TIL

[TIL][240726] 소프트웨어 설계 나머지 공부

노네임드개발자 2024. 7. 26. 21:03
새로 알게 된 점은 무엇인가?

프로그래밍 기본

  • 컴파일러(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와 손쉽게 매핑할 수 있다.
from django.urls import path
from . import views

app_name = 'project'

urlpatterns = [
    path('', views.HomeView.as_view(), name='home'),
    path('login/', views.LoginView.as_view(), name='login'),
]

 • URL은 보통 다음과 같이 구성된다.

 

  • MTV 패턴을 그림으로 정리하면 아래와 같다.
    1. 유저가 특정 URL로 요청하면 URLconf을 통해 해당 URL과 매핑된 View 호출
    2. 호출된 뷰는 요청에 따라 적절한 로직을 수행, 그 과정에서 Model에 CRUD를 지시
    *CRUD: Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말
    3. Model은 ORM을 통해 DB와 소통하여 CRUD 수행
    4. View는 지정된 템플릿을 렌더링
    5. 최종 결과를 응답으로 반환

MTV pattern


무엇을 느꼈고 내일은 무엇을 할까?

아직 갈 길이 멀고도 멀다.