본문 바로가기

웹 개발/Backend

백엔드 배경지식 Backend Background) MVC (Model-View-Controller) 프레임워크 : Java Spring, Python Django, Javascript express 기초 개념 알아보기

MVC 프레임워크

1. [Java] Spring Framework

자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크 우리나라 공공기관 웹 서비스 개발시 사용 권장되는 전자 정보 표준 프레임워크

1.1 제어 반전 컨테이너 (IoC : Inversion of Control)

메소드나 객체의 호출 작업을 개발자가 아닌 프레임워크가 필요에 따라 제어 즉, 제어권이 사용자가 아닌 프레임워크에로 역전

  • 객체 간 결합도를 줄이고 유연한 코드를 작성할 수 있게 함
  • 가독성 및 코드 중복, 유지 보수 측면에서 좋음
  • Java relection 특징 사용
    • 객체를 통해 클래스의 정보를 분석하는 프로그램 기법
    • JVM에서 실행되는 어플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 프로그램에서 사용
    • 클래스의 구조를 개발자가 확인하고 값을 가져오거나 메소드를 호출하는데 사용
    • 스프링에서는 reflection을 사용해서 런타임시에 개발자가 등록한 빈을 어플리케이션에 가져와 사용할 수 있음
  • 스프링에서 객체 생성 및 실행 순서
    1. 객체 생성
    2. 의존성 객체 주입 (IOC컨테이너에서 만들어 놓은 객체를 주입) → 제어권을 스프링에 넘김
    • *싱글턴 패턴(singleton)*으로 객체 생성 및 제공
      • 싱클턴 패턴 : 전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디서든 참조할 수 있도록 하는 패턴
      • 하나의 인스턴스만을 생성
      • 모든 클라이언트에게 동일한 인스턴스를 반환하는 역할을 하는 메소드 필요
      • 참고

1.2 관점 지향 프로그래밍 (AOP : Aspect-Oriented Programming)

여러 모듈에서 공통적으로 사용하는 기능은 분리하여 관리

1.2.1 관련 용어

  • Crosscutting concerns : 흩어진 관심사, 다른 부분에서 공통적, 중복되어 사용되는 코드
  • Aspect: 공통 기능을 모듈화한 것
  • Target : Aspect를 적용하는 곳 (클래스, 메소드, 등)
  • Advice : 모듈이 실질적으로 해야하는 기능을 구현한 것
  • JointPoint : advice가 적용될 위치
  • PointCut : JointPoint의 상세 스펙
  • Aspect 실행 지점 annotation
@Before : 어드바이스 타겟 메소드 호출 전에 어드바이스 기능 수행
@After : 타겟 메소드 결과와 상관 없이 메소드 완료 시 어드바이스 수행
@AfterReturning : 타겟 메소드가 성공적인 결과를 반환한 후에만 어드바이스 수행
@AfterThrowing : 타겟 메소드 수행 중 예외 발생시 어드바이스 수행
@Around : 어드바이스가 타겟 메소드를 감사 호출 전후에 어드바이스 수행
...

1.2.2 특징

  • 모듈성 증가시킴
  • 스프링 Bean (객체)에만 AOP 적용 가능
  • 프록시 패턴 기반 AOP 구현체
    • Proxy : 대변인, 대리인
    • 프록시에게 흐름 제어를 맡기는 것 (결과값 조작은 하지 않음)
    • 프록시의 메소드 구현시 인터페이스 사용하고 실제 서비스와 같은 이름으로 구현
    • 실제 서비스를 참조하는 변수 사용
    • 실제 서비스와 같은 이름의 메소도를 호출하고 그 값을 클라이언트에게 돌려줌
    • 실제 서비스 메소드 호출 전후 별도의 로직도 수행 가능
    • 참고
    클라이언트가 어떤 일에 대한 요청을 하면 프록시가 대신 실제 서비스를 호출하고 값을 전달받아 클라이언트에 값을 전달하는 패턴

