TIL 24 [ Spring ( 3 Layer 아키텍처, DB, SQL, JDBC, SQL Mapper ) ]

2025. 3. 21. 22:36·[내일배움캠프-Sparta]/Spring 6기
반응형

1️⃣ 3 Layered Architecture

  • 애플리케이션을 세 가지 주요 계층으로 나누어 구조화하는 방법으로 각 계층은 특정한 책임을 갖고 있음.
  • 계층 간 명확한 역할 분담이 이뤄져 코드의 재사용성, 유지보수성, 확장성  ↗

초록색 동그라미 부분이 이번에 다룰부분임.

기존의 MVC 패턴에 Cotroller는 역할이 너무 많다.

  1. 요청에 대한 처리
  2. 예외처리
  3. 응답, 요청
  4. 비즈니스 로직 처리
  5. DB 상호작용

실제 이렇게 관리하면 나중에 유지보수 측면에서 많이 어려움을 겪을 것이다. 컨트롤러 라는 이름에 걸맞게 코드를 써야한다. 그래서 나눌 필요가 있다. 나눔으로써 코드의 가독성과 유지보수 가 좋아지게 될 것이다.

3 Layer 아키텍처 구조

  • Presentation Layer [ 요청, 응답 ]
    • 사용자의 요청을 받고 응답하는 역할을 수행한다.
    • 화면을 응답하거나 데이터를 응답하는 API를 정의한다.
  • Business Layer(Service Layer)  [ 서비스, 비즈니스 로직 ]
    • 비지니스 로직을 수행한다.
    • 요청을 해석하여 Repository Layer에 전달한다.
    • 일반적으로 하나의 비지니스 로직은 하나의 트랜잭션으로 동작한다.
  • Data Access Layer(Repository Layer) [ 데이터 관리 , DB ]
    • 데이터베이스와 연동되어 실제 데이터를 관리한다. [ 직접 DB에 연결 됨 ]설명

1. Controller

 

  • 클라이언트의 요청을 받는 역할을 수행
  • 요청에 대한 처리를 Service에 전달함.
  • Service에서 처리 완료된 결과를 응답함.
  • 사용하는 어노테이션 : @Controller, @RestController

2. Service

  • 사용자의 요청 사항을 처리 [ 비즈니스 로직 ]
  • DB와 상호작용 필요시, Repository에게 전달.
  • 사용하는 어노테이션 : @Service

3. Repository

  • DB와 상호작용을 수행
    • Connection 연결, 해제
    • CRUD 작업처리 
  • 사용하는 어노테이션 : @Repository

4. DTO

  • 계층간 데이터 전달을 위해 사용
  • 요청 데이터를 처리하는 객체 RequestDto 로 표현
  • 응답 데이털를 처리하는 객체 ResponseDto 로 표현

2️⃣ DB ( Database )

데이터의 집합으로, 데이터를 S/W에서 효율적으로 관리하기 위한 저장소이다. 

▶  여러 데이터들을 모아 놓은곳 ( 데이터 저장소 )

 

DBMS(Database Management System)

  • Database를 관리하고 운영하는 시스템
  • 데이터를 정의, 저장, 검색, 수정, 삭제하는 등의 작업을 효율적으로 수행할 수 있게 해준다.
  • 다수 사용자들이 동시에 데이터에 접근하고, 데이터를 안전하게 관리할 수 있도록 다양한 기능을 제공한다.
  • SQL이라는 언어로 DBMS에 데이터 관리를 요청하면 DBMS가 요청을 처리한다.

DBMS 기능

  1. 데이터 정의
    • 데이터베이스 구조를 정의하는 기능 제공
  2. 데이터 관리
    • 데이터를 물리적으로 저장하고, 관리하는 역할
    • 사용자가 데이터를 다룰수 있도록 SQL 쿼리언어 제공
  3. 데이터 보안
    • 사용자 권한 관리, 암호화, 감사 로그등 데이터를 보호
  4. 트랜잭션 관리
    • ACID 속성 보장
      • 원자성(Atomaticy) : 트랜잭션의 모든 작업이 성공적으로 완료되거나 실패시 모든 작업이 롤백
      • 일관성(Consistency) : 트랜잭션이 데이터베이스를 일관된 상태로 유지
      • 고립성(Isolation) : 동시에 실행되는 트랜잭션 간의 영향을 최소화
      • 영속성(Durability) : 트랜잭션이 완료된 후 데이터의 변경 사항은 영구적으로 저장
  5. 백업 및 복구
    • 데이터 손실에 대비 복구, 백업기능 제공
  6. 동시성 제어

  • 다수의 사용자가 동시에 DB에 접근하더라도 데이터 일관성이 유지되도록 동시성 제어를 제공함. 이를 통해 충돌이나 데이터 불일치를 방지.

 

