[아이티센 부트캠프] Spring Boot 실습

이언덕·2026년 5월 5일

아이티센 부트캠프

목록 보기
67/115
post-thumbnail

문제

먼저 문제 원본은 아래와 같다.

문제에서 실제로 구현해야 하는 조건만 다시 정리하면 이렇다.

  • 브라우저에서 숫자 2개와 연산자 1개를 입력받는다.
  • calcForm.html 파일은 static 폴더에 두고, form의 action은 calc로 설정한다.
  • 요청은 GET 방식으로 전송한다.
  • CalcController에서 /calc 요청을 처리한다.
  • num1, num2, oper 값을 컨트롤러 메서드의 아규먼트로 받는다.
  • 전달받은 연산자에 따라 덧셈, 뺄셈, 곱셈, 나눗셈을 처리한다.
  • 정상 연산 결과는 calcResult.html에서 출력한다.
  • 나눗셈 연산에서 두 번째 숫자가 0이면 오류 메시지를 저장한다.
  • 오류 메시지는 errorResult.html에서 출력한다.
  • 결과 화면과 오류 화면에는 다시 입력 화면으로 돌아갈 수 있는 링크를 둔다.



문제 해석

이 문제는 단순히 계산식만 작성하는 문제가 아니다.

브라우저에서 입력한 값이 form을 통해 서버로 전달되고, Spring MVC 컨트롤러가 그 요청값을 받아 연산한 뒤, 결과에 따라 서로 다른 화면을 응답하는 흐름을 구현하는 문제다.

핵심은 HTML 화면, 컨트롤러, 결과 화면이 각각 따로 존재하지만 하나의 요청 흐름으로 연결된다는 점이다.


먼저 calcForm.html에서 숫자 2개와 연산자를 입력받는다.
사용자가 계산하기 버튼을 누르면 /calc 주소로 요청이 전송된다.
그 다음 CalcController가 @RequestParam으로 요청 파라미터를 받고, 연산자에 따라 결과를 계산한다.
정상 계산이면 result 값을 ModelAndView에 저장하고 calcResult 화면으로 이동한다.
반대로 나눗셈에서 두 번째 숫자가 0이면 msg 값을 저장하고 errorResult 화면으로 이동한다.

즉 이 실습의 핵심 흐름은 아래와 같다.

입력 화면 작성 → form 요청 전송 → 컨트롤러에서 요청값 받기 → 연산 처리 → 정상 결과 저장 → 오류 메시지 저장 → 결과 화면 출력



풀이 순서

  1. calcForm.html 파일을 static 폴더에 작성한다.
  2. form 태그의 method와 action을 설정한다.
  3. 숫자 2개와 연산자 1개를 입력받는 입력 화면을 만든다.
  4. CalcController 클래스를 만든다.
  5. /calc 요청을 처리하는 컨트롤러 메서드를 만든다.
  6. @RequestParam으로 num1, num2, oper 값을 받는다.
  7. ModelAndView 객체를 생성한다.
  8. 나눗셈에서 두 번째 숫자가 0인지 먼저 검사한다.
  9. 오류 상황이면 msg를 저장하고 errorResult 화면으로 이동한다.
  10. 정상 상황이면 연산자에 따라 계산 결과를 구한다.
  11. 계산 결과를 result로 저장하고 calcResult 화면으로 이동한다.
  12. calcResult.html에서 정상 결과를 출력한다.
  13. errorResult.html에서 오류 메시지를 출력한다.
  14. 입력 화면, 정상 결과 화면, 오류 결과 화면을 실행해서 확인한다.



자세한 풀이

1. 입력 화면 작성

먼저 사용자가 숫자 2개와 연산자 1개를 입력할 수 있는 calcForm.html 파일을 만든다.

이 파일은 templates가 아니라 static 폴더에 둔다.
static 폴더에 있는 파일은 컨트롤러를 거치지 않고 브라우저에서 바로 열 수 있다.