1.3 의존성 주입 (DI : Dependency Injection)

어떤 객체가 사용하는 의존 객체를 직접 만들지 않고 주입 받아 사용하는 패턴

  • IoC를 위해 사용하는 개념
  • 각 계층 또는 서비스간 의존성이 있는 경우 프레임워크가 서로 연결시켜 줌
  • 객체를 직접 생성하는게 아니라 외부에서 생성한 후 주입 시켜주는 방식
  • 모듈간 결합도(Coupling)가 낮아지고 유연성이 높아짐
  • Bean(스프링에서의 객체)를 생성하는 Bean 컨테이너 (IOC 컨테이너)는 객체의 외부에 존재하는 것으로, 이곳에서 생성한 객체를 특정 객체에 주입함

 

  • 방법 1: A 객체가 생성자를 통해 B 와 C 객체를 직접 생성하는 방법
  • 방법 2: 외부에서 생성된 B, C 객체를 A객체에서 setter()생성자를 통해 사용하는 방법

1.4 MVC 패턴

  • dispatcherServlet = controller 역할
  • dispatcherServlet이 각 요청을 적절한 서비스에 분산시켜 줌
  • 각 서비스들이 처리되어 결과 생성
  • 결과가 다양한 형식의 뷰로 화면에 표시

1.5 데이터 액세스 및 트랜잭션 관리

DB 접속과 SQL 발행과 같은 데이터 액세스 처리를 비즈니스 로직층에서 분리하여 별도의 계층으로 설계하고 구현한다.

1.5.1 DAO (Data Access Object) 패턴

  • DAO : 데이터 액세스 처리에 특화된 객체
  • DAO는 CRUD 메소드를 갖춘 형태

1.5.2 특징

  • JDBC, Hibernate, JPA, MyBatis, JDO 등을 기술을 스프링에서 더욱 쉽게 사용할 수 있도록 제공
  • 트랜잭션 관리를 위한 일관적인, 데이터 접근 추상화 제공
  • 여러 기술의 트랜잭션을 종합적으로 아우르는 일관된 모델
  • 선언적 트랜잭션 관리

1.5.3 더보기

1.6 배치

백엔드의 배치 처리 기능 구현을 위해 사용하는 프레임워크로 스프링 배치 설정 요소를 간편화하여 편리한 배치 설정이 가능하다.

  • 특정 시간대에 실행하거나 대용량 자료를 처리하는데 쓰이는 일괄 처리 (배치 프로세싱) 지원

1.6.1 더보기

1.6.2 관련 용어

  • jobjob은 여러 step 인스턴스를 포함하는 컨테이너
  • JobBuilderFactory로 job 생성
  • 배치 처리 과정의 한 단위를 나타내는 객체 (배치 처리의 최상위 계층)
  • JobInstanceex) 하루에 한번씩 job이 실행된다면 어제의 jobInstance, 오늘의 jobInstance가 존재하는 것
  • 배치 처리 과정에서 job이 실행될 때 하나의 job 실행 단위
  • JobExecutionJobInstance, 배치 실행 상태, 시작 시간, 끝난 시간, 실패시 메시지 등의 정보를 담고 있음
  • JobInstance에 대한 한번의 실행을 나타내는 객체
  • JobParametersJobInstance들을 구별하는 기분
  • JobParameter : JobInstance = 1 : 1
  • Job이 실행될 때 필요한 파라미터를 map 타입으로 지정하는 객체
  • StepJob을 처리하는 실질적 단위
  • 모든 job에는 1개 이상의 step 필요
  • 실질적인 배치 처리를 정의하고 제어하는데 필요한 모든 정보를 가진 도메인 객체
  • StepExecution
  • step의 실행 정보를 담고 있는 객체
  • JobRepository
  • 배치 처리 정보, 배치 처리에 대한 메타데이터 저장
  • JobLauncher
  • job, JobParameter와 함께 배치를 실행하는 인터페이스
  • ItemReaderfile, xml 등 여러 타입의 데이터를 읽을 수 있음
  • step의 대상이 되는 배치 데이터를 읽어오는 인터페이스
  • ItemProcessor
  • ItemReader로 읽어 온 배치 데이터를 변환하는 역할 수행
  • ItemWriter
  • 배치 데이터를 DB나 파일에 저장

