
그림
대상 객체에 접근하기 전에 접근 흐름을 가로채는 중간 계층
요청을 필터링하거나 수정하여 대상 객체에 대한 접근 제어
객체의 기능을 보완하면서 보안성 강화
데이터 검증, 캐싱, 로깅 등에 활용
객체뿐만 아니라 프록시 서버에도 적용
프록시 서버에서의 캐싱
자주 사용하는 데이터를 캐시에 저장한 뒤, 동일한 요청이 들어오면 원격 서버에 다시 요청하지 않고 캐시의 데이터를 반환하는 방식
- 원격 서버 요청 횟수 감소
- 네트워크 트래픽 감소
- 응답 속도 향상
"Node.js의 버퍼 오버플로우 취약점을 예방하기 위해서는 nginx를 프록시 서버로 앞단에 놓고 Node.js를 뒤쪽에 놓는 것이 좋다."
— Ryan Dahl
nginx를 앞단에 두었을 때의 장점
버퍼 오버플로우
버퍼의 크기를 초과하는 데이터가 입력되어 할당된 메모리 영역을 넘어 다른 영역까지 침범하는 현상
이 과정에서 다른 메모리의 주소나 값이 변경되어 보안 취약점으로 이어질 수 있음.
gzip 압축
DEFLATE 알고리즘을 기반으로 데이터를 압축하는 방식
- 데이터 전송량 감소
- 네트워크 사용량 감소
- 단, 압축·해제 과정에서 CPU 연산 비용 발생
따라서 전송량 감소 효과와 CPU 오버헤드를 고려하여 적용 필요
사용자 ───────→ Cloudflare ───────→ 웹 서버
크롤러 ──────→ ↓
공격자 ──────→ 트래픽 검사
↓
의심 트래픽 차단
핵심적으로는 사용자 → 실제 서버로 바로 접근하는 구조에서
사용자 → Cloudflare → 실제 서버 구조로 변경하여 Cloudflare가 보안, 트래픽 제어, 캐싱 등을 대신 처리하는 방식
Map, Set처럼 서로 다른 자료구조도 같은 방식으로 순회 가능const mp = new Map()
mp.set('a', 1)
mp.set('b', 2)
mp.set('c', 3)
const st = new Set()
st.add(1)
st.add(2)
st.add(3)
for (let a of mp) console.log(a)
for (let a of st) console.log(a)
/*
[ 'a', 1 ]
[ 'b', 2 ]
[ 'c', 3 ]
1
2
3
*/
Map과 Set은 서로 다른 자료구조for...of를 이용하여 동일한 방식으로 순회 가능이터레이터 프로토콜
이터러블 객체의 요소를 어떤 방식으로 순회할 것인지 정의한 규칙
JavaScript에서는
next()를 통해 다음 요소에 접근하며 일반적으로{ value, done }형태의 결과를 반환
이터러블 객체
반복 가능한 객체
Symbol.iterator메서드를 가지고 있어for...of등으로 순회할 수 있는 객체ex)
Array,Map,Set,String
참고: 책의 설명처럼 과거 JavaScript에서는
private,public접근 제어자를 직접 사용하는 방식이 제한적이었기 때문에 이러한 패턴이 많이 사용되었습니다.
현재 JavaScript 클래스에서는#privateField와 같은 private class field도 지원합니다.
const pukuba = (() => {
const a = 1
const b = () => 2
const public = {
c: 2,
d: () => 3
}
return public
})()
console.log(pukuba)
console.log(pukuba.a)
/*
{ c: 2, d: [Function: d] }
undefined
*/
a, b
c, d
즉시 실행 함수 내부
│
├─ a, b → 외부에 노출 X → private
│
└─ c, d → return으로 노출 → public
public
클래스나 모듈 외부에서도 접근 가능한 범위
외부에서 자유롭게 변수나 메서드에 접근 가능
protected
클래스 내부와 해당 클래스를 상속받은 하위 클래스에서 접근 가능한 범위
일반적인 JavaScript에는
protected접근 제어자가 문법적으로 직접 제공되지 않음
private
클래스나 모듈 내부에서만 접근 가능한 범위
외부에서 직접 접근할 수 없도록 데이터를 숨기는 데 사용
즉시 실행 함수(IIFE)
함수를 정의함과 동시에 즉시 실행하는 함수
별도의 함수 호출 없이 바로 실행되며, 함수 내부에 독립적인 스코프를 만들어 외부에서 변수에 직접 접근하지 못하게 할 수 있음.
(() => { // 실행할 코드 })()
예를 들어 화면에 사각형 박스와 글자가 있다면 모델에는 다음과 같은 정보가 포함될 수 있음.
사각형의 위치 정보
글자 내용
글자 위치
글자 인코딩 및 형식 등의 데이터
사용자가 데이터를 생성하거나 수정하면 컨트롤러를 통해 모델의 데이터가 생성 또는 갱신
input, checkbox, textarea 등 사용자 인터페이스 요소 포함사용자
↓ 요청
Controller
↓
Model
↓ 처리 결과
Controller
↓
View
↓
사용자에게 화면 표시
즉,
@GetMapping("/users/{id}")
public String getUser(
@PathVariable Long id,
@RequestParam String name) {
...
}
주요 애너테이션
@RequestParam
@RequestHeader
@PathVariable
@PathValue가 아니라@PathVariable이 정확한 명칭입니다.
Spring MVC의 장점
요청 값의 바인딩과 검증을 편리하게 처리
잘못된 요청을 쉽게 검증 가능
Controller, Service 등의 코드를 분리하여 재사용성과 유지보수성 향상
단위 테스트 및 통합 테스트 용이
리디렉션 및 요청 처리 흐름 구현 용이
핵심
MVC는 애플리케이션을 데이터(Model) / 화면(View) / 제어 로직(Controller)으로 분리하여 각 구성 요소의 역할을 명확하게 만드는 패턴입니다.
Controller가 Presenter로 변경된 구조View ↔ Presenter ↔ Model
Presenter
View와 Model 사이에서 중간 역할을 하며, 화면에 표시할 데이터와 UI 관련 로직을 처리하는 계층
Controller가 ViewModel로 변경된 디자인 패턴Model, View, ViewModel로 구성View ↔ ViewModel ↔ Model
computed, watch 등을 이용하여 반응형 데이터 처리 가능const count = ref(0)
count.value++
count 값이 변경되면 이를 사용하는 화면도 자동으로 갱신Command
사용자의 클릭, 입력 등 여러 UI 동작을 하나의 실행 가능한 액션으로 추상화하는 방식
View가 직접 로직을 수행하지 않고 ViewModel에 정의된 동작을 실행하도록 구성
Data Binding
화면에 표시되는 데이터와 애플리케이션의 데이터를 연결하는 기법
데이터가 변경되면 View에도 변경 사항이 자동으로 반영됨.
양방향 데이터 바인딩
ViewModel → View뿐만 아니라View → ViewModel방향으로도 값이 자동 반영되는 방식ViewModel 변경 → View 변경 View 변경 → ViewModel 변경Vue.js에서는 대표적으로
v-model을 통해 양방향 데이터 바인딩을 구현할 수 있음.