DBMS 종류

  1. 관계형 DBMS(RDBMS)  ★
    • 가장 많이 사용하는 DB
    • 데이터를 테이블 형태로 구조화해 저장하고 관리하는 시스템
    • 테이블 간의 관계를 이용해 데이터를 연결함
    • 대기업, 중견 기업에서 주로쓰임
    • ex) MySQL, Oracle, PostgreSQL
  2. 비관계형 DBMS(NoSQL)
    • 테이블이 아닌 key-value, document, graph 등의 다양한 형태로 데이터를 저장하고 관리한다.
    • 스키마가 고정되지 않고, 대규모 데이터 처리와 높은 확장성을 제공한다.
    • 중소 기업, 스타트업에서 많이 쓰임
    ex) MongoDB, Cassandra, Redis 등
  3. 다중 모델 DBMS
    • 하나의 데이터베이스 관리 시스템에서 여러 데이터 모델을 지원하는 시스템이다.
    • 동일한 DBMS에서 관계형 데이터뿐만 아니라 문서형, 그래프형 데이터를 함께 관리할 수 있다.
    ex) Amazon DynamoDB, Microsoft Azure Cosmos DB 등

트랜잭션

DB에서 하나의 논리적인 작업 단위를 뜻하며, 트랜잭션으로 묶인 작업들은 모두 성공적으로 완료되거나 하나라도 실패시 전체가 취소 된다 ( 롤백 ).

▶ 원자성과 일치함.

 

계좌이체 예시 

실패 예시 ( 롤백 )
성공 예시 ( 완료 )

RDBMS

관계형 데이터베이스 RDB를 관리할 수 있는 S/W로 데이터를 테이블 형식으로 관리함.

▶ 데이터 간 관계를 정의하고, 이러한 관계를 바탕으로 복잡한 쿼리를 실행할 수 있는 기능을 제공

 

특징

1. 테이블 형식

  • RDBMS에서 데이터는 테이블이라는 구조에 저장되며 행(row)과 열(column)로 구성된다.
  • 열(column)은 데이터의 속성(유일한 이름)을 나타내고 타입(데이터 유형)을 가진다.
  • 행(row)은 관계된 데이터의 묶음을 의미하고 tuple 또는 record라고 한다.
  • 데이터 무결성
    • 테이블은 특정 규칙과 제약 조건(기본 키, 외래 키, 유니크 등)을 통해 데이터를 저장함으로써 데이터의 무결성(정확성, 일관성, 유효성)을 유지

2. 관계

  • 테이블 간의 관계는 외래 키(Foreign Key)를 통해 설정된다.
  • RDBMS는 다양한 유형의 관계를 지원한다.
    • 1:1 관계: 한 테이블의 한 행이 다른 테이블의 한 행과만 연결된다.
    • 1:다 관계: 한 테이블의 한 행이 다른 테이블의 여러 행과 연결된다.(위 예시와 같음)
    • 다:다 관계: 두 테이블의 여러 행이 서로 연결될 수 있다.

3. SQL

  • RDBMS에서 데이터를 정의하고, 관리하기 위한 표준 언어이다.
  • 데이터를 생성(Create), 읽기(Read), 갱신(Update), 삭제(Delete)하는 작업을 수행한다.

4. 키 (Keys)

  • 기본 키(Primary Key)
    • 테이블 내에서 각 행을 고유하게 식별하는 열 또는 열의 조합이다.
    • 기본 키는 중복된 값을 허용하지 않으며, NULL 값을 가질 수 없다.
  • 외래 키(Foreign Key)
    • 한 테이블의 열이 다른 테이블의 기본 키를 참조하여 두 테이블 간의 관계를 설정하는 데 사용된다.
    • 테이블 간의 데이터 무결성을 유지할 수 있다.
  • 유일 키(Unique Key)
    • 기본 키와 유사하지만, 하나의 테이블에서 여러 개가 존재할 수 있다.
    • 중복된 값을 허용하지 않지만, NULL 값은 허용할 수 있다.
    • ex) 이메일, 주민등록번호 등 (민감한 정보들)

5. 트랜잭션(Transaction)

  • RDBMS는 트랜잭션이라는 단위를 통해 데이터베이스 작업을 처리하며, 이를 통해 데이터의 일관성과 무결성을 유지한다.
  • 트랜잭션은 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability)이라는 ACID 속성을 따른다.
    • Atomicity: 트랜잭션의 모든 작업이 성공적으로 완료되거나, 실패 시 모든 작업이 롤백
    • Consistency: 트랜잭션이 데이터베이스를 일관된 상태로 유지
    • Isolation: 동시에 실행되는 트랜잭션 간의 영향을 최소화
    • Durability: 트랜잭션이 완료된 후 데이터의 변경 사항은 영구적으로 저장

