- 컴포넌트
실질적
으로동작되고 있는 개체(단위)
- 모듈
가장 상위에 위치
하는구현의 단위
실질적
으로구현이 된 단위
기능을 기준
하여분리된 단위
설계 목표
- C++ :
속도
,C와의 하위 호환성
에 집중- Java :
보안
과빠른 이식성
에 집중
메모리 관리
:
C++
은C를 포함
하여하위 포환성
을유지
하기 위해메모리 관리 제어
,포인터
,전처리기
같은기능
을컨트롤
하게 했다. 하지만,java
에서는 이렇게여러 버그를 일으키는 기능
을없애거나
메모리관리 같은 부분
은GC(Garbage Collection)
이 대신 해준다.
- C++
Heap
/Stack
모두할당 가능
메모리 해제
를프로그래머
가수동
으로 해야함(소멸자
이용)- Java
GC(Garbage Collection)
이자동으로 관리
실행 과정
컴파일
:개발자가 작성한 소스코드
를기계가 이해할 수 있는 언어
로변환
하는 과정빌드
:소스코드 파일
을실행 가능한 형태의 산출물
로 만드는 일련의 과정(컴파일
+링크
등등 과정포함
)
- C++ -->
각 OS
에 맞춰실행파일
이 생성
컴파일러
가오브젝트 코드
를생성
한 후,링커
가필요한 라이브러리
를링크
해서실행 가능한 파일
생성오브젝트 코드
,실행 파일
은OS에 맞는 기계어로 컴파일
된다- Java -->
JVM
에서실행 가능한 파일
생성 -->OS에 독립적
- 개발자가 자바 소스코드 작성(
.java
)- 자바 컴파일러(
javac
)가컴파일
해서, 자바 바이트 코드(.class
) 생성- JVM의 클래스 로더(
Class Loader
)가링크 등의 과정
을 거치고JVM에 메모리
에 올린다JVM
에서명령어 단위
로 가져와서파일을 실행
다중상속과 연산자 오버로드
- C++
다중상속
가능
연산자 오버로딩
가능
- Java
다중상속 불가능
-->인터페이스
로 어느정도대체 가능
연산자 오버로드 불가능
인자 전달 방법의 차이
- C++
- 기본적으로
객체
를값으로 전달
(Call By Value
)- Java
- 기본적으로
객체
를reference로 전달
(Call By reference
)
3요소
- 캡슐화(
Encapsulation
) ==정보 은닉
- 객체의 속성(
data fields
)과 행위(methods
)를 하나의 클래스라는캡슐
에 묶는 것은닉된 정보
로의 접근은 접근지정자(public
/protected
/private
등)를 통해서만 조작 가능- 캡슐화는
원본 데이터
를유지
하며보존
,보호
하기 위해 존재
- 상속(
Inheritance
) ==재사용
+확장
상위 클래스의 특성
을하위 클래스
에서물려받는 것
을 말하고 하위 클래스에서는 더필요한 속성을 확장
해서 사용할 수 는 것
- 다형성(
Polymorphism
) ==사용 편의
하나의 객체
가여러 가지 형태
를 가질 수 있는 것을 의미- 오버로딩(
Overloading
)
:매개변수
,리턴타입
을 다르게 해서같은 이름의 함수
를다양하게 정의
하는 것(메서드 중복
)- 오버라이딩(
Overriding
)
:부모로부터 받은 메소드
를자식 객체
에서재정의
하는 것(메서드 재정의
)
5원칙
- 5가지 원칙
- SRP(
Single responsibility Principle
)
: 단일 책임 원칙- OCP(
Open/Closed Principle
)
: 개방-폐쇄 원칙- LSP(
Liskov Substitution Principle
)
: 리스코프 치환 원칙- ISP(
Interface Segregation Principle
)
: 인터페이스 분리 원칙- DIP(
Dependency Inversion Principle
)
: 의존 관계 역전 원칙- OCP / DIP가 가장 중요!
1. SRP(Single responsibility Principle)
단일 책임 원칙
- 한 클래스는 하나의 책임만 가져야 한다
('하나의 책임'이라는 것은 모호한 면이 있음
--> 문맥과 상황에 따라 다름)
- 즉, 핵심은 변경이 있을 때 파급 효과가 적어야 한다는 것!
(UI변경 / 객체의 생성과 사용 분리 등)
2. OCP(Open/Closed Principle)
개방-폐쇄 원칙
- S/W 요소는 확장에는 열려있으나 변경에는 닫혀있어야 한다
- 핵심은 다형성을 활용하는 것
- 새로운 구현체를 사용한
확장은 열어두면서
,기존 코드의 변경은 닫혀
있게 해야 한다
3. LSP(Liskov Substitution Principle)
리스코프 치환 원칙
프로그램의 객체
는프로그램의 정확성
을 깨뜨리지 않으면서하위 타입의 인스턴스
로 바꿀 수 있어야 함
- 자동차 인터페이스에서
액셀
은앞으로 가라는 기능
이라는 정확성을 만족시켜야 우리가 믿고 쓸 수 있음- 즉, 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다!
- 다형성을 지원하기 위한 원칙
- 인터페이스를 구현한 구현체를 믿고 사용하려면 필요한 원칙
4. ISP(Interface Segregation Principle)
인터페이스 분리 원칙
특정 클라이언트
를 위한인터페이스 여러개
가범용 인터페이스 하나
보다 낫다
- 자동차 인터페이스 -> 운전 / 정비 인터페이스로 분리!
- 인터페이스가 명확해지고, 대체 가능성이 높아진다.
5. DIP(Dependency Inversion Principle)
의존관계 역전 원칙
- 코드가 구현클래스에 의존하지 말고, 인터페이스에 의존해야함
- 즉,
코드
는역할(Role)에 의존
해야 한다!프로그래머
는"추상화에 의존해야지, 구체화에 의존하면 안된다"
추상(abstract) 메서드
선언부만 작성
하고구현부는 작성하지 않은 채
로남겨둔 메서드
abstract 키워드
를메서드
에 사용- 반드시
오버라이딩
해서자식 클래스에서 구현하도록 하는 목적
을 가짐
추상(abstract) 클래스
추상 메서드
를포함
한 클래스new
를 통해서인스턴스화 할 수 없다
인터페이스(interface)
추상 클래스의 일종
추상클래스
보다추상화 정도가 높아서
추상 메서드만 가질 수 있음
- 따라서
인터페이스를 상속받은 클래스
는 반드시모든 메서드를 구현
해야 한다인터페이스
는다중 상속이 가능
하다- 작성 규칙
- 선언시
class
대신interface
키워드 사용멤버 변수
에는public static final
이 붙음메서드
앞에는public abstract
가 붙음 (다른 접근지정자 사용 X
)
상속(extends) vs 구현(implements)
- 상속
클래스
를상속
,공통된 부모를 가지는 것
끼리 묶음.is-a 관계
클래스
에서클래스의 다중 상속
은불가능
,클래스
에서인터페이스 다중 구현
은가능
- 구현
인터페이스(interface)
를구현하는 것
,can-do 관계
반드시 인터페이스의 모든 메소드
를구현
해야 함인터페이스
는인터페이스의 다중 상속
이가능
ref :
https://m.blog.naver.com/suresofttech/221569611618
https://mangkyu.tistory.com/143
https://gmlwjd9405.github.io/2018/06/03/agile-tdd.html
개념
테스트코드
를먼저 작성
한 후개발
에 들어가는개발 방식
테스트
가개발을 이끌어 나간다
결정
과피드백
사이의갭
을 조절하기 위한 테크닉 (갭이 크면 문제!
)
- 결정 :
코딩을 하면서 생기는 다양한 방법
들을결정
하는 것- 피드백 :
성공/실패
라는 정확한결과
- 일반적으로
TDD를 하면서 작성하는 테스트 코드
는'단위 테스트'
TDD cycle
TDD
는Red
,Green
,Refactor
이라는하나의 주기
를 가지며테스트 목록
을추가/수정
하며 진행된다
- Red :
먼저 실패하는 테스트 코드를 작성
하고, 실패하도록 만들어실패 상태(Red)를 확인
- Green :
빠른 시간 내에 테스트가 통과
하는프로덕션 코드를 작성
- Refactor :
코드의 리팩토링
을 통해Clean up
과정을 수행
필요성(장점)
테스트 코드
에는개발자의 개발 과정
(어떤 고민
/어떤 의사결정
)이 나와있다
-->정해진 결과
를 통해개발의 방향성
을확실
하게 가져갈 수 있다여러 상황
에 대한예외처리를 함께 작성
하기 때문에결함이 줄어든다
객체 지향적인 코드 개발
을 하게 된다
-->테스트의 용이성
을 위해각각의 기능들
에 대해철저히 구조화
시켜서 작성
-->TDD의 목적
인코드의 재사용성
을보장
하며객체지향적으로 작성
하게 됨
-->깨끗한 코드 작성
이 가능
TDD를 적용하기 어려운 이유
- 개발시간 증가
- 기존 개발의 흐름을 완전히 바꿔야 하기 때문
- TDD를 하는 방법에
정확한 정답이 있는 것 처럼 틀이 정해져 있다고 생각
된다 (핵심
)
--> 너무도구 / 규칙
에집착
하기 때문
ref : https://mangkyu.tistory.com/143
단위 테스트(Unit Test)
하나의 모듈
을기준
으로독립적으로 진행
되는가장 작은 단위
의테스트
하나의 기능
혹은메소드
정도로 이해될 수 있음- 일반적으로
TDD를 할 때 작성
되는테스트 방식
통합 테스트(Integration Test)
모듈을 통합하는 과정
에서모듈 간 호환성
을확인
하기 위해 수행되는테스트
캐시
나데이터베이스
등 연관된모든 컴포넌트를 연결
해야 한다실제 애플리케이션을 실행
시켜서테스트가 진행
되기 때문에속도가 느리다
단위 테스트 작성의 필요성
해당 부분
만독립적으로 테스트
하기 때문에 어떤코드
를리팩토링
하여빠르게 문제 여부를 확인
할 수 있음
- 테스팅에 대한
시간과 비용을 절감
새로운 기능 추가
시에 수시로빠르게 테스트 가능
리팩토링
시에안정성을 확보
단위 테스트의 문제점 & Stub
- 단위 테스트를 진행하기 위해서도 대부분은
결국 다른 객체들과 메세지를 주고 받아야 한다
임시적으로 테스트에 필요
한Mobk Object(가짜 객체)
같은Stub
이 필요함
DDD(Domain-Driven Design)
모두
의프로젝트 이해
와커뮤니케이션 수단의 통일성(도메인)
을 만들어기획자
부터개발자
까지프로젝트 커뮤니케이션 코스트 낭비
를최소화
하기 위한설계방법론
- 이로인해
프로젝트
는기획
에서설계
까지원하는 방향
으로 잘나갈 것을 기대하는설계 방법론
도메인
소프트웨어
로해결
하고자 하는문제 영역
도메인 모델
특정 도메인
을개념적
으로표현
한 것도메인 모델을 사용
하면여러 관계자들
(개발자
,기획자
,사용자
)이동일한 모습
으로도메인을 이해
하고도메인 지식을 공유
하는데도움
이 된다
도메인 모델 패턴
도메인 규칙
을객체 지향 기법
으로구현
하는 패턴비즈니스 로직
을도메인에 직접 작성
하는 방식(도메인
에데이터
와프로세스
가같이 존재
)- 객체간
관계
를 맺을 수 있어, 제약하거나로직의 단순화
에 도움- 하지만
객체들간의 설계가 수반
되어야 하기에모델 구축이 어려움
DDD(도메인 주도 설계) 아키텍처 구조
- Web Layer
- 흔히 사용하는
컨트롤러
와뷰 템플릿
의 영역 (인터셉터
등외부요청과 응답도 포함
)- Service Layer
트랜잭션
,도메인
간순서 보장
을 해주는 역할- 일반적으로
컨트롤러
와DAO
의중간 영역
에서 사용- Repository Layer
실제 Database
와 같은데이터 저장소
에접근하는 영역
DAO
에 해당- Domain Model
개발 대상에 해당
하는'도메인'
을,모든 사람
이동일한 관점에서 이해
할 수 있고공유
할 수 있도록단순화 시킨 것
( ==도메인 모델
)실제 비즈니스 로직
이수행
되는 곳
로직 패턴
마틴 파울러
라는 사람이비즈니스 로직을 처리하는 2가지 패턴
을 정의함트랜잭션 스크립트
와도메인 모델 패턴
이 그 두 예시책임지는 쪽
이Domain Level
이냐,Script Level
이냐에 따라 구분
트랜잭션 스크립트
- 개념
하나의 트랜잭션으로 구성된 로직
을단일 함수
또는단일 스크립트
에서처리
하는 구조service 계층 내부
에비즈니스 로직
을모두 작성
하는 방식- 장점
- 구현이 쉽다
모듈화를 잘 구현
한다면높은 효율
을 낼 수 있다- 단점
비즈니스 로직이 복잡해질수록
난잡한 코드
가 된다도메인 모델 패턴
에 비해중복된 코드가 많이 발생
도메인 모델 패턴
- 개념
객체 지향 분석 설계
에 기반해서구현하고자 하는 도메인
의모델
을생성
하는 패턴도메인 내부
에데이터와 프로세스
(비즈니스 로직
)가함께 존재
- 장점
객체 지향에 기반
한재사용성
,확장성
,유지보수
가 좋다- 단점
하나의 도메인 모델
을구축
하는데많은 노력
이 필요 (구축이 힘듬
)
ref : https://wonit.tistory.com/487
MA(Monolithic Architecture)
- 개념
하나의 서비스
또는애플리케이션
이하나의 거대한 아키텍처
를 가지는 방식- 장점
- 개발이 비교적 쉽다
- 쉽게
고가용성 서버 환경
을 만들 수 있다(같은 애플리케이션
으로 하나 더 만들면 됨)End-to-End 테스트
가 용이 (MSA
경우테스트에 필요한 서비스
를모두 각자 동작
시켜야 함)- 단점
한 프로젝트의 규모가 너무 커지면
,애플리케이션 구동시간
,빌드
,배포 시간
이너무 길어짐
조그마한 수정사항
이 있어도전체를 다시 빌드하고 배포
를 해야 함많은 양의 코드
로 인해유지보수가 힘들다
일부분의 오류
가전체에 영향
을 미친다
SOA(Service Oriented Architecture)
- 개념
서비스 지향 설계 방식
서비스 단위의 개발
을 하여개발된 서비스
를공유(ESB를 통해)
하고재가용성
과유연성
을확보
하는 방식서비스들의 재사용성 향상
이지향점
- 장점
서비스 단위로 모듈을 분리
하여결합도가 낮은 아키텍처
가 된다버스 형태에 연결만 가능
하다면확장성
과유연성
이증가
된다- 단점
- 결국
하나의 DB(저장소)
를 사용해서근본적인 의존성은 해결되지 못함
비즈니스에서 실 성공 사례가 매우 드물다
MSA(Micro Service Architecture)
- 개념
마이크로 서비스 설계 방식
작은 단위
인MS(Micro Service)로 분리
하여독립적
으로빌드
,배포
가 가능하도록 구성REST API
를 통해느슨하게 연결
되기 때문에각 서비스
는 모두독립성이 강하다
- 장점
추가
및수정사항
이 있을때,마이크로서비스
만 빠르게빌드
,배포
가 가능해당 기능에 효율적인
기술
, 언어
들을선택
할 수 있음일부분의 오류
가전체 서비스 자체
에영향을 주지 않게 할 수 있음
- 단점
서비스가 분산
되어 있어서유지보수가 힘들다
- 무조건적으로
상호 간 서비스
를호출하는 코드
가추가
되어통신 관련 오류
가 더잦다
전체 테스트
가MA에 비해 불편
하다
SOA와 MSA
- 공통점
응집된 비즈니스 집합
을여러개의 서비스 집합
으로나누어 개발
하는 구성
(MSA
에서나누는 서비스
는SOA
에서나누는 서비스
보다규모가 훨씬 작다
)- 차이점
MSA
는SOA
와 다르게서비스 별 저장소
를분리
하여다른 서비스
가저장소
를직접 호출하지 못하게 캡슐화 함
MSA
는SOA
와 다르게REST API
같은가벼운 개방형 표준
을 사용하여느슨하게 연결
(SOA
는ESB / SOAP
등의사용
으로 인해서비스간 결합도 증가
)
ref :
http://ruaa.me/why-functional-matters/
https://mangkyu.tistory.com/111
프로그래밍 패러다임
- 프로그래밍 패러다임(
Programming Paradigm
)은 프로그래머에게프로그래밍의 관점
을 갖게 하고,코드를 어떻게 작성할 지 결정
하는 역할을 한다
프로그래밍 패러다임
은 크게 아래와 같이 구분된다
- 명령형 프로그래밍 :
어떻게(How)
할건지를 설명 -->알고리즘 명시 O
,목표 명시 X
- 절차지향 프로그래밍 :
수행되어야 할 순차적인 처리과정을 포함
하는 방식(C, C++
)- 객체지향 프로그래밍 :
객체들의 집합
으로프로그램의 상호작용을 표현
(C++, Java
)- 선언형 프로그래밍 :
무엇(What)
을 할 것인지 설명 -->알고리즘 명시 X
,목표 명시 O
- 함수형 프로그래밍 :
순수 함수
를조합
하고소프트웨어를 만드는 방식
(클로저
등)
(필요한 개념들) 부수 효과(Side effect) & 1급 객체 & 순수 함수
- 부수 효과(
Side effect
)
변수의 값
이변경
됨예외
나오류
가발생
하며실행이 중단
됨콘솔
또는파일 I/O
가 발생됨객체의 필드값
을설정함
- 1급 객체
변수
나데이터 구조
안에담을 수 있는 객체
파라미터로 전달
을 할 수 있는 객체반환값(return value)으로 사용
할 수 있는 객체할당에 사용된 이름
과무관
하게고유한 구별
이가능
한 객체함수형 프로그래밍
에서함수
는1급 객체로 취급
받기 때문에유연하고 다양하게 사용
될 수 있음
- 순수 함수(
Pure Function
)
- 개념
- 부수 효과(
Side effect
)를제거한 함수
동일한 입력
에항상 같은 값을 반환
하는 함수(바뀔 일이 없음
)- 장점
함수 자체가 독립적
이며,Side-effect
가 없어서Thread에 안정성
을보장
받을 수 있음Thread에 안정성을 보장
받아병렬 처리
를동기화 없이 진행
할 수 있음
함수형 프로그래밍 등장
명령형 프로그래밍을 기반
으로 개발했던 개발자들은소프트웨어의 크기
가커짐
에 따라, 복잡하게 엉켜있는스파게티 코드
를유지보수하는 것
이매우 힘들다는 것
을 느끼게 됨모든 것
을순수 함수
로 나누어문제를 해결
하는 기법인함수형 프로그래밍
에 관심을갖게 됨- 결과적으로,
작은 문제를 해결하기 위한 함수를 작성
하여가독성을 높이고
유지보수를 용이
하게 됨
함수형 프로그래밍 개념
순수 함수
를조합
해서소프트웨어를 만드는 방식
작은 문제를 해결
하기 위한함수
를 작성(순수함수
)대입문
이 없는 프로그래밍(변수를 항상 상수로 받아서 변경이 없음
)
함수형 프로그래밍 필요성
- 동시성 프로그래밍
:여러 스레드
가동시에 공유 데이터에 접근
하더라도,순수함수의 사용
으로불변성
을 가지기 때문에동시성과 관련된 문제
를원천적으로 봉쇄
- 가독성 향상
:작은 문제를 해결하기 위한 함수
를 통해핵심 코드
의가독성
이 올라간다
함수형 프로그래밍 예시
- 기존 코드
public static int evenSum() { int sum = 0; for (int i = 1; i <= 100; i++) { if ( i % 2 == 0) sum += i; } return sum; }
- 함수형 프로그래밍 코드
/* 훨씬 코드가 간결해짐 */ public static int evenSum() { return IntStream.rangeClosed(1, 100) .filter(i -> i % 2 ==0) .reduce(0, (l, r) -> l + r); }
ref :
https://velog.io/@josworks27/CORS-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90
https://velog.io/@wlsdud2194/cors
개념
교차 출처 리소스 공유
를 하도록허용
하는체계
- 이와
반대되는 개념
으로Same-Origin Policy
가 있음
- 웹은 기본적으로
보안상의 이유
로같은 Origin끼리만 통신
하게제한
- Origin ?
도메인
과비슷
하지만프로토콜
과포트
정보를명시하는 점
이 다르다- 도메인(
domain
) :naver.com
- 오리진(
origin
) :https://www.naver.com:포트번호
SOP(Same-Origin Policy)의 필요성
웹 시큐리티의 중요한 정책
중 하나로Same-Origin Policy
가 있는데, 이것은Origin사이의 리소스 공유에 제한
을 두어 다음2가지를 예방
한다
- XSS(
Cross-Site Scripting
)
:악의적인 Script를 삽입
해서정보
를탈취
-->Cookie내에 인증정보 탈취
- CSRF(
Cross-Site Request Forgeries
)
:XSS로 획득한 정보
를 통해서유저
가의도하지 않은 request
를서버
에게 보내는 것
CORS를 위한 HTTP request
CORS
를 하기 위한HTTP request
를2가지 유형
으로 분류하여 처리
- 단순 요청(
Simple Requests
)- 비 단순 요청(
Non-Simple Requests
)2가지 요청 유형
에 따라서클라이언트 / 서버
에서HTTP request / response
가 다르기 때문에원리를 알아 둘 필요
가 있음
단순 요청 처리 과정
- [클라이언트]
HTTP request 헤더
에Origin : [client의 origin]
필드 추가
- [서버]
HTTP response 헤더
에'Access-Control-Allow-Origin : [client의 origin]'
을 추가해서 보냄
(*
으로 입력하면모든 도메인에 대해 요청을 허락
한다는 것으로 간주할 수 있음)
비 단순 요청 처리 과정
- [클라이언트]
- 사전 요청(
preflight request
)을 보내서서버측과 통신이 가능한지
전송
(preflight request
는브라우저
가 알아서 해주므로,개발자가 직접하지 않아도 됨
)HTTP request header
에2가지 필드가 추가
하면preflight request
가 된다
Access-Control-Request-Method : POST(예시)
Access-Control-Request-Headers: Content-Type,API-Key(예시)
- [서버]
- 사전 요청(
preflight request
)에 대한응답
으로허용할 origin, method, header, cache 정보
들을 보내주어 전송 가능함을 확인HTTP response header
에4가지 필드
가추가
되어야 한다
- 허용할 origin :
Access-Control-Allow-Origin : [client origin]
- 허용할 method :
Access-Control-Allow-Methods: PUT, DELETE, GET, POST
- 허용할 headers
:Access-Control-Allow-Headers: API-Key,Content-Type,If-Modified-Since,Cache-Control
- 캐싱 정보(명시 시간동안은
preflight request
필요 X
)
:Access-Control-Max-Age: 86400
그래서 개발자는 뭘해야 하는데?
- 클라이언트 개발자
- 보통
CORS처리
를서버측
에서 하므로 따로 할일은 없음
(필요한 상황
에request에 포함될 필드
는브라우저가 자동으로 삽입
해주기 때문)- 하지만,
서버측 코드를 수정하지 않고
클라이언트쪽에서 proxy설정
을 통해이것을 처리
할 수도 있음
(proxy
를 통해서same-origin의 요청
으로 바꾸어서통신을 가능
하게 할 수 있음)
- 서버 개발자
클라이언트의 origin이 다른 경우
,요청을 처리
하기 위해서Access-Control-Allow-Origin
필드를HTTP response headers 필드
에삽입
해서 보내줘야 한다
- 추가
- Node.js
:Cors 모듈
을 가져와서app.use()
를 통해추가
해주면 됨
(매번 직접response header
에 추가해줄 순 없으니모듈을 사용
하자!)
--> 보통Access-Control-Allow-Origin : *
로모든 origin 요청을 처리
하도록 하는데 이것은보안적으로 취약
하기에직접 client의 origin을 추가
하는option
을사용
하는 것이 좋다 (CSRF 공격 대비
)- Spring Boot
:@CrossOrigin
사용해서origin을 추가
CORS
인 경우HTTP request
에쿠키가 자동 추가
되지 않는다?
같은 Origin
인 경우자동으로 쿠키가 http request에 추가
되지만,다른 Origin
인 경우추가적으로 설정이 필요
하다- [클라이언트] :
HTTP request headers
에withCredentials : true
추가- [서버] :
HTTP response headers
에Access-Control-Allow-Credentials : true
추가
인증(Auhentication)
클라이언트
가자신이 주장하는 사용자
와같은 사용자
인지를확인
하는 과정쿠키 / 세션 / 토큰
은인증을 하기 위한 수단
들이다
인가(Authorization)
권한
을부여
하는 것
차이 이해
인증을 거친 사용자
에 대해 우리는인가(권한 부여)
를 해주는 것이다
ref :
https://r4bb1t.tistory.com/38
https://velog.io/@yaytomato/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%90%EC%84%9C-%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0
개요
웹 서비스
에서데이터를 저장할 수 있는 공간
은3개
로 분류
- 쿠키(
Cookie
)- 웹 스토리지(
Web Storage
)
- 로컬 스토리지(
Local Storage
)- 세션 스토리지(
Session Storage
)
- 일반적으로 쿠키(
Cookie
)와 로컬 스토리지(Local Storage
)중선택
하게 된다
쿠키(Cookie)
- 쿠키는 HTTP 통신의 무상태성을 보완해주기 위해 나온 것
- 서버가 보낸 data를 최대 4KB까지 저장하는 공간
- 서버에서 접근할 수 있는 것이 가장 큰 특성 !
- HTTP Request시 자동으로 포함된다는 특징이 있음
httpOnly설정
을 추가하여JavaScript의 접근
을 막을 수 있음
(Script를 이용하는 공격인 XSS를 예방 / CSRF공격에는 노출)secure 설정
을 추가하여 반드시HTTPS통신
을 하게되면네트워크에서 토큰정보가 탈취되는 것
을 막을 수 있음
로컬 스토리지(Local Storage)
- 서버에서 접근할 수 없음
- persistent cookies와 비슷!
- 반 영구적으로 저장 가능
- 5 ~ 10MB의 크기를 갖는 공간
- JS로 쉽게 접근할 수 있기 때문에
XSS에 취약
세션 스토리지(Session Storage)
- 서버에서 접근할 수 없음
- session cookies와 비슷! --> 세션을 위한 저장 공간
- 세션이 종료되면 모두 삭제 (브라우저 종료시 삭제됨)
- 5 ~ 10MB의 크기를 갖는 공간
정리
- 보안이 크게 중요하지 않다면
로컬 스토리지(Local Storage)
도 나쁘지 않은 선택이 될 수 있다- 일반적으로는,
쿠키(Cookie)
에secure + httpOnly옵션
을 사용을 많이 체택하는 것 같다
(여전히 보안 취약점은 가지고 있음
-->완벽한 보안 방법은 없다ㅠㅠ
)
- 다른 방법들
CSRF Token
을 사용 -->Spring Security에서 권장
refresh token
/access token
을 사용하여access token 시간 짧게 설정
- 등 정말 여러가지 방법이 있음
ref :
https://gmlwjd9405.github.io/2018/07/06/design-pattern.html
개념
소프트웨어 설계
에서공통으로 발생하는 문제
에 대해자주 쓰이는 설계 방법
을 정리한 패턴
종류
- 생성(
Creational
) 패턴 :객체 생성
과 관련된 패턴
- 추상 팩토리(
Abstract Factory
)
:구체적인 클래스
에 의존하지 않고,연관
되거나의존
적인객체의 조합
을 만드는인터페이스를 제공
하는 패턴- 팩토리 메서드(
Factory Method
)
:객체 생성 처리
를서브 클래스
로분리
해처리
하도록캡슐화
하는 패턴- 싱글턴(
Sigleton
)
:하나의 객체
는하나의 인스턴스
를 가지는 패턴
- 구조(
Structural
) 패턴 :클래스
나객체
를조합
해큰 구조
를 만드는 패턴
- 컴포지트(
Composite
)
:복합 객체
와단일 객체
를구별 없이 다루게
해주는 패턴- 데코레이터(
Decorate
)
:객체의 결합
을 통해기능을 동적으로 유연하게 확장
할 수 있는 패턴
- 행위(
Behavioral
) 패턴 :객체
나클래스
사이의알고리즘
이나책임 분배
에 관련된 패턴
- 옵서버(
Observer
)
:한 객체
의상태 변화
에 따라다른 객체
의상태도 연동
되도록일대다 객체 의존 관계
를 구성하는 패턴- 스테이트(
State
)
:객체의 상태
에 따라객체의 행위 내용
을변경
해주는 패턴- 스트래티지(
Strategy
)
:행위
를클래스
로캡슐화
해동적으로 행위
를 자유롭게 바꿀 수 있게 해주는 패턴- 템플릿 메서드(
Template Method
)
:어떤 작업을 처리하는 일부분
을서브 클래스
로캡슐화
해전체 일을 수행하는 구조
는 바꾸지 않으면서특정 단계에서 수행하는 내역
을 바꾸는 패턴- 커맨드(
Command
)
:실행될 기능
을캡슐화
함으로써주어진 여러 기능
을 실행할 수 있는재사용성이 높은 클래스를 설계
하는 패턴
MVC 패턴
디자인 패턴
중구조
와 관련한 패턴 중 하나Model
/View
/Controller
로각 역할
에 맞추어분리
한 구조
- Model :
View에 보여질 데이터
를 가지고 있는Object
- View :
Model에 있는 데이터
를 통해User에게 보여주는 부분
- Controller :
요청에 대한 처리
및비즈니스 로직을 수행
하는 부분
(보통비즈니스 로직을 수행
하거나트랜잭션, 도메인 간 순서 보장
을 위해Service
를따로 둠
)
- 장점
분리
를 통해각자 역할에 집중
할 수 있게 한다유지보수성
,애플리케이션 확장성
,유연성
이증가
Front Controller 패턴
디자인 패턴
중구조
와 관련한 패턴 중 하나사용자의 요청을 처리
하는하나의 컨트롤러
(Front Controller
)를 통해개발
및유지보수
의효율성
을올리는 패턴
기존 MVC 패턴
에서는사용자의 요청을 처리
하기 위해각자 Servlet을 생성 및 관리
하였으며,forward 중복
,viewPath중복
등이 발생
-->공통으로 사용자의 요청을 처리
하는컨트롤러(Front Controller)
도입
Adapter 패턴
디자인 패턴
중구조
와 관련한 패턴 중 하나서로 다른 인터페이스를 사용
하기 위해중간 Adapter
를 두어해결
하는 패턴- 장점
유연성
이 증가확장성
이 증가
MVC 패턴
+Front Controller 패턴
+Adapter 패턴
- MVC 패턴
Model
/View
/Controller
각역할
로 나누어서유지보수 용이
- Front Controller 패턴
매번 요청
을처리
하기 위한서블릿 생성/삭제 등 관리
를 각자 하는 것은비효율적
-->서블릿 관리
,viewPath관리
등공통으로 처리
하기 위해Front Controller
도입- Adapter 패턴
다양한 종류
의인터페이스를 처리
하기 위해Adapter를 추가
해서유연성
증가
-->HandlerAdapter
를 통해서실제 Handler(Controller)
를호출