1.6.2 배치 시나리오

  1. 읽기 (read) : DB에서 특정 데이터 레코드 읽기
  2. 처리 (processing) : 원하는 방식으로 데이터 처리
  3. 쓰기 (write) : 수정된 데이터를 다시 DB에 저장

  • job : step = 1 : m
  • step : itemReader/itemProcessor/itemWrite = 1 : 1
  • job 하나에 여러 단계를 두고, 각 단계를 배치의 기본 흐름대로 구성

2. [Python] django

파이썬으로 만들어진 무료 오픈 소스 웹 애플리케이션 프레임워크

2.1 HTTP request

클라이언트가 서버에 보내는 이진 데이터 패킷

  • request line
    • request의 가장 첫번째 라인
    • request method** , URI, HTTP protocol 등
  • ** request method : 클라이언트가 웹 서버에게 사용자 요청의 목적 및 종류를 알리는 수단
더보기

GET

  • 정보 조회 read
  • 서버에서 데이터를 가져와서 보여주기 위한 용도
  • URI 끝에 ?가 붙고, 요청 정보가 key=value 쌍을 이루어 서버로 전송한다. 여러개일 경우 &로 구분한다.
  • ex) www.urladdress.xyz?name1=value1&name2=value2
  • 파라미터를 넘겨서 해당하는 본문 body를 받는다.
  • read

POST

  • 서버의 데이터의 값이나 상태를 바꾸기 위한 용도
  • HTTP 헤더 항목 location에 새로 생성한 URI 주소를 포함하여 응답한다.
  • 여러번 수행하면 매번 새로운 자원을 생성한다.
  • request header에 데이터 타입을 적어주어야 한다.
  • 클라이언트가 인코딩한 데이터를 서버로 전송하면 서버는 이를 디코딩하여 처리해서 보안상 안전하다
  • Boby안에 숨겨서 요청 정보를 전달하기 때문에 대용량 데이터를 전송할 수 있다.

HEAD

  • 메시지 헤더를 전달
  • 문서 내용이 아닌 문서 자체의 정보를 요청한다.
  • body/본문 없이 헤더 정보만 보낸다.

PUT

  • 요청된 자원을 수정 update
  • 갱신된 내용은 요청된 URI를 그대로 사용하는 것으로 간주한다.
  • 여러번 요청에도 동일한 자원에 대해 업데이트만을 수행한다는 점에서 POST와 다르다.

PATCH

  • 요청된 자원을 수정 update
  • 해당 자원의 일부 교체를 요청할 때 사용한다.

DELETE

  • 요청된 자원의 삭제 delete
  • 안전성의 문제로 대부분의 서버에서 비활성화한다.

CONNECT

  • 동적으로 터널 모드를 교환, 프롹시 기능 요청
  • 요청한 자원에 대한 양방향 연결을 시작한다.
  • SSL(HTTPS)를 사용하는 웹사이트 접속에 사용된다.

TRACE

  • 원격지 서버에 루프백 메시지 호출을 위한 테스트용
  • 요청 자원이 수신되는 경로를 보여준다.

OPTIONS

  • 웹 서버에서 지원되는 메소드의 종류 확인
  • ex) Allow: GET, POST, HEAD

 

  • request header
    • 요청에 대한 추가 정보
    • request time, accept-encoding, client IP, client port, http protocol version, accept-language 등
    • request line가 body 사이 라인들
  • request body (optional)
    • 주로 JSON, XML 파일 타입
    • 요청에 추가로 서버에 보낼 수 있는 콘텐츠

