[DB] 데이터베이스 기초 — RDB 설계·MyBatis·Maven vs Gradle
목차
Relational Database (관계형 데이터베이스)

- 관계형 모델: 데이터를 행(row)과 열(column)로 이뤄진 테이블로 정의
- AutoIncrement: DB가 자동으로 다음 값을 증가시켜 PK로 사용 (Surrogate Key)
- MySQL은 오라클에 인수된 이후 오픈소스 진영에서 MariaDB가 파생
주요 제약 조건 (Constraint)
| 제약 | 설명 |
|---|---|
| PK (Primary Key) | 각 row를 고유하게 식별, AutoIncrement로 자동 생성 가능 |
| FK (Foreign Key) | 다른 테이블과의 관계 정의, 잘못 사용하면 DB 조작이 어려워짐 |
| UQ (Unique) | 중복 불허, 로그인 ID 등 명백한 키에 적용 |
JPA를 사용하면 PK·FK 관리를 프레임워크가 대신 처리해준다.
Docker로 MySQL 실행

docker run —name mysql-stub -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 -d mysql:8
| 옵션 | 설명 |
|---|---|
--name | 컨테이너 이름 지정 |
-e | 환경 변수 설정 (예: MySQL 루트 비밀번호) |
-p 3306:3306 | 호스트 포트:컨테이너 포트 바인딩 |
-d | 백그라운드(detach) 모드로 실행 |
-d없이 실행하면 터미널에 컨테이너가 붙어있는 상태가 됨docker logs <컨테이너>: 컨테이너 로그 확인docker inspect <컨테이너>: 컨테이너 실행 상태 확인docker rm -f mysql: 컨테이너 강제 삭제
데이터 무결성과 Volume
- 컨테이너는 삭제하면 내부 DB 데이터도 함께 삭제됨
-v(volume) 옵션: 컨테이너 내부 디렉토리를 호스트 디렉토리와 연결하여 데이터를 영속 보존- Docker Compose: 명령어로 전달할 내용을 파일로 저장해 한 번에 여러 컨테이너를 실행하는 편의 도구
MySQL 설정

- 스키마: 조작하기 위한 테이블들이 모여있는 단위
- 운영 환경에서는 root 계정 직접 사용을 권장하지 않음 → 전용 계정 생성 후 권한 부여
create database demo_school;
create user 'staff' identified by 'password';
grant insert,
delete,
create,
drop,
select,
update on demo_school.* to staff;
ER Diagram (Entity-Relationship Diagram)

- DB 설계 시 다이어그램을 먼저 그리는 것이 좋다
- 관계 예시:
- 유저 1명이 애플리케이션 여러 개 소유 가능 (1:N)
- 하나의 애플리케이션에 여러 Role이 들어갈 수 있어 조인 테이블 활용
- Role은 반복 입력을 방지하기 위해 별도 테이블로 분리
- Scope은 Role에 종속되어 1:N 관계
- AppKey를 통해 접근 권한을 위임

돈이 들어가는 서비스는 상태 이력(입금·취소 등)이 생겨 DB 설계가 복잡해진다.
Java에서 DB 사용하기
- 원초적인 방법: JDBC (Java Database Connectivity) Connection을 직접 받아와 사용
- MyBatis: 인터페이스에 정의된 쿼리문을 실행하는 SQL 매퍼 프레임워크
MyBatis 주요 개념
useGeneratedKeys: INSERT 후 자동 생성된 PK를 DTO에 채워서 반환keyProperty: 반환받을 DTO의 키 속성 지정- 매퍼 인터페이스를 통해 쿼리 실행, INSERT 반환값은
int(영향받은 row 수)
Maven vs Gradle


두 도구 모두 빌드 자동화 도구(Build Automation Tool) 이며 Maven Central Repository에서 라이브러리를 내려받아 사용한다.
| 항목 | Maven | Gradle |
|---|---|---|
| 설정 파일 | pom.xml | build.gradle (Groovy / Kotlin DSL) |
| 빌드 방식 | 라이프사이클 기반, 순차 빌드 | Incremental Build (변경된 부분만 빌드) |
| Task 정의 | 플러그인 의존, 자유도 낮음 | 커스텀 Task 정의 가능, 자유도 높음 |
| 속도 | 초기에는 빠르게 느껴지나 대규모에서 느려짐 | 수정이 잦은 대규모 프로젝트에서 빠름 |
| 특이사항 | mvnw (Maven Wrapper) 지원 | gRPC 프로토콜 등 커스텀 빌드 설정에 유리 |
Maven과 Gradle은 완전한 상호 호환이 아니라 다른 목적으로 설계된 도구. 환경 설정 방식이 다르다.