그래서 주소창에서 /calcForm.html로 접근하면 입력 화면이 바로 열린다.

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Insert title here</title>
</head>
<body>
<h1>연산할 두 개의 숫자를 입력하고 연산자를 선택하시오.</h1>
<hr>
<form method="get" action="calc">
  <input type="number" name="num1" placeholder="연산할 숫자1" required>
  <select name="oper">
    <option>+</option>
    <option>-</option>
    <option>*</option>
    <option>/</option>
  </select>
  <input type="number" name="num2" placeholder="연산할 숫자2" required>
  <input type="submit" value="계산하기">
</form>
</body>
</html>

여기서 중요한 부분은 form 태그다.

<form method="get" action="calc">

method="get"은 입력값을 요청 주소 뒤에 붙여서 전송하겠다는 의미다.
action="calc"는 계산하기 버튼을 눌렀을 때 /calc 요청을 보내겠다는 의미다.


그리고 각각의 입력 태그에는 name 속성이 들어가 있다.

<input type="number" name="num1" placeholder="연산할 숫자1" required>
<select name="oper">
<input type="number" name="num2" placeholder="연산할 숫자2" required>

이 name 값이 나중에 컨트롤러에서 요청 파라미터 이름으로 사용된다.

즉, 브라우저에서 숫자와 연산자를 입력하면 서버에는 아래와 같은 이름으로 값이 전달된다.

  • num1
  • oper
  • num2


데이터 흐름 예상

<form method="get" action="calc">
  <!-- 1. 계산하기 버튼을 누르면 calc 주소로 GET 요청을 보냄 -->

  <input type="number" name="num1" placeholder="연산할 숫자1" required>
  <!-- 2. 첫 번째 숫자는 num1이라는 이름으로 전송됨 -->

  <select name="oper">
    <!-- 3. 선택한 연산자는 oper라는 이름으로 전송됨 -->
    <option>+</option>
    <option>-</option>
    <option>*</option>
    <option>/</option>
  </select>

  <input type="number" name="num2" placeholder="연산할 숫자2" required>
  <!-- 4. 두 번째 숫자는 num2라는 이름으로 전송됨 -->

  <input type="submit" value="계산하기">
  <!-- 5. 버튼을 누르면 입력값이 서버로 전달됨 -->
</form>

예를 들어 첫 번째 숫자에 10, 연산자에 +, 두 번째 숫자에 20을 입력하고 버튼을 누르면 요청 흐름은 이렇게 된다.

/calc?num1=10&oper=%2B&num2=20

실제 브라우저에서는 + 연산자가 URL에서 %2B처럼 인코딩되어 전달될 수 있다.

→ calcForm.html에서 숫자 2개와 연산자 1개를 입력한다.
→ 계산하기 버튼을 누르면 GET 방식으로 /calc 요청이 전송된다.
→ num1, oper, num2라는 이름으로 값이 서버에 전달된다.
→ 이 값들은 컨트롤러의 @RequestParam에서 받을 수 있다.



2. 컨트롤러 클래스 작성

이제 /calc 요청을 처리할 컨트롤러를 만든다.

컨트롤러 클래스에는 @Controller를 붙인다.
@Controller가 붙어 있어야 Spring MVC가 이 클래스를 요청 처리용 클래스라고 인식한다.

package com.example.springlab.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller // 추가: 이 클래스를 Spring MVC 컨트롤러로 등록함
public class CalcController {

}

현재는 클래스 틀만 만든 상태다.

아직 어떤 주소를 처리할지 정하지 않았기 때문에, 브라우저에서 /calc 요청을 보내도 이 클래스 안에서 실행될 메서드가 없다.



3. /calc 요청을 처리하는 메서드 작성

이제 /calc 요청을 처리할 메서드를 만든다.

문제에서는 입력 화면의 form에서 action="calc"로 요청을 보내고 있다.
그래서 컨트롤러에서는 @RequestMapping("/calc")로 이 요청을 받을 수 있게 만든다.