2.2 URLs (urls.py)

사용할 웹 url을 한 곳에 모아 등록해 둔 뒤, 요청이 들어온 url에 맞는 view를 맵핑시켜 주기 위해 필요한 파일 (URL mapper)

  • urlpatterns 객체
    • 지정된 url 패턴과 일치하는 http 요청이 수신되면 맵핑되어 있는 view 함수가 요청 전달
    • 특정 경로(url)와 해당하는 view 함수 맵핑 목록 정의
  • path(param1, param2)
    • param1은 일치시킬 경로 (패턴)
    • param2는 패턴이 일치할 때 view 모듈 안에서 호출할 함수 이름
    • urlpatterns 객체가 가진 함수
  • re_path()
    • path()와 같은 역할을 하지만 정규식을 사용해서 패턴 만듦
  • example
"""URL Configuration
...
"""
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
	path('admin/', admin.site.urls),
	path('book/<int:id>/', views.book_detail, name='book_detail'),
  path('catalog/', include('catalog.urls')),
  re_path(r'^([0-9]+)/$', views.best),
	# admin/으로 시작하는 모든 URL을 view와 대조해 mapping 
	path('', include('site.urls')),
]
# site/urls.py

from django.urls import path
from . import views

urlpatterns = [
	pattern('', view.home, name='home'),
	# home이라는 view가 루트 URL ('http://ipaddress:portnumber/')에 할당
	# url 이름은 뷰이름과 다를 수 있지만 똑같이 설정하는 것이 편함
]

2.3 View (views.py)

HTTP request를 받아서 response를 반환하는 요청 처리 함수

  • model (DB) 을 통해 request에 필요한 데이터에 접근
  • template에게 response 서식을 받음
  • URL mapper가 호출하는 함수들 정의
  • example
## filename: views.py (Django view functions)

from django.http import HttpResponse

def index(request):
    # Get an HttpRequest - the request parameter
    # perform operations using information from the request.
    # Return HttpResponse
    return HttpResponse('Hello from Django!')
  • 데이터 쿼리 example
    • Models는 DB 탐색을 위한 쿼리 API 제공 (exact, case-insensitive, greater than 등)
## filename: views.py

from django.shortcuts import render
from .models import Team

def index(request):
    list_teams = Team.objects.filter(team_level__exact="U09")
		# Team이라는 테이블에서 team_level 필드가 정확하게 U09와 일치하는 모든 레코드를 필터링하여 그 값을 list_team이라는 변수에 저장
    context = {'youngest_teams': list_teams}
		# render 함수에 전달하기 위한 context 변수 
    return render(request, '/best/index.html', context)
		# 브라우저로 다시 전송되는 HttpResponse 생성
		# 지정된 html 템플릿, 그에 삽입할 일부 데이터 (컨텍스트데이터)를 결합하여 html 파일 생성

2.4 Models (models.py)

애플리케이션의 데이터 구조 정의, DB 기록 관리 (CRUD), 쿼리 방식을 제공하는 객체

  • 필드 타입, 필드의 최대 크기, 디폴트 값, 선택 목록 옵션, 문서 도움말 텍스트, 라벨 텍스트 등 데이터 구조 정의
  • example
# filename: models.py

from django.db import models

class Team(models.Model):
    team_name = models.CharField(max_length=40)
		# team_name이라는 필드는 char 형 데이터이고, 최대 길이 40 

    TEAM_LEVELS = (
        ('U09', 'Under 09s'),
        ('U10', 'Under 10s'),
        ('U11', 'Under 11s'),
        ...  #list other team levels
    )
		# 선택 목록 옵션

    team_level = models.CharField(max_length=3, choices=TEAM_LEVELS, default='U11')
		# team_level 이라는 필드는 char 형 데이터이고, 최대 길이가 3이며 위 TEAM_LEVEL 선택 목록 중 하나의 값을 가지며 디폴트 값은 그 중 하나인 U11

2.5 Templates

