(SDM; Software Development Methodology) :
소프트웨어를 개발하는 방법에 대한 이론으로서, 소프트웨어 개발 과정, 절차, 방법, 산출물, 기법, 도구들을 체계적으로 정리하고 표준화시킨 것입니다.

(Structured Development) :
전체 시스템을 정형화된 분석 절차에 따라 요구사항을 파악하여 문서화 하고, 이를 기반으로 소트프웨어를 개발하는 방법론 입니다.

“거시적 관점”이 부족하다는 한계가 있음
(Information Engineering Development) :
비즈니스 시스템 규모 성장과 소프트웨어 공학 발전에 따라 1980년대 중반에 등장한 방법론으로
기업 전체, 또는 기업의 주요 부분을 계획, 분석, 설계 및 구축에 정형화 된 기법들을 상호 연관성 있게 통합, 적용하는 데이터 중심 방법론 입니다.

“경직된 구조”로 이전 단계의 변화에 대응하기 어려움
(Object-Oriented Development) :
현실 세계의 개체(Entity)를 속성(Attribute)과 메소드(Method)가 결합된 형태의 객체(Object) 로 표현하며,
이 객체들이 메시지 교환을 통해 상호 작용함으로써 전체 시스템이 운영되도록 개발하는 방법론입니다.

개발 수준이 저 수준의 추상화 개념이므로 실제로 재사용 가능한 소프트웨어 개발은 기대하기 어려움
(Component Based Development) :
컴포넌트를 조립하여 시스템을 개발 하여 객체지향의 단점인 S/W 재사용성을 극대화한 개발 방법론입니다.

(Agile Software Development) :
기존 개발 방법론들이 너무 절차를 중시한 나머지 변화에 대응하기 어려웠던 단점을 개선하기 나왔습니다.
미래를 예측하기 보다는 주기적으로 제작 프로토타입을 시험해보는 철저한 관리를 통한 개발 방법론이라 할 수 있으며
끊임없이 개발하고 수정하는 일을 반복하면서 고객이 가장 만족할 수 있는 방향으로 소프트웨어를 개발합니다.

(Test Driven Development) :
전통적인 개발 방법론에서의 구현 후 테스트를 수행하는 단계와는 반대로 테스트를 먼저 수행하고, 소프트웨어를 구현하는 개발 방법론입니다.

(Behaviour Driven Development) :
TDD에서 파생된 개발 방법론으로, 사용자의 행위를 정의하고 이에 대한 테스트 코드를 작성하면서 소프트웨어를 개발하는 방법입니다.
(Software Development Life Cycle, SDLC)
시스템 엔지니어링, 정보 시스템, 또는 소프트웨어 공학에서 정보 시스템을 계획, 개발, 시험, 채용하는 과정을 뜻하는 용어입니다.
대게 요구사항 분석→설계→개발→테스트→운영 단계로 구성되어 있습니다.
DBMS마다 Lock를 구현하는 방식과 세부 적용 방법은 다르지만,
데이터의 접근을 제한함으로써 일관성을 보장하기 위한 방법으로 기본적인 개념은 유사합니다.
DB Lock은 적용 대상과 상황에 따라 분류할 수 있습니다.
Transaction 간의 lock 경합이 발생하여, 작업이 진행되지 않고 멈춰선 상태를 말합니다.
Shared Lock 간에는 발생하지 않지만, Exclusive Lock에선 경합을 하여 우선 순위에 따라 Transaction이 수행됩니다.
이렇게 Blocking 된 Transaction은 lock이 해제 될 때까지 대기하게 되며, 이는 성능에 좋지 않는 영향을 미칩니다.
경합을 최소화하기 위해선 아래의 사항을 준수합니다.
Dead lock(교착 상태)은 두 개 이상의 작업이 서로 상대방의 작업이 끝나길 기다리고 있기 때문에, 결과적으로 아무것도 완료되지 못하는 상태를 말합니다.
Database에서 dead lock은 서로 다른 Transaction 간의 교착 상태를 의미합니다.
DBMS마다 Dead Lock을 관리하는 방법이 상이합니다.
MySQL-innodb 기준으로 아래의 쿼리를 통해 확인 할 수 있습니다.
mysql> show engine innodb status
위 쿼리를 수행하면 현재 innodb의 상태 정보를 표출되며, 최근 발생한 Dead lock 정보를 확인 할 수 있습니다.

