231114 TIL - SpringBoot 기초(Controller, Annotations, Json)

jkeum·2023년 11월 14일
0

TECHIT-BackendSchool

목록 보기
11/50
post-thumbnail

@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을 넣는다.
그런데, intnull을 허용하지 않는 primitive type이므로 에러 발생.

@GetMapping("/calc2")
@ResponseBody
String showCalc2(Integer a, Integer b) {
	return "a: %d, b: %d".formatted(a, b);
}

이건 에러가 발생하지 않음. Integernull을 담을 수 있음.

/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 방식을 따름.

profile
It's me, jkeum!

0개의 댓글