파일 구조 및 레이아웃을 정의하고 실제 내용을 보여주기 위한 텍스트 파일 (HTML)

  • 페이지가 생성될 때 채워질 데이터의 위치를 정하는 place holder를 사용하여 출력 문서의 구조를 지정
  • django template 문법 - 참고
 

Django 템플릿 언어 — Django 1.4 documentation

Django의 템플릿 언어는 강력함과 용이성 사이의 균형을 잡고자 설계되었습니다. HTML 작업을 하는 동안 편안함을 느낄 수 있도록 합니다. Smarty나 CheetahTemplate등의 텍스트 기반 템플릿 언어를 접해

django-doc-test-kor.readthedocs.io

  • example) 아래 html을 render() 함수가 호출하여 보여줌
## filename: best/templates/best/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Home page</title>
</head>
<body>
  {% if youngest_teams %}
	{# render() 함수 내의 컨텍스트 변수에 youngest_team에 접근할 수 있다면 #}
    <ul>
      {% for team in youngest_teams %}
			{# for문 시작 #}
        <li>{{ team.team_name }}</li>
				{# 각 요소의 team_name 데이터 값 표시 #}
      {% endfor %}
			{# for문 끝 #}
    </ul>
  {% else %}
    <p>No teams are available.</p>
  {% endif %}
</body>
</html>

2.6 More functions

  • 양식
    • 양식 작성, 유효성 검사 및 처리 단순화
  • 사용자 인증 및 권한
  • 캐싱
    • 랜더링된 페이지 전체 또는 일부를 저장하여 필요시를 제외하고 리랜더링 방지
  • 관리 사이트
    • 사이트 관리자가 모델을 작성 및 편집하여 볼 수 있는 관리 페이지 제공
    • 기본적으로 관리 사이트 제공
  • 데이터 직렬화
    • 데이터를 XML, JSON으로 직렬화 가능
  • django는 개발 목적으로 python으로 짜여진 가벼운 wsgi(web server gateway interface)를 웹 서버로 사용 → 프로덕션용으로는 권장하지 않음 / nginx를 웹 서버로 사용

3. [Javascript] Express

NodeJS를 사용하여 쉽게 서버를 구성할 수 있는 웹 프레임워크 HTTP와 Connect 컴포넌트 기반 웹 프레임워크

# install nodejs

$ npm init
$ npm install express 

1.1 기본 골격

var express = require('express')
var app = express()
var fs = require('fs');
var template = require('./lib/template.js');
 
//route, routing
//app.get('/', (req, res) => res.send('Hello World!'))
app.get('/', function(request, response) { 
  fs.readdir('./data', function(error, filelist){
    var title = 'Welcome';
    var description = 'Hello, Node.js';
    var list = template.list(filelist);
    var html = template.HTML(title, list,
      `<h2>${title}</h2>${description}`,
      `<a href="/create">create</a>`
    ); 
    response.send(html);
  });
});
 
app.get('/page', function(req, res) { 
  return res.send('/page');
});
 
app.listen(3000, function() {
  console.log('Example app listening on port 3000!')
});

1.2 Node.js

구글 크롭 V8 자바스크립트 엔진을 기반으로 한 비동기 IO 를 지원하는 고성능 네트워크 서버

  • 장점
    • 비동기 처리로 인해 매우 빠름
    • javascript 만을 사용해서 서버 클라이언트 모두 개발 가능 → 프론트엔드 개발자에게 유리
    • 커뮤니티 활성화되어 있음
  • 단점
    • 싱글 스레드이기 때문에 하나의 작업 자체가 시간이 많이 걸리면 전체 시스템의 성능이 낮아짐
    • 자바에 비해 코드 가독성이 떨어짐
    • 컴파일 시에 에러를 확인할 수 없음
  • nodejs 사용이 적합한 애플리케이션
  • 간단하지만 많은 양의 처리를 해야 하는 서버 구축시 효율적

References