RDBMS는 관계형 데이터베이스로, 테이블 간의 관계나 스키마를 지정해야 합니다.
장점은 복잡한 데이터를 다루기 쉽고, 트랜잭션을 통한 안정적인 데이터 관리에 용이합니다.
단점은 유연성이 낮아 성능을 향상 시키기 위해서는 Scale-Up만 가능하기에 높은 비용이 듭니다.NoSQL은 Not Only SQL의 약자로, 비관계형 데이터베이스를 의미합니다.
장점은 사전에 스키마를 정의하지 않아도 됩니다. 따라서 하나의 저장소 내에서 다양한 형식의 데이터를 다루기 쉽게 처리할 수 있습니다.
또한, Scale-Out이 가능하여 확장성과 유연성이 높습니다.
단점은 스키마를 정의하지 않는다는 특징 때문에 데이터 변형 및 중복을 막기 위한 데이터 사용시에는 부적합합니다.
RDBMS의 정규화는 데이터베이스 설계에서 중복을 제거하고 데이터 중복을 최소화하여 데이터베이스를 보다 효율적으로 설계하는 과정입니다. 그러나 과도한 정규화는 성능 저하를 일으킬 수 있으므로 적절한 수준에서의 정규화가 필요합니다.
대체로 비용이 적게 들이면 MySql을 선호하고, 충분한 예산과 복잡한 비즈니스 요구를 수행해야 하는 큰 프로젝트는 Oracle을 선호합니다. Oracle은 메모리 사용율이 커서 최소 수백MB 이상이 되어야 설치 가능하지만 메모리 사용율이 낮은 MySQL은 1MB 환경에서도 설치가 가능합니다.
- Oracle은 대규모 트랜잭션 로드를 처리하고 성능을 최적화하기 위해 여러 서버에 대용량 DB분산 절차적 언어를 통해 DB에 내장된 프로그램의 작성을 지원합니다. MySQL은 단일 DB로 제한되어 있어, 매일 수백만번 액세스하는 대용량 DB에는 부적합합니다. DB를 이전 상태로 복원하는데 도움이 되는 저장점이 없고 COMMIT과 ROLLBACK만 존재합니다.
테이블에서 데이터를 유일하게 구분하는 키를 Primary Key(기본키)라고 하며, 각 테이블 간에 연결을 만들기 위해서 다른 테이블의 참조되는 키를 Foreign Key(외래키)라고 합니다.
1. 컴파일러가 자바 소스를 바이트코드로 변환한다.
2. Class Loader가 바이트 코드를 런타임 데이터 영역에 로드시킨다.
3. 로딩된 바이트 코드가 실행엔진에 의해서 실행되게 된다.
스레드별 PC Register, JVM Stack, Native Method Stack이 있고, 공통 스레드는 Method Area, Heap이 있다.
JVM에서 메모리를 관리해주며, Heap 메모리를 재활용하기 위해서 더 이상 참조되지 않는 객체들을 메모리에서 제거하는 모듈이다. 개발자가 직접 메모리를 정리하지 않아도 되어서 개발속도가 향상되는 장점이 있지만 Mark and Sweep이라는 과정에서 참조되지 않는 객체를 찾는 과정이 있는데, 이때 스레드가 잠깐 중단되어서 성능이 떨어진다는 단점이 있다.
객체지향 프로그래밍은 프로세스 중심이 아닌 객체중심으로 프로그래밍으로 구현하는것이다. (재사용 가능)
객체지향 프로그래밍의 4가지 특징은 추상화, 캡슐화, 다향성, 상속성이 있다.
- 추상화는 클래스들의 공통적인 특성들을 묶어 표현하는 것이다.
- 캡슐화는 데이터를 보호, 은닉하는 목적으로 사용한다.
- 상속성은 부모 클래스에 정의된 변수 및 메서드를 자식 클래스에서 상속받아 사용하는 것이다.
- 다형성은 하나의 타입에 여러 객체를 대입할 수 있는 성질이다.
추상클래스는 abstract 지시자로 정의되며 추상메소드가 하나 이상 포함된다. 인터페이스는 interface 지시자로 정의하며 모든 메소드가 추상메소드로 정의한다.
추상클래스와 인터페이스의 차이는 그 존재의 목적에 있습니다. 추상클래스는 상속받아서 기능을 재활용하고 확장시키는데 목적이 있다면, 인터페이스는 함수의 구현을 강제해서 구현한 객체들이 같은 동작을 하는것을 보장하는 것에 그 목적이 있습니다.
Call by Reference는 클래스 객체를 인수로 전달하는 경우로, 매개변수의 원래 주소에 값을 저장하는 방식입니다. Call by Value는 인수로 기본 데이터형을 사용하는 경우로, 주어진 값을 복사하여 처리하는 방식입니다. 매서드 내의 처리 결과는 메서드 밖의 변수에 영향을 미치지 않습니다.

