4 분 소요


  1. 개발 환경 준비 1)
  2. Spring IoC 1) 2)
  3. Spring MVC 1) 2) 3)
  4. Database 활용
  5. View Template 1) 2) 3) 4) 5)
  6. AOP / Filter / Interceptor
  7. File Upload / Download

응답처리

HTML 경로 표기법

  • / : 웹사이트의 루트 폴더 (절대 경로)
  • . : 현재 웹페이지가 소속된 폴더 (상대 경로)
  • .. : 현재 웹페이지의 부모 폴더 (상대 경로)
  • 자식폴더명 : 현재 소속된 폴더의 자식 폴더 (상대 경로)

@GetMapping

  • @GetMapping(value="")@RequestMapping(value="", method = RequestMethod.GET)와 같은 의미이다.
  • Get 요청을 받았을 때 사용한다.

return String

  • 반환값에 보여줄 경로의 페이지를 명시한다.

file\src\main\java\com\example\basic\controller\HtmlController.java

Java

1
2
3
4
5
6
7
8
...

@GetMapping("/html/string")
public String string() {
    return "/html/string";
}

...

/html/string.html


void

  • 요청에 명시된 페이지를 표시한다.

file\src\main\java\com\example\basic\controller\HtmlController.java

Java

1
2
3
4
5
6
7
8
...

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

}

...

html/void.html


return Map<키, 값>

file\src\main\java\com\example\basic\controller\HtmlController.java

Java

1
2
3
4
5
6
7
8
9
...

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

...

html/map.html


return Model

file\src\main\java\com\example\basic\controller\HtmlController.java

Java

1
2
3
4
5
6
7
8
...

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

...

html/model.html


return ModelAndView

  • setViewName() 메서드로 출력할 화면을 지정한다.

file\src\main\java\com\example\basic\controller\HtmlController.java

Java

1
2
3
4
5
6
7
8
9
10
...

@GetMapping("html/modelAndView")
public ModelAndView htmlModelAndView() {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("html/model_and_view");
    return mav;
}

...

html/model_and_view.html


return Object (DTO : Date transter object)

  • Member 클래스 작성

file\src\main\java\com\example\basic\model\Member.java

Java

1
2
3
4
5
6
7
8
9
10
package com.example.basic.model;

import lombok.Data;

@Data // @Getter, @Setter, @toString 등등 annotation들을 종합해 놓은 annotation
public class Member {
    private String name;
    private String userId;
    private String userPassword;
}
  • html 페이지 작성

file\src\main\resources\templates\html\object.html

HTML

1
2
3
4
5
6
7
8
9
10
11
12
13
<html xmlns:th="http://www.thymeleaf.org">

<head>
</head>

<body>
    <h1>Html Object</h1>
    [[${member}]]
    <hr>
    [[${member.name}]]
</body>

</html>
[[${변수}]]
Thymeleaf 템플릿: 데이터를 주고 받을때 기본이 되는 형식이다.

file\src\main\java\com\example\basic\controller\HtmlController.java

Java

1
2
3
4
5
6
7
8
9
10
...

@GetMapping("html/object")
public Member htmlObject() {
    Member member = new Member();
    member.setName("kim");
    return member; // member가 html의 member에 전송됨
}

...

http://localhost:8080/html/object img


@ResponseBody

  • 별도의 html 페이지 없이 반환할 데이터를 전송한다.

return String

  • 리턴 문자열을 데이터만 body에 담아 전송한다.

file\src\main\java\com\example\basic\controller\Json1Controller1.java

Java

1
2
3
4
5
6
7
8
9
...

@GetMapping("/json/string")
@ResponseBody
public String jsonString() {
    return "반환할 데이터";
}

...

return Map<키, 값>

  • json의 형태로 응답한다.

리턴 타입이 map이나 model클래스 일 경우 json형태로 응답한다.

file\src\main\java\com\example\basic\controller\Json1Controller1.java

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
...

@GetMapping("json/map")
@ResponseBody
public Map<String, Object> jsonMap(Map<String, Object> map) {
    Map<String, Object> map2 = new HashMap<String, Object>();
    map2.put("key1", "value");
    map2.put("key2", 2324);
    map2.put("key3", true);
    return map2;
}