6. 정규화

  • 데이터의 중복을 줄이고, 일관성과 무결성을 유지하기 위해 데이터를 구조화하는 프로세스이다.
  • 여러가지 정규화 단계가 있으며, 각 단계는 데이터 중복을 줄이고 이상 현상을 방지하는 데 목적이 있다.

7. 데이터 무결성 (Data Integrity)

  • 엔터티 무결성
    • 각 테이블의 기본 키(PK)가 중복되지 않고 NULL 값이 아닌 상태를 유지한다.
  • 참조 무결성
    • 외래 키(FK)를 통해 참조되는 데이터가 유효성을 유지하도록 보장한다.
  • 도메인 무결성
    • 각 열이 정의된 데이터 타입과 제약 조건에 따라 유효한 값을 유지하도록 한다.

8. 인덱스 (Index)

  • 특정 열의 검색 성능을 향상시키기 위해 사용된다.
  • 인덱스는 테이블의 데이터를 정렬하고, 효율적으로 접근할 수 있도록 지원한다.
  • 인덱스가 많아지면 삽입 및 수정 작업의 성능에 영향을 미칠 수 있다.

 

대표적인 RDBMS

  • MySQL
    • 오픈소스 기반의 RDBMS로 무료로 제공된다.
    • 빠른 속도와 높은 성능, 다양한 기능을 제공한다.
    • 광범위한 운영체제와 플랫폼에서 사용할 수 있다.
    • 전 세계적으로 널리 사용되며, 방대한 문서와 커뮤니티가 있어 학습 및 문제 해결이 용이하다.
    • 트래픽에 따라 확장할 수 있다.
  • PostgreSQL
  • Oracle Database
  • Microsoft SQL Server

SQL

SQL은 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 정의, 조작, 제어, 조회하기 위해 사용되는 표준 프로그래밍 언어임.

 

특징

  • 관계형 데이터베이스와의 상호작용을 표준화하고 효율적으로 수행할 수 있게 해준다.
    • 데이터베이스에서 원하는 정보를 추출하고 분석할 수 있게 해준다.
  • 대부분의 RDBMS(MySQL, PostgreSQL, Oracle 등)가 SQL을 지원한다.
  • 표준 SQL은 존재하지만, 제품마다 조금씩의 차이(함수명)가 존재한다.
  • SQL 명령문은 대소문자를 구분하지 않고, 대문자로 사용하면 가독성이 향상되어 오타를 방지한다.
  1. DDL(Data Definition Language)
    • 데이터베이스 구조를 정의하는 데 사용된다.
    • CREATE
      • 새로운 데이터베이스 및 테이블을 생성한다.
    • ALTER
      • 기존 데이터베이스 및 테이블 구조를 수정한다.
    • DROP
      • 데이터베이스 및 테이블을 삭제한다.
  2. DML(Data Manipulation Language)
    • 데이터베이스의 데이터를 조작하는 데 사용된다.
    • INSERT
      • 데이터를 테이블에 삽입한다.
    • UPDATE
      • 테이블의 기존 데이터를 수정한다.
    • DELETE
      • 테이블의 데이터를 삭제한다.
  3. DQL(Data Query Language)
    • 데이터베이스에서 데이터를 검색(조회)하는 데 사용된다.
    • SELECT
      • 데이터를 조회한다. 특정 조건을 추가할 수 있다.
  4. DCL(Data Control Language)
    • 데이터베이스의 권한을 관리하는 데 사용된다.
    • GRANT
      • 사용자에게 권한을 부여한다.
    • REVOKE
      • 사용자의 권한을 회수한다.
  5. TCL(Transaction Control Language)
    • 여러 DML 작업을 하나의 논리적 단위로 묶어 트랜잭션으로 처리하는 데 사용된다.
    • COMMIT
      • 트랜잭션이 성공한 것을 데이터베이스에 알리고 모든 변경 사항을 영구적으로 저장한다.
    • ROLLBACK
      • 트랜잭션 중 발생한 모든 변경 사항을 취소하고, 데이터베이스를 트랜잭션 시작 시점의 상태로 되돌린다.

3️⃣ JDBC

