gi_dor

Spring MVC , Controller 본문

Back_End/Spring

Spring MVC , Controller

기돌 2024. 3. 12. 20:17

 

 

 Spring MVC의 주요 구성요소

1️⃣ DispatcherServlet - Servlet class

  • 클라이언트의 모든 요청을 접수 받아서 Controller 를 실행한다
  • Controller 가 반환한 값으로 적합한 뷰 객체를 찾아서 응답을 보낸다

2️⃣ HandlerMapping - Interface

  • 클라이언트의 요청URL을 어떤 Controller가 처리 할지 결정한다
  • 웹 애플리케이션 실행 시 모든 컨트롤러의 매핑정보를 분석한다
  • Mapping정보를 저장하고 전달해주는 등의 관리역할을 하는 인터페이스이다
  • 기본 HandlerMapping 구현객체
    • RequestMappingHandlerMapping  
    • BeanNameHandlerMapping
    • SimpleUrlHandlerMapping

3️⃣ HandlerAdapter - Interface

  • 클라이언트의 요청을 처리하는 요청핸들러 메서드를 실행한다
  • 클라이언트의 요청 URL에 맞는 요청 핸들러 메서드를 실행한다
  • 요청핸들러 메서드 실행 전 / 실행 후 다양한 작업을 실행한다
    • 실행 전 작업 
      • 요청 파라미터 값을 분석해 , 요청 핸들러 메서드의 매개변수로 전달
      • 요청 핸들러 메서드의 매개변수를 분석해 적절한 객체를 주입
    • 실행 후 작업
  • 기본 HandlerAdapter 구현객체 - RequestMappingHandlerAdapter

4️⃣ ViewResolver - Interface

  • Controller가 반환하는 뷰 이름에 맞는 뷰 객체를 찾아서 반환한다.
  • 기본 ViewResolver 구현객체
    • InternalResuorceViewResolver 객체
      • 뷰 이름이 "redirect : " 로 시작하면 RedirectView 객체를 반환한다
      • 뷰 이름이 "redirect : "로 시작하지 않으면 prefix + 뷰이름 + suffix 로 내부이동시키는 JstlView 객체를 반환한다

5️⃣ View  - Interface

  • 클라이언트에게 응답을 보낸다
  • 기본 View 구현객체
    • RedirectView : 재요청 URL 을 응답으로 보낸다
    • JstlView : 지정된 JSP  페이지로 내부이동시켜서 JSP를 실행하고 , 생성된 HTML을 응답으로 보냄

6️⃣ Controller - Class

  • 클라이언트의 요청을 처리한다
  • 뷰의 이름을 반환한다

7️⃣ ModelAndView - Class

  • 뷰 이름 , View 객체 , Model 객체를 저장하는 객체다
  • 뷰의 이름은 일반적으로 JSP 페이지의 이름이다
  • View 객체는 클라이언트에게 응답을 제공하는 객체다
  • Model 객체는 클라이언트에게 응답을 제공할 때 사용되는 데이터를 포함한 객체다
  • Controller의 요청 핸들러 메서드는 클라이언트의 요청처리가 완료되면 ModelAndView 객체를 반환해야한다 

 

실행 순서

 

 

1 . 클라이언트의 URL 요청이 웹서버가 받는다

2. 웹서버가 DispatcherServlet을 실행한다

3. DispatcherServlet은 HandlerMapping 객체의 getHandler() 메서드를 실행해서
         HandlerExecutionChain 객체를 반환받는다
              📌 HandlerExecutionChain 객체에는 Interceptor , 요청핸들러 메서드가 실행순서에 맞게 저장되어 있다

4. DispatcherServlet은 클라이언트의 요청을 처리하기 위해 HandlerAdapter의 handle() 메서드를 실행
         📌 요청 객체 , 응답객체 , 요헝핸들러 메서드를 매개변수로 전달

5. DispatcherServlet은 HandlerAdapter가 반환하는 ModelAndView객체를 전달받음

6. ModelAndView 객체에 View 객체가 존재하지 않으면 ViewResolver 객체의 resolveViewNam() 메서드를 실행해 적절한
View 객체를 받환 받는다

