backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  1. 스프링
  2. 서블릿, JSP

11 도서관리 프로젝트 실습

p215 - src/main/java/boot/start/domain/Book

@Getter @Setter @NoArgsConstructor @AllArgsConstructor
public class Book {
    // 인덱스 번호
    private Long id;
    // 도서 이름
    private String title;
    // 출판사
    private String publisher;
    // 판매 가격
    private double salePrice;
    // 대여 비용
    private double rentalPrice;
    // 대여자
    private String renter;
    // 등록일자
    private LocalDate registrationDate;
    // 수정일자
    private LocalDate updateDate;
}

p217 - build.gradle

plugins {
	id 'java'
	id 'war'
	id 'org.springframework.boot' version '3.2.8'
	id 'io.spring.dependency-management' version '1.1.6'
}

group = 'education'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
	implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api'
	implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
	implementation 'jakarta.servlet:jakarta.servlet-api'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
	implementation 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
}

tasks.named('test') {
	useJUnitPlatform()
}

p218 - src/main/java/boot/start/repository/BookRepository

public class BookRepository {
    private final ConcurrentMap<Long, Book> bookMap = new ConcurrentHashMap<>();
    private static Long bookIndex = 0L;

    // 싱글톤 인스턴스를 위한 static 변수
    private static final BookRepository instance = new BookRepository();

    // private 생성자: 외부에서 인스턴스 생성 불가
    private BookRepository() {}

    // 유일한 인스턴스를 반환하는 메서드
    public static BookRepository getInstance() {
        return instance;
    }

    // CREATE: Book 객체 저장
    public Book save(Book book) {
        book.setId(++bookIndex);
        bookMap.put(book.getId(), book);
        return book;
    }

    // READ: ID로 책 검색
    public Optional<Book> findById(Long id) {
        return Optional.ofNullable(bookMap.get(id));
    }

    // READ: 모든 책 리스트 반환
    public List<Book> findAll() {
        return new ArrayList<>(bookMap.values());
    }

    // UPDATE: 기존 책 정보 수정
    public Optional<Book> update(Long id, Book updatedBook) {
        if (bookMap.containsKey(id)) {
            updatedBook.setId(id); // 기존 ID 유지
            bookMap.put(id, updatedBook);
            return Optional.of(updatedBook);
        }
        return Optional.empty();
    }

    // DELETE: ID로 책 삭제
    public boolean delete(Long id) {
        return bookMap.remove(id) != null;
    }
}

p219, 220, 222, 223, 227, 229 - src/main/java/boot/start/servlet/BookServlet

@WebServlet(name = "BookServlet", urlPatterns = {"/books", "/books/create", "/books/update", "/books/delete", "/books/list"})
public class BookServlet extends HttpServlet {
    private final BookRepository bookRepository = BookRepository.getInstance();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getServletPath();

        switch (action) {
            case "/books/create":
                showCreateForm(req, resp);
                break;
            case "/books/update":
                showUpdateForm(req, resp);
                break;
            case "/books/delete":
                deleteBook(req, resp);
                break;
            case "/books/list":
            default:
                listBooks(req, resp);
                break;
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getServletPath();

        switch (action) {
            case "/books/create":
                createBook(req, resp);
                break;
            case "/books/update":
                updateBook(req, resp);
                break;
            default:
                listBooks(req, resp);
                break;
        }
    }

    private void showCreateForm(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        RequestDispatcher dispatcher = req.getRequestDispatcher("/jsp/book/book-form.jsp");
        dispatcher.forward(req, resp);
    }

    private void showUpdateForm(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Long id = Long.parseLong(req.getParameter("id"));
        Optional<Book> existingBook = bookRepository.findById(id);

        if (existingBook.isPresent()) {
            req.setAttribute("book", existingBook.get());
            RequestDispatcher dispatcher = req.getRequestDispatcher("/jsp/book/book-form.jsp");
            dispatcher.forward(req, resp);
        } else {
            resp.sendRedirect("/books/list");
        }
    }

    private void createBook(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String title = req.getParameter("title");
        String publisher = req.getParameter("publisher");
        double salePrice = Double.parseDouble(req.getParameter("salePrice"));
        double rentalPrice = Double.parseDouble(req.getParameter("rentalPrice"));
        String renter = req.getParameter("renter");

        Book newBook = new Book();
        newBook.setTitle(title);
        newBook.setPublisher(publisher);
        newBook.setSalePrice(salePrice);
        newBook.setRentalPrice(rentalPrice);
        newBook.setRenter(renter);
        newBook.setRegistrationDate(LocalDate.now());
        newBook.setUpdateDate(LocalDate.now());

        bookRepository.save(newBook);
        resp.sendRedirect("/books/list");
    }

