Java/Spring

[Spring] 4. 데이터베이스 작업

Sigfriede 2023. 6. 5. 14:10

  데이터베이스(Database)란 데이터를 보관하기 위한 상자라고 할 수 있습니다. 데이터베이스에서 데이터를 모을 때는 특정한 규칙을 적용하여 데이터를 정리해서 보관합니다. 관계형 데이터베이스(Relational Database)는 데이터를 표 형식으로 표현하고, 여러 표에서 항목의 값 사이에 관계를 맺고 있는 데이터베이스를 말합니다. 데이터베이스의 특징으로는 다음과 같습니다.

  • 실시간 접근성(real time accessibillity): 사용자가 데이터를 요청하면 수 초 내에 결과를 서비스
  • 계속적인 변화(continuous change): 어느 한 순간의 상태를 나타내지만, 데이터 값은 시간에 따라 항상 바뀜. 삽입, 삭제, 수정 등의 작업을 통해 바뀐 데이터 값을 저장
  • 동시 공유(concurrent sharing): 서로 다른 업무 또는 여러 사용자에게 동시에 공유
  • 내용에 따른 참조(reference by content): 데이터베이스에 저장된 데이터는 데이터의 물리적인 위치가 아니라 데이터 값에 따라 참조
  • 데이터 독립성(Data Independence): 응용 프로그램과 데이터베이스를 독립 데이터의 논리적 구조를 변경시켜도 응용 프로그램은 변경되지 않음

 

  테이블이란 데이터베이스 안에서 실제로 규칙을 가진 데이터가 저장되는 상자를 의미합니다. 테이블은 데이터를 항목으로 이차원 표 형식으로 정리해서 저장합니다.

  테이블의 가로 행(row)을 레코드(record), 세로 열(column)을 칼럼(column)이라고 합니다. 하나의 레코드는 한 건의 데이터를, 하나의 칼럼은 데이터의 각 요소입니다.

  열1 열2
행1 데이터1 - 1 데이터1 - 2
행2 데이터2 - 1 데이터2 - 2

 

  SQL(Structured Query Language)은 데이터베이스를 조작하기 위한 언어입니다. 사양이 표준화되어 있어 다른 데이터베이스에서도 거의 같은 방법으로 조작할 수 있습니다.

  CRUD란 영속적으로 데이터를 취급하는 4개의 기본적인 기능인 생성(Create), 읽기(Read), 갱신(Update), 삭제(Delete)의 머리글자를 따서 만든 단어입니다. SQL은 테이블 상의 레코드에 대해 CRUD를 조작하는 구문을 제공합니다.

CRUD 구문
생성
(Create)
INSERT INTO 테이블명 (칼럼명, 칼럼명, …) VALUES (값, 값, …);
읽기
(Read)
SELECT 칼럼명 FROM 테이블명;
갱신
(Update)
UPDATE 테이블명 SET 칼럼명 = 값 WHERE 갱신할_레코드를_특정하는_조건;
※ WHERE로 조건을 지정하지 않는 경우 모든 레코드를 대상으로 함
삭제
(Delete)
DELETE FROM 테이블명 WHERE 삭제할_레코드를_특정하는_조건;
※ WHERE로 조건을 지정하지 않는 경우 모든 레코드를 대상으로 함

  SQL은 스키마를 사전에 정의해야 합니다. 모든 열과 데이터 유형이 사전에 파악되어야 데이터를 데이터베이스에 작성할 수 있다는 것입니다. 키를 사용하여 여러 테이블을 연결하는 방식으로 정보를 저장합니다. 이 과정에서 여러 테이블 간 관계가 형성됩니다.

  SQL과 대응되는 것은 NoSQL입니다. 이는 비관계형 데이터베이스 유형을 가리키며 관계형 테이블과는 다른 형식으로 데이터를 저장합니다. 사전에 스키마를 정의하지 않아도 데이터를 저장할 수 있습니다. 신속한 수평적 확장 능력 덕분에 높은 트래픽을 처리할 수 있고 적응력이 뛰어납니다.

  그러나 NoSQL이 모든 상황에서 뛰어난 것은 아닙니다. NoSQL은 비정규화된 데이터에 의존하며 상대적으로 적은 수의 데이터(또는 컨테이너)를 사용하는 애플리케이션 유형을 지원합니다. 따라서 금융, 회계 등 데이터 변형 및 데이터 중복을 방지하기 위해 고도로 정규화된 데이터에 의존해야 하는 경우에는 어울리지 않습니다.

  또한 NoSQL의 또 다른 특징으로는 쿼리 복잡성이 있습니다. 단일 테이블에 대한 쿼리 작업에는 잘 작동합니다. 그러나 쿼리 복잡성이 높아지는 경우, NoSQL은 복잡한 조인, 하위 쿼리 및 WHERE절에서의 중첩 쿼리를 제공하지 않습니다. 이런 상황에서는 관계형 데이터베이스가 더 유리합니다.

  SQL
