1. 도메인 객체(DTO)
속성(필드, 변수), 생성자, getter/setter
package com.springmvc.domain;
public class Book {
private String bookId;
private String name;
private int unitPrice;
private String author;
private String description;
private String publisher;
private String category;
private long unitsInStock;
private String releaseDate;
private String condition;
public Book() {
super();
}
public Book(String bookid, String name, int unitPrice) {
super();
this.bookId = bookid;
this.name = name;
this.unitPrice = unitPrice;
}
//getter/setter 생략
}
2. 퍼시스턴트 계층(DAO)
애너테이션 @Repository: 해당 클래스가 저장소 객체임을 의미
2.1 Repository 인터페이스 생성
package com.springmvc.repository;
import java.util.List;
import com.springmvc.domain.Book;
public interface BookRepository {
List<Book> getAllBookList();
}
2.2 인터페이스 구현
ArrayList<Book> 참조변수 listOfBooks 작성
생성자 작성
(오버라이드)listOfBooks 리턴하는 getAllBookList() 작성
package com.springmvc.repository;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.springmvc.domain.Book;
@Repository
public class BookRepositoryImpl implements BookRepository {
private List<Book> listOfBooks = new ArrayList<Book>();
public BookRepositoryImpl() {
Book book1 = new Book("ISBN1234", "C# 교과서", 30000);
book1.setAuthor("박용준");
book1.setDescription(
"C# 교과서』는 생애 첫 프로그래밍 언어로 C#을 시작하는 독자를 대상으로 한다. 특히 응용 프로그래머를 위한 C# 입문서로, C#을 사용하여 게임(유니티), 웹, 모바일, IoT 등을 개발할 때 필요한 C# 기초 문법을 익히고 기본기를 탄탄하게 다지는 것이 목적이다.");
book1.setPublisher("길벗");
book1.setCategory("IT전문서");
book1.setUnitsInStock(1000);
book1.setReleaseDate("2020/05/29");
Book book2 = new Book("ISBN1235", "Node.js 교과서", 36000);
book2.setAuthor("조현영");
book2.setDescription(
"이 책은 프런트부터 서버, 데이터베이스, 배포까지 아우르는 광범위한 내용을 다룬다. 군더더기 없는 직관적인 설명으로 기본 개념을 확실히 이해하고, 노드의 기능과 생태계를 사용해보면서 실제로 동작하는 서버를 만들어보자. 예제와 코드는 최신 문법을 사용했고 실무에 참고하거나 당장 적용할 수 있다.");
book2.setPublisher("길벗");
book2.setCategory("IT전문서");
book2.setUnitsInStock(1000);
book2.setReleaseDate("2020/07/25");
Book book3 = new Book("ISBN1236", "어도비 XD CC 2020", 25000);
book3.setAuthor("김두한");
book3.setDescription(
"어도비 XD 프로그램을 통해 UI/UX 디자인을 배우고자 하는 예비 디자이너의 눈높이에 맞게 기본적인 도구를 활용한 아이콘 디자인과 웹&앱 페이지 디자인, UI 디자인, 앱 디자인에 애니메이션과 인터랙션을 적용한 프로토타이핑을 학습합니다.");
book3.setPublisher("길벗");
book3.setCategory("IT활용서");
book3.setUnitsInStock(1000);
book3.setReleaseDate("2019/05/29");
listOfBooks.add(book1);
listOfBooks.add(book2);
listOfBooks.add(book3);
}
@Override
public List<Book> getAllBookList() {
return listOfBooks;
}
}
3. 서비스 계층(비즈니스)
3.1 인터페이스 작성
package com.springmvc.service;
import java.util.List;
import com.springmvc.domain.Book;
public interface BookService {
List<Book> getAllBookList();
}
3.2 인터페이스 구현
package com.springmvc.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.springmvc.domain.Book;
import com.springmvc.repository.BookRepository;
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookRepository bookRepository;
@Override
public List<Book> getAllBookList() {
return bookRepository.getAllBookList();
}
}
4. 프레젠테이션 계층(컨트롤러)
package com.springmvc.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.springmvc.domain.Book;
import com.springmvc.service.BookService;
@Controller
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping(value="/books", method=RequestMethod.GET)
public String requestBookList(Model model) {
List<Book> list = bookService.getAllBookList();
model.addAttribute("bookList", list);
return "books";
}
}
컨트롤러와 의존 관계의 빈 객체 등록
servlet-context.xml 수정
<context:component-scan base-package="com.springmvc.*" />
뷰 구현
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<link href="./resources/css/bootstrap.min.css" rel="stylesheet">
<meta charset="UTF-8">
<title>도서 목록</title>
</head>
<body>
<nav class="navbar navbar-expand navbar-dark bg-dark">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="./home">Home</a>
</div>
</div>
</nav>
<div class="jumbotron">
<div class="container">
<h1 class="display-3">도서 목록</h1>
</div>
</div>
<div class="container">
<div class="row" align="center">
<c:forEach items="${bookList}" var="book">
<div class="col-md-4">
<h3>${book.name}</h3>
<p>${book.author}
<br>${book.publisher} | ${book.releaseDate}
<p align=left>${fn:substring(book.description, 0, 100)}...
<p>${book.unitPrice}원
</div>
</c:forEach>
</div>
<hr>
<footer>
<p>© BookMarket
</footer>
</div>
</body>
</html>
시퀀스 다이어그램
*@Autowired: 의존 관계에 있는 클래스의 프로퍼티(멤버 변수)에 대해 Setter() 메서드를 대신 선언하는 애너테이션
@Autowired //자동으로 변수에 대입, 연관관계 BookServiceImpl->BookRepositoryImpl
private BookRepository bookRepository;
//사용하지 않을 경우
public void setBookRepository(BookRepository bookRepository){
this.bookRepository = bookRepository;
}
'정리노트' 카테고리의 다른 글
[스프링] 폼 태그 (0) | 2024.01.19 |
---|---|
[스프링]MVC (0) | 2024.01.18 |
[스프링] 스프링 MVC 분석 (0) | 2024.01.16 |
[스프링] 스프링 MVC (0) | 2024.01.15 |
[스프링] Spring 설치 및 Maven Project 생성 (0) | 2024.01.12 |