🍏 개발일기

코드 분석 : 글 1번 클릭했을 때 전체 흐름

보배 진 2026. 2. 10. 14:26

 

main.jsp에서 시작

스프링을 실행시켜 로그인을 한 뒤

main.jsp로 넘어왔습니다

여기에서 admin이 작성한 글 1번을 눌렀을 때의 흐름을 정리해보도록 하겠습니다

 

 

 

< main.jsp 전체 코드 >

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인</title>
</head>
<body>
	<table border="1">
		<tr>
			<td>글 번호</td><td>글 제목</td><td>작성자</td>
		</tr>
		<c:forEach var="data" items="${datas}">
			<tr>
				<td><a href="board?bid=${data.bid}">${data.bid}</a></td><td>${data.title}</td><td>${data.writer}</td>
			</tr>
		</c:forEach>
	</table>
	<hr>

	<a href="logout">로그아웃</a>
	<a href="mypage">마이페이지</a>	
	<a href="write">글 작성하기</a>
	
	<hr>
	<ul>
	<c:forEach var="data" items="${mdatas}">
		<li>${data.mid} | ${data.mname}님</li>
	</c:forEach>
	</ul>
</body>
</html>

위의 코드가 main.jsp 의 코드입니다

 

 

<a href="board?bid=${data.bid}">${data.bid}</a>

main.jsp의 핵심코드

사용자가 글 번호 클릭

브라우저가 GET 요청 생성

ex) data?bid = 1

 

 

 

 

Controller 실행

클릭을 하면 GET 요청으로 GET /board?bid=3 이렇게 만들어져서

매핑되는 컨트롤러 메서드는 🔽 아래와 같습니다

@GetMapping("/board")
public String boardPage(BoardDTO dto, Model model) {
    boardService.updateBoard(dto);
    model.addAttribute("data", boardService.getBoard(dto));
    return "board";
}

URL : /board

방식 : GET

파라미터 : bid = 3

이 넘어오기 때문인데 

 

< Spring 자동 바인딩 >

그럼  Spring이 자동으로 bid = 3 ➡dto.setBid(3)으로 해줍니다

 

간단히 정리하면 메서드 안에서는

조회수 증가와 글 상세 조회를 하고 있습니다

그리고 board.jsp로 이동을 한다

실제 경로는 /WEB-INF/views/board.jsp 이다

 

 

 

Controller → Service 호출

package com.example.biz.board;

import java.util.List;

public interface BoardService {
	boolean insertBoard(BoardDTO dto);
	boolean updateBoard(BoardDTO dto);
	boolean deleteBoard(BoardDTO dto);
	
	BoardDTO getBoard(BoardDTO dto);
	List<BoardDTO> getBoardList(BoardDTO dto);
}

조회수 증가를 할 때 boardService를 호출한다

인터페이스 설계도가 존재하고

실제 실행 X 👉 “이런 메서드가 있다”

 

 

 

 

Spring이 BoardServiceImpl 연결 (ServiceImpl → DAO 호출)

package com.example.biz.board.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.biz.board.BoardDTO;
import com.example.biz.board.BoardService;

@Service("bs")
public class BoardServiceImpl implements BoardService {
	@Autowired
	private PlusBoardDAO boardDAO;
	
	@Override
	public boolean insertBoard(BoardDTO dto) {
		return boardDAO.insertBoard(dto);
	}

	@Override
	public boolean updateBoard(BoardDTO dto) {
		return boardDAO.updateBoard(dto);
	}

	@Override
	public boolean deleteBoard(BoardDTO dto) {
		return boardDAO.deleteBoard(dto);
	}

	@Override
	public BoardDTO getBoard(BoardDTO dto) {
		return boardDAO.getBoard(dto);
	}

	@Override
	public List<BoardDTO> getBoardList(BoardDTO dto) {
		return boardDAO.getBoardList(dto);
	}
}

@Service
public class BoardServiceImpl implements BoardService

➡ Spring이 자동 연결

즉 실제 실행 : BoardServiceImpl.updateBoard()

 

 

 

 

 

 

 

 

DAO → MyBatis 실행

package com.example.biz.board.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.example.biz.board.BoardDTO;

@Repository
public class MybatisBoardDAO {
	@Autowired
	private SqlSession sqlSession;
	private static final String NAMESPACE = "Board.";

	public boolean insertBoard(BoardDTO dto) {
		if(sqlSession.insert(NAMESPACE+"insert", dto) <= 0) {
			return false;
		}
		return true;
	}
	public boolean updateBoard(BoardDTO dto) {
		if(sqlSession.update(NAMESPACE+"update", dto) <= 0) {
			return false;
		}
		return true;
	}
	public boolean deleteBoard(BoardDTO dto) {
		if(sqlSession.delete(NAMESPACE+"delete", dto) <= 0) {
			return false;
		}
		return true;
	}

	public BoardDTO getBoard(BoardDTO dto) {
		return sqlSession.selectOne(NAMESPACE+"getOne", dto);
	}
	public List<BoardDTO> getBoardList(BoardDTO dto){
		return sqlSession.selectList(NAMESPACE+"getList");
	}
}

MyBatis Mapper XML 실행

 

 

 

 

 

Mapper XML → 실제 SQL 실행

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
	<mapper namespace="Board">
	
		<insert id="insert" parameterType="boardDTO">
			INSERT INTO BOARD(TITLE,WRITER,CONTENT) 
			VALUES(#{title},#{writer},#{content})
		</insert>
		
		<update id="update" parameterType="boardDTO">
			UPDATE BOARD 
			SET CNT=CNT+1 
			WHERE BID=#{bid}
		</update>
		
		<delete id="delete" parameterType="boardDTO">
			DELETE FROM BOARD 
			WHERE BID=#{bid}
		</delete>
		
		<select id="getOne" parameterType="boardDTO" resultType="boardDTO">
			SELECT * FROM BOARD 
			WHERE BID=#{bid}
		</select>
		
		<select id="getList" resultType="boardDTO">
			SELECT * FROM BOARD 
			ORDER BY BID DESC
		</select>
	</mapper>

실제 DB 실행: UPDATE BOARD SET CNT=CNT+1 WHERE BID=1

 

 

[사용자 클릭]
main.jsp
 ↓
GET /board?bid=1
 ↓
Controller
 ↓
BoardService (인터페이스)
 ↓
BoardServiceImpl (실제 실행)
 ↓
DAO (MybatisBoardDAO or PlusBoardDAO)
 ↓
SqlSession
 ↓
Mapper XML
 ↓
DB
 ↓
결과 반환
 ↓
board.jsp 출력