본문 바로가기
공부/springboot

MVC -- Model(2) : 데이터 받아오기

by 샤샤샤샤 2023. 1. 25.

형식

1. html파일에서 보내고자 데이터들을 보내는 요청사항 이름을 지정해준다.

2. @RequestMapping 등을 이용하여 요청사항에 대한 응답 함수를 짠다.

 

코드를 직접 보며 확인해보자.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>로그인 화면</title>
</head>
<body>
<h3>로그인 화면입니다.</h3>

<!-- action에 정해진 경로(url)가 없다면, 내부 경로, 자기 서버로 보낸다.-->

<form action="/loginAction1" method="post">
  <input type="text" name="username" > <br>
  <input type="password" name="password" > <br>
  <input type="submit" value="로그인">

</form>

</body>
</html>

데이터 입력 html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>로그인 결과 화면</title>
</head>
<body>

<h2>로그인 결과 화면</h2>

<h2 th:text="|당신의 아이디는 ${ username } 입니다.|">username 값</h2>

<h2 th:text="|당신의 암호는 ${ password } 입니다.|">password 값</h2>

</body>
</html>

데이터 출력 html

 

데이터 수신의 3가지 방식

 

1. 기본형 - HttpServletRequest를 통한 입력값 받기

    @RequestMapping("/loginAction1")
    public String loginAction1(HttpServletRequest request, Model model){
        // 받아온 데이터 변수로 저장
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        // 저장된 데이터 보내기
        model.addAttribute("username",username);
        model.addAttribute("password",password); 
        return "loginResult"; // loginForm.html로 응답
    }

 

데이터를 받는 가장 기본적인 형태다.

입력된 데이터를 직접 getParameter()를 통해 사용할수 있도록 변수로 지정한다.

 

2. url을 통한 데이터 받기( @RequestMapping + @PathVariable )

@RequestMapping(/요청사항/{매개변수1}/{매개변수2}) 와 같은 형식으로 함수 선언 전 미리 url을 통해 데이터를 받음을 알리고, @Pathvariable를 통해 매개변수로 사용할수 있게 만든다.

    @RequestMapping("/loginAction1/{username}/{password}")
    public String loginAction1( @PathVariable("username") String username,
                                @PathVariable("password") String password,
                               Model model){
        model.addAttribute("username",username);
        model.addAttribute("password",password);
        return "loginResult";
    }

중괄호({ })는 데이터를 의미하며, 그 안의 문자열은 데이터의 이름을 뜻한다.

함수에서 데이터를 사용하기 위해 매개변수 적는 칸에서 @PathVariable( "이름" )을 통해 url로 입력된 데이터를 선택하고, 이후 매개변수 타입, 매개변수 이름을 적어 함수 내에서 사용 가능한 매개변수로 만들어준다.

 

3. HttpServletRequest => @RequestParam 대체

모든 매개변수에 대해 HttpServletRequest 의 함수 getParameter을 사용해 변수에 넣는 것은 매우 귀찮고 반복적인 작업이다. 이러한 과정을 축약시켜줄수 있는 어노테이션이 바로 @RequestParam이다.

@RequestParam을 사용하면 일일이 변수에 넣어주는 대신, 함수 선언시 매개변수 받는 괄호() 안에서 매개변수 선언과 동시에 변수값 지정을 동시에 할수 있다.

    @RequestMapping("/loginAction1")
    public String loginAction2(
            @RequestParam("username") String username,
            @RequestParam("password") String password,
            Model model){
        model.addAttribute("username",username);
        model.addAttribute("password",password);
        return "loginResult";
    }

@RequestParam은 커스텀이 가능하다.

    @RequestParam(value = "username", required = false, defaultValue = "김진사") String username

value는 받을 input태그의 이름,

required는 입력값으로 null값을 허용할지 여부( false면 허용함 ),

defaultValue는 입력값이 null일때 자동 설정되는 값을 의미한다.

 

클래스 객체 자동 생성 + 입력값 자동 전달

지금까지는 데이터 하나하나에 일일이 addAttribute를 사용해서 값을 전달했다. 그런데 만약 데이터가 100개,1000개 단위로 커진다면 이는 상당히 비효율적인 작업이 된다. 이때 바로 @RequestMapping을 이용한 자동화를 사용하면 된다.

package com.study.springboot;



import lombok.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Member {
    @Value("변사또")
    private String username;
    @Value("1234")
    private String password;

}

먼저 데이터 저장 용도로 사용할 Member클래스를 만들자. 앞으로 이 Member클래스의 객체에 값을 저장할 것이다.

@Value(): @Autowired나 @RequiredArgsConstructor를 통해 객체를 만들때, 생성자함수의 매개변수 값을 지정한다.

 

자동화는 따로 코드를 적어주지 않고 간단하게 사용 가능하다.

    @RequestMapping("/loginAction1")
    public String loginAction1(HttpServletRequest request, Model model, Member member){
//        Member member = new member();
//        member.setUsername(request.getParameter("username"));
//        member.setPassword(request.getParameter("password"));
//        model.addAttribute("username",username);
//        model.addAttribute("password",password);   --- 자동 주입 기능을 사용하면 생략 가능
    
          model.addAttribute("member",member);
        return "loginResult"; // loginForm.html로 응답
    }

@RequestMapping을 사용하면 객체선언, 입력값 재정의의 과정을 모두 생략할수 있다. 매개변수 받는 괄호 안에 클래스 객체를 받으면 자동적으로 객체 생성이 되며, input태그의 name이, 매개변수 괄호 안에서 생성된 클래스의 필드 변수와 이름이 같은지 자동적으로 검사한 뒤, 이름이 같다면 알아서 값을 넣어주기 때문이다.

따라서 자동화를 사용하고 싶다면 필드 이름과 파라미터 이름이 같아야 한다.

 

**Bean으로 관리된다고 해도, @Autowired와 같은 방식으로 의존주입하지 않는 이상 Bean으로 생성되는 객체가 아니다. 따라서 싱글톤도 아니며, Bean으로 관리되는 객체와는 아무 관련이 없는 독립적인 객체다.

 

파라미터를 Map에 대응시키기

    @RequestMapping("/loginAction1")
    public String loginAction5(
            @RequestParam Map<String, Objects> map,
            Model model
            ){
        // map : "username" : "hong"
        //     : "password" : "1234"
        System.out.println(map.get("username"));
        model.addAttribute("map",map);
        return "loginResult";
    }

이경우 역시 매개변수를 받는 괄호안에 map을 선언하면 자동적으로 name값이 key, 데이터 값이 value로 들어가진다.

'공부 > springboot' 카테고리의 다른 글

JPA 사용법(1) -- JPA 사용법  (0) 2023.01.26
개발용 임시 DB : H2DB  (0) 2023.01.25
데이터의 전송 타입( Get/ Post)  (0) 2023.01.25
MVC -- Model(1): 데이터 전송하기  (0) 2023.01.25
타임리프 레이아웃  (0) 2023.01.25