본문 바로가기
Spring/spring

스프링 5일차 정리

by dyddyd0 2024. 7. 16.
요청 url 방식

 

get: 요청 객체의 body가 생성 안 되는 방식.

화면에서 전송되는 모든 데이터가 파라미터(쿼리스트링 방식)로 전달된다.

url에 전송되는 모든 키와 밸류가 표출. 보안상 좋지 않아서 중요한 데이터를 전송할 때는 사용되지 않는다.

하지만 다른 방식들보다 데이터 처리하는 로직이 줄어들어 속도가 빠르기 때문에 단순 조회에서 많이 사용된다.

 

 

post: 요청 객체의 body를 생성하여 통신하는 방식.

전송하는 데이터가 요청 객체의 body에 저장되기 때문에 url에 표출되지 않는다.

요청 객체에 body를 생성하기 때문에 get방식보다는 속도가 느리고 데이터를 숨길 수 있기 때문에 보안상 용이하다.

 

put;

delete;

(Spring Framework에서는 insert, update, delete 모두 post 방식을 사용했는데, Spring Boot에서 put 방식과 delete 방식이 추가되면서 Boot에서는 insert는 post로 update은 put으로 delete는 delete로 구분하여 사용한다.)

 

DispatcherServlet 클래스의 상위 클래스 FrameworkServlet 클래스를 들어가 보면,

아래방식으로 사용도 가능하게 만들어 두었다. -> doGet / doPost / doPut / doDelete

 

 

jstl 사용하려면 선언문 추가 → <%@ **taglib** prefix="c" uri="jakarta.tags.core" %>

name-tel.jsp

더보기

<%--
Created by IntelliJ IDEA.

User: bit

Date: 2024-07-15

Time: 오전 10:22 To change this template use File | Settings | File Templates.

--%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%@ taglib prefix="c" uri="jakarta.tags.core" %>

<html>

<head>

    <title>name-tel</title>

    <style>

        div > p { display: inline-block; margin-left: 10px; }

    </style>

</head>

<body>

    <form action="/name-tel.do" method="post">

        <input type="text" name="name">

        <input type="text" name="tel">

        <input type="submit" value="전송">

    </form>

</body>

</html>

같은 url에 여러 방식으로 매핑 가능함

RequestMapping에 method를 지정하지 않으면 모든 방식으로 처리할 수 있다.

// get/post 방식 모두 지원하는 url 매핑
    @RequestMapping("name-tel.do")
    public String nameTelGetPost(){
        System.out.println("get/post 방식 모두 동작");
        return "name-tel";
    }

 

post 방식 : 전송을 눌러도 url 변화가 안보임

url에 데이터값이 숨겨져 전송됨

 

 

put 방식: 전송을 누르면 쿼리스트링으로 전송된다

url에 전송된 데이터 값이 보여짐

 


화면단에서 전송한 데이터 입력받기

 

(name-tel.jsp의 폼은 확인을 위해 get 방식으로 바꿔주었다)

url에 직접 쿼리스트링을 입력해서 보내주어도 되며,

url에 직접 데이터 값을 적어줌

 

폼을 입력해 전송해도 같은 결과가 나온다.

각각의 전송된 데이터를 콘솔에서 확인해봄


url 이동을(localhost:8090 → localhost:8090/name-tel.do) 하다 보니,

url에 접속하지 않고 입력만 해도 데이터가 전송된다??

url에 직접 입력하다 방향키->를 눌러 자동완성 시키면 엔터를 치지않아도 콘솔에 데이터가 들어온다?? 이후 지우고 새값으로 엔터치면 전송안됨

localhost:8090 화면에서 url에 /name- 글자를 치고 → 방향키를 눌러 자동완성을 하게 되면 엔터로 요청을 보내지 않아도 데이터가 들어온다??


 

데이터 확인을 위해 출력은 name 두 개가 아니라 name, tel로

출력 부분 수정→

System.out.println("name: " + n);

System.out.println("tel: " + t);

 

화면 → 자바로 데이터 전송

 

1. HttpServletRequest 객체로 데이터 받기.
Controller 객체의 메서드의 파라미터가 생성한 Command 객체 getParameter(키)로 가져오기

@GetMapping("/name-tel.do")
    public String nameTelGet(HttpServletRequest request) {
        System.out.println("name: " + request.getParameter("name")); // name 키의 벨류를 가져옴
        System.out.println("tel: " + request.getParameter("tel")); // tel 키의 벨류를 가져옴
        return "name-tel";
    }

 

 

 

2. @RequestParam 어노테이션으로 데이터 받기.
파라미터로 지정한 @RequestParam의 변수명으로 가져오기

@GetMapping("/name-tel.do")
    // @RequestParam 의 required 속성은 true 가 기본값이라 데이터를 전송하지 않으면 에러 발생함.
    public String nameTelGet(@RequestParam(value = "name", required = false, defaultValue = "test") String n,
                             @RequestParam(value = "tel", required = false, defaultValue = "test") String t) {
        System.out.println("name: " + n);
        System.out.println("tel: " + t);
        return "name-tel";
    }

 

 

3. @RequestParam + Map <>에 매핑해 받아오기.

화면에서 넘겨준 키 벨류 형식의 데이터를 그대로 Map에 매핑해 map변수이름. get(”키”) 로 가져온다.

@GetMapping("/name-tel.do")
    public String nameTelGet(@RequestParam Map<String, String> paramMap) {
        System.out.println("name: " + paramMap.get("name"));
        System.out.println("tel: " + paramMap.get("tel"));
        return "name-tel";
    }

 

 

