Spring

Spring Legacy 게시판 만들기 1편 - 프로젝트 세팅 (pom.xml, web.xml, MySQL)


📚 Spring Legacy 게시판 만들기 시리즈

웹사이트를 만들어 본 적이 있나요? 오늘부터 3편에 걸쳐서 Spring이라는 도구를 사용해 게시판을 만들어 볼 거예요. 마치 레고 블록을 조립하듯이, 하나씩 차근차근 만들어 나가면 멋진 게시판이 완성됩니다!


🎯 우리가 만들 것

우리가 만들 게시판은 이런 기능을 가지고 있어요:

기능설명
📋 목록 보기등록된 글들을 한눈에 볼 수 있어요
✏️ 글 쓰기새로운 글을 작성할 수 있어요
📖 글 읽기글의 자세한 내용을 볼 수 있어요
🔧 글 수정쓴 글을 고칠 수 있어요
🗑️ 글 삭제필요 없는 글을 지울 수 있어요

🏗️ Spring 프로젝트의 구조

Spring 프로젝트는 마치 잘 정리된 서랍장과 같아요. 각각의 파일이 제자리에 있어야 제대로 동작합니다.

graph TB
    subgraph "📁 프로젝트 구조"
        A["🗂️ sp1 (최상위 폴더)"]
        B["📄 pom.xml<br/>필요한 도구 목록"]
        C["📁 src/main/java<br/>Java 코드"]
        D["📁 src/main/resources<br/>설정 파일"]
        E["📁 src/main/webapp<br/>웹 페이지"]
    end
    
    A --> B
    A --> C
    A --> D
    A --> E
    
    style A fill:#e1f5fe
    style B fill:#fff3e0
    style C fill:#e8f5e9
    style D fill:#fce4ec
    style E fill:#f3e5f5

각 폴더가 하는 일을 알아볼까요?

폴더/파일역할비유
pom.xml필요한 라이브러리(도구) 목록요리 재료 목록 📝
src/main/java실제 동작하는 Java 코드요리사의 레시피 👨‍🍳
src/main/resources설정 파일들요리 도구 설정 ⚙️
src/main/webapp화면에 보이는 웹 페이지완성된 요리 접시 🍽️

📦 Step 1: 필요한 재료 준비하기 (pom.xml)

요리를 하려면 재료가 필요하듯, Spring 프로젝트도 여러 **라이브러리(도구)**가 필요해요. pom.xml 파일에 이 목록을 적어둡니다.

<project xmlns="http://maven.apache.org/POM/4.0.0">
  <modelVersion>4.0.0</modelVersion>
  <groupId>sp1</groupId>
  <artifactId>sp1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <dependencies>
    <!-- 🔧 Lombok: 반복적인 코드를 줄여주는 도구 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.42</version>
    </dependency>
    
    <!-- 🌱 Spring Framework: 웹 애플리케이션의 기본 틀 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>6.2.14</version>
    </dependency>
    
    <!-- 🗄️ 데이터베이스 연결 도구들 -->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>7.0.2</version>
    </dependency>
    
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>9.4.0</version>
    </dependency>
    
    <!-- 🗺️ MyBatis: SQL을 쉽게 사용하게 해주는 도구 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.19</version>
    </dependency>
  </dependencies>
</project>

💡 Maven이란? 필요한 라이브러리를 인터넷에서 자동으로 다운로드해주는 편리한 도우미예요!


🌐 Step 2: 웹 서버에게 알려주기 (web.xml)

웹 서버(Tomcat)에게 “우리 프로젝트는 Spring을 사용할 거야!”라고 알려줘야 해요.

sequenceDiagram
    participant Browser as 🌐 브라우저
    participant Tomcat as 🐱 Tomcat 서버
    participant WebXml as 📄 web.xml
    participant Spring as 🌱 Spring
    
    Browser->>Tomcat: 접속 요청
    Tomcat->>WebXml: 설정 확인
    WebXml->>Spring: Spring 시작하라고 알림
    Spring->>Browser: 페이지 응답

web.xml 파일은 이렇게 생겼어요:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" version="6.0">  
 
  <display-name>sp1</display-name>
  
  <!-- 🔔 Spring 시작을 알리는 리스너 -->
  <listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  
  <!-- ⚙️ 비즈니스 로직 설정 파일 위치 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/root-context.xml</param-value>
  </context-param>
  
  <!-- 🚦 모든 요청을 처리할 DispatcherServlet -->
  <servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    
    <!-- 🎨 웹 관련 설정 파일 위치 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/spring/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <!-- 📍 모든 URL 요청을 Spring이 처리하도록 설정 -->
  <servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

web.xml의 핵심 구성요소

graph LR
    A["🌐 사용자 요청"] --> B["📄 web.xml"]
    B --> C["🔔 ContextLoaderListener<br/>비즈니스 로직 준비"]
    B --> D["🚦 DispatcherServlet<br/>요청 분배"]
    
    C --> E["⚙️ root-context.xml"]
    D --> F["🎨 servlet-context.xml"]
    
    style A fill:#e3f2fd
    style B fill:#fff8e1
    style C fill:#e8f5e9
    style D fill:#fce4ec

