Q) Spring이 다른 프레임워크랑 비교했을 때 장단점?
Q) 프로세스와 스레드의 차이는?
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
Q) 멀티 프로세스와 멀티스레드의 차이는? 장단점 위주로 설명
Q) 디자인패턴에 대해 아는대로 말해주세요
Q) MVC가 뭐냐?
사전적 의미 : 날렵한, 민첩한 기민한
소프트웨어 개발 방법론 중의 하나
작업 계획을 짧은 단위로 세우고, 시제품을 만들어 나가는 사이클을 반복
개발과 함께 즉시 피드백을 받아서 유동적으로 개발
고객의 요구 변화에 유연하고도 신속하게 대응
애자일 방법론의 종류
Kanban 칸반 : 시각적 작업 관리 도구
Scrum 스크럼
XP (Extreme Programming)
TDD (Test Diven Development) : 테스트 주도 개발
Pair Programming
애자일과 반대되는 전통적 개발 방법론은 워터폴(Waterfall) 방식
지나치게 계획과 절차에 의존 - 시간, 비용의 낭비가 증가
전체적인 관점보다 개별 포인트에서의 완결성에 우선순위를 두는 속성상 전체 흐름이 단절되기 쉬움
Application Programming Interface
● API는 생성된 시기와 이유에 따라 네 가지 방식으로 작동
- SOAP API
- RPC API
- Websocket API
- REST API
Authentication (인증) : 신원을 확인
Authorization (인가) : 특정 엑세스 권한을 부여
- 인증은 Key, 인가는 해당 Key가 엑세스 권한을 부여하는지 여부
- 둘 다 사용자가 특정 애플리케이션, 시스템 또는 리소스에 대한 권한을 얻는 프로세스에 필수적 (고유한 두 단계)
- 액세스 권한을 부여하기 위해 인가가 제공되기 전에 인증이 이뤄져야 한다.
- 인증과 인가의 경계가 모호할 수 있다.
- 일반적으로 인증과 인가의 과정은 특정 시나리오에서 상호 교환 가능
- '인증 -> 인가' 로 이어질 수 있지만
- '인가 -> 인증' 으로 이어질 수 없다.
ex) 키가 있는 사용자는 접속(접근) 권한을 가진다.
하지만 접속권한을 가졌다고 해서 사용자를 특정 할 순 없다.

● HOST
일반적인 서버-클라이언트 구조의 변형, 클라이언트가 서버의 역할을 겸하는 경우가 존재
이 경우, 클라이언트/서버의 명칭보다 더 범용적인 '호스트'라는 명칭을 사용하기도 한다.
P2P 구조 (Peer 2 Peer)
Common Language Runtime
.NET Framework 의 VM 요소



