MVC 프레임워크
1. [Java] Spring Framework
자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크 우리나라 공공기관 웹 서비스 개발시 사용 권장되는 전자 정보 표준 프레임워크
1.1 제어 반전 컨테이너 (IoC : Inversion of Control)
메소드나 객체의 호출 작업을 개발자가 아닌 프레임워크가 필요에 따라 제어 즉, 제어권이 사용자가 아닌 프레임워크에로 역전
- 객체 간 결합도를 줄이고 유연한 코드를 작성할 수 있게 함
- 가독성 및 코드 중복, 유지 보수 측면에서 좋음
- Java relection 특징 사용
- 객체를 통해 클래스의 정보를 분석하는 프로그램 기법
- JVM에서 실행되는 어플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 프로그램에서 사용
- 클래스의 구조를 개발자가 확인하고 값을 가져오거나 메소드를 호출하는데 사용
- 스프링에서는 reflection을 사용해서 런타임시에 개발자가 등록한 빈을 어플리케이션에 가져와 사용할 수 있음
- 스프링에서 객체 생성 및 실행 순서
- 객체 생성
- 의존성 객체 주입 (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 배치 시나리오
- 읽기 (read) : DB에서 특정 데이터 레코드 읽기
- 처리 (processing) : 원하는 방식으로 데이터 처리
- 쓰기 (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 문법 - 참고
- 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
- https://goddaehee.tistory.com/156
- https://velog.io/@gillog/Spring-DIDependency-Injection
- https://engkimbs.tistory.com/746
- https://cheese10yun.github.io/spring-batch-basic/
- 튜토리얼 따라하기 : https://tutorial.djangogirls.org/ko/django/
- https://developer.mozilla.org/ko/docs/Learn/Server-side/Django/Introduction
- https://testmanager.tistory.com/346
- django + react : http://milooy.github.io/TIL/Django/react-with-django-rest-framework.html#react-redux-react-router
- https://velog.io/@madpotato1713/JAVASCRIPT-express란
- https://ithub.tistory.com/32
'웹 개발 > Backend' 카테고리의 다른 글
Java/vscode/MacOs) vscode에서 JAVA 개발 시 필요 없는 import 모듈 한번에 정리하는 단축키 (0) | 2021.07.16 |
---|---|
[Spring] 의존성 주입 ,스프링 컨테이너 (IoC 컨테이너) 개념 기초 (0) | 2021.04.29 |
백엔드 배경지식 Backend Background) MVC (Model-View-Controller) 패턴 (0) | 2021.04.08 |