⚙️ Step 3: Spring 설정하기

Spring은 두 개의 설정 파일로 나누어져 있어요:

설정 파일역할담당하는 것
root-context.xml비즈니스 로직데이터베이스, 서비스
servlet-context.xml웹 화면컨트롤러, 뷰

root-context.xml (데이터베이스 설정)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring">

    <!-- 📦 서비스 클래스들을 자동으로 찾아 등록 -->
    <context:component-scan base-package="org.zerock.service" />
    
    <!-- 🗄️ 데이터베이스 연결 설정 (HikariCP) -->
    <bean name="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
        <property name="jdbcUrl" 
                  value="jdbc:mysql://localhost:3306/springdb" />
        <property name="username" value="springdbuser" />
        <property name="password" value="1234" />
    </bean>
    
    <bean name="dataSource" class="com.zaxxer.hikari.HikariDataSource">
        <constructor-arg ref="hikariConfig" />
    </bean>
    
    <!-- 🗺️ MyBatis 설정 -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:/mapper/*.xml" />
        <property name="configLocation" value="classpath:/mybatis-config.xml" />
    </bean>
    
    <!-- 🔍 Mapper 인터페이스 자동 스캔 -->
    <mybatis-spring:scan base-package="org.zerock.mapper"/>
</beans>

servlet-context.xml (웹 설정)

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context">

    <!-- 🎯 Spring MVC 어노테이션 활성화 -->
    <mvc:annotation-driven/>
    
    <!-- 👁️ JSP 파일 위치 설정 (View Resolver) -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
    <!-- 📂 정적 리소스 (CSS, JS, 이미지) 위치 -->
    <mvc:resources location="/resources/" mapping="/resources/**" />
    
    <!-- 🎮 컨트롤러 클래스들을 자동으로 찾아 등록 -->
    <context:component-scan base-package="org.zerock.controller" />
</beans>

🗄️ Step 4: 데이터베이스 준비하기

게시판의 글을 저장할 테이블이 필요해요. MySQL에서 다음 명령어를 실행하세요:

-- 데이터베이스 생성
CREATE DATABASE springdb;

-- 사용자 생성 및 권한 부여
CREATE USER 'springdbuser'@'localhost' IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES ON springdb.* TO 'springdbuser'@'localhost';

-- 게시판 테이블 생성
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          -- 삭제 여부
);

테이블 구조를 그림으로 보면:

erDiagram
    TBL_BOARD {
        int bno PK "글 번호 (자동증가)"
        varchar title "제목"
        varchar content "내용"
        varchar writer "작성자"
        timestamp regdate "등록일"
        timestamp updatedate "수정일"
        boolean delflag "삭제여부"
    }

📝 delflag가 왜 필요할까요? 실제로 데이터를 지우지 않고, “삭제됨” 표시만 해두는 방식이에요. 이렇게 하면 나중에 복구도 가능하고, 데이터 분석에도 유용해요!


🎨 전체 구조 한눈에 보기

지금까지 설정한 내용을 전체적으로 정리하면:

flowchart TB
    subgraph "🌐 웹 서버 (Tomcat)"
        A["📄 web.xml<br/>시작점"]
    end
    
    subgraph "🌱 Spring 설정"
        B["⚙️ root-context.xml<br/>데이터베이스 연결"]
        C["🎨 servlet-context.xml<br/>웹 화면 설정"]
    end
    
    subgraph "🗄️ 데이터베이스"
        D["💾 MySQL<br/>tbl_board 테이블"]
    end
    
    A --> B
    A --> C
    B --> D
    
    style A fill:#ffeb3b
    style B fill:#4caf50,color:#fff
    style C fill:#2196f3,color:#fff
    style D fill:#9c27b0,color:#fff

✅ 1편 정리

오늘 우리가 한 일을 체크해볼까요?

  • Spring 프로젝트 구조 이해하기
  • pom.xml에 필요한 라이브러리 추가하기
  • web.xml로 Spring 시작 설정하기
  • root-context.xml로 데이터베이스 연결하기
  • servlet-context.xml로 웹 설정하기
  • MySQL 데이터베이스와 테이블 생성하기

🔮 다음 편 예고

2편에서는 실제로 게시판의 뼈대를 만들어볼 거예요!

  • Controller - 사용자 요청을 받는 역할
  • Service - 실제 로직을 처리하는 역할
  • Mapper - 데이터베이스와 대화하는 역할
  • DTO - 데이터를 담아 나르는 역할

마치 햄버거 가게처럼, 각자 맡은 역할이 있어서 효율적으로 일할 수 있어요! 🍔


⚠️ 꼭 확인하세요! 다음 편으로 넘어가기 전에:

  1. MySQL 서버가 실행 중인지 확인
  2. springdb 데이터베이스가 생성되었는지 확인
  3. tbl_board 테이블이 존재하는지 확인