4. @ModelAttribute 어노테이션과 Command 객체를 이용해 받아오기.

자동으로 생성된 객체에 (전송된 데이터의 키와 클래스 변수명이 같으면 자동으로) setter 메서드 동작시켜 전송된 데이터 벨류 값이 멤버변수에 담아 가져온다. → setter메서드 동작시켜야 되니 → 구현 필수

@GetMapping("/name-tel.do")
    public String nameTelGet(@ModelAttribute NameTelDto nameTelDto) {
        System.out.println("name: " + nameTelDto.getName());
        System.out.println("tel: " + nameTelDto.getTel());
        return "name-tel";
    }

    @PostMapping("/name-tel.do")
    public String nameTelPost(@ModelAttribute NameTelDto nameTelDto) {
        System.out.println("name: " + nameTelDto.getName());
        System.out.println("tel: " + nameTelDto.getTel());
		    return "name-tel";
   }

 

 

자바 → 화면으로 데이터 전송

 

1. Model 객체를 이용 addAttribute(키, 밸류) 메서드를 사용해서 html/jsp 파일에서 el 표기법으로 받아온다. ${키}

@PostMapping("/name-tel.do")
    public String nameTelPost(@ModelAttribute NameTelDto nameTelDto, Model model) {
        System.out.println("name: " + nameTelDto.getName());
        System.out.println("tel: " + nameTelDto.getTel());
        nameTelService.postNameTel(nameTelDto);

        // 2. 자바에서 화면단으로 데이터 전송
        // 2-1 Model 객체를 통한 데이터 전송, Model 객체의 addAttribute (키,벨류) 로 데이터 매핑해서 화면단으로 전송
        // 화면단에서는 el 표기법(${키}) 으로 키 값에 해당하는 벨류를 사용할 수 있다.
//        model.addAttribute("nm", nameTelDto.getName());
//        model.addAttribute("tl", nameTelDto.getTel());

        // Model 객체에는 클래스 타입의 변수도 담아서 전송할 수 있다.
        model.addAttribute("nameTelDto", nameTelDto);

        return "name-tel";
    }

 

.jsp

 <div>
<%--        java 에서 전송한 데이터를 el 표기법으로 표출한다.
            자바에서도 데이터 전송할 때 키: 벨류 매핑된 데이터로 오기 때문에,
            키를 이용해 밸류값을 사용한다.
--%>
<%--        <p>name의 attributeName 로 지정한 nm: ${nm}</p>--%>
<%--    <br>--%>
<%--        <p>tel의 attributeName 로 지정한 tl:${tl}</p>--%>

<%--        자바에서 전송한 데이터가 클래스 타입일 경우 정송한 키, 맴버변수명 으로 데이터를 꺼내서 사용할 수 있다.--%>
        <p>nameTelDto 객체의 name: ${nameTelDto.name}</p>
    <br>
        <p>nameTelDto 객체의 tel: ${nameTelDto.tel}</p>
    </div>

 

 

2. HttpServletRequest 객체를 통한 데이터 전송

@PostMapping("/name-tel.do")
    public String nameTelPost(@ModelAttribute NameTelDto nameTelDto, HttpServletRequest request) {
        System.out.println("name: " + nameTelDto.getName());
        System.out.println("tel: " + nameTelDto.getTel());
        nameTelService.postNameTel(nameTelDto);
        
        // 2-2 HttpServletRequest 객체를 통한 데이터 전송
        // HttpServlet 객체의 setAttribute(키, 벨류);
        request.setAttribute("nameTelList", nameTelService.getNameTelList());

			  return "name-tel";
    }

 

 

3. HttpSession 객체를 이용한 데이터 전송

@PostMapping("/name-tel.do")
    public String nameTelPost(@ModelAttribute NameTelDto nameTelDto, HttpSession httpSession) {
        System.out.println("name: " + nameTelDto.getName());
        System.out.println("tel: " + nameTelDto.getTel());
        nameTelService.postNameTel(nameTelDto);
        
        // 2-3 HttpSession 객체를 이용한 데이터 전송
        // Model 객체와 HttpServletRequest 객체는 하나의 요청이 시작될 때 생성돼서 요청이 종료되면 사라지는 객체
        // HttpSession 객체는 사용자가 웹 어플리케이션에 접속하는 순간 생성되는 객체
        // WEB Server (web.xml)에 설정되어 있는 시간동안 유지되는 객체
        // (기본값은 30분으로 설정되어 있고,
        // 사용자가 웹 어플리케이션에서 다른 동작(이벤트나 요청)을 발생시키면 다시 30분으로 초기화.)
        // 해당 요청에 한정되지 않고 다른 페이지들에서도 HttpSession 에 담겨있는 데이터를 사용할 수 있다.
        // 주로 로그인 사용자의 정보를 담아둘 때 사용한다.
        httpSession.setAttribute("nameTelList", nameTelService.getNameTelList());

            return "name-tel";
    }

 

+

jsp (html) 파일에 form 태그가 여러 개 있을 때,

controller에 특정 form 가져오기 / 현재는 두 폼의 요청 모두 같이 처리하고 있음.

반응형

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

스프링 7일차 정리  (0) 2024.07.17
스프링 6일차 정리  (0) 2024.07.17
스프링 4일차 정리  (0) 2024.07.14
스프링 3일차 정리  (0) 2024.07.11
스프링 2일차 정리  (0) 2024.07.10