목차
1. 프로젝트 개요
2. ERD 모델링 및 테이블 설계
2-1. 새 모델 생성 및 다이어그램 추가
2-2. 테이블 추가 및 컬럼 정의
- 사용자 테이블 (BOARD_USER_TB)
- 게시글 테이블 (BOARD_POST_TB)
- 댓글 테이블 (BOARD_COMMENT_TB)
2-3. 기본 키(PK), 외래 키(FK) 설정
3. 쿼리 추출 및 실행
3-1. Forward Engineer로 쿼리 추출
3-2. 추출된 쿼리 실행 (테이블 생성)
3-3. SQL 파일 저장
1. 프로젝트 개요
이번 글에서는 MySQL Workbench를 사용해 ERD를 그리고,
그 결과를 바탕으로 SQL 쿼리를 추출하여 실제 테이블을 생성하는 과정을 다뤄보겠습니다.
간단하고 빠르게 기본적인 데이터베이스 구조를 만드는 것이 목표입니다.
그래서 복잡한 기능을 과감히 생략하고, 최소한의 구조로 CRUD 개발이 가능한 수준까지만 설계했습니다.
작업의 범위는 다음과 같습니다.
- 회원가입/로그인 없이 회원 테이블만 존재 (비회원 기능 제외)
- 게시글, 댓글 테이블만 존재 (대댓글, 첨부파일 등의 기능 제외)
처음이신 분들도 따라오실 수 있도록 워크벤치의 사용법을 설명하면서 진행하겠습니다.
그럼 지금부터 ERD 모델링을 시작하겠습니다.
2. ERD 모델링 및 테이블 설계
2-1. 새 모델 생성 및 다이어그램 추가
먼저 MySQL Workbench를 실행합니다.
실행 후, 왼쪽 상단에 보이는 회색 박스를 더블클릭하면 데이터베이스 접속 창이 열립니다.
비밀번호를 입력하라는 창이 뜨면 본인의 MySQL 계정 비밀번호를 입력해줍니다.

비밀번호를 입력하고 접속에 성공하면, 아래와 같은 홈 화면이 나타납니다.

이제 본격적으로 ERD 모델링을 시작해보겠습니다.
왼쪽 상단 메뉴에서 File > New Model 을 클릭합니다.

새 모델이 생성되면 MySQL Model 이라는 창이 열립니다.
상단 아이콘 중에서 Add Diagram 이라는 아이콘을 더블클릭합니다.

그러면 아래처럼 빈 ERD Diagram 창이 열립니다.
이제 이 공간에서 본격적으로 테이블을 생성하고 관계를 연결하며 ERD를 구성해볼 수 있습니다.

2-2. 테이블 추가 및 컬럼 정의
왼쪽에 보이는 세로 아이콘 중, 위에서 7번째에 있는 아이콘에 마우스를 올려보면 Place a New Table 이라는 문구가 나타납니다.
이 아이콘을 클릭한 후, ERD의 빈 공간 아무 곳이나 클릭하면 새 테이블이 추가됩니다.

만들어진 테이블을 더블클릭하면 하단에 테이블 이름과 컬럼을 정의할 수 있는 입력창이 열립니다.
각 입력 항목은 다음과 같습니다.
- Table Name : 테이블 이름
- Column Name : 컬럼 이름
- DataType : 컬럼의 데이터타입 (INT, VARCHAR 등)
- PK (Primary Key) : 기본키 설정 (고유값, 중복 불가)
- NN (Not Null) : Null 값을 허용하지 않음
- UQ (Unique) : 중복값을 허용하지 않음
- ZF (Zero fill) : 자릿수보다 짧은 숫자 앞에 0을 자동으로 채움 (ex: INT(3) : 002)
- AI (Auto Increment) : 자동으로 증가하는 값
- G (Generated) : 계산된 컬럼 (다른 컬럼 기반으로 자동으로 계산되는 값을 지정할 때 사용)
- Default/Expression : 값이 입력되지 않았을 때 사용할 기본값 혹은 식
* 대부분의 경우 ZF, G 는 잘 사용하지 않습니다.
필요한 내용에 맞게 이름과 타입 등을 설정하겠습니다.

[ 사용자 테이블 (BOARD_USER_TB) ]
게시판의 회원 정보를 담을 테이블을 만들 것이기에 BOARD_USER_TB 라는 이름으로 테이블을 생성했습니다.
- BOARD : 게시판
- USER : 사용자
- TB : 테이블
회원 테이블의 컬럼은 다음과 같이 구성했습니다.
| 컬럼명 | 설명 | 설정 |
| USER_ID | 회원 아이디 | PK, NM |
| USER_PW | 회원 비밀번호 | NN |
| USER_NM | 회원 닉네임 | NN, UQ |
회원 정보를 담을 테이블이기에 컬럼은 USER_ID(회원 아이디), USER_PW(회원 비밀번호), USER_NM(회원 닉네임)으로 구성했습니다.
USER_ID에는 PK, NN 옵션을 추가하고
USER_PW에는 NM, USER_NM에는 NN과 UQ 옵션을 추가했습니다.
* 테이블과 컬럼의 이름은 회사나 프로젝트마다 명명 규칙이 다를 수 있으므로, 실제 업무에선 해당 부분을 확인하고 그에 따르는 것이 좋습니다.
* 테이블을 클릭하고 드래그하는 것으로 크기를 변경할 수 있습니다.