@Controller
public class CalcController {

    @RequestMapping("/calc") // 추가: /calc 요청이 들어오면 이 메서드가 실행됨
    public ModelAndView calc(
            @RequestParam("num1") int num1, // 추가: 요청 파라미터 num1 값을 int로 받음
            @RequestParam("num2") int num2, // 추가: 요청 파라미터 num2 값을 int로 받음
            @RequestParam("oper") String oper // 추가: 요청 파라미터 oper 값을 String으로 받음
    ) {
        ModelAndView mav = new ModelAndView(); // 추가: 데이터와 화면 이름을 함께 담을 객체 생성

        return mav;
    }
}

여기서 @RequestParam은 브라우저에서 전달된 요청 파라미터를 컨트롤러 메서드의 매개변수로 받아오는 역할을 한다.

입력 화면에서 사용한 name 값과 @RequestParam 안의 이름이 서로 맞아야 한다.

<input type="number" name="num1">
<select name="oper">
<input type="number" name="num2">

@RequestParam("num1") int num1
@RequestParam("num2") int num2
@RequestParam("oper") String oper

즉, HTML에서 name="num1"로 전송한 값은 컨트롤러에서 @RequestParam("num1")으로 받는다.


데이터 흐름 예상

<form method="get" action="calc">
  <input type="number" name="num1" required>
  <!-- 1. 사용자가 입력한 첫 번째 숫자가 num1이라는 이름으로 전달됨 -->

  <select name="oper">
    <option>+</option>
    <option>-</option>
    <option>*</option>
    <option>/</option>
  </select>
  <!-- 2. 사용자가 선택한 연산자가 oper라는 이름으로 전달됨 -->

  <input type="number" name="num2" required>
  <!-- 3. 사용자가 입력한 두 번째 숫자가 num2라는 이름으로 전달됨 -->
</form>

@RequestMapping("/calc")
public ModelAndView calc(
        @RequestParam("num1") int num1,
        // 4. 요청 파라미터 num1 값이 int num1 변수에 들어옴

        @RequestParam("num2") int num2,
        // 5. 요청 파라미터 num2 값이 int num2 변수에 들어옴

        @RequestParam("oper") String oper
        // 6. 요청 파라미터 oper 값이 String oper 변수에 들어옴
) {
    ModelAndView mav = new ModelAndView();
    // 7. 결과 데이터와 이동할 화면 이름을 담기 위한 객체를 생성함

    return mav;
}

→ 입력 화면에서 name 속성으로 정한 이름이 요청 파라미터 이름이 된다.
→ /calc 요청이 들어오면 calc() 메서드가 실행된다.
→ @RequestParam("num1")은 첫 번째 숫자를 받는다.
→ @RequestParam("num2")는 두 번째 숫자를 받는다.
→ @RequestParam("oper")는 연산자를 받는다.
→ 받은 값은 메서드 안에서 바로 계산에 사용할 수 있다.



4. 나눗셈 오류 조건 먼저 처리하기

이번 문제에서는 나눗셈 연산일 때 두 번째 숫자가 0이면 정상 계산을 하면 안 된다.

나눗셈에서 0으로 나누는 것은 불가능하기 때문에, 연산을 하기 전에 먼저 오류 조건을 검사해야 한다.

if (oper.equals("/") && num2 == 0) { // 추가: 나눗셈이고 두 번째 숫자가 0인지 확인
    mav.addObject("msg", "나눗셈 연산시 두 번째 숫자는 0 일 수 없습니다!!"); // 추가: 오류 메시지 저장
    mav.setViewName("errorResult"); // 추가: 오류 결과 화면으로 이동
}

여기서 조건은 두 가지가 동시에 만족되어야 한다.

  • 연산자가 /인지 확인한다.
  • 두 번째 숫자가 0인지 확인한다.

그래서 &&를 사용한다.

oper.equals("/") && num2 == 0

이 조건이 참이면 계산 결과를 만들지 않고, 오류 메시지를 msg라는 이름으로 저장한다.

