티스토리 뷰
@PutMapping이용시 오류메시지 해결하기 / not-null property references a null or transient value
foodev 2022. 5. 27. 14:04스프링으로 회원 가입 테스트 과제를 만들던 중
회원수정 @PutMapping에서 not-null property references a null or transient value가 발생했다.
JPA에 대한 깊은 이해가 없이 테스트 과제를 수행하기에만 급급하여 오류 해결에 애를 먹었다
이를 해결하기 위해 접근했던 방법을 기록하고자 작성한다.
[변경 전 회원수정 Controller 일부]
...
@ApiOperation(value = "회원 수정", notes = "회원정보를 수정한다")
@PutMapping(value = "/user")
public SingleResult<User> modify(
@ApiParam(value = "회원번호", required = true) @RequestParam long idx,
@ApiParam(value = "회원아이디", required = true) @RequestParam String id,
@ApiParam(value = "회원이름", required = true) @RequestParam String name) {
User user = User.builder()
.idx(idx)
.id(id)
.name(name)
.build();
return responseService.getSingleResult(userJpaRepo.save(user));
}
...
*@Builder를 사용 아며 User객체에 idx와 id와 name을 저장함 -> 스프링데이터JPA의 내장 메소드 save를 이용
[UserEntity]
...
@Column(name = "user=idx")
private long idx;
@Column(nullable = false, length = 30)
private String id;//아이디
@Column(nullable = false, length = 30)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
// @NotEmpty
private String password;//비밀번호
// @NotEmpty
@Column(nullable = false, length = 30)
private String name;//이름(실명)
// @NotEmpty
@Column(nullable = false, length = 30)
private String mobile;//번호
// @NotEmpty
@Column(nullable = false, length = 30)
private String email;//이메일
public User(){}
@Column(nullable = false, length = 30)
private LocalDateTime joinDate;
...
오류가 나기 전 나의 접근법: 회원 수정을 하는데 있어 @Builer패턴을 사용했다.
*@Builer패턴: 객체를 생성하기 위한 방법 중 하나
장점:
1. 필요한 데이터만 설정할 수 있음
2. 유연성을 확보할 수 있음
3. 가독성을 높일 수 있음
4. 변경 가능성을 최소화 할 수 있음
변경 전 코드를 보면 @Builder패턴을 이용했다.
이방법은 Create와 동일 한 방법이다. @Builer를 통해 객체를 생성하는데 id와 name을 생성하고 나머지는 null에러가 뜬 것을 알 수 있다.
Spring Data JPA의 더티 체킹
Spring Data JPA를 이용하다 보면 더티 체킹이란 것이 있다
간략히 요약하자면 update 쿼리가 없음에도 save(저장/생성)를 통해 update를 실행할 수 있게끔 하는 상태변화를 뜻함
https://jojoldu.tistory.com/415
더티 체킹 (Dirty Checking)이란?
Spring Data Jpa와 같은 ORM 구현체를 사용하다보면 더티 체킹이란 단어를 종종 듣게 됩니다. 더티 체킹이란 단어를 처음 듣는분들을 몇번 만나게 되어 이번 시간엔 더티 체킹이 무엇인지 알아보겠습
jojoldu.tistory.com
자세한 것은 위 블로그를 참고하면 된다.
수정 후
[변경 후 회원수정 Controller 일부]
@PutMapping(value = "/user")
public SingleResult<User> modify(@RequestParam Long idx, @RequestParam String mobile, @RequestParam String email) {
User user = userJpaRepo.getById(idx);
user.modify(mobile, email);
return responseService.getSingleResult(userJpaRepo.save(user));
}
@PostMapping으로 회원가입 후 생성된 User객체에 idx를 불러옵니다
해당 idx의 User의 정보를 불러온 뒤 mobile, email 정보를 userEntity내 modify메소드로 전달합니다.
[변경 후 userEntity]
...
@Column(name = "user=idx")
private long idx;
@Column(nullable = false, length = 30)
private String id;//아이디
@Column(nullable = false, length = 30)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
// @NotEmpty
private String password;//비밀번호
// @NotEmpty
@Column(nullable = false, length = 30)
private String name;//이름(실명)
// @NotEmpty
@Column(nullable = false, length = 30)
private String mobile;//번호
// @NotEmpty
@Column(nullable = false, length = 30)
private String email;//이메일
public User(){}
@Column(nullable = false, length = 30)
private LocalDateTime joinDate;
//추가된 내용
public void modify(String mobile, String email) {
this.mobile = mobile;
this.email = email;
}
...
modify메소드를 통해 회원 수정 Controller에서 mobile과 email을 파라미터로 전달 받고 @PutMapping 어노테이션을 통해 들어온 값을 userEntity 변수에 저장한다.
수정 전과 수정 후 차이점
not-null property references a null or transient value
수정 전에는 @Builder를 활용하여 객체를 생성하여 저장하는 방법이였고 (그러다 보니 null오류)
수정 후에는 스프링데이터 JPA에서 idx를 찾은 뒤 해당 객체의 데이터를 불러와서 mobile, email만 바꿔주는 방식
'💻 개발 > 프레임워크' 카테고리의 다른 글
- Total
- Today
- Yesterday