웹 컴포넌트의 규격
Shadow Dom, Custom Elements, ES Modules
소프트웨어를 독립적으로 개발시 다른 모듈과의 호환을 생각하기 어렵다.
이는 소프트웨어의 재사용을 어렵게 하고 유지보수 비용을 증가 시킨다.
Cascading Style Sheets
스타일 시트 언어
Cascading 의 사전적 의미 : 폭포수 처럼 떨어지는
상위 요소의 스타일 속성을 자손 요소들에게 상속시켜주는 모습이 DOM 트리구조에서 폭포수 모습과 닮았기 때문
but, 마진, 패딩, 보더 등의 박스모델 관련 속성은 상속되지 않는다. (inherit 값을 주면 강제 상속 가능)
DAO (Data Access Object)
DB의 데이터에 접근하기 위한 객체
직접 DB에 접근하여 data를 삽입, 삭제, 조회 등 조작
DAO는 DB와 연결할 Connection 까지 설정되어 있는 경우가 많다.
현재는 MyBatis 등에서 커넥션풀까지 제공하므로 DAO를 별도로 만드는 경우는 드물다
DTO (Data Transfer Object)
계층 간(Controller, View, Business Layer) 데이터 교환을 위한 Java Bean
getter, setter 외에는 로직(메소드)을 가지지 않는다.
주로 비동기 처리를 할 때 사용한다.
VO (Value Object)
Read-Only 속성을 가진 값 오브젝트
단순히 값 타입을 표현하기 위한 불변 클래스로 getter 기능만 존재한다
VO의 핵심 역할은 equals()와 hashcode()를 오버라이딩 하는 것
VO 내부에 선언된 속성(필드)의 모든 값들이 같아야 똑같은 객체라고 판별한다.
DTO vs VO
DTO는 가변 클래스
VO는 불변 클래스 (값 자체를 의미)
DTO는 인스턴스 개념이라면 VO는 리터럴 개념
Entity : DB 테이블과 1:1로 매핑되는 클래스
https://velog.io/@ha0kim/DAO-DTO-VO-%EC%B0%A8%EC%9D%B4
DataBase
데이터베이스 – 데이터를 정리하여 보관하고 있는 저장소
ex) Oracle, Cubrid, MsServer, MySQL, Tibero, Altibase
데이터베이스 정규화 : RDB의 설계에서 "중복"을 최소화하게 데이터를 구조화하는 프로세스
정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성, 무결성(Integrity) 유지
비공식적으로 RDB table이 제 3 정규(3NF)화가 되었으면 정규화되었다 라고 한다.
3NF 테이블의 대부분이 삽입, 변경, 삭제 이상이 없다.
DB 디자인 표준 가이드는 DB가 완전히 정규화되게 디자인되어야 한다.
그 뒤에 일부가 성능상의 이유로 비정규화될 수는 있다.
NF : Normal form
컴퓨터 프로그램 개발 단계 중에 발생하는 시스템의 논리적이 오류나 비정상적인 연산(버그)을 찾아내고 수정하는 작업 과정.
얕은복사(Deep Copy) vs 깊은복사(Shallow Copy)
DeepCopy
'실제 값'을 새로운 메모리 공간에 복사하는 것
일반적인 개념의 복사
● 구현
- Cloneable 인터페이스 구현
- 복사 생성자
- 복사 팩터리
Shallow Copy
'주소 값'을 복사하는 것
참조하는 실제 값은 같다. 양자얽힘
Document Object Model : 문서 객체 모델
DOM 은 XML, HTML 문서의 각 항목을 계층으로 표현하여 생성, 변형, 삭제를 돕는 인터페이스
메모리에 웹 페이지 문서 구조를 표현함으로써, 스크립트 및 프로그래밍 언어와 페이지를 연결
이때 스크립트는 주로 JS를 의미
DOM은 문서를 논리 트리로 표현, DOM 메서드를 이용하여 접근, 이를 통해 문서의 구조, 스타일, 콘텐츠를 변경

예외 처리 또는 오류 처리(Trouble Shooting)는 일반적인 실행의 흐름을 바꾸는 몇 가지 조건을 처리하도록 설계한 프로그래밍 언어의 개념 or 컴퓨터 하드웨어 구조
- 실패 투명성 (no throw guarantee)
- 강력한 불변의 예외 안전 (Commit or rollback semantics)
- 기본 예외 안전 (Basic exception safety)
- 최소 예외 안전 (no-leak guarantee)
- 예외 보증을 하지 않는 안전 (No exception safety)
Java 예외처리 코드 참고
https://catsbi.oopy.io/92cfa202-b357-4d47-8de2-b9b3968dfb2e
Entity Relationship Diagram
ERM(Entity-Relationship Modelling) 프로세스의 산출물
개념적 데이터 모델 혹은 시멘틱 데이터 모델의 한 타입
● Entity(엔티티) : 정의 가능한 사물 또는 개념
속성 : 개체가 갖고 있는 속성(Attribute), DB table의 각 필드(column)
도메인 : 속성의 값, 타입, 제약사항 등에 대한 범위를 표현
분류 : 유형, 무형, 문서, 이력, 코드 엔티티
● ERD 키와 제약 조건
주 식별자(PK)
왜래 식별자(FK)
NOT NULL
관계선 : 실선(식별자 관계), 점선(비식별자 관계)
● ERD 관계의 카디널리티
Cardinality는 한 개체에서 발생할 수 있는 횟수를 정의, 다른 개체에서 발생할 수 있는 횟수와 연관
One to One 1대1 대응
One to Many 1대다 대응
Many to One 댜대1 대응
Many to Many 다대다 대응N:M 관계에 있는 경우 두개의 엔티티만으로는 서로를 표현하는데 부족
1:N, N:1 로 조정하는 작업이 필요하다 >> 중간 엔티티 구성(두 엔티티의 공유 속성 역할)

