Spring MVC 게시판 만들기 1편: 프로젝트 구조와 아키텍처 완벽 정리
💡 이 시리즈는 누구를 위한 것인가요?
Spring MVC로 게시판을 만들어보고 싶은 분, 백엔드 개발을 시작하는 초보자를 위해 쉬운 비유와 함께 설명합니다.
🎯 한눈에 보기
| 주제 | 핵심 내용 |
|---|---|
| 기술 스택 | Spring MVC 6 + MyBatis + HikariCP + MySQL |
| 아키텍처 | Controller → Service → Mapper → DB |
| 주요 기능 | CRUD, 페이징, 검색, 댓글 |
📌 이 시리즈에서 배울 것
안녕하세요! 이번 시리즈에서는 Spring MVC로 만든 게시판 프로젝트를 처음부터 끝까지 파헤쳐 보려고 합니다.
이 프로젝트는 실제로 많이 사용되는 기술들을 조합해서 만들어졌어요:
- ✅ 게시글 작성, 수정, 삭제, 조회 (CRUD)
- ✅ 페이지 나누기 (페이징)
- ✅ 제목/내용/작성자 검색 기능
- ✅ 댓글 기능
🎯 사용된 기술 스택
┌─────────────────────────────────────────────────────┐
│ 🌐 브라우저 │
│ (사용자가 보는 화면) │
└─────────────────────────────────────────────────────┘
↓ HTTP 요청
┌─────────────────────────────────────────────────────┐
│ 📦 Spring MVC 6 │
│ (웹 요청을 처리하는 핵심) │
├─────────────────────────────────────────────────────┤
│ Controller → Service → Mapper → Database │
└─────────────────────────────────────────────────────┘
↓ SQL 쿼리
┌─────────────────────────────────────────────────────┐
│ 🗄️ MySQL 데이터베이스 │
│ (데이터 저장소) │
└─────────────────────────────────────────────────────┘
| 기술 | 버전 | 역할 |
|---|---|---|
| Spring MVC | 6.2.14 | 웹 애플리케이션 프레임워크 |
| MyBatis | 3.5.19 | SQL 매핑 프레임워크 |
| HikariCP | 7.0.2 | 데이터베이스 연결 풀 |
| MySQL | 9.4.0 | 데이터베이스 |
| Lombok | 1.18.42 | 코드 자동 생성 |
| Bootstrap | 5.3.3 | UI 프레임워크 |
| Java | 21 | 프로그래밍 언어 |
📂 프로젝트 폴더 구조
프로젝트는 크게 Java 코드, 설정 파일, 화면(JSP) 세 부분으로 나뉩니다.
sp1/
├── 📁 src/main/java/org/zerock/ ← Java 코드
│ ├── 📁 controller/ ← 요청을 받는 곳
│ │ └── BoardController.java
│ ├── 📁 service/ ← 비즈니스 로직
│ │ ├── BoardService.java
│ │ └── ReplyService.java
│ ├── 📁 mapper/ ← DB 연결 인터페이스
│ │ ├── BoardMapper.java
│ │ └── ReplyMapper.java
│ └── 📁 dto/ ← 데이터 전달 객체
│ ├── BoardDTO.java
│ └── ReplyDTO.java
│
├── 📁 src/main/resources/ ← 설정 파일
│ ├── 📁 mapper/ ← SQL 쿼리 파일
│ │ ├── boardMapper.xml
│ │ └── ReplyMapper.xml
│ └── mybatis-config.xml
│
└── 📁 src/main/webapp/ ← 화면 파일
└── 📁 WEB-INF/
├── 📁 spring/ ← Spring 설정
│ ├── root-context.xml
│ └── servlet-context.xml
└── 📁 views/ ← JSP 페이지
└── 📁 board/
├── list.jsp
├── read.jsp
├── register.jsp
└── modify.jsp
🔄 전체 동작 흐름 (Big Picture)
사용자가 게시글 목록을 보고 싶을 때 어떤 일이 일어나는지 살펴볼게요!

