🧑🏫 목표
- Layered Architecture와 데이터베이스의 기본 개념을 이해하고, MySQL 설치와 SQL 작성 실습을 통해 데이터베이스 시스템의 작동 방식을 익힌다.
Layered Architecture

- 기존의 MVC 패턴에서 Controller는 역할이 무수히 많다.
- 요청에 대한 처리
- 예외처리
- View Template 응답 or Data 응답
- 비지니스 로직 처리
- DB 상호작용
- 문제점
- Controller에서 요청에 대한 모든 처리를 수행한다. 즉, 책임이 너무 많다.
- 기능 추가, 수정, 삭제 등의 유지보수가 힘들어진다.
- 코드의 재사용성이 떨어진다. 메서드로 분리하여도 메서드를 호출하는 중복 코드가 발생한다.
- Layered Architecture 구조

- Presentation Layer: 요청을 받고 응답하는 역할
- Business Layer:
- 비지니스 로직 수행
- Repository Layer에 전달
- 일반적으로 하나의 비지니스 로직은 하나의 트랜잭션으로 동작
- Repository Layer: 데이터베이스와 연동
- 용어 설명
- DTO(Data Transfer Object)
- 계층간 데이터 전달을 위해 사용되는 객체이다.
- Model
- Entity
- 추후 숙련주차에 배울 JPA와 관련이 있다.
- JPA에서는 Entity라는 형태로 데이터를 반환한다.
- DAO(Data Access Object)
Controller : @Controller, @RestController
Service: @Service
Repository: @Repository
DTO: 계층간 데이터 전달을 위해 사용
Database
여러 사람이 공유하고 사용할 목적으로 한 곳에서 관리되는 데이터의 조직화된 집합으로, 데이터를 소프트웨어에서 효율적으로 관리하기 위한 저장소이다. 데이터베이스 관리 시스템(DBMS)에 의해 제어된다.