GC는 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중 필요없게 된 영역을 해제하는 기능. 더 이상 사용할 수 없게 된 영역이란, 어떤 변수도 가리키지 않게 된 영역
Java, C#, 일부 스크립트 언어들은 처음부터 GC 기법을 염두에 두고 설계되었다.
C, C++ 등의 프로그래밍 언어는 수동 메모리 관리를 가정하고 설계되었으나, GC를 지원하는 구현도 존재한다.
장점
동적으로 할당된 메모리 영역의 전체를 완벽하게 관리할 필요가 없다. 아래와 같은 버그를 줄이거나 완전히 막을 수 있다.
유효하지 않은 포인터 접근 : 이미 해제된 메모리에 접근하는 버그
이중 해제 : 이미 해제된 메모리를 또다시 해제하는 버그를 가리킨다.
메모리 누수 : 더이상 필요하지 않은 메모리가 해제되지 않고 남아있는 버그
단점
어떤 메모리를 해제할지 결정하는 데 비용이 든다.
쓰레기 수집이 일어나는 타이밍이나 점유 시간을 미리 예측하기 어렵다.
할당된 메모리가 해제되는 시점을 알 수 없다.
GC가 동작하는 동안 다른 동작을 멈추기 때문에 오버헤드가 발생한다.
STW : Stop The World
GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상
GC관련 Thread를 제외한 모든 Thread가 멈춘다.
이 시간을 최소화 시키는 것이 쟁점!
포인터 추적 방식: 대부분의 GC 기법은 포인터 추적 방식을 사용한다.
한 개 이상의 변수가 접근 가능한 메모리는 사용할 수 있는 메모리로 간주, 그 밖의 메모리는 해제
- 여러 가지 포인터 추적 기법
표시하고 쓸기 (mark and sweep)
삼색 표시 기법
객체 이동 기법
세대 단위 쓰레기 수집
참조 횟수 계산 방식 : 일부 GC 기법은 참조 횟수 계산 방식을 사용한다.
컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 스냅샷 스트림 기반의 분산 버전 관리 시스템
분산 버전 관리(Distributed Revision Control)
Distributed Version Control (System) DVCS, VCS
소프트웨어 개발에서 소스 코드 관리에 주로 사용
어떠한 파일 집합의 변경사항을 지속적으로 추적하기 위해 사용될 수 있다.
빠른 속도에 중점을 두고 있다. 데이터 무결성, 분산, 비선형 워크플로를 지원

작업 계층 구조 : 작업 디렉토리 - 스테이징 공간 - 로컬 저장소 - 원격 저장소
해시 함수 또는 해시 알고리즘은 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수
해시 함수에 의해 얻어지는 값은 해시 값, 해시 코드, 해시 체크섬, 해시라고 한다
검색할 때 사용할 key값이 배열의 인덱스로 변환되기 때문에 검색과 저장의 평균 시간 복잡도가 O(1)로 수렴, 모든 index에서 충돌이 발생하는 최악의 경우 O(n)
암호학적 해시함수
역상 저항성(preimage resistance) : 임의의 출력에 대해 사상시키는 입력을 찾는 것이 계산적으로 불가능
제 2 역상 저항성(seconde preimage resistance) :임의의 입력에 대해 같은 출력으로 사상시키는 또 다른 입력값을 찾는 것이 계산적으로 불가능하다.
충돌 저항성 (collision resistance) : 충돌쌍을 갖는 두 개의 입력값을 계산하는 것이 어려워야 한다.
(HyperText Markup Language) : 마크업 언어
(HyperText Transport Protocol)
W3 상에서 정보를 주고받을 수 있는 프로토콜
클라이언트와 서버 사이에 이루어지는 요청/응답(request/response)
HTTP 요청 : HTTP 버전 유형, URL, 메서드, 요청 헤더, 본문(선택사항)
HTTP 메서드 : 가장 일반적인 두가지 GET, POST
HTTP 요청 헤더 : 키값 쌍에 저장된 텍스트 정보 포함
HTTP 요청 본문 : 전송되는 정보 '본문', 이름, 비밀번호 등 웹 서버에 제출되는 데이터
HTTP 응답 : 상태 코드, 응답 헤더, 본문(선택사항)
HTTP 상태코드 : HTTP 요청이 성공적으로 완료되었는지 여부.
1XX : Informational
2XX : 성공
3XX : 리디렉션
4XX : 클라이언트 오류
5XX : Server ErrorHTTP 응답헤더 : 요청 헤더와 마찬가지로 응답 본문에서 전송되는 데이터의 언어 및 형식과 같은 중요한 정보
HTTP 응답본문 : GET 요청에 대한 성공적인 HTTP 응답에는 요청된 정보가 포함된 본문,
대부분의 경우 HTML 데이터


