7/11, 7/12 스프링 MVC : 요청 매핑, 커맨드 객체, 리다이렉트, 폼 태그, 모델

박세현·2024년 7월 11일

Spring

목록 보기
8/15
post-thumbnail

스프링 MVC : 요청 매핑, 커맨드 객체, 리다이렉트, 폼 태그, 모델

1. 요청 매핑 애노테이션을 이용한 경로 매핑

  • 요청 메서드(method)
    • GET, DELETE
    • POST, PATCH, PUT


1) @RequestMapping

  • 모든 요청 메서드에 매핑, method 설정에 GET, POST, DELETE 등등 설정 가능
  • 스프링 4.3버전 이후부터 제공하는 애노테이션
    • @GetMapping
    • @PostMapping
    • @PatchMapping
    • @DeleteMapping
    • @DeleteMapping

① params

  • 요청데이터를 한정해서 매핑
    • 어떠한 요청데이터가 들어와야 유입이됨

② headers

  • 요청쪽 헤더 데이터 한정

③ consumes

  • 요청헤더 쪽 Content-Type 체크

④ produces

  • 응답헤더 쪽 Content-Type 설정

예시) @GetMapping_name(), value(), path() : 주소 매핑

ㄴ 주소 매핑하는 역할 3개다 똑같음
ㄴ 디폴트 : 요청 데이터?
ㄴ value는 생략가능하기 때문에

ㄴ 이렇게 사용 가능

예시) @GetMapping_headers(), consumes(), produces() : 전부 헤더에 관한 내용

ㄴ 전부 헤더에 관한 내용

ㄴ 응답헤더 추가

예시) @RequestMapping_method() : 요청매핑 정

ㄴ 상세하게 요청을 받고 싶은경우?
ㄴ 겟방식인 경우 겟만 받을 수 있는데 난 딜리트도 받고 싶어 그런경우...

ㄴ 이 요청메서드는 겟과 포스트 방식에만 매칭이 된다
ㄴ 설정을 안하면 모든 요청메소드에 매칭



예시) 겟, 포스트일때 값이 넘어오는지 쳌

  • @RequestMapping(path="/member/join", method = {RequestMethod.GET, RequestMethod. POST})



예시) 커맨드 객체 = 리퀘스트조인

ㄴ setter에 있는 이름과 양식에 name이 매칭
ㄴ 이름과 값 형태

ㄴ 보통 이동은 로케이션 헤더를 통해 이동

ㄴ 샌드 리다이렉트처럼 이동하게끔 하는 역할

ㄴ 이거 반복됨

ㄴ 리쿼스트매핑엔 모든 요청이 유입되니 공통적인거 넣어주기



예시) path : 요청 매핑 , params : 요청데이터를 한정해서 매핑 = 어떠한 요청데이터가 들어와야 유입이됨

ㄴ 파람스 : 요청데이터 한정
ㄴ 이 방식으로 들어온 요청만 이 메서드로 유입되게끔...?

ㄴ 같은 /join이지만 패스의 경우 파람즈(요청데이터의 제한)값이 요청데이터에 추가로 있어야 유입됨
ㄴ 밸루의 경우 그냥 유입됨



참고) MockMvc

  • 통합 테스트
  • MockMvc : 컨트롤러 테스트

참고) 로거 사용
private final Logger log = LoggerFactory.getLogger(MemberController.class); // 로그를 연동한 코드

  • log.fatal(...)
  • log.error(...)
  • log.warn(...)
  • log.info(...)
  • log.debug(...)
  • log.trace(...)
  • 로거 레벨별로 메서드가 있다
  • lombok 활용시 다음 애노테이션 사용하면 로거 연동 코드 자동 생성
    • @slf4j
      -> private final Logger log = LoggerFactory.getLogger(MemberController.class); 이거 안써도 됨
    • @log4j
    • @log4j2

예시) 로거



예시) MockMvc : 컨트롤러 테스트

ㄴ 2번째 방식 : 특정 컨트롤러 한정해서 테스트

ㄴ 의존성 추가해줌
ㄴ 왜 매개변수가 AnnotationConfigWebApplicationContext 가 아니지?
ㄴ 이거말고 다른 설정쓸수 있으니 다 허용해주려구(다형성)

ㄴ 이제 목mvc 사용가능
ㄴ 향후에는 이렇게 설정 안해도 알아서 해주는거 있다고...

ㄴ 매개변수로 요청메서드가 들어간다



예시) headers : 요청쪽 헤더 데이터 한정

ㄴ 헤더를 안넣었더니 유입이 안된 모습

ㄴ 헤더에 정보 추가

ㄴ 이번엔 유입된 모습



예시) consumes : 요청헤더 쪽 Content-Type 체크

ㄴ 요청 쪽 콘텐트타입이 application/json형태로 들어와야만 유입되도록 한정함

