파일 목록
-
📁 .metadata
-
📁 .mylyn
-
📁 contexts
- repositories.xml.zip
-
-
📁 .plugins
-
📁 org.eclipse.buildship.core
-
📁 init.d
-
📁 project-preferences
-
-
📁 org.eclipse.buildship.ui
-
📁 org.eclipse.core.resources
-
📁 .history
-
📁 22
-
📁 28
-
📁 6a
-
📁 78
-
📁 7e
-
📁 83
-
📁 ca
-
📁 e
-
📁 fe
-
-
📁 .projects
-
📁 .org.eclipse.egit.core.cmp
-
📁 BookMarket
-
📁 .indexes
-
📁 af
-
-
📁 org.eclipse.jdt.apt.core
-
📁 org.eclipse.jdt.core
- .location
- .markers
- .markers.snap
- .syncinfo.snap
-
-
📁 Chap02
-
📁 org.eclipse.jdt.apt.core
-
📁 org.eclipse.jdt.core
- .markers
- .markers.snap
- .syncinfo.snap
-
-
-
📁 .root
-
📁 .safetable
- 10.snap
-
-
📁 org.eclipse.core.runtime
-
📁 .settings
- Docker.prefs
- org.eclipse.buildship.ui.prefs
- org.eclipse.core.resources.prefs
- org.eclipse.debug.ui.prefs
- org.eclipse.egit.core.prefs
- org.eclipse.epp.mpc.ui.prefs
- org.eclipse.jdt.core.prefs
- org.eclipse.jdt.debug.ui.prefs
- org.eclipse.jdt.junit.prefs
- org.eclipse.jdt.launching.prefs
- org.eclipse.jdt.ui.prefs
- org.eclipse.jsch.core.prefs
- org.eclipse.jst.j2ee.webservice.ui.prefs
- org.eclipse.m2e.apt.prefs
- org.eclipse.m2e.discovery.prefs
- org.eclipse.mylyn.context.core.prefs
- org.eclipse.mylyn.monitor.ui.prefs
- org.eclipse.mylyn.tasks.ui.prefs
- org.eclipse.pde.api.tools.prefs
- org.eclipse.ui.browser.prefs
- org.eclipse.ui.ide.prefs
- org.eclipse.ui.navigator.prefs
- org.eclipse.ui.prefs
- org.eclipse.ui.workbench.prefs
- org.eclipse.wst.jsdt.ui.prefs
- org.eclipse.wst.jsdt.web.core.prefs
- org.eclipse.wst.sse.ui.prefs
- org.eclipse.wst.ws.service.policy.prefs
- org.springframework.ide.eclipse.boot.dash.prefs
- org.springframework.ide.eclipse.boot.launch.prefs
- org.springframework.ide.eclipse.boot.prefs
- org.springframework.ide.eclipse.imports.prefs
- org.springsource.ide.eclipse.commons.ui.prefs
-
-
📁 org.eclipse.datatools.connectivity
-
📁 org.eclipse.debug.core
-
📁 org.eclipse.debug.ui
-
📁 org.eclipse.e4.workbench
-
📁 org.eclipse.eclemma.core
-
📁 .execdata
-
-
📁 org.eclipse.egit.core
-
📁 .org.eclipse.egit.core.cmp
-
📁 .settings
- .project
-
-
-
📁 org.eclipse.emf.common.ui
-
📁 org.eclipse.epp.mpc.ui
-
📁 org.eclipse.equinox.p2.ui
-
📁 org.eclipse.jdt.core
- 1032664556.index
- 1046776222.index
- 1085918923.index
- 1098367511.index
- 1103990142.index
- 114257520.index
- 1259591260.index
- 1306943540.index
- 1342465706.index
- 1343725884.index
- 1406489186.index
- 1423644118.index
- 1499060772.index
- 150191461.index
- 153282544.index
- 1561259185.index
- 1587038330.index
- 1591058950.index
- 163494242.index
- 1737725865.index
- 1795320714.index
- 1802910406.index
- 1814875633.index
- 1823358352.index
- 1829605366.index
- 1855262625.index
- 1865797976.index
- 1877692097.index
- 1899050622.index
- 1901848277.index
- 1908842224.index
- 1950052445.index
- 203363936.index
- 2093080152.index
- 213132002.index
- 2158070117.index
- 2187926128.index
- 2208116219.index
- 2239392838.index
- 2270640161.index
- 2300481235.index
- 2323862626.index
- 2327230697.index
- 2361831942.index
- 2403806799.index
- 2425170697.index
- 2428421529.index
- 243173088.index
- 243444292.index
- 246872496.index
- 2574092214.index
- 2606035263.index
- 2642855571.index
- 2673762025.index
- 2687063221.index
- 2694330660.index
- 2716873423.index
- 2735274666.index
- 2762635672.index
- 2785578155.index
- 281274800.index
- 2874808635.index
- 2910265552.index
- 2922188548.index
- 2940098355.index
- 2947743441.index
- 2960267103.index
- 3005342323.index
- 3039149765.index
- 3092362395.index
- 3171200218.index
- 3185776176.index
- 3289718304.index
- 3343647032.index
- 3350778374.index
- 3368243042.index
- 3394968329.index
- 3413701618.index
- 3413725848.index
- 3463701276.index
- 3550271171.index
- 3552686602.index
- 3553503214.index
- 3554740767.index
- 3593383410.index
- 3667659376.index
- 3680454040.index
- 3691127648.index
- 376211574.index
- 3767840844.index
- 3806757576.index
- 3822504139.index
- 3830692465.index
- 3847922432.index
- 3851352355.index
- 3896498729.index
- 4019127980.index
- 4032350038.index
- 4094206136.index
- 4097592731.index
- 4141668602.index
- 4236191647.index
- 426763299.index
- 437405910.index
- 479256431.index
- 509260333.index
- 521676379.index
- 523827649.index
- 524399751.index
- 553796313.index
- 578923137.index
- 594698515.index
- 671830540.index
- 761271397.index
- 766539937.index
- 773662974.index
- 804699012.index
- 83750376.index
- 838434006.index
- 862373323.index
- 869691404.index
- 901893090.index
- 904368330.index
- 924643285.index
- 926828645.index
- 97507228.index
- 976341134.index
- assumedExternalFilesCache
- externalFilesCache
- externalLibsTimeStamps
- indexNamesMap.txt
- javaLikeNames.txt
- nonChainingJarsCache
- savedIndexNames.txt
- variablesAndContainers.dat
-
📁 org.eclipse.jdt.junit.core
-
📁 history
-
-
📁 org.eclipse.jdt.launching
-
📁 org.eclipse.jdt.ui
-
📁 org.eclipse.linuxtools.docker.core
-
📁 org.eclipse.linuxtools.docker.ui
-
📁 org.eclipse.ltk.core.refactoring
-
📁 .refactorings
-
📁 .workspace
-
📁 2025
-
📁 3
-
-
-
📁 Chap02
-
📁 2025
-
📁 3
-
-
-
-
-
📁 org.eclipse.ltk.ui.refactoring
-
📁 org.eclipse.m2e.core
-
📁 org.eclipse.m2e.logback
-
📁 org.eclipse.mylyn.context.core
-
📁 contexts
-
-
📁 org.eclipse.mylyn.github.ui
-
📁 org.eclipse.mylyn.tasks.ui
-
📁 org.eclipse.oomph.setup
-
📁 org.eclipse.oomph.setup.ui
-
📁 org.eclipse.pde.api.tools
-
📁 org.eclipse.pde.core
-
📁 .cache
-
📁 .p2
-
📁 org.eclipse.equinox.p2.engine
-
📁 profileRegistry
-
-
-
-
📁 org.eclipse.tips.ide
-
📁 org.eclipse.tm.terminal.view.ui
-
📁 .executables
-
-
📁 org.eclipse.ui.editors
-
📁 org.eclipse.ui.ide
-
📁 org.eclipse.ui.intro
-
📁 org.eclipse.ui.workbench
-
📁 org.eclipse.userstorage.oauth
-
📁 org.eclipse.wildwebdeveloper.embedder.node
-
📁 org.eclipse.wst.common.modulecore
-
📁 org.eclipse.wst.internet.cache
-
📁 org.eclipse.wst.jsdt.core
-
📁 indexes
-
📁 libraries
- externalLibsTimeStamps
- variablesAndContainers.dat
-
-
📁 org.eclipse.wst.jsdt.ui
-
📁 org.eclipse.wst.jsdt.web.core
-
📁 JSWebResourceEventManager
-
-
📁 org.eclipse.wst.server.core
-
📁 org.eclipse.wst.sse.core
-
📁 org.eclipse.wst.sse.ui
-
📁 org.eclipse.wst.xml.core
-
📁 org.springframework.ide.eclipse.boot
-
📁 installs
-
-
📁 org.springframework.ide.eclipse.boot.dash
-
📁 org.springframework.tooling.boot.ls
-
- .lock
- .log
- version.ini
-
-
📁 BookMarket
-
📁 .apt_generated
-
📁 .apt_generated_tests
-
📁 .gradle
-
📁 8.5
-
📁 checksums
-
📁 dependencies-accessors
-
📁 executionHistory
-
📁 fileChanges
-
📁 fileHashes
-
📁 vcsMetadata
- gc.properties
-
-
📁 buildOutputCleanup
-
📁 vcs-1
- file-system.probe
-
-
📁 bin
-
📁 default
-
📁 main
-
📁 com
-
📁 springboot
-
📁 interceptor
- BookMarketApplication.class
-
-
📁 logging
-
📁 static
-
📁 css
-
📁 images
-
📁 js
- welcome.html
-
-
📁 templates
- application.properties
- messages.properties
-
-
📁 test
-
📁 com
-
📁 springboot
-
-
-
-
📁 build
-
📁 classes
-
📁 java
-
📁 main
-
-
-
📁 generated
-
📁 sources
-
📁 annotationProcessor
-
📁 java
-
📁 main
-
-
-
📁 headers
-
📁 java
-
📁 main
-
-
-
-
-
📁 tmp
-
📁 compileJava
-
-
-
📁 gradle
-
📁 wrapper
-
-
📁 src
-
📁 main
-
📁 java
-
📁 com
-
📁 springboot
-
📁 interceptor
- BookMarketApplication.java
-
-
-
📁 resources
-
📁 logging
-
📁 static
-
📁 css
-
📁 images
-
📁 js
- welcome.html
-
-
📁 templates
- application.properties
- messages.properties
-
-
-
📁 test
-
📁 java
-
📁 com
-
📁 springboot
-
-
-
-
- .classpath
- .gitignore
- .project
- build.gradle
- gradlew
- gradlew.bat
- HELP.md
- settings.gradle
-
- .project
- Title.png
package com.springboot.controller;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.io.File; // 파일 처리용
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; // RequestMethod 추가
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.MatrixVariable;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.BindingResult;
import com.springboot.domain.Book;
import com.springboot.service.BookService;
import com.springboot.validator.UnitsInStockValidator; // validator는 그대로 유지
import com.springboot.exception.CategoryException;
import jakarta.validation.Valid;
import com.springboot.validator.BookValidator;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ExceptionHandler;
import com.springboot.exception.BookIdException;
@Controller
@RequestMapping(value = "/books")
public class BookController {
@Autowired
private BookService bookService;
@Value("${file.uploadDir}")
String fileDir;
@Autowired
private BookValidator bookValidator;
@GetMapping
public String requestBookList(Model model) {
List<Book> list = bookService.getAllBookList();
model.addAttribute("bookList", list);
return "books";
}
@GetMapping("/all")
public ModelAndView requestAllBooks() {
ModelAndView modelAndView = new ModelAndView();
List<Book> list = bookService.getAllBookList();
modelAndView.addObject("bookList", list);
modelAndView.setViewName("books");
return modelAndView;
}
@GetMapping("/book")
public String requestBookById(@RequestParam("id") String bookId, Model model) {
Book bookById = bookService.getBookById(bookId);
model.addAttribute("book", bookById);
return "book";
}
@GetMapping("/{category}")
public String requestBooksbyCategory (@PathVariable("category") String bookCategory, Model model) {
List<Book> booksByCategory = bookService.getBookListByCategory(bookCategory);
if(booksByCategory == null || booksByCategory.isEmpty()) {
throw new CategoryException();
}
model.addAttribute("bookList", booksByCategory);
return "books";
}
@GetMapping("/filter/{bookFilter}")
public String requestBooksbyFilter (@MatrixVariable(pathVar = "bookFilter") Map<String, List<String>> bookFilter, Model model) {
Set<Book> booksByFilter = bookService.getBookListByFilter(bookFilter);
model.addAttribute("bookList", booksByFilter);
return "books";
}
@GetMapping("/add")
public String requestAddBookForm(Model model) {
model.addAttribute("book", new Book());
return "addBook";
}
@PostMapping("/add")
public String submitAddNewBook(@Valid @ModelAttribute Book book, BindingResult bindingResult) {
if(bindingResult.hasErrors())
return "addBook";
MultipartFile bookImageFile = book.getBookImage();
String finalFileName = null;
if (bookImageFile != null && !bookImageFile.isEmpty()) {
String originalFilename = bookImageFile.getOriginalFilename();
if (originalFilename != null && !originalFilename.trim().isEmpty()) {
finalFileName = new File(originalFilename).getName(); // <--- 순수 파일명 추출!
File saveFile = new File(fileDir, finalFileName);
try {
bookImageFile.transferTo(saveFile);
} catch (Exception e) {
throw new RuntimeException("도서 이미지 업로드가 실패하였습니다: " + e.getMessage(), e);
}
}
}
book.setFileName(finalFileName);
bookService.setNewBook(book);
return "redirect:/books";
}
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("addTtitle", "신규 도서 등록");
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setValidator(bookValidator);
binder.setAllowedFields("bookId", "name", "unitPrice", "author", "description", "publisher", "category", "unitsInStock", "releaseDate", "condition", "bookImage");
}
@ExceptionHandler(value={BookIdException.class})
public ModelAndView handleError(HttpServletRequest req, BookIdException exception) {
ModelAndView mav = new ModelAndView();
mav.addObject("invalidBookId", exception.getBookId());
mav.addObject("exception", exception);
mav.addObject("url", req.getRequestURL()+"?"+req.getQueryString());
mav.setViewName("errorBook");
return mav;
}
// 도서 수정 페이지 출력
@GetMapping("/update")
public String getUpdateBookForm(@ModelAttribute("updateBook") Book book, @RequestParam("id") String bookId, Model model) {
Book bookById = bookService.getBookById(bookId);
model.addAttribute("book", bookById);
return "updateForm";
}
// 도서 수정 처리
@PostMapping("/update")
public String processUpdatewBookForm(@ModelAttribute("updateBook") Book book) {
MultipartFile bookImage = book.getBookImage();
if (bookImage!= null && !bookImage.isEmpty()) {
try {
String fname = bookImage.getOriginalFilename();
File saveFile = new File(fileDir, fname);
bookImage.transferTo(saveFile);
book.setFileName(fname);
} catch (Exception e) {
throw new RuntimeException("Book Image saving failed", e);
}
} else {
// 이미지가 없는 경우, 기존 파일 이름을 유지하기 위해
// DB에서 기존 book 정보를 가져와서 fileName을 복사해야 합니다.
Book existingBook = bookService.getBookById(book.getBookId());
book.setFileName(existingBook.getFileName());
}
bookService.setUpdateBook(book);
return "redirect:/books";
}
// 도서 삭제
@RequestMapping(value = "/delete", method = RequestMethod.GET)
public String getDeleteBookForm (Model model, @RequestParam("id") String bookId) {
bookService.setDeleteBook(bookId);
return "redirect:/books";
}
}