mav.addObject("msg", "나눗셈 연산시 두 번째 숫자는 0 일 수 없습니다!!");

그리고 이동할 화면 이름을 errorResult로 지정한다.

mav.setViewName("errorResult");

여기서 errorResult는 실제 파일명 전체가 아니라 뷰 이름이다.
Thymeleaf를 사용하면 이 이름을 기준으로 templates/errorResult.html 파일을 찾는다.


데이터 흐름 예상

if (oper.equals("/") && num2 == 0) {
    // 1. 전달된 연산자가 "/" 인지 확인함
    // 2. 두 번째 숫자가 0인지 확인함
    // 3. 두 조건이 모두 참이면 정상 계산을 하지 않음

    mav.addObject("msg", "나눗셈 연산시 두 번째 숫자는 0 일 수 없습니다!!");
    // 4. 오류 메시지를 msg라는 이름으로 저장함

    mav.setViewName("errorResult");
    // 5. errorResult.html 화면으로 이동하도록 설정함
}

예를 들어 사용자가 아래처럼 입력했다고 가정한다.

num1 = 10
oper = /
num2 = 0

그러면 흐름은 이렇게 된다.

→ 컨트롤러가 num1, oper, num2 값을 받는다.
→ oper.equals("/")가 참이 된다.
→ num2 == 0도 참이 된다.
→ 두 조건이 모두 참이므로 오류 처리 구간이 실행된다.
→ msg라는 이름으로 오류 메시지가 저장된다.
→ 화면 이름은 errorResult로 지정된다.
→ 최종적으로 errorResult.html이 응답된다.



5. 정상 연산 처리하기

오류 조건이 아니라면 정상적으로 계산을 처리한다.

계산 결과를 저장할 result 변수를 먼저 만들고, 전달받은 연산자에 따라 다른 계산식을 실행한다.

else {
    int result = 0; // 추가: 계산 결과를 저장할 변수

    switch (oper) { // 추가: 전달된 연산자에 따라 실행할 계산식 선택
        case "+":
            result = num1 + num2;
            break;
        case "-":
            result = num1 - num2;
            break;
        case "*":
            result = num1 * num2;
            break;
        case "/":
            result = num1 / num2;
            break;
    }

    mav.addObject("result", result); // 추가: 계산 결과를 result라는 이름으로 저장
    mav.setViewName("calcResult"); // 추가: 정상 결과 화면으로 이동
}

switch문은 oper 값에 따라 실행할 코드를 나눈다.

  • +이면 덧셈
  • -이면 뺄셈
  • *이면 곱셈
  • /이면 나눗셈

계산이 끝나면 결과값을 result라는 이름으로 저장한다.

mav.addObject("result", result);

그리고 화면 이름을 calcResult로 지정한다.

mav.setViewName("calcResult");

그러면 templates/calcResult.html이 최종 응답 화면으로 사용된다.


데이터 흐름 예상

else {
    int result = 0;
    // 1. 계산 결과를 저장할 변수를 준비함

    switch (oper) {
        // 2. 전달받은 연산자 값에 따라 실행할 계산식을 선택함

        case "+":
            result = num1 + num2;
            // 3. oper가 "+"이면 두 숫자를 더함
            break;

        case "-":
            result = num1 - num2;
            // 4. oper가 "-"이면 첫 번째 숫자에서 두 번째 숫자를 뺌
            break;

        case "*":
            result = num1 * num2;
            // 5. oper가 "*"이면 두 숫자를 곱함
            break;

        case "/":
            result = num1 / num2;
            // 6. oper가 "/"이면 첫 번째 숫자를 두 번째 숫자로 나눔
            break;
    }

    mav.addObject("result", result);
    // 7. 계산 결과를 result라는 이름으로 저장함

    mav.setViewName("calcResult");
    // 8. calcResult.html 화면으로 이동하도록 설정함
}

예를 들어 사용자가 아래처럼 입력했다고 가정한다.

