다음과 같은 User엔터티와, 요청으로 User의 필드를 받아와 User 객체를 생성하여 비즈니스 로직을 실행하려고 한다.
//User.java
package com.spring.app.common.auth;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
public class User {
private String id;
}
```java
//AuthController.java
@RestController
public class AuthController {
@CrossOrigin("*")
@PostMapping("/api/login")
public ResponseEntity<User> login(@RequestBody User user,
HttpServletRequest request,
HttpServletResponse response) {
User foundUser = null;
/*
* @params : {id: "amdin"}
* id == admin -> 정상 로그인 -> cookie 생성/응답
*/
if("admin".equals(user.getId())) {
foundUser = new User("admin");
Cookie cookie = new Cookie("id", "admin");
cookie.setMaxAge(3600);
response.addCookie(cookie);
}
return new ResponseEntity<User>(foundUser, HttpStatus.OK);
}
}
근데 자꾸 만들어달라는 User는 안 만들어주고 400을 띄워주는게 아니겠는가?
이유는 스프링의 객체 매핑 원리에 있었다.
스프링은 jackson의 ObjectMapper을 통해 Request로 받아온 데이터를 통해 객체를 매핑하고 생성한다.
이 때, AllArgsConstructor처럼 한 번에 모든 필드를 집어넣으며 생성하는 것이 아니라,
기본 생성자(NoArgs)를 생성하고, Setter을 통해 하나하나 필드를 넣어주는 것이다.
그래서 위 상황에서 계속 생성자가 없다는 오류가 떴던 것!
기본 생성자를 넣어주면 된다.
필자는 귀찮기 때문에 @NoArgsConstructor을 이용했다.
package com.spring.app.common.auth;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String id;
}