[Spring] @RequestBody의 객체 매핑 원리

·2024년 6월 19일
0

SpringBoot

목록 보기
5/6
post-custom-banner

문제 상황

다음과 같은 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;
}
profile
풀스택 호소인
post-custom-banner

0개의 댓글