TLS(Transport Layer Security) 를 통한 보안이 적용된 버전, 전송 내용이 암호화되어 전달
기본포트 - HTTP 80번, HTTPS 443번
Integrated Development Enviroment
코딩, 디버그, 컴파일, 배포 등 프로그램 개발에 관련된 모든 작업을 처리하는 환경제공 소프트웨어
사물인터넷은 각종 사물에 센서와 통신 기능을 내장하여 인터넷에 연결하는 기술.
무선 통신을 통해 각종 사물을 연결하는 기술
– 웹 어플리케이션 개발에 가장 많이 사용하는 언어 중 하나
(5가지 핵심 목표)
자바 지속성은 자바 플랫폼 SE(Standard Edition)와 자바 플랫폼 EE(Enterprise Edition)를 사용하는 응용프로그램에서 RDB 의 관리를 표현하는 자바 API
JPA는 반복적인 CRUD SQL을 처리해준다
자바 진영에서 ORM 기술 표준으로 사용되는 인터페이스의 모음
Hibernate : 대표적인 오픈소스

기존에 EJB에서 제공되던 엔터티 빈(Entity Bean)을 대체하는 기술
EJB : Enterprise JavaBeans
기업환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델
JPA 의 구성요소
javax.persistance 패키지로 정의 된 API 그 자체
JPQL (자바 퍼시스턴스 쿼리 언어)
객체/관계 메타데이터
엔티티
RDB 의 테이블로 지속되는 경량 자바 클래스
엔티티는 일반적으로 다른 엔티티들과 관계가 있다. 객체/관계형 메타 데이터를 통해 표현
HTML의 클라이언트 사이드 조작을 단순화 하도록 설계된 크로스 플랫폼의 JS 라이브러리다.
모토 : write less, do more
- jQuery의 위상이 하락하는 요인
높은 기능성을 갖춘 웹 표준 API의 증가
인터넷 익스플로러의 쇠락
가상 돔(virtual DOM)을 사용하는 라이브러리 선호 - React, Vue.js- JQuery의 대응 전략
경량화, 브라우저 호환 기능 추가
Java Server Pages
자바 가상 머신
자바 바이트코드를 실행할 수 있는 주체
JRE(Java Runtime Environment)에 포함되어 있다
자바 바이트코드 : Java 코드를 컴파일하여(by javac) 만들어지는 (바이트 단위의) 소스코드


Model View Controller
소프트웨어 디자인 패턴
MVC에 기반을 둔 몇가지 다른 디자인패턴
MVVM(모델-뷰-뷰모델), MVP(모델-뷰-프리젠터), MVW(모델-뷰-왓에버)


모델(Model) – 데이터와 비즈니스 로직을 관리
어떠한 동작을 수행하는 코드
순수하게 public 함수로만 이루어진다.
몇몇 함수들은 사용자의 질의(query)에 대해 상태 정보를 제공, 나머지 함수들은 상태를 수정
뷰(View) – 레이아웃과 화면을 처리
MVC에서 모델은 여러 개의 뷰(view)를 가질 수 있다.
보여줄 값(모델)을 컨트롤러로부터 받아와 사용자에게 보여준다
컨트롤러(Controller) – 명령을 모델과 뷰 부분으로 라우팅
MVC의 뷰는 여러 개의 컨트롤러(controller)를 가지고 있다.
사용자는 컨트롤러를 사용하여 모델의 상태를 바꾼다.
컨트롤러는 모델의 mutator 함수를 호출하여 상태를 바꾼다.
객체 지향 프로그래밍 Object-Oriented Programming
https://velog.io/@hooony/OOP-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
Object Relational Mapping
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
객체 간의 관계를 바탕으로 SQL을 자동 생성하여 객체 모델 - 관계형 모델 간에 불일치를 해결한다.
장점
- SQL문이 아닌 Method를 통해 DB 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있음
- Query와 같이 필요한 선언문, 할당 등 부수적인 코드가 줄어, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높임
- 객체지향적인 코드 작성 가능
- 매핑 정보가 Class로 명시 되었기 때문에 ERD를 보는 의존도를 낮추고 유지보수 및 리팩토링에 유리
단점
- 프로젝트 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨림
- 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요 -> 결국 SQL문을 써야할 수도 있음
- 학습비용이 비쌈
프로시저, 저장 프로시저, Stored Procedure
데이터베이스에 대한 일련의 작업을 정리한 절차를 관계형 데이터베이스 관리 시스템에 저장한 것
일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합
영구저장모듈(Persistent Storage Module) 이라고도 부른다
하나의 요청으로 여러 SQL문을 실행 -> 네트워크 부하를 줄일 수 있다. 성능개선
여러 어플리케이션과 공유 가능하다 (API 처럼 제공)
기능 변경이 편리 (특정 기능을 변경할 때 프로시저만 변경하면 된다)
문자나 숫자열 연산에 사용하면 C, Java 보다 느린 성능을 보일 수 있다.
유지보수가 어렵다. (프로시져가 앱의 어디에 사용되는지 확인이 어렵다)