ㄴ 요청쪽에 콘텐트타입 설정 안했더니 오류 뜸

ㄴ 콘텐트타입 설정함

ㄴ 이번엔 유입됨



예시) consumes_미디어타입 이넘상수

ㄴ 콘텐트타입 직접 설정하기 보단 오타방지 위해 스프링에서 제공하는(정의되어 있는) 미디어타입 이넘상수형태를 활용하자

ㄴ 스프링에서 제공하는 미디어 타입 이넘상수형태를 활용하자



2) 반환값

① redirect: 주소

  • Location헤더에 주소 추가 -> 응답헤더 302

② forward : 주소

  • 주소의 출력 데이터로 버퍼를 치환

  • RequestDispatcher

  • forward


예시) redirect : 페이지 이동
반환값 : redirect:주소 -> Location헤더에 주소 추가 -> 응답헤더 302

ㄴ 같은 이름의 setter가 있으면 알아서 주입해준다...?
ㄴ 커맨드 객체

ㄴ 응답헤더 에서 중요한 정보 : 바디의 타입, 브라우저의 동작로케이션 헤더가 있으면 브라우저가 이동 등등 -> 브라우저에게 무슨 행동하라고 알려줌
ㄴ 이게 페이지 이동 정석이긴 하지만 이렇게는 근데 길지 않니
ㄴ 스프링에선 리다이렉트 키워드만 넣어도 위와 같은 기능을 알아서 내부적으로 해준다

ㄴ 리다이렉트 url사용 = 이렇게 해도 로케이션 헤더 추가해줌

ㄴ /가 있으면 절대경로 = url주소(로케이션헤더추가)
ㄴ /가 없으면 상대경로 = 뷰의 경로

ㄴ 응답코드 302(페이지가 이동했다를 의미)



예시) forward : 버퍼치환

ㄴ 로그인페이지 뷰가 보이긴 하지만
ㄴ 응답코드는 302로 바뀌지 않음(찐 페이지 이동이 아님)




2. 요청 파라미터 접근

1) @RequestParam

  • HTTP 요청에서 쿼리 매개변수, 폼 데이터, 또는 URL 경로의 매개변수를 메서드 파라미터로 바인딩하는 데 사용
  • 쿼리 매개변수 처리: URL의 쿼리 문자열에서 값을 추출하여 메서드 파라미터로 전달합니다.
  • 폼 데이터 처리: POST 요청의 폼 데이터에서 값을 추출하여 메서드 파라미터로 전달합니다.
  • 필수 여부 설정: 매개변수가 필수인지 선택사항인지 지정할 수 있습니다.
  • 기본값 설정: 매개변수가 제공되지 않았을 때 사용할 기본값을 지정할 수 있습니다.

예시)

import org.springframework.web.bind.annotation.*;

@RestController
public class ExampleController {

    @GetMapping("/greet")
    public String greet(@RequestParam(name = "name", required = false, defaultValue = "Guest") String name) {
        return "Hello, " + name + "!";
    }
}


/greet?name=John → 응답: "Hello, John!"
/greet → 응답: "Hello, Guest!"

ㄴ @RequestParam은 name이라는 쿼리 매개변수를 greet 메서드의 파라미터로 바인딩
ㄴ 만약 name 매개변수가 요청에 포함되지 않으면, 기본값으로 "Guest"를 사용



예시) 폼 데이터 처리

import org.springframework.web.bind.annotation.*;

@RestController
public class FormController {

    @PostMapping("/submitForm")
    public String submitForm(@RequestParam String username, @RequestParam String password) {
        // 로직 처리
        return "Form submitted with username: " + username;
    }
}

ㄴ submitForm 메서드는 POST 요청의 폼 데이터에서 username과 password 값을 추출하여 처리



예시) 필수 매개변수

@GetMapping("/search")
public String search(@RequestParam(name = "query") String query) {
    return "Search results for: " + query;
}

ㄴ query 매개변수가 필수이며, 요청에 포함되지 않으면 400 Bad Request 응답이 반환



2) 커맨드 객체를 이용해서 요청 파라미터 사용하기

  • 커맨드 객체 클래스명 -> EL 속성으로 자동 추가
    ex) RequestJoin -> requestJoin
    ㄴ 클래스명이 기본 앞자만 소문자로

3. 뷰 JSP 코드에서 커맨드 객체 사용하기

예시) 커맨드 객체 , EL 속성, 뷰_로그인 실패 후 다시 로그인페이지 이동 시 기존 데이터 유지

ㄴ 요청데이터가 커맨드객체에 담겨있는 모습

ㄴ 커맨드객체를 서비스나 밸리데이터말고도 뷰에서도 사용함
ㄴ 뷰에서 사용 많이 하니가 알아서 el속성으로 자동 추가해줌
ㄴ el식에서는 파람을 통해 커맨드 객체 접근 가능

