웹 애플리케이션 개발을 쉽게, 효율적으로, 그리고 구조적으로 도와주는 소프트웨어 플랫폼(여러 라이브러리와 기능을 묶어서 제공)
서버와 클라이언트 간 요청과 응답을 처리하고, 시스템의 안정성과 보안을 유지
// 클라이언트가 /users URL로 GET 요청을 보내면 사용자 목록을 반환하는 메서드를 실행
@GetMapping("/users")
public List<User> getUsers() {
return userService.getAllUsers();
}
//클라이언트가 /users URL로 POST 요청을 보내면 새로운 사용자를 생성하는 메서드를 실행.
@PostMapping("/users")
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
Thread 관리 : 요청을 처리하기 위한 서버는 여러 Thread 사용, 각 요청마다 별도의 스레드를 생성하거나 할당 및 관리, 동시에 여러 요청을 처리, 데이터베이스 접속을 위한 Thread 할당 및 관리, 백그라운드 작업에도 스레드 사용.
WAS(Web Application Server), DB(Database), OS(Operating System) 모두 자체적으로 스레드를 생성하고 관리
WAS Thread(여기선 이걸 말함): 클라이언트의 요청을 처리하는 애플리케이션 서버의 스레드.
DB Thread: 데이터베이스 작업을 처리하기 위해 할당된 스레드.
OS Thread: 운영 체제 수준에서 관리되는 스레드. WAS와 DB 스레드도 결국 OS 스레드 위에서 동작.
데이터베이스 동시성 제어 : 다수의 클라이언트 요청이 동시에 데이터베이스에 접근할 때, 데이터 충돌을 방지하기 위해 동시성을 제어.
데이터베이스는 하나인데 여러 스레드가 동시에 접근하면 일관성 문제가 발생할 수 있음
Isolation Level(격리 수준)
데이터베이스 트랜잭션 간에 데이터를 겹치게 볼 수 있는지 결정.
예) 두 사용자가 동시에 같은 데이터를 읽거나 수정하려는 경우 어떻게 처리할지 정의.격리 수준 : READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE 등이 있음.
Serialization(직렬화) / Deserialization(역직렬화) : 요청, 응답 시 어플리케이션의 객체와 클라이언트의 JSON 사이 변환
Security : CORS 규칙 등에 대한 보안 관련 정의 및 처리
Authentication(인증) / Authorization(인가) : 인증(사용자가 누구인지 확인), 인가(사용자가 어떤 사용 권한이 있는지 확인)
라우팅: 클라이언트의 요청(URL 경로)에 따라 적절한 로직(메서드)을 호출.
템플릿 엔진: 동적인 HTML 생성.
데이터베이스 연동: ORM(Object-Relational Mapping) 또는 SQL 쿼리를 통해 데이터 처리.
보안: 인증, 인가, CORS, CSRF 보호.
세션 및 쿠키 관리: 사용자 상태 및 정보 유지.
HTTP 요청 수신: 클라이언트가 서버로 요청을 보냄.
라우팅 처리: 프레임워크가 URL과 요청 메서드(GET, POST 등)에 따라 적합한 메서드로 연결.
비즈니스 로직 처리: 개발자가 작성한 코드 실행.
데이터베이스 연동: 필요한 데이터를 읽거나 수정.
응답 생성: 동적으로 HTML 생성, 또는 JSON 데이터를 반환.
HTTP 응답 전송: 처리 결과를 클라이언트에게 반환.
웹 어플리케이션 프레임워크는 아래의 2가지를 제공
다수의 라이브러리 제공 : 개발 편의성을 위한 다양한 라이브러리 제공
다수의 인터페이스 제공 : 개발을 위한 껍데기를 제공할뿐 필요한것은 직접 구현 혹은 라이브러리 교체
즉, 많은 수의 라이브러리가 필요하기에 1. 어떤 라이브러리를 사용하고, 2. 어떤 버전을 사용할지 관리가 필요
결과적으로, 프레임워크 사용 시 라이브러리에 대한 버전 관리를 위한 Package Manager 가 필요
Javascript 는 npm 사용
package.json
Python 은 pip 사용
Ruby 는 bundler 사용
Java 는 Maven 혹은 Gradle 사용
build.gradle
CRUD = 데이터 조회 및 조작 : Create, Read, Update, Delete
- 동적 데이터를 저장하는 저장소이기에 데이터를 식별할때는 무조건 ID 를 사용할 것
- 동적 데이터이기에 데이터는 매번 바뀐다. 데이터가 바뀌더라도 고유의 ID 로 일관적인 조회 가능
- 데이터 식별을 이름 으로 하였다면, Aaron 이 Baron 으로 개명되었을때 조회 실패
- 데이터 식별을 ID 로 하였다면, Aaron 이 Baron 으로 개명되어도 여전히 ID 1번으로 조회 성공
생성 방식 심화 : 고유 식별자로 일반적으로는 숫자로 구성된 ID 를 쓰지만, UUID(GUID), CUID 가 필요할때가 있다.
Auto Increment ID : 2가지 문제가 있다
UUID (Universally/Globally Unique Identifier) - int float 등 숫자가 제한됨
CUID (Collision-Resistant Unique Identifier) : 분산 시스템에서 적당한 옵션
NanoID : 순서 보장이 굳이 필요없지만, CUID 보다 더 짧은 아이디를 원하는 경우
심화 : ID Generator 중 Snowflake
- Transaction 이란? 단일 데이터베이스에 다수 접근이 충돌나지 않게 번호표를 주고, 순서대로 처리 -> 요청 간 순서 제어를 통해 데이터 무결성을 보장.
Java
Spring Framework: 강력한 확장성과 다양한 기능을 제공하는 대표적인 Java 기반 웹 프레임워크.
Struts: 오래된 Java 프레임워크로, MVC 아키텍처 기반.
Python
Django: "배터리 포함" 철학으로, 웹 개발에 필요한 모든 기능을 내장.
Flask: 간단하고 경량화된 Python 기반 프레임워크.
JavaScript:
Express.js: Node.js 기반의 경량 웹 프레임워크.
Next.js: React와 통합된 서버사이드 렌더링(SSR) 지원 프레임워크.
Ruby:
Ruby on Rails: 개발 생산성을 극대화하는 Ruby 기반 프레임워크
PHP:
Laravel: 직관적이고 아름다운 코드로 유명한 PHP 프레임워크.