프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다
커널 내에는 준비 큐, 대기 큐, 실행 큐 등의 자료구조가 있다. 이를 이용해 프로세스의 상태를 관리


프록시의 사전적 의미는 '대리'
프록시 서버(proxy server)는 서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행
보통 Deric 이라고 부른다 (??)
익명으로 컴퓨터를 유지 (보안 목적)
캐시를 사용하여 리소스로의 접근을 빠르게 하기 위해
네트워크 서비스나 콘텐츠로의 접근 정책을 적용하기 위해 (원치 않는 사이트 차단)
사용률을 기록하고 검사
보안 및 통제를 뚫고 나가기 위해
바이러스 전파, 악성 루머 전파, 다른 정보들을 빼낼 목적
역으로 IP추적을 당하지 않을 목적
전달에 앞서 악성 코드를 목적으로 전달된 콘텐츠를 검사하기 위해
밖으로 나가는 콘텐츠를 검사하기 위해 (데이터 유출 보호)
지역 제한을 우회하기 위해
프록시 서버가 설치된 처음 목적은 웹 서핑을 비롯한 인터넷 속도의 향상
현재 이 역할담당은 CDN : Content Delivery Network / Content Distribution Network

도서관 프록시

HttpEntity 클래스를 상속받아 구현한 클래스 (RequestEntity, ResponseEntity)
결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스
HttpEntity
SpringFramework에서 제공하는 클래스
HTTP 요청(Request) 또는 응답(Response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스
Representational State Transfer
REST는 네트워크 아키텍처 원리 모음
네트워크 아키텍처 원리 : 자원을 정의하고 자원에 대한 주소를 지정하는 방법 전반을 일컫는다.
REST 구성
자원(Resource) - URI
행위(Verb) - HTTP Method
표현(Representations)
REST 특징
Java Servlets : 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양
웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스

서블릿은 자바로 구현 된 CGI
CGI : Common Gateway Interface
서블릿의 주요 특징
-- 클라이언트의 Request에 대해 동적으로 작동하는 웹 어플리케애션 컴포넌트
-- 기존의 정적 웹 프로그램의 문제점을 보완하여 동적인 여러 기능을 제공
-- Java의 Thread를 이용하여 동작
-- MVC 패턴에서 Controller로 이용됨
-- 컨테이너에서 실행
-- 보안 기능을 적용하기 쉬움
-- HTML을 사용하여 요청에 응답, HTML 변경 시 Servlet을 재컴파일해야 하는 단점 존재
-- UDP보다 처리 속도가 느리다
서블릿의 생명주기
초기화 : init()
작업수행 : doGet(), doPost()
종료 : destory()

서블릿 컨테이터 : 구현되어 있는 servlet 클래스의 규칙에 맞게 서블릿을 담고 관리해주는 컨테이터
-- 웹 서버와의 통신 지원
-- 서블릿 생명주기(Life Cycle) 관리
-- 멀티쓰레드 지원 및 관리
-- 선언적인 보안 관리
클라이언트에서 요청을 하면 컨테이너는 HttpServlet, HttpServletResponse 두 객체를 생성
서블릿 컨테이너는 웹 서버와 소켓으로 통신하며 대표적인 예로 톰캣(Tomcat)이 있다.
톰캣은 실제로 웹 서버와 통신하여 JSP(자바 서버 페이지)와 Servlet이 작동하는 환경을 제공
Servlet & JSP
- 서블릿은 Java 코드 안에 HTML을 포함
- JSP는 HTML 문서 안에 Java 코드를 포함
JSP(Java Server Page) : java언어를 기반으로 하는 Server Side 스크립트 언어
자카르타 서버 페이지(Jakarta Server Page) : 바뀐 명칭
HTML 소스코드 속에 Java 소스코드가 들어가며, 웹 브라우저로 보내는 것이 아니라 웹 서버에서 실행되는 부분
JSP는 WAS(Web Application Server)에 의해 서블릿 클래스로 변환되어 사용됨

Spring : Java 기반의 웹 어플리케이션을 만들 수 있는 프레임워크
스프링이 등장하기 이전에는 EJB(Enterprise Java Bean)
일반적으로 프레임워크는 특정 업무 혹은 하나의 기술에 집중
즉, 어떤 특화된 목적을 편리하게 달성할 수 있게 하기 위해 만들어짐
반면, 애플리케이션 프레임워크는 개발에 필요한 모든 과정에 집중
즉, 애플리케이션을 개발하는 데 있어 필요한 모든 업무 분야 및 모든 기술관련 코드의 뼈대를 제공
POJO 프로그래밍 지향 (Plain Old Java Object) : 순수 Java만을 통해 생성한 객체
외부 기술이나 규약의 변화에 얽매이지 않고, 보다 유연하게 변화와 확장에 대처
POJO 프로그래밍을 위해 지원하는 기술 IoC/DI, AOP, PSA
IoC / DI (Inversion of Control / Dependency Injection)
개발자가 아닌 스프링이 (어떤 객체가) 사용할 객체를 생성하여 의존 관계를 맺어주는 것을 IoC
그 과정에서 생성자를 통해 주입하는 것을 DI
AOP (Aspect Oriented Programming) : 별도의 객체로 분리, 메서드를 통해 구현
애플리케이션 개발시 구현해야 하는 기능을 구분 - 공통 관심 사항, 핵심 관심 사항
공통 관심 사항 ex) 로깅, 보안
PSA (Portable Service Abstraction) : 일관된 서비스 추상화
특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용
ex) JDBC를 이용하여 동일한 사용방법을 유지한 채로 DB 변경

