Spring - @ModelAttribute / @RequestMapping / @GetMapping / @PathVariable / spring에서의 redirect와 forward

S.Sun·2024년 4월 5일

스프링

목록 보기
6/17

질문 내용

  1. @ModelAtrribute 에 대하여 설명하시오.
  2. @RequestMapping 과 @GetMapping 의 차이는?
  3. @PathVariable 에 대하여 설명하시오.
  4. Command 객체에 대하여 설명하시오.
  5. 스프링에서 redirect 와 forward 방법은?

개인 작성

  1. @ModelAttribute
    - Model 객체를 받는 과정 및 함수 사용 과정을 처리하는 에너테이션
    - 내부적으로 model.addAttribute()을 호출한다.
    -> 자주 활용되는 에너테이션 중 하나
- 요청 핸들러 메서드의 파라미터나 메서드 내에 선언된 메서드의 반환값을 모델에 추가할 때 사용
  • @RequestMapping
    - 요청 메서드, 요청 경로 지정하여 사용 가능(2번 예시)
    • 요청 메서드를 생략하고 요청 경로만 표시할 수도 있음(1번 예시)
      -> 생략된 경우에는 해당 경로의 모든 요청을 처리한다는 의미
  • @GetMapping
    - 메서드가 Get 요청을 처리하도록 명시적으로 표현(3번 예시)

2번 예시와 3번 예시는 동일한 과정을 수행한다.

1번 예시

	@RequestMapping("/student")
	public String student(@RequestParam("id") String id, Model model) {
		System.out.println("student()..");
		model.addAttribute("studentId", id);
		return "student/student_id";
	}

2번 예시

	@RequestMapping(method = RequestMethod.GET, value = "/student")
	public String student(@RequestParam("id") String id, Model model) {
		System.out.println("student()..");
		model.addAttribute("studentId", id);
		return "student/student_id";
	}

3번 예시

	@GetMapping("/student")
	public String student(@RequestParam("id") String id, Model model) {
		System.out.println("student()..");
		model.addAttribute("studentId", id);
		return "student/student_id";
	}
  • @PathVariable 애너테이션은 스프링에서 RESTful 웹 서비스를 개발할 때 사용되는 중요한 애너테이션 중 하나라고 함.
http://localhost:8282/path?student=10
대신 
http://localhost:8282/path/student/10
의 형태로 변형시키는 걸 제안한 것이라 보면 됨. 

사용 시 변수명과 메서드의 파라미터명이 동일해야 한다.
(예시1 형태일 경우에 한함.)
원래 예시2의 형태로 해줘야 하지만, 더 축약한 형태가 예시1이라고 한다.

예시2에서는 에너테이션에서 이미 일치시키는 과정을 밟고 있으므로, 이후 받는 메서드 파라미터명은 다르게 해도 된다.

예시1)

	@RequestMapping("/student/{id}")
	public String student(@PathVariable String id, Model model) {
		System.out.println("student()..");
		model.addAttribute("studentId", id);
		return "student";
	}

예시2)

	@RequestMapping("/student/{id}")
	public String student(@PathVariable("id") String studentId, Model model) {
		System.out.println("student()..");
		model.addAttribute("studentId", studentId);
		return "student";
	}

Command 패턴

  • 사용자의 요청을 캡슐화하고 처리하기 위한 디자인 패턴
  • Command 객체는 요청의 종류를 나타내는 클래스를 정의하고, 해당 요청을 처리하기 위한 메서드를 구현
  • 요청과 그 요청을 처리하는 객체를 분리
캡슐화는 객체지향 프로그래밍의 기본 개념 중 하나. 
- 객체의 상태와 행위를 하나로 묶고, 외부에서는 내부 구현에 직접 접근하지 못하도록 하는 것
-> 객체 간의 결합도를 낮추고 코드의 유지보수성을 향상
  1. Spring

  • "redirect:/"
  • "forward:/" 혹은 "/"
  • redirect는 리턴되는 문자열 값에 "redirect:"을 추가한다.
    -> 기본적으로는 view 파일경로를 가리키지만, 해당 상황에서 redirect 이후에 붙는 문자열(ex)"/studentOK")은 경로를 의미
    -> forward: 다음에 붙는 문자열 또한 경로를 의미하는 것.

    활용예시.

 	@RequestMapping("/redirect/check")
	public String redirectCheck(@RequestParam("id")String id, Model model) {		
		System.out.println("redirectCheck()..");
		if(id.equals("abcde")) {
			return "redirect:/studentOK";
		}
		model.addAttribute("id", id);
		return "forward:/studentNG";		
	}
    
    @RequestMapping("/studentOK")
	public String studentOK() {
		
		return "/student/studentOK";
	}
	
	@RequestMapping("/studentNG")
	public String studentNG() {
		
		return "/student/studentNG";
	}

forward와 redirect에 대한 개념 정리하면서 그린 ppt이미지
- 과연 이걸 그림만 보고 설명할 수 있을까? 흠...
- 그리고 왜 굵은 글씨로 설정하는지 알겠다. 이미지로 보니 같은 크기인데 글자가 안보여...ㅠㅠ

  • forward
  • redirect
profile
두리둥둥

0개의 댓글