7. DispatcheServlet은 View의 render() 메서드를 실행해 응답을 클라이언트로 보낸다

 

 


Controller 관련 어노테이션

@Controller 해당 클래스가 Controller임을 나타내기 위한 어노테이션
@RequestMapping 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지를 맵핑하기 위한 어노테이션
@RequestParam Controlle 메소드의 파라미터와 웹요청 파라미터와 맵핑하기 위한 어노테이션
@ModelAttribute Controller 메소드의 파라미터나 리턴값을 Model 객체와 바인딩하기 위한 어노테이션
@SessionAttributes Model 객체를 세션에 저장하고 사용하기 위한 어노테이션
@CommandMap Controller  메소드의 파라미터를 Map

 

🖥 예시 코드

@Controller
public class HelloController {
	
    @GetMapping("/hello")
	public String hello(HttpServletRequest Request , HttpServletResponse response) {
    	
    }
    
     @GetMapping("/hello")
	public String hello(Model model) {
    	model.addAttribute("message", "반가워");
    }
    
     @GetMapping("/hello")
	public String hello(HttpSession session) {
    	
    }
}

 


 

<form method="post" action="login">
    <input name="userId">
    <input name="userPwd">
    <button type="submit"> 로그인 </button>
</form>
@PostMapping("/login")
public String login(HttpServletRequest request) {
	String id = request.getParameter("userId");
    String pwd = request.getParameter("userPwd);
}

@PostMapping("/login")
public String login(String userId , String userPwd) {

}

@PostMapping("/login")
public String login(@RequestParam("userId") String userId , 
               	 	@RequestParam("userPwd") String userPwd) {

}

 


 

<form method="post" action="register">
    <input type ="text" name ="eamil">
    <input type ="password" name ="password">
    <input type ="text" name ="name">
    <input type ="text" name ="tel">
    <input type ="number" name ="age">
    <input type ="text" name ="zipcode">
    <input type ="text" name ="address1">
    <input type ="text" name ="address2">
	<button type="submit"> 회원가입 </button>
</form>
// 안이쁨 , 타자 칠거 많아서 귀찮음
@PostMapping("/register")
public String registerUser(String email , String password , String name,
        String tel , int age , String zipcode , String address1, String address2) {

}

// 굿 
public String RegisterUserForm {

    private String email;
    private String password;
    private String name;
    private int age;
    private String zipcode;
    private String address1;
    private String address2;
    
    // Getter , Setter 메서드 정의했음
}

@PostMapping("/register")
public String registerUser (RegisterUserForm registerUserForm) {

}

@Controller
public class DepartmentContorller {
	
    @Autowired
    private HrService hervice;
    
    @GetMapping("/dept/list")
	public String list() {
    
    	return "";
    }
    
    @GetMapping("/dept/register")
	public String form() {
    
   	 return "";
    }
    
    @PostMapping("/dept/list")
    public String register() {
	
    	return "";
    }
    
    
}

 

📌 반복적인 "/dept"  꼴보기 싫음

@RequestMapping() 을 사용해 반복되는 "/dept" 정리

 

@Controller
@RequestMapping("/dept")
public class DepartmentContorller {
	
    @Autowired
    private HrService hervice;
    
    // 요청 URL - localhost/dept/list
    // 요청방식 - GET
    @GetMapping("/list")
	public String list() {
    
    	return "";
    }
    
    // 요청 URL - localhost/dept/register
    // 요청방식 - GET
    @GetMapping("/register")
	public String form() {
    
   	 return "";
    }
    
    // 요청 URL - localhost/dept/register
    // 요청방식 - POST
    @PostMapping("/register")
    public String register() {
	
    	return "";
    }
    
    
}

 

728x90

'Back_End > Spring' 카테고리의 다른 글

ioC , DI  (1) 2024.05.19
MyBatis  (4) 2024.03.12
Spring AOP  (0) 2024.03.12
빌드도구 Maven  (0) 2024.03.11
Spring Framework  (0) 2024.03.11