(관계형
데이터베이스)
NoSQL
(비관계형
데이터베이스)
특징 1. 열과 테이블로 이루어진 정규화된 데이터를 다룸
2. 데이터의 스키마를 미리 정의하고 데이터는 정의된 스키마에 따라 저장됨
3. 테이블 간 관계를 이용하여 데이터를 조작 및 조인할 수 있음
1. 비구조화된 데이터 형태를 다룸
(예: 키-값, 문서, 그래프 등)
2. 확장성과 유연성에 초점
장점 1. ACID(원자성, 일관성, 고립성, 지속성) 트랜잭션을 지원하여 데이터 무결성과 안정성을 보장
2. SQL 언어를 이용하여 복잡한 데이터베이스 조작을 수행할 수 있음
3. 스키마를 미리 정의하므로 데이터의 구조와 제약 조건을 명확하게 알 수 있음
1. 수평적인 확장을 지원하여 대규모 데이터베이스를 효과적으로 처리할 수 있음(분산 저장 지원)
2. 특정 작업에 대해 빠른 응답 시간과 높은 처리량
단점 1. SQL은 수직적 확장에 의존하므로 수평적인 확장에는 제한이 있을 수 있음
2. 정해진 스키마를 따르기 때문에 데이터 구조의 변경이 어려울 수 있음
1. 데이터 일관성이 지켜지지 않을 수 있음
2. 쿼리 언어를 제공하지 않기 때문에 쿼리 복잡성이 올라갈 경우 기능이 제한될 수 있음
3. 다양한 유형의 데이터베이스 시스템을 포괄하므로 공통된 표준이 부족할 수 있음
대표
애플리
케이션
MySQL, Oracle Database, PostgreSQL 등 MongoDB, Cassandra, Redis 등

  두 가지 모두 명확한 장단점이 있으므로 데이터베이스를 어떤 식으로 운영해나갈 것인지 분석하고, 조건과 상황에 맞는 데이터베이스 유형을 선택하면 될 것 같습니다.

 

  엔티티(Entity)는 데이터베이스에서 에이블의 한 행(레코드)에 대응하는 객체입니다. 엔티티의 필드는 테이블의 칼럼값에 대응합니다. 리포지토리(Repository)는 데이터베이스를 조작하는 클래스입니다. 리포지토리를 생성하는 경우에는 반드시 인터페이스를 정의하고 구현해야 합니다. 리포지토리 인터페이스의 필드에 리포지토리 구현 클래스를 DI하여 특정 구현에 의존하는 것을 피할 수 있기 때문입니다.

 

  O/R 매퍼(Object-relational Mapper)는 애플리케이션에서 사용하는 객체(Object)와 관계형 데이터베이스(Relational)의 데이터를 매핑하는 것입니다. 미리 설정된 객체와 관계형 데이터베이스 간 대응 관계 정보가 바탕이 됩니다. 인터페이스의 데이터에 대응하는 테이블에 내보내거나 데이터베이스에서 값을 읽어 들여 인터페이스에 대입하는 작업을 자동으로 실행합니다.

  스프링 데이터 JDBC는 O/R 매퍼로, 스프링 데이터가 제공하는 CrudRepository를 상속하여 자동으로 CRUD를 지원하는 메서드를 사용할 수 있습니다. 책에는 JDBC가 O/R 매퍼로 분류되어 있지만, 찾아보니 엄밀히 분류하면 SQL 매퍼로 분류되는 듯 합니다(아닐 수도!). O/R 매퍼 역시 보편적으로는 ORM이라는 용어를 쓰는 듯 보입니다.

  영속성 프레임워크(Persistence Framework)는 데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일을 모아놓은 것입니다. 이를 이용하여 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있다는 장점이 있습니다. 그 중 하나가 ORM이며 ORM은 SQL Mapper와 비교할 수 있습니다.

  ORM은 Java 객체와 관계형 데이터베이스 테이블 간의 매핑을 중심으로 하며, 객체를 중심으로 데이터베이스 작업을 추상화합니다. SQL이 자동으로 생성된다는 장점이 있습니다. 대표적으로는 JPA가 있으며 구현체로는 Hibernate가 있습니다. 반면에 SQL Mapper는 Java와 데이터베이스의 단순한 매핑에 중점을 두고 있으며 명시적인 SQL 쿼리를 작성하여 데이터베이스 작업을 처리합니다. 대표적으로는 앞서 설명한 JDBC가 있으며 이를 기반으로 만들어진 프레임워크 MyBatis가 있습니다.

 

참고 문서: Oracle NoSQL Database

https://www.oracle.com/kr/database/nosql/what-is-nosql/

 

  ※ "스프링 프레임워크 첫걸음"이라는 책을 참고하여 쓴 게시글로, 책의 내용을 완전히 담지 않되 공부한 부분을 위주로 정리하여 작성하고자 했습니다. 따라서 글에는 책에서 다루지 않은 내용도 포함되어 있으며 문제가 되거나 부정확한 부분이 있다면 알려주시면 감사하겠습니다.

  ※ 책은 게시글보다 정확한 내용을 담고 있으며 코드, 그림, 예제를 이용하여 개념을 자세히 설명합니다.