목록분류 전체보기 (718)
쌓고 쌓다
핸들러와 핸들러 어댑터에서 우선순위가 가장 높은 것은 RequestMappingHandlerMapping과 RequestMappingHandlerAdapter이다. 이 핸들러와 핸들러 어댑터는 어노테이션 기반의 컨트롤러를 지원한다. @RequestMapping 기반으로 컨트롤러를 구성해보자. V1 (Save) @Controller public class SpringMemberSaveControllerV1 { private MemberRepository memberRepository = MemberRepository.getInstance(); @RequestMapping("/springmvc/v1/members/save") public ModelAndView process(HttpServletRequest..
OldController @Component("/springmvc/old-controller") public class OldController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("OldController.handleRequest"); return new ModelAndView("new-form"); // 추가된 부분 } } 기존의 핸들러에 뷰를 사용할 수 있도록 new ModelAndView("new-form")를 반환해준다. application..
게시글 삭제시 해당 게시글에 포함되어 서버 내부에 저장된 파일 또한 같이 삭제하는 기능이다. 파일 삭제 자체 방법은 간단하다. File file = new File("저장된 파일 경로"); // EX) /Users/lsm/Desktop/imgFolder/abc.png (맥 기준) if(file.exists()) file.delete(); 그럼 내가 만들어보고있는 게시판에 적용해보자. UploadFileRepository public interface UploadFileRepository extends JpaRepository { List findByPno(Long pno); } 첨부파일 리포지토리에 게시글 번호 pno로 해당 게시글의 파일 객체들을 찾는 메서드를 추가했다. UploadFileService..
지금은 사용하지 않는 과거 컨트롤러로 핸들러 매핑과 어댑터를 이해하자. 과거 Controller 인터페이스 public interface Controller { @Nullable ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception; } 이 인터페이스를 컨트롤러에서 받아 구현할 예정이다. *Controller 인터페이스와 @Controller 어노테이션은 전혀 다르다. OldController import org.springframework.web.servlet.mvc.Controller; @Component("/springmvc/old-controller") public cl..
서버에 업로드하여 존재하는 파일을 응답하는 방법이다. 먼저 이미지 출력은 태그를 사용한다. 이제 요청에 맞춰 서버에서 파일을 응답해보자. 아래의 방법으로 간단히 이미지 파일을 응답하여 출력이 가능하다. @ResponseBody @GetMapping("/images/{filename}") public Resource downloadImage(@PathVariable String filename) throws MalformedURLException { return new UrlResource("file:" + fileStore.getFullPath(filename)); } 그러나 이 방법은 컨텐츠 헤더를 제대로 작성하지 않고 대충 던져도 웹 브라우저가 똑똑해서 알아서 컨텐츠 타입을 처리해서 보여주긴하나 타입..
회원과 사물함 같은 관계에서 일대일 연관관계 매핑을 사용할 수 있다. 테이블에서 주 테이블이든 대상 테이블이든 양 테이블중 한 곳에만 외래 키가 있다면 양쪽으로 조회할 수 있다. 외래 키를 주 테이블, 대상 테이블중 누가 관리할지 선택할 수 있다. 아래의 예시들은 멤버가 주 테이블이고 사물함이 대상 테이블이다. 단방향은 멤버에서 사물함을 참조하는 방향이다. 1. 주 테이블에 외래 키 주 테이블에 외래 키를 두면 주 객체가 대상 객체를 참조하듯이, 주 테이블에서 외래 키로 대상 테이블을 참조할 수 있다. 즉, 객체의 참조와 비슷하게 사용할 수 있다는 것이다. MEMBER 테이블에서 lokcer_id 외래 키로 Locker의 PK를 갖는다. 단방향 Member @Entity @Getter @Setter @N..
Sprng MVC 구조 Spring MVC도 FrontController 패턴이다. DispatcherServlet가 FrontController이다. DispatcherServlet은 부모를 타고타고 들어가보면 HttpServlet을 상속 받아있기에 서블릿으로 동작한다. 스프링부트는 DispatcherServlet을 서블릿으로 등록하며 모든 경로(urlPatterns="/")에 대해서 매핑한다. *DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet 요청 흐름 서블릿이 호출되면 HttpServlet의 service()가 호출된다. 그러나 FrameworkServlet에서 service()를 오버라이드해놨기에 FrameworkSe..
PosterController @GetMapping("/download/{id}") public ResponseEntity downloadAttach(@PathVariable Long fileId) throws MalformedURLException { UploadFile file = uploadFileRepository.findById(fileId).get(); String uploadFileName = file.getUploadFileName(); String storeFileName = file.getStoreFileName(); UrlResource urlResource = new UrlResource("file:" + fileStore.getFullPath(storeFileName)); Stri..