sequenceDiagram
participant 👤 as 사용자
participant 🌐 as 브라우저
participant 🎮 as Controller
participant 🔧 as Service
participant 📊 as Mapper
participant 🗄️ as MySQL
👤->>🌐: 게시판 목록 클릭
🌐->>🎮: GET /board/list 요청
🎮->>🔧: getList() 호출
🔧->>📊: listSearch() 호출
📊->>🗄️: SELECT 쿼리 실행
🗄️-->>📊: 게시글 데이터 반환
📊-->>🔧: List<BoardDTO> 반환
🔧-->>🎮: BoardListPaginDTO 반환
🎮-->>🌐: list.jsp 화면 렌더링
🌐-->>👤: 게시글 목록 표시 ✨
🧩 각 계층의 역할
Spring MVC는 계층형 구조를 사용합니다. 마치 회사에서 일을 분담하는 것처럼, 각 계층이 맡은 역할이 있어요!
flowchart TB
subgraph "🎨 Presentation Layer"
JSP[JSP 화면]
Controller[Controller]
end
subgraph "💼 Business Layer"
Service[Service]
end
subgraph "💾 Data Access Layer"
Mapper[Mapper]
XML[Mapper XML]
end
subgraph "🗄️ Database"
MySQL[(MySQL DB)]
end
JSP <--> Controller
Controller <--> Service
Service <--> Mapper
Mapper <--> XML
XML <--> MySQL
| 계층 | 파일 | 역할 |
|---|---|---|
| Controller | BoardController.java | HTTP 요청을 받고, 적절한 서비스 호출 후 결과를 JSP에 전달 |
| Service | BoardService.java | 비즈니스 규칙 처리 (페이징 계산, 검색 조건 처리 등) |
| Mapper | BoardMapper.java + .xml | 데이터베이스 CRUD 작업 담당 |
| DTO | BoardDTO.java | 계층 간 데이터 전달용 객체 |
🗃️ 데이터베이스 테이블 구조
이 프로젝트에서는 두 개의 테이블을 사용합니다.
📝 게시판 테이블 (tbl_board)
CREATE TABLE tbl_board (
bno INT AUTO_INCREMENT PRIMARY KEY, -- 게시글 번호 (자동 증가)
title VARCHAR(500) NOT NULL, -- 제목
content VARCHAR(2000) NOT NULL, -- 내용
writer VARCHAR(50) NOT NULL, -- 작성자
regdate TIMESTAMP DEFAULT NOW(), -- 등록일
updatedate TIMESTAMP DEFAULT NOW(), -- 수정일
delflag BOOLEAN DEFAULT FALSE -- 삭제 여부
);
💬 댓글 테이블 (tbl_reply)
CREATE TABLE tbl_reply (
rno INT AUTO_INCREMENT PRIMARY KEY, -- 댓글 번호
bno INT NOT NULL, -- 게시글 번호 (FK)
replyText VARCHAR(1000) NOT NULL, -- 댓글 내용
replyer VARCHAR(50) NOT NULL, -- 댓글 작성자
replyDate TIMESTAMP DEFAULT NOW(), -- 댓글 등록일
updateDate TIMESTAMP DEFAULT NOW(), -- 댓글 수정일
delflag BOOLEAN DEFAULT FALSE -- 삭제 여부
);
💡 Tip:
delflag를 사용하면 데이터를 실제로 삭제하지 않고 “삭제된 것처럼” 표시할 수 있어요. 이걸 **소프트 삭제(Soft Delete)**라고 합니다!
🔑 핵심 개념 미리보기
다음 편들에서 자세히 다룰 개념들이에요:
| 개념 | 설명 | 다룰 편 |
|---|---|---|
| @Controller | 웹 요청을 처리하는 클래스 표시 | 2편 |
| @Service | 비즈니스 로직 클래스 표시 | 3편 |
| MyBatis Mapper | SQL과 Java를 연결 | 4편 |
| 페이징 처리 | 많은 데이터를 나눠서 보여주기 | 5편 |
| 동적 쿼리 | 조건에 따라 SQL이 바뀌는 기능 | 5편 |
📝 정리
이번 글에서 배운 내용을 정리하면:
- Spring MVC 게시판은 Controller → Service → Mapper → DB 구조로 동작
- 계층 분리로 코드가 깔끔하고 유지보수가 쉬움
- MyBatis로 SQL 쿼리를 쉽게 관리
- HikariCP로 데이터베이스 연결을 효율적으로 관리
🚀 다음 편 예고
**2편: Spring MVC 컨트롤러와 요청 흐름 이해하기**에서는:
@GetMapping,@PostMapping의 동작 원리- 사용자 요청이 Controller에 도착하는 과정
- Controller에서 JSP로 데이터 전달하는 방법
을 알아볼 예정입니다!
📚 시리즈 목차
- [1편] 프로젝트 구조와 아키텍처 완벽 정리 ← 현재 글
- [2편] Spring MVC 컨트롤러와 요청 흐름 이해하기
- [3편] 서비스 계층과 비즈니스 로직 구현하기
- [4편] MyBatis와 데이터베이스 연동 완벽 가이드
- [5편] 페이징과 검색 기능 구현하기
- [6편] 댓글 기능과 예외 처리 마스터하기
💬 질문이나 피드백이 있으시면 댓글로 남겨주세요!
이 글이 도움이 되었다면 공유해주시면 감사하겠습니다 🙏