내 경우엔 처음에 책에서 시키는대로 패키지를 dao와 dto를 나눠서 만들었는데, 코드를 보다보니 그렇게 많은 페이지가 있지 않아서 그냥 chapter04에 넣고 만들었다. 다른 패키지에 있는 것을 가져오지 않기 때문에 임폴트할 것이 많지 않았다.
컨트롤러는 여전히 exam4_12이다.
그래서 컨트롤러 내부는 이렇게 되어있다. (일부)
@WebServlet("/exam4_12")
public class exam4_12 extends HttpServlet
exam4_12.jsp파일 상단엔 임폴트가 일부가 이렇게 들어가 있음
<%@ page import="chapter04.Book" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html; charset=utf-8" %>
<jsp:useBean id="bookDAO" class="chapter04.BookRepository" scope="session" />
클래스 태그를 넣을 땐 .을 쓰고. 아래쪽에서 모듈화된 페이지를 들고 올 땐 상대경로 .과 /를 동시에 썼다.
처음엔 .으로 표시했다가 안 뜨고, /로도 해서 안떴는데 보다보니 chapter03이 상위
.. : 상위 폴더로 한 단계 이동
/가 맨앞에 있지 않아서 얘는 상대경로다.
<%@ include file="../chapter03/exam3_13_3.jsp" %>
JSP 도서 목록 프로젝트 구조와 데이터 흐름
1. 전체 구조 한눈에 보기
프로젝트
├─ webapp
│ ├─ chapter03
│ │ └─ exam3_13_2.jsp (공통 헤더)
│ │ └─ exam3_13_3.jsp (공통 푸터)
│ ├─ chapter04
│ │ └─ BookList.jsp (도서 목록 페이지)
│ └─ ...
└─ src/main/java
└─ chapter04
└─ Book.java (책 한 권 정보)
└─ BookRepository.java (책 목록 저장소)
2. 역할별 설명
2.1. Book.java
- DTO (Data Transfer Object)
- 책 한 권의 정보를 저장하는 클래스
- 주요 필드: 책ID, 이름, 저자, 설명, 출판사, 분류, 재고, 출판일 등
- 예시:
public class Book {private String bookId;private String name;private String author;// ...기타 필드와 getter/setter }
2.2. BookRepository.java
- 책 목록(여러 권)을 저장, 관리하는 클래스
- 내부에 ArrayList를 멤버변수로 가짐
- 생성자에서 샘플 책 3권을 미리 추가함
- 주요 메서드:
getAllBooks()→ 모든 책 반환
public class BookRepository {
private ArrayList<Book> listOfBooks = new ArrayList<Book>();
public BookRepository() {
// Book 객체 3개 생성해서 listOfBooks에 add
}
public ArrayList<Book> getAllBooks() {
return listOfBooks; }
}
2.3. BookList.jsp
- 사용자에게 보이는 도서 목록 웹페이지
- BookRepository에서 책 목록을 가져와 반복문으로 출력
- 공통 레이아웃(헤더/푸터)은 include로 관리
<%@ page import="chapter04.Book" %>
<%@ page import="java.util.ArrayList" %>
<jsp:useBean id="bookDAO" class="chapter04.BookRepository" scope="session" /> ...
<%@ include file="../chapter03/exam3_13_2.jsp" %> <!-- 공통 헤더 -->
... <% ArrayList<Book> listOfBooks = bookDAO.getAllBooks();
for (int i = 0; i < listOfBooks.size(); i++) {
Book book = listOfBooks.get(i); %>
<div>
<h5><%= book.getName() %></h5>
<p><%= book.getAuthor() %></p> </div>
<% } %>
...
<%@ include file="../chapter03/exam3_13_3.jsp" %>
<!-- 공통 푸터 -->
3. 데이터 흐름
- JSP가 열리면
→bookDAO라는 BookRepository 객체가 세션에 생성 - bookDAO.getAllBooks()
→ 책 목록(ArrayList) 가져오기 - 반복문으로 Book 객체 출력
→ 화면에 책 정보 하나씩 표시 - include
→ 공통 헤더/푸터 파일을 가져와서 페이지 꾸밈
4. include 정리
- include는 HTML/JSP 코드 재사용
<%@ include file="../chapter03/exam3_13_2.jsp" %><%@ include file="../chapter03/exam3_13_3.jsp" %>
- 반복적으로 들어가는 메뉴, 카피라이트, 사이트 정보 등에 자주 사용
5. 한눈에 보는 데이터 관계
- BookRepository
→ 여러 개의 Book 객체 관리
→ JSP에서getAllBooks()로 받아와 반복 출력
BookRepository (도서 저장소)
└─ [Book, Book, Book, ...] (여러 권의 책)
↓
JSP (BookList.jsp)에서 출력
6. 주요 포인트
- Book: 단일 책의 데이터
- BookRepository: 여러 책의 목록 관리, 데이터 제공
- JSP: 데이터를 불러와서 화면에 표시 (자바와 HTML이 섞여 있음)
- include: 레이아웃 코드(메뉴, 푸터 등) 재사용
7. 실전 팁
- JSP에서 자바 클래스를 쓸 때는 꼭
import선언 필요 - include할 때는 파일 경로를 슬래시(/)로 구분하고,
상대경로(../) 잘 확인 - 데이터베이스를 안 쓰는 간단 실습에서는
BookRepository에 직접 데이터 샘플을 만들면 편함
8. 자주 헷갈리는 부분 정리
- JSP에서 자바 객체를 쓰려면 useBean, import 필요
- include 경로는 반드시 슬래시(/)로, 위치 잘 맞추기
- BookRepository가 계속 새로 만들어지는 구조라서,
프로젝트에서 데이터를 추가/삭제해도 새로고침하면 원래대로 돌아감
9. 정리용 그림(마인드맵 스타일)
BookList.jsp
|
+-- include 헤더.jsp
|
+-- <jsp:useBean id="bookDAO"...>
|
+-- BookRepository (listOfBooks)
|
+-- Book (한 권 정보)
|
+-- include 푸터.jsp
1. 전체 JSP 페이지가 만들어지는 과정
① JSP 파일은 '조립식 웹페이지'
- JSP는 여러 조각(header, footer, 본문 등)을 include해서 한 페이지로 합친다.
- 그리고 자바 코드(자바 클래스, 자바 객체)를 JSP 안에서 불러서 데이터를 꺼내와서 보여준다.
② include로 조각을 한데 합친다
- 예시 코드
<%@ include file="../chapter03/exam3_13_2.jsp" %>
이 부분은
"이 위치에 exam3_13_2.jsp 파일 내용을 그대로 복붙해서 합쳐줘"
라는 뜻이야.
- 예를 들어
exam3_13_2.jsp가 헤더(상단 바) 내용이라면,
지금 페이지에서 맨 위에 상단바가 자동으로 들어오게 됨 - 아래쪽에 있는이건 주로 **footer(하단 바)**.
<%@ include file="../chapter03/exam3_13_3.jsp" %>
⬇️
- 헤더 JSP 파일
- 본문 코드 (도서 목록 반복문)
- 푸터 JSP 파일
이렇게 3덩어리(또는 그 이상)가
JSP 컴파일 시 "한 파일"로 합쳐져서 서버에서 HTML로 바뀜.
③ 자바 클래스를 JSP에 연결: useBean
<jsp:useBean id="bookDAO" class="chapter04.BookRepository" scope="session" />
이건
bookDAO라는 이름으로BookRepository객체를 JSP에서 쓸 수 있게 만든다는 뜻.- 실제로 BookRepository 객체가 하나 만들어지고
이 객체 안에는 책 리스트(ArrayList<Book>)가 들어있음. - (session scope는 로그인 유지 같은 용도지만, 지금은 그냥 "JSP에서 객체를 공유"라고 보면 됨)
④ 자바 객체에서 데이터 꺼내기
<%
ArrayList<Book> listOfBooks = bookDAO.getAllBooks();
%>
- 아까 만든
bookDAO객체에서
getAllBooks() 메소드로 책 리스트를 꺼냄. - 이제 이 리스트(
listOfBooks)를 for문으로 돌리면서
각 책 정보를 한 줄씩 출력하는 것.
⑤ 한 페이지에 "조립"되는 순서 요약
- 헤더 (include)
- 도서 목록 본문 (직접 작성한 for문, 객체, 데이터)
- 푸터 (include)
즉,
여러 조각 → 한 덩어리 HTML 파일로 만들어서
브라우저에 보여줌
2. 동작 흐름
- JSP 파일 열림
↓ include된 JSP 조각들이 전부 이 위치에 복사
↓useBean으로 자바 객체(BookRepository) 생성
↓getAllBooks()로 데이터 가져옴
↓- for문 돌리며 각 책 데이터 출력
↓ - 마지막에 푸터 조각도 포함
↓ - 서버가 이 전체를 HTML로 변환해서 브라우저에 보냄
3.
- include : 여러 JSP 파일을 한페이지로 합쳐준다.
- useBean/import : 자바 객체와 클래스를 불러와서 JSP에서 쓸 수 있게 한다.
- for문 등 자바 코드 : 불러온 객체에서 데이터 꺼내서 보여준다.
비유로 다시 요약
- include : 레고 조각 붙이기 (여러 페이지 조각을 하나로 합치기)
- useBean/import : 창고(자바)에서 필요한 물건(데이터) 가져오기
- for문 등 : 가져온 물건(책들)을 테이블에 진열하는 작업
'JSP' 카테고리의 다른 글
| HTML → Servlet → JSP (0) | 2025.05.23 |
|---|---|
| JSP에서 Enumeration 개념 (0) | 2025.05.23 |
| JSP 주요 문법 기호 정리 (0) | 2025.05.21 |
| 02. 챕터 만들기 (0) | 2025.05.21 |
| 00. 초기환경설정부터 (0) | 2025.05.20 |