스프링으로 애플리케이션을 만들 때 필요한 설정을 간편하게 처리해주는 별도의 프레임워크
기존 배포시 별도의 외장 웹 서버를 설치, 프로젝트를 War 파일로 빌드하여 배포 진행
속도가 느리며 번거롭다
스프링 부트는 자체적인 웹 서버를 내장, 빠르고 간편하게 배포를 진행 가능
스프링 부트를 사용하면 독립적으로 실행 가능한 Jar 파일로 프로젝트를 빌드할 수 있어, 클라우드 서비스 및 도커와 같은 가상화 환경에 빠르게 배포 가능
Structured Query Language 구조화 질의어
관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어
Data Definition Language (정의)
Cteate, Drop, Alter
Data Manipulation Language (조작)
Insert Into, Update ~Set, Delete From, Select
Data Control Language (제어)
Grant, Revoke, Set Transaction, Begin, Commit, Rollback, SavePoint, Lock
쓰레드는 어떤 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.
한 프로그램은 하나 이상의 스레드를 가진다. MultiThread
- 멀티프로세스 vs 멀티스레드
둘 모두 여러 흐름이 동시에 진행된다.
멀티프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지한다.
멀티스레드는 프로세스 내의 메모리를 공유해 사용할 수 있다.
프로세스 간의 전환(Context Switching) 속도보다 스레드 간의 전환 속도가 빠르다.
- 멀티 프로세스
장점 : 여러 개의 자식 프로세스 중 하나에 문제가 발생해도, 다른 프로세스로 영향이 확산되지 않는다.
단점 : Context Switching 에서의 오버헤드
프로세스 사이의 어렵고 복잡한 통신 기법 (IPC : Inter Process Communication)
- 멀티 스레드
장점 : CPU가 여러 개일 경우 각각의 CPU가 스레드 하나씩을 담당하여 속도를 높일 수 있다. 여러 스레드가 실제 시간상으로 동시에 수행될 수 있기 때문이다.
프로세스 내에서 힙, 데이터를 공유하기 때문에 메모리를 절약할 수 있다.단점 : 주의 깊은 설계가 필요하다
각 스레드 중 어떤 것이 먼저 실행될지 그 순서를 알 수 없다.
자원 공유 문제가 발생 할 수 있다.(동기화 문제) 이런 경쟁 상태인 경우 원인을 찾기 힘들다. 즉, 디버깅이 까다롭다.
스레드 하나가 잘못된 연산이나 버그 등으로 비정상 종료한다면 같은 프로세스에 소속된 다른 스레드들까지 모두 강제로 종료된다.
트랜잭션은 DBMS 또는 유사한 시스템에서 상호작용의 단위, 논리적 실행단계
(트랜랙션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템)
작업의 단위는 질의어 한문장이 아닌것에 주의!
트랙잭션을 조작하는 기능은 사용자가 DB 완전성(Integrity)유지를 확신하게 한다.
ACID : DB 트랜잭션이 안전하게 수행된다는 것을 보장하는 성질
원자성(Atomicity) : 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장
일관성(Consistency) : 트랜잭션 전후 데이터 모순이 없는 상태를 유지하는 것
독립성(Isolation) : 트랜잭션 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장
지속성(Durability) or 영구성 : 성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다.
- ACID 속성을 구현하는 건 간단한 문제가 아니다. 트랙잭션 처리는 인덱스 업데이트를 비롯한 수많은 변화가 필요하다. 연산 순서는 실패의 원인이 되기도 한다. 공간부족이나 CPU 자원 점유문제도 있다.
- ACID는 DB의 모든 연산이 한번에 실행되는 것을 권장
널리 사용하는 두 가지 방법으로 로깅방식과 새도우 패이징이 있다.
모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다.
트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있다.
트랜잭션 상태

