@Controller
: 해당 클래스가 컨트롤러임을 알려줌
@GetMapping
: 여기로 왔을때 이 함수 실행해라
@ResponseBody
: 이 함수의 리턴값을 그대로 브라우저에 전송해라
@GetMapping("/calc")
@ResponseBody
String showCalc(int a, int b) {
return "계산 결과: %d".formatted(a+b);
}
이렇게 인자가 필요할 때는?
java.lang.IllegalStateException: Optional int parameter 'a' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.
a에 뭘 넣어야 할지 모르니까 null
을 넣는다.
그런데, int
는 null
을 허용하지 않는 primitive type이므로 에러 발생.
@GetMapping("/calc2")
@ResponseBody
String showCalc2(Integer a, Integer b) {
return "a: %d, b: %d".formatted(a, b);
}
이건 에러가 발생하지 않음. Integer
에 null
을 담을 수 있음.
/calc?a=10&b=20 이렇게 주면 실행됨
/calc2?a=10&b=20 의 결과
/calc2 의 결과
@GetMapping("/calc3")
@ResponseBody
String showCalc3(@RequestParam(defaultValue = "0") int a, @RequestParam(defaultValue = "0") int b) {
return "계산 결과: %d".formatted(a+b);
}
a와 b의 값을 지정하지 않아도 0으로 초기화됨
/calc3?a=10&b=20
여기서 브라우저가 10과 20이 숫자인지 인식하는가? 아님
url은 무조건 다 문자열
내부적으로 스프링부트에서 알아서 Integer.parseInt("10")
과정을 거침.
@GetMapping("/calc7")
@ResponseBody
boolean showCalc7(int a, int b) {
return a > b;
}
true나 false가 리턴되는데, 이 boolean
형식은 자바만 이해하는 것.
브라우저에 보이는 true/false는 문자열일 뿐. 그 의미는 브라우저에서 모름.
@GetMapping("/calc8")
@ResponseBody
Person showCalc8(String name, int age) {
return new Person(name, age);
}
@AllArgsConstructor
class Person {
private String name;
private int age;
}
멤버변수가 private
라서 에러남. public
으로 수정해야함
public
으로 수정하면 문제 없이 실행됨
@GetMapping("/calc10")
@ResponseBody
Map<String, Object> showCalc10(String name, int age) {
Map<String, Object> personMap = Map.of(
"name", name,
"age", age
);
return personMap;
}
실행 결과는 위와 같음.
@GetMapping("/calc13")
@ResponseBody
List<Person2> showCalc13(String name, int age) {
List<Person2> persons = new ArrayList<>() {{
add(new Person2(name, age));
add(new Person2(name + "!", age + 1));
add(new Person2(name + "!!", age + 2));
}};
return persons;
}
@GetMapping("/calc11")
@ResponseBody
List<Integer> showCalc11() {
List<Integer> nums = new ArrayList<>() {{
add(10);
add(200);
add(-90);
}};
return nums;
}
@GetMapping("/calc12")
@ResponseBody
int[] showCalc12() {
int[] nums = new int[]{10, 200, -90};
return nums;
}
두 함수의 실행 결과는 같음.
리스트는 추가가 가능하지만, 배열은 길이가 정해져있음.
함수가 리턴하면 브라우저에 나타남. 번역이 필요함.
150 => "150"
true => "true"
'a' => "a"
객체를 문자열로 바꿀 때는 json 방식을 따름.