JSON 형식으로 객체를 전달하는 작동 과정을 물어봄.
@Controller
public class HelloController{
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name){
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
@Controller
는 클래스가 HTTP 요청을 처리하는 컨트롤러라는 것을 알려준다.@GetMapping
은 큰따옴표 안에 특정 URI에 대한 GET 방식의 HTTP 요청을 매핑한다. 코드상에서 보면 로컬호스트:포트/hello-api 가 get방식으로 오면 Hello라는 객체를 리턴하는 helloApi 메서드로 매핑이 된다.@ResponseBody
는 helloApi 메서드 리턴값이 response body에 포함이 되어야 함을 스프링 부트에 전달한다.helloApi method
는 스트링 name이라는 매개변수를 사용하는 모습. helloApi는 Hello 객체를 리턴한다. 코드를 보면 hello라는 인스턴스를 생성한 후 인스턴스에 setName(name)을 해주고 리턴한다.Hello class
. helloApi method에서 Hello 클래스를 반환하니 Hello 클래스를 정의해보자. Hello class는 HelloController class 안에서 중첩 정의되고 있는 정적 클래스다. 정적 클래스로 만들면 HelloController class 안에서 사용이 가능하다. 클래스 안의 String name을 private으로 두면서 getter and setter method를 통해 접근하도록 설정한다(자바 표준 방식이라고 하네요~). 예시 코드로 설명을 해보자. helloApi 메서드에서 리턴할 인스턴스 hello에 setName(name)을 한다. 매개변수 name이 Hello 객체의 private String name에 세팅이 된 후 hello 인스턴스를 반환한다.static
: Hello 클래스의 인스턴스 hello를 만들 수 있다. HelloController 클래스의 인스턴스 생성 없이. (예시 코드에서) Hello 클래스는 HelloController 클래스 안에서만 쓰이기 때문에, static을 써준다~private
: 프라이빗은 access modifier다. 얘는 name field를 만든다. Hello class에 액세스할 수 있는. 다른 애들은 name에 바로 접근 못 한다. 대신에 getter와 setter를 사용해 name에 접근한다.public
: 다른 클래스로부터 접근할 수 있는 getter와 setter의 access modifier다. 무슨 의미냐면, 다른 클래스는 getter와 setter 메서도를 콜해서 private field인 name에 접근한다.요약하면, 스태틱은 아우터 클래스의 인스턴스 생성 없이 이너 클래스에 접근할 수 있게 한다. 프라이빗은 필드나 메서드가 같은 클래스에서만 접근하도록 쓰인다. 퍼블릭은 필드나 메서드가 다른 클래스로부터 접근 가능하도록 쓰인다.
왜 name을 private으로 함? public으로 하면 게터랑 세터 없어도 되는 거 아님?