Commit : 모든 작업들을 정상 처리하겠다고 확정하는 명령어
해당 처리 과정을 DB에 영구 저장, Commit을 수행하면 하나의 트랜잭션 과정이 종료
Roll-back : 트랜잭션의 처리 과정에서 발생한 변경사항을 취소하는 명령어
트랜잭션은 시작되기 이전의 상태로 되돌아간다. 마지막 Commit을 완료한 시점으로 돌아간다는 말과도 같다.
트랜잭션 예외 : DDL문은 트랜잭션의 rollback 대상이 아니다
DDL문 : Create, Drop, Alter, Rename, Truncate
Spring 이 제공하는 트랜잭션 핵심 기술
트랜잭션 동기화, 트랜잭션 추상화, AOP를 이용한 트랜잭션 분리
Test-Driven Development 테스트 주도 개발
매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나
요구사항을 검증하는 테스트 케이스 작성 - 테스트 케이스 통과하기 위한 최소한의 코드 작성 - 작성한 코드를 표준에 맞게 리팩토링
TDD 자체가 하나의 테스트가 완전하지 않다는 것을 가정하고 있기 때문에,
테스트를 완료한 다음 새로운 테스트 케이스를 확장해서 작성하고 통과하기 위한 개발을 하는 과정을 끊임없이 반복
주의사항!
실패하는 테스트 코드를 작성할 때까지 실제 코드를 작성하지 않는것
실패하는 테스트를 통과할 정도의 최소 실제 코드를 작성

Unified Modeling Language 통합 모델링 언어
객체 지향 프로그래밍 소프트웨어 집약 시스템을 개발할 때 산출물을 명세화, 시각화, 문서화할 때 사용

Virtual Private Network 가상사설망
공중 네트워크를 통해 한 회사나 단체가 내용을 바깥 사람에게 드러내지 않고 (암호화 하여) 통신할 목적으로 쓰이는 사설 통신망
공중망(Public Network) : 불특정 다수의 사용자에게 서비스를 제공하는 통신망, 일반적인 인터넷
eXtensible Markup Language
특수한 목적을 갖는 마크업 언어를 만드는데 사용하는 다목적 마크업 언어.
데이터를 기술하는 데 사용할 수 있다.
다른 종류의 시스템(특히 인터넷에 연결된 시스템)끼리 데이터를 쉽게 주고 받을 수 있게 하여 HTML의 한계를 극복할 목적으로 만들어 졌다.
XML은 구조적인 데이터를 위한 것이다.
XML은 다소 HTML 같이 보인다.
XML은 텍스트이며, 읽히는 것만을 뜻하지 않는다.
XML은 크기가 커진다.
XML은 기술의 집합이다.
XML은 새로운 기술이 아니라 발전한 기술이다.
XML은 HTML에서 XHTML로 이끌었다.
XML은 모듈식이다.
XML은 RDF와 시맨틱 웹의 토대이다.
XML은 라이선스 제약이 없으며, 플랫폼이 독립적이고, 많은 지원이 있다.