Public은 접근 제한이 없어 같은 프로젝트 내에 어디서든 사용이 가능합니다.
Protected는 같은 패키지 내에 다른 패키지에서 상속 받아 자식 클래스에서 접근이 가능합니다.
Default는 같은 패키지 내에서만 접근이 가능합니다.
Private는 같은 클래스 내에서만 접근이 가능합니다.


MVC 패턴은 Model, View, Controller의 약자로, Model은 데이터와 비즈니스 로직을 관리, View는 레이아웃과 화면을 처리, Controller는 사용자의 입력 처리와 흐름 제어 담당, 화면과 Model, View를 연결해주는 역할입니다.
클라이언트의 요청 사항을 모듈화 되지 않은 하나의 파일로 처리할 것인지 각각의 기능을 담당하는 모듈들이 역할을 분담해서 처리할 것인지로 결정됩니다.
MVC1은 JSP에서 View, Controller의 역할을 담당하지만, MVC2는 Model, Controller, View 부분로 모듈화 되어 JSP는 로직 처리가 없이 단순히 Client에게 보여지는 뷰만을 담당합니다.
HTTP 메서드는 크게 GET, POST, PUT, DELETE, PATCH 다섯 가지로 나눌 수 있습니다.
GET은 데이터를 가져오는 용도로 사용되며, POST는 데이터를 보내거나 전송하는 용도로 사용됩니다. PUT은 데이터를 갱신하거나 수정하는 용도로 사용되고, DELETE는 데이터를 삭제하는 용도로 사용됩니다. PATCH는 데이터를 부분적으로 수정하는 용도로 사용됩니다.
운영체제의 최소 단위인 프로세스는 운영체제가 Code, Data, Stack, Heap 메모리 영역을 할당해준다. 스레드는 프로세스 내에서 Stack 메모리 영역을 제외한 다른 영역을 같은 프로세스 내에서 다른 스레드와 공유한다.
프로세스가 다른 프로세스와 정보를 공유하기 위해서는 번거로운 과정을 거쳐야 하지만 스레드는 프로세스 안에서 메모리를 공유하는 구조이기 때문에 다른 스레드와 정보 공유가 용이하다.
1. 사용자가 URL을 입력하면 브라우저는 웹 서버에 HTTP 요청을 보내고 데이터를 수신합니다.
2. 받은 HTML과 CSS는 파싱되어 DOM과 CSSOM 트리를 생성하며, 이들은 렌더 트리로 병합됩니다.
3. 렌더 트리를 기반으로 레이아웃 단계에서 각 요소의 크기와 위치를 계산합니다.
4. 계산된 정보로 화면에 페이지를 그리는 페인팅 단계가 이루어집니다.
5. 필요한 JavaScript가 실행되고 모든 요소가 로드되면 페이지가 완성되어 사용자와 상호 작용합니다.
CORS는 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처(프로토콜, 도메인, 포트번호)의 리소스에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제입니다.
쿠키는 클라이언트(사용자) 측에서 사용되는 작은 데이터 파일입니다. 웹 서버는 클라이언트에게 쿠키를 전송하여 저장시키고, 클라이언트는 이 쿠키를 요청마다 함께 전송합니다. 쿠키는 클라이언트 컴퓨터에 저장되어 웹사이트를 방문할 때마다 사용될 수 있습니다.
세션은 서버(웹 서버) 측에서 사용되는 데이터 저장 방식입니다. 클라이언트가 웹사이트에 접속하면, 서버는 클라이언트에게 고유한 세션 ID를 부여하고, 이 세션 ID를 통해 클라이언트의 상태 정보를 서버에 저장합니다. 세션은 서버에 저장되기 때문에 클라이언트가 임의로 변경할 수 없고, 일정 시간 동안 유지됩니다.
즉, 쿠키는 클라이언트 측에서 저장되고 클라이언트 요청마다 사용되며, 세션은 서버 측에서 저장되고 클라이언트의 상태 정보를 유지합니다.
TCP는 웹 페이지나 이메일 같이 신뢰성과 순서 보장이 필요한 경우에 사용합니다.
UDP는 음성 및 비디오 스트리밍 같이 빠른 전송이 중요하고, 일부 패킷 손실이 허용되는 경우에 사용합니다.
HTTP는 평문 형태로 데이터를 전송하며, 기본적으로 80번 포트를 사용합니다. 보안 수준이 낮으나 설정이 간단합니다.
HTTPS는 SSL/TLS를 사용해 데이터를 암호화하며, 기본적으로 443번 포트를 사용합니다. 보안이 높으나 인증서 필요합니다.
DI는 의존성 주입(Dependency Injection)이란 뜻으로,
의존 관계를 외부에서 결정 하여 주입하는 것을 의미합니다.IoC는 제어의 역전(Inversion of Control) 이라는 의미입니다.
메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미합니다.
트래픽 증가에 따라 서버의 수를 늘려서 처리 능력을 향상시키거나 서버에 트래픽을 균등하게 분배하여 개별 서버에 가해지는 부하를 줄일 수 있고, 자주 요청되는 데이터나 결과를 캐시에 저장하여 빠르게 줄이는 등 서버의 부하를 줄일 수 있습니다.