다른 테이블들도 작업해보겠습니다.
[ 게시글 테이블 (BOARD_POST_TB) ]
BOARD_POST_TB
- BOARD : 게시판
- POST : 게시글
- TB : 테이블
게시글 정보를 담는 테이블입니다.
주요 컬럼의 설정은 다음과 같습니다.
| 컬럼 | 설명 | 설정 |
| POST_ID | 글 번호 | PK, NN, AI |
| VIEW_CNT | 조회수 | NN, Default/Expression : 0 |
| TITLE | 제목 | NN |
| CONTENT | 내용 | NN |
| REG_DT | 작성일자 | |
| MOD_DT | 수정일자 |

[ 댓글 테이블 (BOARD_COMMENT_TB) ]
BOARD_COMMENT_TB
- BOARD : 게시판
- COMMENT : 댓글
- TB : 테이블
댓글 정보를 담는 테이블입니다.
주요 컬럼의 설정은 다음과 같습니다.
| 컬럼 | 설명 | 설정 |
| COMMENT_ID | 댓글 번호 | PK, NN, AI |
| CONTENT | 댓글 내용 | NN |
| REG_DT | 작성일자 | |
| MOD_DT | 수정일자 |

2-3. 기본 키(PK), 외래 키(FK) 설정
이제 테이블 간의 관계를 설정해보겠습니다.
우선, 기본 키(Primary Key, PK)와 외래 키(Foreign Key, FK)가 무엇인지 간단하게 짚고 넘어가겠습니다.
- 기본 키(PK) : 테이블의 각 행을 유일하게 식별하기 위한 컬럼입니다.
- 외래 키(FK) : 다른 테이블의 기본 키를 참조하는 컬럼으로, 두 테이블 간의 관계를 만들어줍니다.
이번에는 BOARD_USER_TB와 BOARD_POST_TB 사이에 외래 키 관계를 설정해보겠습니다.
하나의 회원이 여러 개의 게시글을 작성할 수 있으므로, 두 테이블은 1:N 관계입니다.
이제 왼쪽의 아이콘 모임에서 1:n 이라고 적힌 아이콘을 찾아보겠습니다.

여기서 주의할 점은, 1:n 이라고 적힌 아이콘이 두 가지가 있다는 것을 볼 수 있습니다.
각각 점선과 실선으로 되어있는데, 이 차이는 바로 비식별 관계(Non-identifying) 와 식별(Identifying) 관계의 차이를 나타냅니다.
비식별 관계 (점선) 은 글을 쓰는 회원이 없을 수도 있는 경우, 즉 관계가 느슨할 때 사용합니다.
회원이 게시글을 쓰지 않아도, 회원으로 존재할 수 있습니다.
더 쉽게 말하면 회원이 글을 쓸 수도, 쓰지 않을 수도 있을 때 비식별 관계를 사용합니다.
식별 관계 (실선) 은 자식 테이블이 부모 테이블에 완전히 종속되는 구조입니다.
예를 들어, 회원의 아이디와 비밀번호만 있는 회원 테이블이 있고, 해당 회원의 성별이나 실명 등의 자세한 정보가 들어있는 회원 상세 테이블이 있다고 생각해봅시다.
회원 상세 테이블의 데이터는 회원 테이블의 데이터가 없이는 존재할 수 없습니다.
더 쉽게 말하면 회원 테이블에 없는 회원의 상세 데이터가 존재할 수 없다는 의미입니다.
이럴 때에 바로 식별 관계를 사용합니다.
이번 상황에서는 점선으로 된 1:n 아이콘 (Place a New 1:n Non-identifying Relationship)을 사용합니다.
해당 아이콘을 클릭하고, 먼저 게시글 테이블 (BOARD_POST_TB)을 선택합니다.
- 여러 글, N 쪽입니다.
다음으로 회원 테이블 (BOARD_USER_TB)를 클릭합니다.
- 하나의 회원, 1 쪽입니다.

정상적으로 연결되면 BOARD_USER_TB 테이블의 PK인 USER_ID 가
BOARD_POST_TB 테이블에 외래 키로 자동 생성된 것을 확인할 수 있습니다.
이로써 두 테이블 간의 참조 관계가 완성됩니다.