ㄴ 이런식으로 사용 많이 함
ㄴ 로그인 할 때 실패 했지만 아이디 비번 입력했던거 날라가면 다시 입력해야하니 짜증나니까
ㄴ 로그인 실패해도 실패한 로그인 아이디 비번 남겨두기용으로 만힝 활용

ㄴ 근데 이렇게 활용많이 하는거 알아서 스프링이 커스텀 태그 지원해줌




4. @ModelAttribute

1) 커맨드 객체가 없으면 빈 커맨드 객체 생성

ㄴ @ModelAttribute 사용하면

ㄴ 이과정 내부적으로 해주고 있음

ㄴ 아무 값도 입력하지 않은 때 null로 되어 있음



2) 커맨드 객체 속성 이름 변경

  • @ModelAttribute애노테이션으로 커맨드 객체 속성 이름 변경

ㄴ 속성명 바꾸기
ㄴ 원래 속성명은 requestJoin



3) 공통 데이터(속성)으로 사용할 데이터 지정

① Controller, RestController

  • 컨트롤러에서의 공통데이터


② ControllerAdvice, RestControllerAdvice

  • 지정된 패키지 범위에서의 공통 데이터

예시) 회원가입 로그인 상관없이 나오는 공통 데이터

ㄴ 로그인.jsp, 조인.jsp 모두 적용 가능




5. 커맨드 객체와 스프링 폼 연동

-<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

1) <form:form>

2) <form:input>

3) <form:password>

4) <form:checkboxes>


예시) 커스텀 태그_<form:form>, <form:input>, <form:password>

ㄴ @ModelAttribute 사용하면

ㄴ 이과정 내부적으로 해주고 있음

ㄴ 아무 값도 입력하지 않은 때 null로 되어 있음



예시) 커스텀태그_<form:checkboxes> + 속성값이 List 자료형




6. 컨트롤러 구현 없는 경로 매핑

1) WebMvcConfigurer(인터페이스)

① addViewControllers 설정

  • 컨트롤러 구성을 할 필요 없는 간단한 페이지 구성 시 사용

  • Spring6/

    • JDK15 - Record

예시) 컨트롤러 없이 메인페이지(뷰) 연동하기

ㄴ 뷰만 추가(컨트롤러 없음)

ㄴ MvcConfig(설정클래스) 에서 메서드 오버라이딩

ㄴ 컨트롤러 없이 연동됨



예시) 컨트롤러 없이 마이페이지(뷰) 연동하기



예시) 레코드 클래스

ㄴ 데이터 클래스, 값만 담을 수 있는 클래스
ㄴ vo
ㄴ 보통 값이 바뀌지 않는 데이터(어짜피 상수로 되어 있음)
ㄴ 그래서 조회하는 메서드만 있음
ㄴ 커맨드 객체로 사용가능함
ㄴ @Getter❌

ㄴ 값은 생성자를 통해서 객체가 생성될때 넣어진다




7. 커맨드 객체 : 중첩 · 콜렉션 프로퍼티

  • 중첩 : 커맨드 객체 안에 커맨드 객체

예시)

8. Model을 통해 컨트롤러에서 뷰에 데이터 전달하기

9. ModelAndView를 통한 뷰 선택과 모델 전달

10. GET 방식과 POST 방식에 동일 이름 커맨드 객체 사용하기





주요 폼 태그 설명

1. <form:form>

  • <form> 태그를 위한 커스텀 태그



2. <form:input>, <form:password>, <form:hidden>

  • <input> 관련 커스텀 태그



3. <form:select>, <form:options>, <form:option>

  • <select> 관련 커스텀 태그

예시) <form:select>

예시)



예시) <form:option>



예시) <form:option>



예시) <form:option>




4. <form:checkboxes>, <form:checkbox>

  • 체크박스 관련 커스텀 태그



5. <form:radiobuttons>, <form:radiobutton>

  • 라디오버튼 관련 커스텀 태그

예시) form:radiobuttons



예시)



예시)

6. <form:textarea>

  • <textarea〉 태그를 위한 커스텀 태그 :




CSS 및 HTML 태그와 관련된 공통 속성

1. cssClass: HTML의 class 속성값




2. cssErrorClass : 폼 검증 에러가 발생했을 때 사용할 HTML의 class 속성값




3. cssStyle: HTML의 style 속성값





HTML 태그가 사용하는 다음 속성도 사용 가능하다.

1. id, title, dir




2. disabled, tabindex




## 3. onfocus, onblur, onchange onclick, ondblclick


4. onkeydown, onkeypress, onkeyup




5. onmousedown, onmousemove, onmouseup




6. onmouseout, onmouseover

  • 각 커스텀 태그는 htmlEscape 속성을 사용해서 커맨드 객체의 값에 포함된 HTML 특수 문자를 엔티티 레퍼런스로 변환할지를 결정할 수 있다.
profile
귤귤

0개의 댓글