    private void updateBook(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        Long id = Long.parseLong(req.getParameter("id"));
        String title = req.getParameter("title");
        String publisher = req.getParameter("publisher");
        double salePrice = Double.parseDouble(req.getParameter("salePrice"));
        double rentalPrice = Double.parseDouble(req.getParameter("rentalPrice"));
        String renter = req.getParameter("renter");

        Optional<Book> existingBook = bookRepository.findById(id);

        if (existingBook.isPresent()) {
            Book bookToUpdate = existingBook.get();
            bookToUpdate.setTitle(title);
            bookToUpdate.setPublisher(publisher);
            bookToUpdate.setSalePrice(salePrice);
            bookToUpdate.setRentalPrice(rentalPrice);
            bookToUpdate.setRenter(renter);
            bookToUpdate.setUpdateDate(LocalDate.now());

            bookRepository.update(id, bookToUpdate);
            resp.sendRedirect("/books/list");
        } else {
            resp.sendRedirect("/books/list");
        }
    }

    private void deleteBook(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        Long id = Long.parseLong(req.getParameter("id"));
        bookRepository.delete(id);
        resp.sendRedirect("/books/list");
    }

    private void listBooks(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Book> bookList = bookRepository.findAll();
        req.setAttribute("books", bookList);
        RequestDispatcher dispatcher = req.getRequestDispatcher("/jsp/book/book-list.jsp");
        dispatcher.forward(req, resp);
    }
}

p225 - src/main/webapp/jsp/book/book-form.jsp

<%@ page import="boot.start.domain.Book" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    Book book = (Book) request.getAttribute("book");
    String actionUrl = (book == null) ? "/books/create" : "/books/update?id=" + book.getId();
%>
<!DOCTYPE html>
<html>
<head>
    <title><%= (book == null) ? "Create Book" : "Update Book" %></title>
</head>
<body>
<h1><%= (book == null) ? "Create Book" : "Update Book" %></h1>
<form action="<%= actionUrl %>" method="post">
    <label for="title">Title:</label>
    <input type="text" id="title" name="title" value="<%= (book != null) ? book.getTitle() : "" %>"><br>

    <label for="publisher">Publisher:</label>
    <input type="text" id="publisher" name="publisher" value="<%= (book != null) ? book.getPublisher() : "" %>"><br>

    <label for="salePrice">Sale Price:</label>
    <input type="text" id="salePrice" name="salePrice" value="<%= (book != null) ? book.getSalePrice() : "" %>"><br>

    <label for="rentalPrice">Rental Price:</label>
    <input type="text" id="rentalPrice" name="rentalPrice" value="<%= (book != null) ? book.getRentalPrice() : "" %>"><br>

    <label for="renter">Renter:</label>
    <input type="text" id="renter" name="renter" value="<%= (book != null) ? book.getRenter() : "" %>"><br>

    <input type="submit" value="<%= (book == null) ? "Create" : "Update" %>">
</form>
<a href="/books/list">Back to List</a>
</body>
</html>

p228 - src/main/webapp/jsp/book-list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="boot.start.domain.Book" %>
<%@ page import="java.util.List" %>
<!DOCTYPE html>
<html>
<head>
    <title>Book List</title>
</head>
<body>
<h1>Book List</h1>
<table border="1">
    <tr>
        <th>ID</th>
        <th>Title</th>
        <th>Publisher</th>
        <th>Sale Price</th>
        <th>Rental Price</th>
        <th>Renter</th>
        <th>Actions</th>
    </tr>
    <%
        List<Book> books = (List<Book>) request.getAttribute("books");
        for (Book book : books) {
    %>
    <tr>
        <td><%= book.getId() %></td>
        <td><%= book.getTitle() %></td>
        <td><%= book.getPublisher() %></td>
        <td><%= book.getSalePrice() %></td>
        <td><%= book.getRentalPrice() %></td>
        <td><%= book.getRenter() %></td>
        <td>
            <a href="/books/update?id=<%= book.getId() %>">Update</a> |
            <a href="/books/delete?id=<%= book.getId() %>">Delete</a>
        </td>
    </tr>
    <%
        }
    %>
</table>
<a href="/books/create">Add New Book</a>
</body>
</html>
Previous서블릿,필터,리스너 보충자료NextSpring Boot

Last updated 6 months ago