[LG U+ 유레카 3기] Spring Boot MVC 도서 관리 시스템 실습

2025. 11. 5. 16:40Java/Spring

❶ 실습 개요

이번 실습은 기존의 서블릿 & JSP 구조로 구현했던 BookManager 프로젝트를 Spring Boot MVC 아키텍처로 전환한 버전입니다.
핵심 목표는 MVC 구조의 완전한 이해Spring의 계층적 데이터 흐름을 체감하는 것이었습니다.

❷ 프로젝트 구조


SpringBootMVCDB
 ┣ 📁 src/main/java/com/mycom/myapp
 ┃ ┣ 📁 common → DBManager.java (Connection 관리)
 ┃ ┣ 📁 controller → BookController.java
 ┃ ┣ 📁 dao → BookDao.java / BookDaoImpl.java
 ┃ ┣ 📁 dto → BookDto.java
 ┃ ┣ 📁 service → BookService.java / BookServiceImpl.java
 ┃ ┗ 📄 SpringBootMvcdbApplication.java
 ┣ 📁 src/main/webapp/WEB-INF/jsp
 ┃ ┣ 📄 books.jsp
 ┃ ┗ 📄 index.html
 ┗ 📄 application.properties

---

❸ MVC 흐름 설명

Spring Boot는 기본적으로 Spring MVC 패턴을 기반으로 동작합니다.
즉, 클라이언트 요청은 아래 순서로 처리됩니다 👇


Client (브라우저)
   ↓
@Controller (BookController)
   ↓
@Service (BookServiceImpl)
   ↓
@Repository (BookDaoImpl)
   ↓
MySQL DB

DB에서 읽어온 데이터는 반대로 위 계층을 거쳐 다시 브라우저에 전달되며, 최종적으로 JSP 화면 혹은 JSON 데이터로 표시됩니다.

---

❹ 주요 코드 분석

📍 Controller


@Controller
public class BookController {

    @Autowired
    BookService bookService;

    // 페이지 이동
    @GetMapping("/books")
    public String bookMain() {
        return "books";
    }

    // 도서 목록 데이터 (JSON 응답)
    @GetMapping("/books/list")
    @ResponseBody
    public List<BookDto> listBook() {
        return bookService.listBook();
    }
}

Controller는 브라우저의 요청을 받아 Service 계층에 전달하고, 결과 데이터를 JSON으로 반환합니다.

---

📍 Service


@Service
public class BookServiceImpl implements BookService {

    @Autowired
    BookDao bookDao;

    @Override
    public List<BookDto> listBook() {
        return bookDao.listBook();
    }
}

Service 계층은 비즈니스 로직을 담당합니다.
이번 실습에서는 단순히 DAO 호출만 했지만, 실제 서비스에서는 검증, 예외처리, 트랜잭션 등을 수행합니다.

---

📍 DAO


@Repository
public class BookDaoImpl implements BookDao {

    @Autowired
    DataSource dataSource;

    @Override
    public List<BookDto> listBook() {
        List<BookDto> list = new ArrayList<>();
        String sql = "SELECT * FROM book;";

        try (Connection con = dataSource.getConnection();
             PreparedStatement pstmt = con.prepareStatement(sql);
             ResultSet rs = pstmt.executeQuery()) {

            while (rs.next()) {
                BookDto dto = new BookDto();
                dto.setBookId(rs.getInt("bookid"));
                dto.setBookName(rs.getString("bookname"));
                dto.setPublisher(rs.getString("publisher"));
                dto.setPrice(rs.getInt("price"));
                list.add(dto);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
}

DAO 계층은 SQL 실행과 ResultSet 처리를 담당합니다.
여기서 만들어진 BookDto 객체들이 Service → Controller → 브라우저로 전달됩니다.

---

📍 DTO (Data Transfer Object)


public class BookDto {
    private int bookId;
    private String bookName;
    private String publisher;
    private int price;
    // getters, setters
}

DB 테이블의 한 행(row)을 그대로 옮겨 담는 데이터 전용 객체입니다.
즉, DTO = 데이터 상자 라고 생각하면 됩니다.

---

❺ JSP (View)


<h1>도서 관리</h1>

<table>
  <thead>
    <tr>
      <th>bookId</th>
      <th>bookName</th>
      <th>publisher</th>
      <th>price</th>
    </tr>
  </thead>
  <tbody id="bookTbody"></tbody>
</table>

브라우저에서 /books로 접속하면 books.jsp가 렌더링되고,
자바스크립트가 /books/list로 비동기 요청(fetch)을 보낸 뒤 데이터를 테이블로 표시합니다.

---

❻ application.properties


spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

spring.datasource.url=jdbc:mysql://localhost:3306/madang
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

Spring Boot에서는 XML 설정이 아닌 application.properties로 ViewResolver와 DB 연결 정보를 간단히 관리할 수 있습니다.

---

❼ 실행 결과

서버 실행 후 http://localhost:8080/books 로 접속하면 다음과 같은 화면이 출력됩니다 👇

 

- 도서 목록은 DB에서 불러와 테이블 형태로 표시
- 등록, 수정, 삭제 버튼은 fetch API로 각각의 Controller 메서드 호출

❽ 핵심 요약

계층 역할
Controller 요청 수신 및 응답 처리
Service 비즈니스 로직 수행
DAO SQL 실행, DB 접근
DTO 데이터 전달 객체

---

❾ 교훈 및 느낀점

이번 실습에서 "스프링부트도 결국 MVC 구조 위에서 돌아간다"는 걸 완전히 체감했습니다.
데이터가 Controller → Service → DAO → DB로 내려가고, 다시 DB → DAO → Service → Controller → View로 돌아오는 흐름이 눈에 보이니 에러가 나도 원인을 바로 추적할 수 있게 되었습니다.

처음엔 어렵고 복잡했지만, 구조를 “데이터 흐름” 관점에서 이해하면 이제 어떤 프로젝트든 MVC로 바로 분석할 수 있습니다. 물론 완벽하진 않지만 예전에 비하면 디버깅하는 실력도 오른거같고 MVC 구조를 더 완벽히 숙지하고 머릿속으로 시뮬레이션도 돌리며 내껄로 더욱 만들어야하겠습니다.