728x90

회사 업무를 진행하면서 html의 <form></form> 이란 것을 처음 알게 되었고 여러 프로젝트에 참여하면서 form으로 전달되는 데이터를 받는 방식이 제각각이었기에 어떤 것들이 있는지 한번 정리해보기로 했다.


 

 

GitHub - N1ghtsky0/playground

Contribute to N1ghtsky0/playground development by creating an account on GitHub.

github.com


목차

  1. 프로젝트 설정
  2. html 코드
  3. Java 코드
    1. HttpServletRequest로 데이터 받기
    2. Request Params로 데이터 받기
    3. HashMap으로 데이터 받기
    4. 객체로 데이터 받기

※ 프로젝트 실행 후 테스트 시 보여지는 화면에는 별다른 변화가 없고 스프링의 로그를 통해 결과값을 확인할 수 있습니다.


1. 프로젝트 설정

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	implementation 'org.projectlombok:lombok'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

2. html 코드

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
        integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
</head>
<body>
<div class="container">
  <form id="frm" method="post" action="/form">
    <div class="mb-3">
      <label for="name" class="form-label">이름</label>
      <input type="text" class="form-control" id="name" name="name">
    </div>
    <div class="mb-3">
      <label for="fruit" class="form-label">좋아하는 과일</label>
      <input type="text" class="form-control" id="fruit" name="fruit">
    </div>
    <button type="submit" class="btn btn-primary">제출</button>
  </form>
</div>
</body>
</html>

 

프로젝트 실행 시 깔끔하게 보기 위해서 BootStrap 5를 적용해서 코드가 좀더 길어졌는데 그건 중요하지 않고 눈여겨 봐야할 곳은 <form> 태그 속 <input>의 "name"이다. 해당 name으로 파라미터들을 매핑하니 코드를 수정한다면 name은 기억해두자.

 


3-1. HttpServletRequest로 데이터 받기

@Slf4j
@Controller
public class FormController {

    @PostMapping("/form")
    public String formByHttpServletRequest(HttpServletRequest httpServletRequest) {
        String name = httpServletRequest.getParameter("name");
        String fruit = httpServletRequest.getParameter("fruit");

        log.info("formByHttpServletRequest");
        log.info(String.format("form-data ===> {name=%s, fruit=%s}", name, fruit));

        return "redirect:/";
    }
    
}

 

HttpServletRequest을 이용하여 파라미터를 가져올 때는 컨트롤러의 입력 받는 변수에 HttpServletRequest를 선언해준 뒤 매서드내에서 getPatameter(name)으로 가져오면된다. 


3-2. Request Params로 데이터 받기

@Slf4j
@Controller
public class FormController {

    @PostMapping("/form")
    public String formByRequestParams(@RequestParam(value = "name") String name,
                                      @RequestParam(value = "fruit") String fruit) {
        log.info("formByRequestParams");
        log.info(String.format("form-data ===> {name=%s, fruit=%s}", name, fruit));

        return "redirect:/";
    }
    
}

3-3. HashMap으로 데이터 받기

@Slf4j
@Controller
public class FormController {

    @PostMapping("/form")
    public String formByHashMap(@RequestParam HashMap<String, Object> formData) {
        log.info("formByHashMap");
        log.info("form-data ===> " + formData);

        return "redirect:/";
    }
    
}

 

HashMap으로 데이터를 가져올 때 주의할 점은 @RequestParam을 붙여주지 않으면 값을 가져오지 못한다는 것이다. 

 


3-4. 객체로 데이터 받기

// FormData.java
@Getter
@Setter
public class FormData {
    private String name;
    private String fruit;

    public String toString() {
        return "{" +
                "name=" + name + ", " +
                "fruit=" + fruit +
                "}";
    }
}

// Controller.java
@Slf4j
@Controller
public class FormController {

    @PostMapping("/form")
    public String formByDTO(FormData formData) {
        log.info("formByDTO");
        log.info("form-data ===> " + formData.toString());

        return "redirect:/";
    }
    
}

 

정확히는 @ModelAttribute 를 통해 받은 데이터들을 객체로 바인딩 시켜서 가져온다는 표현이 맞겠지만 @ModelAttribute은 생략도 가능하고 개인적으로 객체만 선언해놔도 알아볼 수 있다고 생각하기에 이 편이 더 깔끔하다고 생각한다.

+ Recent posts