num1 = 10
oper = +
num2 = 20

그러면 흐름은 이렇게 된다.

→ 컨트롤러가 num1 = 10, oper = +, num2 = 20을 받는다.
→ 나눗셈 오류 조건이 아니므로 else 구간으로 들어간다.
→ switch (oper)에서 case "+"가 실행된다.
→ result = num1 + num2가 실행되어 30이 저장된다.
→ mav.addObject("result", result)로 결과값을 저장한다.
→ mav.setViewName("calcResult")로 정상 결과 화면을 지정한다.
→ 최종적으로 calcResult.html이 응답된다.



6. 컨트롤러 완성 코드

앞에서 작성한 오류 처리와 정상 연산 처리를 합치면 컨트롤러는 아래와 같이 완성된다.

package com.example.springlab.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class CalcController {
    @RequestMapping("/calc")
    public ModelAndView calc(
            @RequestParam("num1") int num1,
            @RequestParam("num2") int num2,
            @RequestParam("oper") String oper
    ) {
        ModelAndView mav = new ModelAndView();

        if (oper.equals("/") && num2 == 0) {
            mav.addObject("msg", "나눗셈 연산시 두 번째 숫자는 0 일 수 없습니다!!");
            mav.setViewName("errorResult");
        } else {
            int result = 0;

            switch (oper) {
                case "+":
                    result = num1 + num2;
                    break;
                case "-":
                    result = num1 - num2;
                    break;
                case "*":
                    result = num1 * num2;
                    break;
                case "/":
                    result = num1 / num2;
                    break;
            }

            mav.addObject("result", result);
            mav.setViewName("calcResult");
        }

        return mav;
    }
}

이 컨트롤러에서 ModelAndView는 두 가지 역할을 한다.

  • 화면에 전달할 데이터를 저장한다.
  • 응답할 화면 이름을 지정한다.

정상 계산일 때는 아래 코드가 실행된다.

mav.addObject("result", result);
mav.setViewName("calcResult");

오류 상황일 때는 아래 코드가 실행된다.

mav.addObject("msg", "나눗셈 연산시 두 번째 숫자는 0 일 수 없습니다!!");
mav.setViewName("errorResult");

즉, 같은 /calc 요청으로 들어오더라도 조건에 따라 응답 화면이 달라진다.



7. 정상 결과 화면 작성

정상 계산 결과를 출력할 calcResult.html 파일을 만든다.

이 파일은 컨트롤러가 뷰 이름을 calcResult로 지정했을 때 사용되는 화면이다.
따라서 위치는 templates 폴더 안에 있어야 한다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>연산 요청 결과</h1>
<hr/>
<p>결과: <span th:text="${result}" style="color:red"></span></p>
<hr/>
<a href="/calcForm.html">입력화면</a>
</body>
</html>

여기서 핵심은 아래 코드다.

<span th:text="${result}" style="color:red"></span>

컨트롤러에서 정상 계산 결과를 result라는 이름으로 저장했다.

mav.addObject("result", result);

그래서 calcResult.html에서는 ${result}로 그 값을 꺼내 출력할 수 있다.


데이터 흐름

mav.addObject("result", result);
// 1. 컨트롤러에서 계산 결과를 result라는 이름으로 저장함

mav.setViewName("calcResult");
// 2. calcResult.html 화면으로 이동하도록 설정함

<p>결과: <span th:text="${result}" style="color:red"></span></p>
<!-- 3. calcResult.html에서 result 값을 꺼내 화면에 출력함 -->

→ 컨트롤러에서 계산 결과를 result라는 이름으로 저장한다.
→ 화면 이름을 calcResult로 지정한다.
→ templates/calcResult.html이 열린다.
→ th:text="${result}"가 result 값을 꺼내 화면에 출력한다.



8. 오류 결과 화면 작성

이번에는 오류 메시지를 출력할 errorResult.html 파일을 만든다.

