2025. 11. 5. 16:40ㆍJava/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 구조를 더 완벽히 숙지하고 머릿속으로 시뮬레이션도 돌리며 내껄로 더욱 만들어야하겠습니다.
'Java > Spring' 카테고리의 다른 글
| [LG U+ 유레카 3기] Spring MVC + JSP + MyBatis 프로젝트 정리 (0) | 2025.11.17 |
|---|---|
| [LG U+ 유레카 3기]Spring Boot + JDBC -> MyBatis 전환 실습 (0) | 2025.11.06 |
| [LG U+ 유레카3기]Spring MVC | HttpSession 로그인 → 유지 → 로그아웃 실습 정리 (0) | 2025.11.05 |
| [LG U+ 유레카 3기]Spring MVC | 요청 바인딩 + View/Model/Redirect 실습 정리 (0) | 2025.11.05 |
| Spring MVC 내부 동작 구조 (Deep Dive) (0) | 2025.11.04 |