Spring/Spring Boot

[spring Boot] Controller 어노테이션 정리

읽히는 블로그 2024. 8. 8. 16:02

▤ 목차

     
     
     

    ✔ @Controller

     
    클라이언트의 요청이 들어오면 DispatcherServlet이 요청을 받는다.
    dispatcherServlet은 hardler에게 자신의 일을 위임한다. Handler는 요청에 맞는 컨트롤러를 찾고 컨트롤러 실행 결과를 반환한다. 이후 dispatcherServlet는 받은 결과와 함께 viewResolver에게 위임한다. veiw 정보를 찾아 view를 가지고 클라언트에게 응답한다.
     

    ✏️역할

    해당 클래스가 웹 애플리케이션의 컨트롤러임을 나타낸다.
    MVC의 핵심 요소중 하나이며, 클라이언트의 요청을 처리하는 비즈니스 로직과 뷰를 결합하여 전체적인 웹 애플리케이션의 동작을 제어한다.
    스프링 컨테이너는 @Controller 어노테이션이 지정된 클래스를 빈으로 등록한다.
     

    요청을 해당 컨트롤러에 매핑하여 처리한다.

     

    view를 반환하기 위해 사용한다.
    사용자의 요청을 받아 처리한 후 지정된 뷰(템플릿엔진/jsp..)에 모델 객체를 넘겨주는 역할

     

    💻 코드로 보기

    @Controller
    public class TestController {
    	public ModelAndView haha() {
        	return new ModelAndView("list","msg", "안녕!?");
        }
    }

     
     

    👏 중요

     


    더보기

     <결과 코드>
     list.jsp로 전달되도록 할 것이다. 

    '

     

    +) 위의 3개의 코드는 똑같은 결과를 처리한다.

     
     

    ✔@RequestMapping

    method와 매핑하기 위해 사용하는 어노테이션이다. get이나 post 요청을 구분하지 않는다.

    @RequestMapping은 Controller단에서 사용된다.
    DispatcherServlet Controller 파일을 찾고, 논리적 주소가 매핑된 Method를 찾기 위해서
    @Controller와 @RequesetMapping을 작성해야한다.

     

    ⌨ 코드로 보기

    <a href="gogo">컨트롤러 만나보자구!</a><br>

     
     
    1) 코드

    @RequestMapping(value="gogo",method=RequestMethod.GET) //get 요청처리 ,status=405 요청 다름
    	public ModelAndView hoho() {
    		return new ModelAndView("list","msg", "안녕!?");
    	}

    이때 value는 contextPath 요청을 의미한다.
     
     
    2) 코드

    public ModelAndView haha() {
    		ModelAndView modelAndView = new ModelAndView();
    		modelAndView.setViewName("list");
    		modelAndView.addObject("msg", "안녕! jsp?");
    		return modelAndView;
    	}

     
     
     


    반환타입
    1.String : 응답할 Jsp 이름 반환
    2. void : 컨트롤러가 호풀한 서비스에서 직접 응답한다. 요청 주소를 jsp이름으로 인식한다.
    3. 기타 : 비동기 통신 데이터를 응답한다.

    매개변수
    1. HttpServletRequest 선언해서 사용
    2. Model 선언 후 forward하여 해당 정보 저장
    3. HttpSession을 선언해서 사용

    요청
    메소드 : GET, POST
    URL : 요청 주소

     
     

    ✨ Http Request Method (HTTP 요청 메서드)

    HTTP는 요청 메서드를 정의한다. 주어진 리소스에 수행하길 원하는 행동, Server가 수행해야할 동작을 지정한다.

    GET server의 리소스를 조회하기 위해 CRUD에서 R(Read) -읽기
    POST server의 리소스를 생성하기 위해 CRUD에서 C(Create) -생성
    PUT server의 리소스를 수정하기 위해 CRUD에서 U(Update) -수정
    PATCH server의 리소스를 일부 수정하기 위해 CRUD에서 U(Updatae) -수정
    DELETE server의 리소스를 삭제하기 위해 CRUD에서 D(Delete) -삭제

     
     
     
     


     
     

    ✔@GetMapping

    get방식으로 들어온 요청을 받을 수 있다.

    같은 이름의 메서드를 호출해도 get방식으로 들어오는 메서드와 post 방식으로 들어오는 메서드는 다를 수 있다.

    ⌨ 해당 

    <a href="gogo">컨트롤러 만나보자구!</a><br>

     

    @GetMapping("gogo") //get 요청 처리
    	public ModelAndView hehe() {
    		return new ModelAndView("list","msg", "안녕! 123");
    	}

     

    💻 @ResponseBody

    클라이언트 -----request-----> 서버
    서버 --------response--------> 클라이언트
     
    웹에서 화면전환(새로고침)없이 이뤄지는 동작들은 비동기 통신이라고 한다.
    비동기 통신을 위해 클라이언트에서 서버로 요청을 보낼때, 본문에 데이터를 담아서 보내야한다.
    서버 클라이언트로 응답을 보낼때에도 본문에 데이터를 담아서 보내야한다.
    이때 데이터가 들어있는 본문이 body이다.
     
    http요청의 미디어 타입과 파라미터의 타입을 먼저 확인한다.

    @GetMapping("gogo")
    @ResponseBody //일반 data를 그대로 전달
    public String hihi() { //순수 String
    	String value = "일반 데이터 - String, Map, JSON등을 전달 가능";
    	return value;
    }

     
    @Responsebody 어노테이션을 사용하면 http요청 body를 자바 객체로 전달받을 수 있다.
     템플릿 엔진과 관계없이 해당 return값이 그대로 내려간다.

     

    spring boot 내부에서 viewResolve 대신 httpMessageConverter가 작동한다.
    - String 값이 들어오면 StringHttpMessageConverter가 사용된다.
    - 기본 객체가 들어오면 MappingJackson2HttpMessageConverter가 사용된다.
    (객체가 들어오면 기본적으로 json화 시킨다.)

     


     

    👏@RequestBody 


    이때 대표적으로 사용되는 것이 JSON이다.
     
    객체 HTTP 요청의 바디 내용으로 매핑하여 클라이언트로 전송한다.

    application/json 형태로 전달받는다는 의미

     
     


     
     

    ✔@PostMapping

    ⌨ 코드로 보기

    <form action="haha" method="post">
    	<input type="submit" value="컨트롤러 만나기 :-D">
    </form>

     
    1) 코드

    @PostMapping("haha")
    	public String hahahoho(Model model) {
    		model.addAttribute("msg", "행운의 7");
    		return "list";
    	}

    2) 코드

    @PostMapping("test6") //get 요청 처리
    public ModelAndView haho() {
    	 //model에 직접 값을 넣어놨다.
    	return new ModelAndView("list","msg", "벌써.. 6번 성공");
    }

    modelAndView를 사용하면 파라미터를 사용하지 않아도된다. 나누면 Model을 넣어줘야한다.

     

     

     

     


     
     
     

    ✔@RequestParam

    ⌨ 형식

    마치 servlet의 service메서드와 같이 get 요청과 post 요청 상관없이 모두 처리한다.
     

    [ 클라이언트 전달값 수신 방법 ]

    그동안 jsp에서 아래와 같이 값을 받았다.  아래의 코드는 전통적인 방식이다.

    String id = request.getParameter("id");
    String pw = request.getParameter("pw");

     
    위의 코드를 어노테이션을 사용해서 받을 수 있다.
    어노테이션인 @RequestParam을 사용하면 아래와 같이 직접 받을 수 있다.

    public String submit(@RequestParam(value="id")String id,@RequestParam(value="pw")String pw, Model model) {
     파라미터 이름으로 바인딩한다.
     /파일명?id=haha&pw=hoho

    이와 같은 요청이 들어오면
    id=haha, pw=hoho로 바인딩된다.

     

    💻 코드로 보기

    html 파일에서 넘겨주는 값을 controller가 받는다.

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>👻</title>
    </head>
    <body>
    	<form action="haha" method="post">
    		인사말 :  <input type="text" name="hi">
    		<input type="submit" value="확 인">
    	</form>
    </body>
    </html>

     

     

    package pack.controller;
    
    import java.util.ArrayList;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    
    import pack.model.DataDao;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    
    @Controller
    public class JikController {
    	@Autowired
    	private DataDao dataDao;
    	
    	@PostMapping("haha")
    	public String getMethod(@RequestParam(value="hi") String param,Model model) {
    		ArrayList<DataDao> list = (ArrayList)dataDao.Data(param);
    		model.addAttribute("list",list);
    		return "list";
    	}
    	
    }

     

     

     

    💡 @RequestParam을 생략하면 스프링 MVC는 내부에서 required=false를 적용한다.
             즉, 파라미터를 반드시 입력해야 오류가 발생하지 않는다.

     

     


     
     

    😊정리

     
     이외에도 다양한 어노테이션이 있다.

    클라이언트에서 http 요청이 들어오면 해당  요청은 spirng 내부적으로 Dispatcher가 받는다.

    이후 dispatcher가 handlerMapping에 위임하여 처리한다.

    이후 핸들러가 반환하는 정보를 ModelAndView로 변환해 반환한다.

    이후 viewResolver 호출한다.이후 viewResolver는 뷰의 논리 이름을 물리 이름으로 바꾼 후 렌더링 역할을 한다.

    https://catsbi.oopy.io/f52511f3-1455-4a01-b8b7-f10875895d5b

     

    https://catsbi.oopy.io/f52511f3-1455-4a01-b8b7-f10875895d5b