만약 모든 deadlock에 대해 확인 하고 싶은 경우, 아래의 설정을 변경합니다.
[my.cnf]
[mysqld]
innodb_print_all_deadlocks = 1
또는
mysql> SET GLOBAL innodb_print_all_deadlocks = 1;
DB Transaction은 DBMS 또는 이와 유사한 시스템에서 사용되는 상호 작용의 단위입니다.
즉, 시스템을 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위로, 한번에 모두 수행되어야 할 일련의 연산들을 의미합니다.
ACID(원자성, 일관성, 고립성, 지속성)는 데이터베이스 Transaction이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어입니다.
Transaction은 시스템에 적용하기 위한 연산으로 Commit와 Rollback이 있습니다.

Transaction의 ACID를 엄격하게 준수하면, 데이터의 적합성은 보장 할 수 있지만 동시성 효율은 매우 떨어지게 됩니다.
이러한 Trade-off 관계에서 데이터베이스는 서로 다른 Transaction이 어느 정도 허용이 가능하도록 격리 수준을 지원합니다.
(Level 수준이 높을 수록 엄격한 격리 수준을 제공)
| Name | Level | Dirty Read | Non-Repeatable Read | Phantom Read | 정합성 | 동싱성 |
|---|---|---|---|---|---|---|
| Serializable | 3 | X | X | X | 높다 | 낮다 |
| Repeatable Read | 2 | X | X | O | 중간 | 중간 |
| Read Committed | 1 | X | O | O | 중간 | 중간 |
| Read Uncommitted | 0 | O | O | O | 낮다 | 높다 |
Transaction이 사용 중인 테이블의 모든 Row에 대한 접근을 제한합니다.
이 격리 수준에서는 단순한 Select 쿼리가 실행되더라도, 다른 Transaction이 데이터에 접근 할 수 없습니다.
가장 높은 데이터 접합성을 보장하지만, 그만큼 성능은 가장 느립니다.
Transaction이 Active 될 때 수행한 시간을 기록하고, 해당 시점을 기준으로 consistent read를 수행합니다.
하지만 새로운 Row가 추가 되는 것을 막지는 않습니다.
* consistent read : Read operation을 수행 할 때, 현재 DB의 값이 아닌 특정 시점의 snapshot을 읽어 오는 것
Transaction은 읽기 연산 마다 DB Snapshot를 생성합니다.
이로 인해, 커밋이 완료된 다른 Transaction의 변경 사항은 consistent read 시 반영됩니다.
대부분의 DBMS가 기본 모드로 채택하고 있는 격리 수준입니다.
커밋이 되지 않은 데이터 변경을 다른 Transaction이 조회 가능하도록 허용하는 격리 수준입니다.
데이터 부정합 문제가 발생할 확률은 높아지지만, 그만큼 성능은 가장 빠릅니다.
Spring boot project를 내장 톰캣으로 실행시킬 때 아래의 오류가 발생함.
Error occurred during initialization of VM
Could not reserve enough space for 2097152KB object heap
해당 오류는 프로젝트 실행 시 heap 메모리가 부족하다는 오류입니다.
Help > Change Memory Settings
-Xms1024m -Xmx2048m
The maximum theoretical heap limit for the 32-bit JVM is 4G.
Due to various additional constraints such as available swap, kernel address space usage, memory fragmentation, and VM overhead, in practice the limit can be much lower.
On most modern 32-bit Windows systems the maximum heap size will range from 1.4G to 1.6G. On 32-bit Solaris kernels the address space is limited to 2G. On 64-bit operating systems running the 32-bit VM, the max heap size can be higher, approaching 4G on many Solaris systems.
32bit JVM은 이론상 최대 4GB의 메모리를 사용 할 수 있지만, Windows 환경에선 2GB로 제한됩니다. 이로 인해 2GB 이상의 프로젝트를 실행 할때 해당 오류가 발생 한 것입니다.
HTTP Cookie는 서버에 의해 브라우저에 저장되는 데이터 조각입니다.
Cookie는 2개의 유형으로 나뉩니다.
Http는 connectionless & Stateless(무상태성, 상태 정보를 가지 않는) 프로토콜입니다.
서버는 요청한 클라이언트의 상태 정보를 알 수 없기 때문에, 매번 인증 절차를 수행해야 합니다.
