@RestController
@RequestMapping("/v1/members")
public class MemberController {
@PostMapping
public ResponseEntity postMember(@RequestHeader("user-agent") String userAgent,
@RequestParam("email") String email,
@RequestParam("name") String name,
@RequestParam("phoneNumber") String phone) {
System.out.println("# userAgent = " + userAgent);
System.out.println("# email: " + email);
System.out.println("# name: " + name);
System.out.println("# phone: " + phone);
// (2) JSON 문자열 수작업을 Map 객체로 대체
Map<String, String> map = new HashMap<>();
map.put("email", email);
map.put("name", name);
map.put("phone", phone);
// (3) 리턴 값을 ResponseEntity 객체로 변경
return new ResponseEntity<>(new Member(email, name, phone), HttpStatus.CREATED);
}
}
@RequestParam
으로 받았지만, Member로 리턴해주고자 한다. public class Member {
static String email;
static String name;
static String phone;
public Member(String email, String name, String phone) {
this.email = email;
this.name = name;
this.phone = phone;
}
public static String getEmail() {
return email;
}
public static String getName() {
return name;
}
public static String getPhone() {
return phone;
}
}
당연히 반환에 필요한, 생성자와 getter를 만들어 주고, spring을 실행한뒤,
http://localhost:8080/v1/members
로 POST 요청을 수행하니까, 아래와 같은 pretty
가 떴다.
즉,대부분 서버측에서 응답을 잘못준 경우라는 것이다.
Content-Type
은 데이터를 전송하는 쪽에서 데이터형식을 알려주는 헤더이고,Accept
는 클라이언트에서 웹서버로 요청시 요청메세지에 담기는 헤더로써, 선언한 타입만 허용하겠다는 의미, 보통 레거시 스프링에서는 설정을 수정해주면 된다고 한다.Getter
의 메서드가 없는 경우, 혹은 필드의 값이 없는 경우제가 해당하는 경우인데, 응답을 해주기위해, Getter
메서드로 값을 추출해야되는데, Getter`의 메서드가 없어 제대로된 응답을 못해주거나,
인스턴스가 생성되면서 필드의 값이 제대로된 값을 가지지 못하는 경우, Getter
메서드로 값을 꺼낼수가 없을때 발생한다.
내가 406에러가 뜨고, 서버측 콘솔을 확인해보니 아래와 같았다.
제대로된 값을 찾을 수 없다는 경고문구가 나타난다.
그래서 다시한번 작성한 코드를 보니 필드의 값들이, 인스턴스 변수가 아닌,
클래스 변수(전역 변수)로 되어있어서,
static를 지워주니 해결되었다.
public class Member {
private String email;
private String name;
private String phone;
public Member(String email, String name, String phone) {
this.email = email;
this.name = name;
this.phone = phone;
}
public String getEmail() {
return email;
}
public String getName() {
return name;
}
public String getPhone() {
return phone;
}
}