Java 언어를 사용하여 DB와 상호 작용하기 위한 자바 표준 인터페이스로 데이터베이스 관리 시스템(DBMS)과 통신하여 데이터를 삽입(C), 검색(R) , 수정(U) 및 삭제(D)할 수 있게 해준다.  ▶ 인터페이스는 implements하여 확장

JDBC 특징

  1. 표준 API
    • 대부분의 RDBMS (관계형 데이터베이스 관리 시스템)에 대한 드라이버가 제공되어 여러 종류의 DB 대해 일관된 방식으로 상호 작용할 수 있다.
    ex) Database 종류가 바뀌어도 쿼리문이 실행된다. MySQL → ORACLE
  2. 데이터베이스 연결
  3. SQL 쿼리 실행
  4. Prepared Statement
  5. 결과 집합 처리(Result Set)
    1. 데이터베이스로부터 반환된 결과 집합을 처리할 수 있다.
    ex) 데이터를 조회하고 결과를 Java 객체로 매핑할 수 있다.
  6. 트랜잭션 관리
    • JDBC를 사용하여 데이터베이스 트랜잭션을 시작, 커밋(성공) 또는 롤백(실패)하는 등의 트랜잭션 관리 작업을 수행할 수 있습니다

Statement VS Prepared Statement

Statement

  • DB와 연결되어 있는 Connection 객체를 통해 SQL문을 Database에 전달하여 실행하고, 결과를 반환받는 객체
  • SQL 쿼리를 직접 문자열로 작성하여 데이터베이스에 보내는 방법이다.
  • SQL 쿼리는 실행 전에 문자열 형태로 전달되고, 실행 시점에 데이터베이스에 직접 파싱되고 실행.
  • 매번 실행할 때마다 SQL 문을 다시 파싱하므로 성능에 영향을 미칠 수 있고, 보안 취약점을 가질 수 있습니다.

Prepared Statement ★

SQL문을 Complie 단계에서 ? 를 사용하여 preCompile 하여 미리 준비해놓고 Query문을 파라미터 바인딩 후 실행하고 결과를 반환받는다. 미리 준비해놓았다(Pre) 중요!

예시

  • SQL 쿼리를 미리 컴파일하여 데이터베이스에 전송할 때 값만 바뀌는 형태로 전달한다.
  • 쿼리가 한 번 컴파일되면 여러 번 실행할 수 있으며, 성능이 향상되고 보안 측면에서 더 안전한다.
  • 동적인 입력값을 placeholder?로 대체하고 파라미터 바인딩을 통해 쿼리를 삽인한다. 즉, 사용자 입력을 직접적으로 쿼리에 삽입하지 않는다.
  • 이스케이핑 처리를 지원한다. 말그대로 탈출(Escape), 입력값이 자동으로 쿼리에 안전하게 이스케이핑된다. 이스케이핑은 입력 데이터에서 잠재적인 SQL 쿼리 문자열을 무력화한다.

4️⃣ SQL Mapper

직접 작성한 SQL 문의 실행 결과와 객체(Object)의 필드를 Mapping하여 데이터를 객체화한다. 대표적인 SQL Mapper로 Spring JDBC Template, MyBatis가 있다.

  • Spring JDBC Template
    • Spring Framework에서 제공하는 JDBC 작업을 단순화하고 개선한 유틸리티 클래스
  • JDBC Template의 장점
    1. 간편한 데이터베이스 연결
      • 손수 적었던 Connection 관련 코드들을 yml 혹은 properties 파일에 설정만으로 해결한다.
    2. Prepared Statement를 사용한다.
    3. 예외 처리와 리소스 관리
      • DB Connection을 자동으로 처리하여 리소스 누수를 방지한다.
    4. 결과 집합(ResultSet) 처리
      • 데이터를 자바 객체로 변환할 수 있도록 돕는다.
    5. 배치 처리 작업을 지원한다.
      • 매일 동일한 시간에 수행되는 쿼리, 주로 통계에 사용된다.