나눗셈 연산에서 두 번째 숫자가 0인 경우, 컨트롤러는 이 화면으로 이동한다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>요청을 처리하는 동안 오류가 발생했어요..</h1>
<h2>오류의 원인 : <span th:text="${msg}" style="color:red"></span></h2>
<a href="/calcForm.html">입력화면</a>
</body>
</html>

여기서 핵심은 아래 코드다.

<span th:text="${msg}" style="color:red"></span>

컨트롤러에서 오류 메시지를 msg라는 이름으로 저장했다.

mav.addObject("msg", "나눗셈 연산시 두 번째 숫자는 0 일 수 없습니다!!");

그래서 errorResult.html에서는 ${msg}로 그 값을 꺼내 출력할 수 있다.


데이터 흐름

mav.addObject("msg", "나눗셈 연산시 두 번째 숫자는 0 일 수 없습니다!!");
// 1. 컨트롤러에서 오류 메시지를 msg라는 이름으로 저장함

mav.setViewName("errorResult");
// 2. errorResult.html 화면으로 이동하도록 설정함

<h2>오류의 원인 : <span th:text="${msg}" style="color:red"></span></h2>
<!-- 3. errorResult.html에서 msg 값을 꺼내 화면에 출력함 -->

→ 컨트롤러에서 오류 메시지를 msg라는 이름으로 저장한다.
→ 화면 이름을 errorResult로 지정한다.
→ templates/errorResult.html이 열린다.
→ th:text="${msg}"가 msg 값을 꺼내 화면에 출력한다.



9. 전체 요청 흐름 정리

이번 실습의 전체 흐름은 아래와 같다.

<form method="get" action="calc">
  <!-- 1. 입력 화면에서 /calc 요청을 보냄 -->

  <input type="number" name="num1" required>
  <!-- 2. 첫 번째 숫자 전달 -->

  <select name="oper">
    <!-- 3. 연산자 전달 -->
    <option>+</option>
    <option>-</option>
    <option>*</option>
    <option>/</option>
  </select>

  <input type="number" name="num2" required>
  <!-- 4. 두 번째 숫자 전달 -->
</form>

@RequestMapping("/calc")
public ModelAndView calc(
        @RequestParam("num1") int num1,
        @RequestParam("num2") int num2,
        @RequestParam("oper") String oper
) {
    // 5. /calc 요청이 들어오면 num1, num2, oper 값을 받음

    ModelAndView mav = new ModelAndView();
    // 6. 데이터와 화면 이름을 담을 객체 생성

    if (oper.equals("/") && num2 == 0) {
        // 7. 나눗셈인데 두 번째 숫자가 0이면 오류 처리

        mav.addObject("msg", "나눗셈 연산시 두 번째 숫자는 0 일 수 없습니다!!");
        // 8. 오류 메시지 저장

        mav.setViewName("errorResult");
        // 9. 오류 결과 화면으로 이동
    } else {
        // 10. 오류 조건이 아니면 정상 계산 처리

        int result = 0;

        switch (oper) {
            case "+":
                result = num1 + num2;
                break;
            case "-":
                result = num1 - num2;
                break;
            case "*":
                result = num1 * num2;
                break;
            case "/":
                result = num1 / num2;
                break;
        }

        mav.addObject("result", result);
        // 11. 계산 결과 저장

        mav.setViewName("calcResult");
        // 12. 정상 결과 화면으로 이동
    }

    return mav;
    // 13. 저장한 데이터와 화면 이름을 Spring MVC에게 반환
}

정상 계산 흐름은 아래와 같다.

calcForm.html
→ /calc 요청
→ CalcController
→ result 저장
→ calcResult.html
→ 계산 결과 출력

오류 처리 흐름은 아래와 같다.

calcForm.html
→ /calc 요청
→ CalcController
→ msg 저장
→ errorResult.html
→ 오류 메시지 출력



최종 코드