BOARD_POST_TB 테이블을 더블클릭한 뒤, 자동 생성된 외래 키 컬럼의 이름을 USER_ID 로 수정하겠습니다.
Workbench 에서는 관계를 설정하면 기본적으로 위처럼 복잡한 컬럼 이름이 생성되는데
이렇게 두면 나중에 쿼리 작업 시 불편할 수 있어서 가독성을 위해 간단하게 바꿔주는 것이 좋습니다.
이와 같은 방식으로 다른 테이블 간의 관계도 설정해보겠습니다.
게시글 테이블 (BOARD_POST_TB)에서 댓글 테이블(BOARD_COMMENT_TB)로 비식별 1:N 관계를 설정합니다.
- 하나의 게시글에는 여러 댓글이 달릴 수 있습니다.
- 게시글에는 댓글이 달릴 수도, 달리지 않을 수도 있습니다.
회원 테이블 (BOARD_USER_TB)에서 댓글 테이블(BOARD_COMMENT_TB)로 비식별 1:N 관계를 설정합니다.
- 하나의 회원이 여러 개의 댓글을 작성할 수 있습니다.
- 회원이 댓글을 작성할 수도, 작성하지 않을 수도 있습니다.
모든 관계 설정이 완료되면 아래와 같이 ERD가 완성됩니다.

3. 쿼리 추출 및 실행
3-1. Forward Engineer로 쿼리 추출
이제 만들어진 ERD를 사용해서 쿼리를 추출하겠습니다.
상단의 메뉴에서 File > Export > Forward Engineer SQL CREATE Script 을 클릭합니다.

그러면 아래와 같은 화면이 나타납니다.
신경 쓸 옵션은 가장 위에 있는 Generate DROP Statements Before Each CREATE Statement 입니다.
이 옵션을 체크하면 기존 테이블이 있을 경우 삭제 후 재생성하므로, 안전하게 최신 구조로 테이블을 만들 수 있습니다.
이 옵션만 체크하고 Next 를 눌러 넘어가겠습니다.

다음 창으로 넘어가서, 마찬가지로 맨 위의 옵션만 확인해주겠습니다.
저희가 생성한 3개의 테이블이 선택되어있는지 확인하고 Next 를 눌러 넘어갑니다.

이제 미리보기 화면으로 쿼리가 추출된 것을 확인할 수 있습니다.
Copy to Clipboard 를 누르거나, 화면을 클릭하고 Ctrl + A (전체 선택) > Ctrl + C 를 눌러서 복사해줍니다.
복사한 쿼리는 나중에 MySQL Workbench 쿼리 창에 붙여넣어 실행할 수 있습니다.

3-2. 추출된 쿼리 실행 (테이블 생성)
Finish 를 누르고 나와서, MySQL Workbench Query 창에 붙여넣은 후(Ctrl + V) 실행하겠습니다.
전체 실행 단축키 Ctrl + Shift + Enter 를 누르거나 상단의 번개 아이콘을 누르면 실행됩니다.

하단에 초록색 동그라미 아이콘과 함께 이런 내용이 뜨면 완성입니다.

새로운 SQL 창을 열어서 테이블이 제대로 생성되었는지 확인해보겠습니다.
아래 아이콘을 클릭해서 SQL 창을 추가로 열어줍니다.
SELECT * FROM BOARD_USER_TB;
명령어를 입력해서 테이블이 제대로 출력되는지 확인합니다.

3-3. SQL 파일 저장
혹시나 스크립트 내용을 파일로 따로 저장하고 싶다면 아래 단계에서 Save to Other File 을 눌러 원하는 위치에 저장하면 됩니다.

이렇게 테이블 설계 및 생성까지 완료했습니다.
다음 글에서는 본격적으로 CRUD 게시판 기능 구현을 시작하겠습니다.
감사합니다.
참고
[JAVA]9. MySQL Workbench 설치 및 DB 연동
[JAVA]9. MySQL Workbench 설치 및 DB 연동
글쓰기 화면을 만들기 전에, 테이블 설계를 작업하려고 합니다.테이블이 있어야 CRUD 기능을 테스트해볼 수 있기 때문입니다. 순서가 좀 엉망인 느낌이 들긴 하네요.CRUD 화면을 완성하고 나서 전
silverji.tistory.com
'개발 실습 > CRUD 게시판 만들기' 카테고리의 다른 글
| [JAVA]12. 게시판 목록 화면 구현 : 테이블과 forEach를 활용한 게시글 출력 (22) | 2025.08.10 |
|---|---|
| [JAVA]11. 게시판 목록 화면 구현 : 제목 태그(title, h2) (28) | 2025.08.03 |
| [JAVA]9. MySQL Workbench 설치 및 DB 연동 (16) | 2025.07.03 |
| [JAVA]8. 게시판 목록 화면 틀 잡기 (18) | 2025.06.27 |
| [JAVA]7. Eclipse에 MySQL 연동 (22) | 2025.06.21 |