MyBatis

  • SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL을 분리하여 관리되도록 만들어준다.
  • SQL과 Java Code의 분리가 핵심
  • Query를 JAVA에서 XML로
    • 복잡한 JDBC 코드가 사라진다.
    • ResultSet과 같이 결과값을 맵핑하는 객체가 없다.
    • 설정이 간단하다.
    • 관심사를 분리한다. → SQL 을 따로 관리한다.
    • XML 안에있는 SQL을 Java의 메소드에 매핑해준다.
  • MyBatis 장점
    1. 자동으로 Connection 관리를 해주면서 JDBC 사용할 때의 중복 작업 대부분을 없애준다.
    2. DB 결과 집합을 자바 객체로 매핑할 수 있다.
    3. 복잡한 쿼리나 다이나믹하게(동적쿼리) 변경되는 쿼리 작성이 쉽다.
      1. 상황에 따라 분기처리(IF)를 통해 쿼리를 동적으로 만들어주는것.
    4. 관심사 분리 - DAO로부터 SQL문을 분리하여 코드의 간결성 및 유지보수성이 향상된다.
    5. 쿼리 결과를 캐싱하여 성능을 향상시킬 수 있다.

 

  • SQL Mapper의 한계
    1. SQL을 직접 다룬다.
    2. 특정 DB에 종속적으로 사용하기 쉽다.
      1. DB마다 Query문, 함수가 조금씩 다르다.
      → 다른 DB를 사용하면 쿼리도 변경해야할 가능성이 높다.
    3. 테이블마다 비슷한 CRUD SQL, DAO(Data Access Object) 개발이 반복된다. → 코드 중복
    4. 테이블 필드가 변경될 시 이와 관련된 모든 DAO의 SQL문, 객체의 필드 등을 수정해야 한다.
      1. 코드상으로 SQL과 JDBC API를 분리했지만 논리적으로 강한 의존성을 가지고 있다.
    5. 객체와의 관계는 사라지고 DB에 대한 처리에 집중하게 된다. → SQL 의존적인 개발
  • 관계형 DB와 객체지향의 패러다임 불일치
    • 객체지향으로 설계된것을 관계형 DB에 저장하기란 어렵다.
    • 테이블에 저장한 데이터를 다시 객체화 하는것도 어렵다.

패러다임 불일치 문제를 해결하기 위해 이후 ORM이 등장 ( JPA Hibernate )

반응형

'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글

TIL 26 [ Spring 일정관리 앱 과제 해설 + 학습법 & 동기부여 세션 ]  (0) 2025.03.26
TIL 25 [ Spring 일정 관리 앱 과제 ( 필수 . . . JDBC..??) + 미니세션 ( API, ERD ) ]  (0) 2025.03.24
TIL 23 [ Spring ( 응답 데이터, 메모장 만들기 실습 ) + 스탠다드반 ( 예외처리 )]  (0) 2025.03.20
TIL 22 [ Spring ( 어노테이션II, Request Mapping, 요청 데이터) ]  (0) 2025.03.19
TIL 21 [ Spring( 어노테이션, lombok, 프레임워크, 빌드 도구, 웹 기술 역사 + 스탠다드반 (Spring MVC) ]  (0) 2025.03.18
'[내일배움캠프-Sparta]/Spring 6기' 카테고리의 다른 글
  • TIL 26 [ Spring 일정관리 앱 과제 해설 + 학습법 & 동기부여 세션 ]
  • TIL 25 [ Spring 일정 관리 앱 과제 ( 필수 . . . JDBC..??) + 미니세션 ( API, ERD ) ]
  • TIL 23 [ Spring ( 응답 데이터, 메모장 만들기 실습 ) + 스탠다드반 ( 예외처리 )]
  • TIL 22 [ Spring ( 어노테이션II, Request Mapping, 요청 데이터) ]
dimenshun
dimenshun
한 소년의 개발 일기
    반응형
  • dimenshun
    Dev Life Notes
    dimenshun
  • 전체
    오늘
    어제
    • 분류 전체보기 (268)
      • CS (23)
        • 자료구조 (0)
        • 알고리즘 (0)
        • 컴퓨터 구조 (8)
        • 네트워크 (6)
        • 운영체제 (3)
        • DB ( + SQLD ) (5)
        • SW공학 (1)
      • 프로그래밍 (3)
        • Java (0)
        • Spring (0)
        • HTML,CSS (3)
        • JavaScript (0)
      • 개발 툴 (7)
        • Git(버전관리) (1)
        • Docker (3)
        • AWS (2)
        • JSP (1)
      • 코딩테스트(Algorithm) (125)
        • 백준 (6)
        • 프로그래머스 (119)
      • [내일배움캠프-Sparta] (110)
        • Spring 6기 (106)
        • KPT 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SQLD
    내일배움캠프
    OS
    네트워크
    db
    운영체제
    It
    코딩테스트
    트랜잭션
    web
    메모리
    Java
    컴퓨터구조
    세션
    AWS
    docker
    개발자
    spring
    SQL
    배포
    network
    CPU
    알고리즘
    Python
    Til
    cs
    Testcode
    웹
    백엔드
    KPT
  • hELLO· Designed By정상우.v4.10.3
dimenshun
TIL 24 [ Spring ( 3 Layer 아키텍처, DB, SQL, JDBC, SQL Mapper ) ]
상단으로

티스토리툴바