스프링부트

클라이언트 요청: 클라이언트가 /list로 요청을 보냅니다.
클라이언트 (브라우저)
→
/list 경로로 HTTP 요청
컨트롤러(BookController):
클라이언트 요청을 받으면 BookService의 getAllBooks() 메서드를 호출합니다.
클라이언트 → BookController
→ BookService.getAllBooks()
서비스(BookService):
서비스는 비즈니스 로직을 처리하고, BookRepository를 통해 데이터베이스에서 책 목록을 가져옵니다.
BookController → BookService
→ BookRepository.findAll()
레포지토리(BookRepository):
Spring Data JPA가 BookRepository에서 데이터베이스와 상호작용하여 Book 엔티티 목록을 가져옵니다.
BookService → BookRepository
→ 데이터베이스(Book 테이블)
데이터베이스:
BookRepository는 데이터베이스에서 Book 테이블을 조회하고, 책 정보를 가져옵니다.
BookRepository → 데이터베이스
→ Book 엔티티 목록 반환
서비스(BookService):
BookRepository로부터 가져온 책 목록을 BookService가 컨트롤러로 전달합니다.
데이터베이스 → BookRepository
→ BookService → BookController
컨트롤러(BookController):
BookController는 서비스에서 받은 books 리스트를 모델에 추가하고, 이를 뷰로 전달합니다.
BookService → BookController
→ model.addAttribute("books", books)
→ "list" (HTML 뷰)
뷰(View):
list.html 파일에서 모델에 담긴 books 데이터를 사용하여 클라이언트에게 렌더링된 페이지를 응답합니다.
BookController → 템플릿 엔진(Thymeleaf 등)
→ 클라이언트에게 list.html 페이지로 응답


package com.example.Springboot.controller;
import com.example.Springboot.entity.Book;
import com.example.Springboot.entity.BookDTO;
import com.example.Springboot.entity.BookPayloadDTO;
import com.example.Springboot.service.BookService;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
@Tag(name="My REST API", description = "책 API 서비스이다.")
public class BookRestController {
public final BookService bookService;
//GET : http://localhost:8082/api/book
@GetMapping("/book")
public List<BookDTO> books(){
List<BookDTO> books = bookService.getAllBooksDTO();
return books; // JSON(MessageConverter:순환참조 문제 발생)
}
//등록용
@PostMapping("/book")
public BookDTO register(@RequestBody BookPayloadDTO dto){
Book book = new Book(); // Table로 인식함(엔티티)
BookDTO view = new BookDTO();
try {
book.setTitle(dto.getTitle());
book.setPrice(dto.getPrice());
book.setAuthor(dto.getAuthor());
book.setPage(dto.getPage());
book = bookService.save(book); //등록 후 등록된 book반환
// BookDTO(응답용)를 사용
view.setId(book.getId());
view.setTitle(book.getTitle());
view.setAuthor(book.getAuthor());
view.setPrice(book.getPrice());
view.setPage(book.getPage());
}catch (Exception e){
e.printStackTrace();
}
return view;
}
}
rest만드는건 다른쪽 시스템이 쓸려고만듬
자기가 쓸려면 컨트롤 만들고 html로 가면됩니다.
등록 > db저장
view는 null 나오는데 보여지는거 떄문에사용

restapi는 벡과 뷰 분리하기 위함입니다.

rest api 줘
받아서 동적으로 restlist.html body에 넣습니다.

js파일을 찾습니다.

fetch.then.then인데
다른방법으로 하겠습니다.

function loadBookList(){
console.log("OK");
//1. fetch().then().then().catch()
//2. async/await
}
기다리다가 callback 방식
비동기
const response(응답)=요청;
요청한걸 응답 받겠다.

인증키가 노출됩니다.
경로만 알면 자바스크립트 열수 있습니다.
<script th:src="@{/js/restlist.js}"></script>

키를 이용해서 서비스를 쓸수도 있습니다.

보안추가

로그아웃
