Sesac 11일차

SungMin·2022년 10월 19일
0

Sesac-Java/Spring

목록 보기
7/13

응답 처리

HTML Template Response (basic 프로젝트)

● String
● void
● Map
● Model
● ModelAndView
● Object

package com.example.basic.controller;

import java.util.*;
import com.example.basic.model.Member;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HtmlController {
    @RequestMapping("/")
    public String home(){
        return "home";
    }

    @GetMapping("html/string")  // @RequestMapping(method = RequestMethod.GET)과 같은 의미
    public String string(){
        return "html/string"; 
        // 반환(리턴)타입이 String일 때 반환값에 보여줄 경로의 페이지를 명시해준다.
    }

    @GetMapping("html/void")
    public void htmlVoid(){
    }

    @GetMapping("html/map")
    public Map<String,Object> htmlMAp(Map<String,Object> map){
        Map<String,Object> map2 = new HashMap<String,Object>();
        return map2;
    }

    @GetMapping("html/model")
    public Model htmlModel(Model model){
        return model;
    }

    @GetMapping("html/modelAndView")
    public ModelAndView htmlModelAndView(){
        ModelAndView mav = new ModelAndView();
        // ModelAndView를 리턴받을때 setViewName메소드를 통해서 출력할 화면을 지정해줄 수 있다.
        mav.setViewName("html/model_and_view");
        return mav;
    }

    @GetMapping("html/object")
    public Member htmlObject(){
        Member member = new Member();
        member.setName("홍길동");
        return member;
    }

  • object 입력 소스
<html xmlns:th="http://www.thymeleaf.org">

<head>
</head>

<body>
    <h1>HTML object</h1>
    [[${member}]]
    <hr>
    [[${member.name}]]
    
</body>

</html>

  • Chrome 출력 소스
<html>

<head>
</head>

<body>
    <h1>HTML object</h1>
    Member(name=홍길동, userId=null, userPassword=null)
    <hr>
    홍길동
    
</body>

</html>

HTML / JSON Response (@ResponseBody 사용)

  • template Response와 달리 Json을 이용하면 별도의 html문서를 만들지 않고도 새로운 페이지를 만들 수 있다.
package com.example.basic.controller;

import java.util.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.basic.model.Member;

@Controller
public class Json1Controller {
    @GetMapping("/json/string")
    @ResponseBody // 별도의 html없이 반환할 데이터를 전송해준다.
    public String jsonString(){
        return "반환할 데이터";
    }

    // 리턴타입이 Map과 모델클래스일 때 확인
    @GetMapping("/json/map")
    @ResponseBody
    public Map<String,Object> jsonMap(){
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("name", "길동");
        map.put("userId", "user");
        map.put("userPw", "password");
        return map;
    }

    @GetMapping("json/object")
    @ResponseBody
    public Member jsonObject(){
        Member member = new Member();
        member.setName("홍길동");
        member.setUserId("user01");
        member.setUserPassword("password01");
        return member;
    }

    @GetMapping("json/list")
    @ResponseBody
    public List<String> jsonList(){
        List<String> list = new ArrayList<String>();
        list.add("list1");
        list.add("list2");
        list.add("list3");
        return list;
    }

}

  • 올바른 json/map의 형태 (키값 : 밸류값)
    {"name":"길동","userPw":"password","userId":"user"}

  • 올바른 json/object의 형태 (키값 : 밸류값)
    {"name":"홍길동","userId":"user01","userPassword":"password01"}

  • 올바른 json/list의 형태 (키값 : 밸류값)
    ["list1","list2","list3"]

연습문제

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.2/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.2/dist/js/bootstrap.bundle.min.js"></script>
<div class="p-5 bg-primary text-white text-center">
    <h1>My First Bootstrap 5 Page</h1>
    <p>Resize this responsive page to see the effect!</p>
</div>
<nav class="navbar navbar-expand-sm bg-dark navbar-dark">
    <div class="container-fluid">
        <ul class="navbar-nav">
            <li class="nav-item"><a class="nav-link active" href="#">Active</a></li>
            <li class="nav-item"><a class="nav-link" href="#">Link</a></li>
        </ul>
    </div>
</nav>
<div class="container mt-5">
    <div class="row">
        <div class="col-sm-12">
            <h2 class="mt-5">TITLE HEADING</h2>
            <h5>Title description, Sep 2, 2020</h5>
            <p>Sunt in culpa qui officia deserunt mollit</p>
        </div>
    </div>
</div>

package com.example.basic.controller;

import java.util.*;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HtmlController {
	@GetMapping("html/exam")
    public String exam(){
        return "html/exam";
    }

    
}


연습문제 2

  • 결과와 같이 JSON 데이터 응답하기
package com.example.basic.controller;

import java.util.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.basic.model.Member;

@Controller
public class Json1Controller {

	@GetMapping("json/exam")
	@ResponseBody
    public Map<String,Object> jsonExam(){
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("count", "2");

        List<Member> list = new ArrayList<Member>();
        Member member = new Member();
        member.setName("가");
        member.setUserId("A");
        member.setUserPassword("1");
        list.add(member);
        Member member1 = new Member();
        member1.setName("나");
        member1.setUserId("B");
        member1.setUserPassword("2");
        list.add(member1);
        map.put("list", list);

        return map;
    }

}

  • 결과
    {"count":"2","list":[{"name":"가","userId":"A","userPassword":"1"},{"name":"나","userId":"B","userPassword":"2"}]}

요청 처리

크롬 확장 프로그램

  • Talend API Tester - Free Edition
  • JSON Formatter

요청 처리 유형

● GET – 데이터를 가져오기
● POST – 데이터 저장
● PUT – 데이터 수정
● DELETE – 데이터 삭제

결과상태코드설명
Success200요청에 대해 정상 응답
Bad Request400파라미터 등 요구 조건 미충족
Forbidden403접근 거부
Not Found404존재하지 않는 주소
Method Not Allowed405사용 불가 메소드 사용
Internal Server Error500서버의 프로그램 오류
package com.example.basic.controller;

import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MethodController {
    // @GetMapping("req/get")
    @RequestMapping(value = "req/get", method = RequestMethod.GET)
    public String get(){
        return "GET";
    }

    @PostMapping("req/post")
    public String post(){
        return "POST";
    }
    
}

요청 처리 어노테이션

● HttpServletRequest - 가장 전통적으로 사용되는 방식
● RequestParam (편리함)

  • 파라미터 명칭에 맞게 변수 사용
  • 파라미터 종류 및 개수 상관없이 사용

● PathVariable (깔끔함) - 요청 주소의 경로명 활용
● ModelAttribute (명확함)

  • Model / DTO / VO 등 객체와 연계하여 활용
  • JPA, MyBatis 등 ORM 프레임워크 활용

● RequestBody (AJAX 요청 시 주로 사용)

  • 보편적인 요청 파라미터 형식을 사용하지 않고 JSON 형태의 파라미터 사용
    (Query String Parameter, Form Data, Payload)
  • 사용 시 메소드 방식을 POST로 지정

package com.example.basic.controller;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

// HttpServletRequest를 이용
@RestController
public class RequestController {
    @GetMapping("req/http")
    public String http(HttpServletRequest request){
        // http://localhost:8080/req/http?name=gil&pageNum=10
        String name = request.getParameter("name"); // gil
        String pageNum = request.getParameter("pageNum"); // 10
        return name + " , " + pageNum; // gil , 10 을 출력
    }

    @GetMapping("req/param1")
    public String param1(@RequestParam("key1") String key1, @RequestParam int key2) {
        // @RequestParam("key1") String key1 : 
        // key1의 이름을 갖는 파라미터의 값을 문자열 변수 key1에 저장
        // @RequestParam int key2 : 
        // pageNum이라고 하는 정수형 변수에 key2라고 하는 파라미터의 값이 저장된다.
        // 
        // http://localhost:8080/req/param1?key1=gil&key2=10
        return key1 + " , " + key2;
    }

    @GetMapping("req/param2")
    public String param2(@RequestParam Map<String,Object> map){
        // 파라미터를 동적으로 받도록 할 수 있다.
        // 파라미터의 이름, 갯수, 값 등을 자유자재로 조정가능
        return map.toString();
    }
    
}

profile
초보 개발자의 학습 저장용 블로그

0개의 댓글