본문 바로가기

👩‍💻 BackEnd/🌿 스프링 [Spring]

[ Spring ] Controller 에서 데이터를 어떤 형태로 받아야하는가? (@RequestBody, @RequestParam) 📌 개인적으로 헷갈려서 작성하게 된 글입니다. 참고자료는 아래 링크 참고 1. form 데이터 @RequestBody- 폼 태그로 데이터를 전송 시 메서드의 변수명 상관이 없지만, @PostMapping("/reply")public string reply(@RequestBody String request){ return "result";} @RequestParam- 폼 태그로 데이터 전송 시 데이터를 저장하는 이름으로 메서드의 변수명을 설정해주어야 함. name 을 전송한다는 가정하에 같은 변수 명으로 받아줘야 한다. @PostMapping("/reply")public string reply(@RequestParam String name){ return "result";}2. Json 형식의 데이터 서.. 더보기
[ Spring / fileUpload ] File Upload / File Download 기능 구현 개발 환경 sts 4 mybatis oracle xe 11g요구사항파일 업로드 각 게시글 업로드 시 파일 첨부파일 저장 시 게시글 별로 폴더 새로 생성해서 저장uuid + 업로드 파일 이름 형식으로 파일 저장  파일 다운로드 다운로드 받을 때는 uuid가 없는 원본 파일 이름으로 다운로드  파일 업로드 // 컨트롤러 @PostMapping("/board/write")public String insertBoard(BoardListDto dto, Model model, HttpSession session) throws Exception { Long userId = (Long) session.getAttribute(SessionConst.USER_ID); if (userId == null) { .. 더보기
[ Spring / Spring Boot ] 스프링 인터셉터 활용하여 인가작업 처리하기 ✅ 인터셉터를 활용하게 된 배경  게시판 프로젝트를 혼자서 공부하면서 만들던 중 드디어 로그인 이후 사용자의 요청을 구분해야하는 시기가 다가왔다!  로그인한 사용자들은 게시글 작성, 수정, 삭제 등을 할 수 있어야하고, 로그인하지 않은 사용자들은 게시글 조회 등의 작업을 할 수 있다.  그렇게 되면 게시글 작성, 수정, 삭제 로직마다 세션을 확인해서 세션을 갖고 있는 사용자인지 확인을 하는 로직을 아마 매번 넣어야할텐데매요청마다 이러한 로직을 작성하는 것은 코드의 중복을 초래한다.  이를 위해 따로 메서드를 작성하여 해당 메서드를 컨트롤러 단에서 처리할 수 있겠지만그러한 *공통 관심사는 다른 방법으로 해결하는 것이 바람직할 것 같다는 생각이 들었다.   사실 나는 부트캠프에서 프로젝트를 진행하면서 항상 .. 더보기
interceptor 3가지 메서드 스프링 MVC 흐름request -> Dispatcher Servlet -> Handler Mapping -> *preHandle -> Controller -> *postHandle -> ViewResolver -> View -> response -> *afterCompletion()  - Handler Adapter 의 세가지 메서드 1.  preHandle- 컨트롤러 실행 전, 즉 컨트롤러로 요청이 들어가기 전에 수행된다. 그리고 return 시 true 이면 컨트롤러 uri로 가고, false이면 컨트롤러 요청을 하지 않는다.  2. postHandle- 컨트롤러(핸들러) 실행하고 나서 뷰 실행 전, 즉 컨트롤러의 핸들러 처리가 끝나 return 되고 뷰 화면을 response 하기 직전에 post.. 더보기
[Spring MVC] spring mvc 실용적인 방식 v2 방법 -> 하나의 컨트롤러에 메서드를 모아서 작성 요청마다 나눴던 컨트롤러의 메서드를 한 클래스에 모아서 사용이 가능하며 동일한 uri 주소는 컨트롤러에 @RequestMapping 어노테이션을 활용하여 클래스 레벨에 작성해주고, 고유한 uri 주소는 메서드 단에 @RequestMapping 어노테이션을 활용하여 작성해주면 컨트롤러가 실행되면서 두 uri 를 조합하여 사용하게 된다. @Controller @RequestMapping("/springmvc/v2/members") public class SpringMemberControllerV2 { private MemberRepository memberRepository = MemberRepository.getInstance(); @RequestMa.. 더보기
[Spring MVC] DispatcherServlet / 핸들러 매핑과 핸들러 어댑터 DispatcherServlet Spring MVC도 프론트 컨트롤러 패턴으로 구현되어있다. Spring MVC 의 프론트 컨트롤러가 바로 디스패쳐 서블릭이다. 그리고 DispacherServlet이 바로 Spring MVC 의 핵심이다. DispatcherServlet의 서블릿 등록 DispacherServlet 도 부모 클래스에서 HttpServlet을 상속 받아 사용하고 서블릿으로 동작한다. 스프링 부트는 DispacherServlet 을 서블릿으로 자동으로 등록하면서 모든 경로 (urlPattern="/")에 대해서 매핑한다. 그럼 모든 /로 시작하는 다른 경로는? 이라는 생각이 들텐데 참고로 더 자세한 경로가 우선순위가 높다. 인터페이스 살펴보기 스프링 MVC 의 큰 강점은 DispatcherS.. 더보기
[Spring MVC] MVC 패턴 구현해보기 / Adapter 패턴 / 유연한 컨트롤러 구현 유연한 컨트롤러 1 - v5 여러가지 방식의 컨트롤러를 혼용하여 사용하고 싶을 경우! 어떻게 해야할까? 어댑터 패턴 지금까지 만들었던 컨트롤러는 한 가지 방식의 컨트롤러 인터페이스만 사용할 수 있다. ControllerV3, ControllerV4 는 완전히 다른 인터페이스인데... 따라서 호환이 불가능하다는 단점이 있다! 이럴때 서로 호환이 되도록 도와주는 것이 바로 어댑터이다. 어댑터 패턴을 사용하여 프론트 컨트롤러가 다양한 방식의 컨트롤러를 처리할 수 있도록 변경해보자. 핸들러 어댑터 : 중간에 어댑터 역할을 하는 어댑터가 추가되었는데 이름이 핸들러 어댑터이다. 여기서 어댑터 역할을 해주는 덕분에 다양한 종류의 컨트롤러를 호출할 수 있다. 핸들러 : 컨트롤러의 이름을 더 넓은 범위인 핸들러로 변경했.. 더보기
[Spring MVC] Section 4. MVC 프레임워크 만들기 프론트 컨트롤러 패턴 소개 프론트 컨트롤러 도입 전 모든 입구로 요청이 다 들어오니까 들어오는 곳 마다 필요한 로직을 작성해야하는데 이 코드가 중복될 우려가 있다. 프론트 컨트롤러 도입 후 공통 로직을 하나의 프론트 컨트롤러에 작성해둠. 그리고 여기서 어떤 컨트롤러를 호출할지까지 작성. 프론트 컨트롤러 패턴 특징 입구를 하나로 함으로써 공통 처리 가능해짐. 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출하게됨. 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨. 스프링 웹 MVC와 프론트 컨트롤러 스프링 웹 MVC 의 DispatcherServlet 이 FrontController 패턴으로 구현되어있음. (오호!) 프론트 컨트롤러 도입 - v1 (++ 여기 부분은 강의 내용을 .. 더보기