RDBMS
관계형 데이터베이스 RDB(Relational DataBase)를 관리할 수 있는 소프트웨어로 데이터를 테이블 형식으로 관리한다. RDBMS는 데이터 간의 관계를 정의하고, 이러한 관계를 바탕으로 복잡한 Query를 실행할 수 있는 기능을 제공한다.
- 테이블
- RDBMS에서 데이터는 테이블이라는 구조에 저장되며 행(row)과 열(column)로 구성된다.
- 열(column)은 데이터의 속성(유일한 이름)을 나타내고 타입(데이터 유형)을 가진다.
- 행(row)은 관계된 데이터의 묶음을 의미하고 tuple 또는 record라고 한다.
- 데이터 무결성
- 테이블은 특정 규칙과 제약 조건(기본 키, 외래 키, 유니크 등)을 통해 데이터를 저장함으로써 데이터의 무결성(정확성, 일관성, 유효성)을 유지한다.
- 관계 (Relationships)
- 테이블 간의 관계는 외래 키(Foreign Key)를 통해 설정된다.
- RDBMS는 다양한 유형의 관계를 지원한다.
- 1:1 관계: 한 테이블의 한 행이 다른 테이블의 한 행과만 연결된다.
- 1:다 관계: 한 테이블의 한 행이 다른 테이블의 여러 행과 연결된다.
- 다:다 관계: 두 테이블의 여러 행이 서로 연결될 수 있다.
- SQL (Structured Query Language)
- RDBMS에서 데이터를 정의하고, 관리하기 위한 표준 언어이다.
- 데이터를 생성(Create), 읽기(Read), 갱신(Update), 삭제(Delete)하는 작업을 수행한다.
- 키 (Keys)
- 기본 키(Primary Key)
- 테이블 내에서 각 행을 고유하게 식별하는 열 또는 열의 조합이다.
- 기본 키는 중복되지 않으며, NULL 값을 가질 수 없다.
- 외래 키(Foreign Key)
- 한 테이블의 열이 다른 테이블의 기본 키를 참조하여 두 테이블 간의 관계를 설정하는 데 사용된다.
- 테이블 간의 데이터 무결성을 유지할 수 있다.
- 유일 키(Unique Key)
- 기본 키와 유사하지만, 하나의 테이블에서 여러 개가 존재할 수 있다.
- 중복된 값을 허용하지 않지만, NULL 값은 허용할 수 있다.
- 트랜잭션(Transaction)
- RDBMS는 트랜잭션이라는 단위를 통해 데이터베이스 작업을 처리하며, 이를 통해 데이터의 일관성과 무결성을 유지한다.
- 트랜잭션은 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability)이라는 ACID 속성을 따른다.
- Atomicity: 트랜잭션의 모든 작업이 성공적으로 완료되거나, 실패 시 모든 작업이 롤백
- Consistency: 트랜잭션이 데이터베이스를 일관된 상태로 유지
- Isolation: 동시에 실행되는 트랜잭션 간의 영향을 최소화
- Durability: 트랜잭션이 완료된 후 데이터의 변경 사항은 영구적으로 저장
- 정규화 (Normalization)
- 데이터의 중복을 줄이고, 일관성과 무결성을 유지하기 위해 데이터를 구조화하는 프로세스이다.
- 여러가지 정규화 단계가 있으며, 각 단계는 데이터 중복을 줄이고 이상 현상을 방지하는 데 목적이 있다.
- 데이터 무결성 (Data Integrity)
- 엔터티 무결성
- 각 테이블의 기본 키(PK)가 중복되지 않고 NULL 값이 아닌 상태를 유지한다.
- 참조 무결성
- 외래 키(FK)를 통해 참조되는 데이터가 유효성을 유지하도록 보장한다.
- 도메인 무결성
- 각 열이 정의된 데이터 타입과 제약 조건에 따라 유효한 값을 유지하도록 한다.
- 인덱스 (Index)
- 특정 열의 검색 성능을 향상시키기 위해 사용된다.
- 인덱스는 테이블의 데이터를 정렬하고, 효율적으로 접근할 수 있도록 지원한다.
- 인덱스가 많아지면 삽입 및 수정 작업의 성능에 영향을 미칠 수 있다.
SQL(Structured Query Language)
SQL은 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 정의, 조작, 제어, 조회하기 위해 사용되는 표준 프로그래밍 언어이다.
- SQL 종류
- DDL(Data Definition Language)
- 데이터베이스 구조를 정의하는 데 사용된다.
- CREATE
- ALTER
- 기존 데이터베이스 및 테이블 구조를 수정한다.
- DROP
- DML(Data Manipulation Language)
- 데이터베이스의 데이터를 조작하는 데 사용된다.
- INSERT
- UPDATE
- DELETE
- DQL(Data Query Language)
- 데이터베이스에서 데이터를 검색하는 데 사용된다.
- SELECT
- 데이터를 조회한다. 특정 조건을 추가할 수 있다.
- DCL(Data Control Language)
- 데이터베이스의 권한을 관리하는 데 사용된다.
- GRANT
- REVOKE
- TCL(Transaction Control Language)
- 여러 DML 작업을 하나의 논리적 단위로 묶어 트랜잭션으로 처리하는 데 사용된다.
- COMMIT
- 트랜잭션이 성공한 것을 데이터베이스에 알리고 모든 변경 사항을 영구적으로 저장한다.
- ROLLBACK
- 트랜잭션 중 발생한 모든 변경 사항을 취소하고, 데이터베이스를 트랜잭션 시작 시점의 상태로 되돌린다.
JDBC
Java 언어를 사용하여 DB와 상호 작용하기 위한 자바 표준 인터페이스로 데이터베이스 관리 시스템(DBMS)과 통신하여 데이터를 삽입(C), 검색(R) , 수정(U) 및 삭제(D)할 수 있게 해준다.
- JDBC의 주요 특징
- 표준 API
- 대부분의 RDBMS (관계형 데이터베이스 관리 시스템)에 대한 드라이버가 제공되어 여러 종류의 DB 대해 일관된 방식으로 상호 작용할 수 있다.
- 데이터베이스 연결
- SQL 쿼리 실행
- Prepared Statement
- 결과 집합 처리(Result Set)
- 데이터베이스로부터 반환된 결과 집합을 처리할 수 있다.
- 트랜잭션 관리
- JDBC를 사용하여 데이터베이스 트랜잭션을 시작, 커밋(성공) 또는 롤백(실패)하는 등의 트랜잭션 관리 작업을 수행할 수 있습니다.
정리
-
Spring MVC 구조
- 프론트 컨트롤러 : DispatcherServlet
- 어댑터 패턴 : HandlerAdapter
- View 응답 : View Resolver
-
Layered Architecture
- Controller
- 요청, 응답
- Service
- 비지니스 로직
- @Service
- Repository
- 데이터베이스 상호 작용
- @Repository
- DTO
- Layer간 데이터 전달
-
Prepared Statement
- query를 미리 준비한다.
- Statement에 비해 성능면에서 뛰어나다.
- 웹 보안을 유지할 수 있다.
-
Persistence Framework
- JDBC API를 사용한다.
- Prepared Statement를 사용한다.
- JDBC 처럼 복잡함이나 번거로움 없이 간단한 작업만으로 Database와 연동된다.
- 자원 관리(Connection)를 자동으로 해준다.
- SQL Mapper