src/main/resources/static/calcForm.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Insert title here</title>
</head>
<body>
<h1>연산할 두 개의 숫자를 입력하고 연산자를 선택하시오.</h1>
<hr>
<form method="get" action="calc">
  <input type="number" name="num1" placeholder="연산할 숫자1" required>
  <select name="oper">
    <option>+</option>
    <option>-</option>
    <option>*</option>
    <option>/</option>
  </select>
  <input type="number" name="num2" placeholder="연산할 숫자2" required>
  <input type="submit" value="계산하기">
</form>
</body>
</html>

src/main/java/com/example/springlab/controller/CalcController.java

package com.example.springlab.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class CalcController {
    @RequestMapping("/calc")
    public ModelAndView calc(
            @RequestParam("num1") int num1,
            @RequestParam("num2") int num2,
            @RequestParam("oper") String oper
    ) {
        ModelAndView mav = new ModelAndView();

        if (oper.equals("/") && num2 == 0) {
            mav.addObject("msg", "나눗셈 연산시 두 번째 숫자는 0 일 수 없습니다!!");
            mav.setViewName("errorResult");
        } else {
            int result = 0;

            switch (oper) {
                case "+":
                    result = num1 + num2;
                    break;
                case "-":
                    result = num1 - num2;
                    break;
                case "*":
                    result = num1 * num2;
                    break;
                case "/":
                    result = num1 / num2;
                    break;
            }

            mav.addObject("result", result);
            mav.setViewName("calcResult");
        }

        return mav;
    }
}

src/main/resources/templates/calcResult.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>연산 요청 결과</h1>
<hr/>
<p>결과: <span th:text="${result}" style="color:red"></span></p>
<hr/>
<a href="/calcForm.html">입력화면</a>
</body>
</html>

src/main/resources/templates/errorResult.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>요청을 처리하는 동안 오류가 발생했어요..</h1>
<h2>오류의 원인 : <span th:text="${msg}" style="color:red"></span></h2>
<a href="/calcForm.html">입력화면</a>
</body>
</html>



실행 결과 확인

1. 입력 화면 확인

브라우저에서 아래 주소로 접속한다.

http://localhost:8089/calcForm.html

입력 화면에서는 숫자 2개와 연산자 1개를 입력할 수 있다.




2. 정상 계산 결과 확인

예를 들어 아래처럼 입력한다.

num1 = 1
oper = +
num2 = 1

그러면 /calc 요청이 컨트롤러로 전달되고, 계산 결과가 result라는 이름으로 저장된다.
이후 calcResult.html에서 결과가 출력된다.




3. 오류 결과 확인

이번에는 나눗셈 연산에서 두 번째 숫자를 0으로 입력한다.

num1 = 10
oper = /
num2 = 0

이 경우 컨트롤러에서 아래 조건이 참이 된다.

oper.equals("/") && num2 == 0

그래서 정상 계산을 하지 않고, 오류 메시지를 msg라는 이름으로 저장한 뒤 errorResult.html로 이동한다.



실습하면서 확인한 점

  • static 폴더에 있는 HTML 파일은 브라우저에서 직접 접근할 수 있다.
  • form의 action 값은 요청을 보낼 컨트롤러 주소와 연결된다.
  • 입력 태그의 name 값은 서버로 전달되는 요청 파라미터 이름이 된다.
  • @RequestParam은 요청 파라미터 값을 컨트롤러 메서드의 매개변수로 받아오는 역할을 한다.
  • ModelAndView는 화면에 전달할 데이터와 이동할 화면 이름을 함께 담을 수 있다.
  • addObject()는 화면에서 사용할 데이터를 저장할 때 사용한다.
  • setViewName()은 응답할 화면 이름을 지정할 때 사용한다.
  • 정상 결과 화면에서는 ${result}로 계산 결과를 출력한다.
  • 오류 결과 화면에서는 ${msg}로 오류 메시지를 출력한다.
  • 같은 /calc 요청이라도 조건에 따라 calcResult.html 또는 errorResult.html로 다른 화면을 응답할 수 있다.

0개의 댓글