Spring

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 MVC6.2.14웹 애플리케이션 프레임워크
MyBatis3.5.19SQL 매핑 프레임워크
HikariCP7.0.2데이터베이스 연결 풀
MySQL9.4.0데이터베이스
Lombok1.18.42코드 자동 생성
Bootstrap5.3.3UI 프레임워크
Java21프로그래밍 언어

📂 프로젝트 폴더 구조

프로젝트는 크게 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)

사용자가 게시글 목록을 보고 싶을 때 어떤 일이 일어나는지 살펴볼게요!

3-Tier 계층 구조

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
계층파일역할
ControllerBoardController.javaHTTP 요청을 받고, 적절한 서비스 호출 후 결과를 JSP에 전달
ServiceBoardService.java비즈니스 규칙 처리 (페이징 계산, 검색 조건 처리 등)
MapperBoardMapper.java + .xml데이터베이스 CRUD 작업 담당
DTOBoardDTO.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 MapperSQL과 Java를 연결4편
페이징 처리많은 데이터를 나눠서 보여주기5편
동적 쿼리조건에 따라 SQL이 바뀌는 기능5편

📝 정리

이번 글에서 배운 내용을 정리하면:

  1. Spring MVC 게시판은 Controller → Service → Mapper → DB 구조로 동작
  2. 계층 분리로 코드가 깔끔하고 유지보수가 쉬움
  3. MyBatis로 SQL 쿼리를 쉽게 관리
  4. HikariCP로 데이터베이스 연결을 효율적으로 관리

🚀 다음 편 예고

**2편: Spring MVC 컨트롤러와 요청 흐름 이해하기**에서는:

  • @GetMapping, @PostMapping의 동작 원리
  • 사용자 요청이 Controller에 도착하는 과정
  • Controller에서 JSP로 데이터 전달하는 방법

을 알아볼 예정입니다!


📚 시리즈 목차


💬 질문이나 피드백이 있으시면 댓글로 남겨주세요!
이 글이 도움이 되었다면 공유해주시면 감사하겠습니다 🙏