...

http://localhost:8080/json/map img

json의 형태

  • 키값-밸류값 으로 이루어진 자바스크립트의 파일 형식이다.
{
    "userId":1,
    "name":"이름",
    "userPw":"password"
}

return Object (DTO : Date transter object)

  • json의 형태로 응답한다.

file\src\main\java\com\example\basic\controller\Json1Controller1.java

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
...

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

...

http://localhost:8080/json/object img


return List

  • 배열의 형태로 응답한다.

file\src\main\java\com\example\basic\controller\Json1Controller1.java

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
...

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

...

http://localhost:8080/json/object img


연습

1) http://localhost:8080/html/exam 접속 시 exam.html 띄워보자

file\src\main\java\com\example\basic\controller\HtmlController.java

Java

...

@GetMapping("html/exam")
public void exam(){

}

...

file\src\main\resources\templates\html\exam.html

HTML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<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>

http://localhost:8080/html/exam img

2) http://localhost:8080/json/exam 접속 시 json 데이터로 응답해보자

file\src\main\java\com\example\basic\controller\Json1Controller.java

Java

...

@GetMapping("json/exam")
@ResponseBody
public Map<String, Object> jsonExam() {
    Map<String, Object> map = new HashMap<>();
    List<Member> memList = new ArrayList<>();
    Member mem1 = new Member(), mem2 = new Member();

    mem1.setName("가");
    mem1.setUserId("A");
    mem1.setUserPassword("1");
        
    mem2.setName("나");
    mem2.setUserId("B");
    mem2.setUserPassword("2");
        
    memList.add(mem1);
    memList.add(mem2);

    map.put("count", 2);
    map.put("list", memList);

    return map;
}

...

http://localhost:8080/json/exam img


요청 처리

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

img상태 코드


@GetMapping

  • 일반적으로 주소를 입력해서 접속하면 무조건 GET요청이다.

file\src\main\java\com\example\basic\controller\MethodController.java

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.example.basic.controller;

import org.springframework.web.bind.annotation.GetMapping;
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

  • 데이터베이스 등의 저장소에 리소스를 저장할 때 사용한다.

file\src\main\java\com\example\basic\controller\MethodController.java

Java

1
2
3
4
5
6
7
8
...

@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로 지정한다.

HttpServletRequest

  • 모든 파라미터는 문자열로 전달한다. (필요 시 숫자로 변환하여 사용)

file\src\main\java\com\example\basic\controller\RequustController.java

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.example.basic.controller;

import javax.servlet.http.HttpServletRequest;

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

@RestController
public class RequustController {
    @GetMapping("req/http")
    public String http(HttpServletRequest request) {
        String name = request.getParameter("name");
        String pageNum = request.getParameter("pageNum");
        return name + ", " + pageNum;
    }
}

http://localhost:8080/req/http?name=abc&pageNum=123 img

url 주소에서 ? 뒤에 오는 항목들이 모두 파라미터(매개변수)이다. 파라미터의 형태는 ‘변수명=값’, 파라미터간 구분은 &로 한다.


@RequestParam

  • 지정된 파라미터가 없으면 400 오류가 발생한다.
  • defaultValue 또는 required 옵션으로 오류 제어가 가능하다.
  • @RequestParam("key1") 과 같이 name을 지정하지 않으면 변수명을 name으로 사용한다.
  • int 등 String이 아닌 형태로도 사용 가능하다.

file\src\main\java\com\example\basic\controller\RequustController.java

Java

1
2
3
4
5
6
7
8
...

@GetMapping("req/param1")
public String param1(@RequestParam("key1") String key, @RequestParam int key2) {
    return key + ", " + key2;
}

...

http://localhost:8080/req/param1?key1=abcd&key2=1234 img

  • Map을 활용하면 파라미터를 정하지 않고 전달된 모든 파라미터를 동적으로 사용가능하다.

file\src\main\java\com\example\basic\controller\RequustController.java

Java

1
2
3
4
5
6
7
8
...

@GetMapping("req/param2")
public String param2(@RequestParam Map<String, Object> map) {
    return map.toString();
}

...

http://localhost:8080/req/param2?name=abcde&pageNum=12&address=seoul img


Reference

댓글남기기