본문 바로가기
DataBase/MyBatis

[Spring/Mybatis] auto increment id값 return하기

by 정고정 2021. 10. 30.
반응형

의도

@Mapper클래스인 UserRepository가 UserSaveRequestDto를 받아서 저장하고, 그 결과로 auto increment가 걸린 user_id 값을 리턴받고 싶음

정석 해결방안

메소드에 @Options(useGeneratedKeys = true, keyProperty = "user_id")를 붙여주자

 

@Getter
@Setter
@NoArgsConstructor
public class UserSaveRequestDto{
	private String user_email;
	private String user_name;
    		...
}

 

@Mapper
public interface UserRepository {
	@Insert("insert into ...")
	@Options(useGeneratedKeys = true, keyProperty = "user_id")
	public Long saveUser(UserSaveRequestDto requestDto);
    
    	...
}

 

문제

UserSaveRequestDto는 회원가입을 위해 클라이언트에게 입력받은 객체라 user_id field를 가지고 있지 않다.  

keyProperty에 user_id를 넣어줘봤자 user_id를 찾지 못한다는 에러메세지가 당연히 뜰 수밖에 없음

 

org.apache.ibatis.executor.ExecutorException: No setter found for the keyProperty 'user_id' in 'UserSaveRequestDto'

 

오류 메세지를 보니까 @Options(useGeneratedKeys = true, keyProperty = "user_id") 이렇게 옵션을 붙여주면 mybatis가 dto의 setter를 이용해서 auto increment된 user_id값을 주입해 주는 것 같다. 함수 리턴은 그냥 insert 성공값 1로 들어 가고 id값 필요하면 controller단에서 requestDto.getUserId로 빼와야 함.

해결방안 1

사실 간단하게 생각하면, user table의 필드를 전부 가지고 있는 UserDto 하나만 쓰면 된다. 

JPA의 경우 Entity를 직접 가져다 쓸 수는 없으므로 일일이 모든 요청과 응답에 대한 dto를 만들어 썼지만 MyBatis에서의 User는 Entity가 아니라 DTO나 VO니까 JPA에서의 User Entity처럼 취급할 필요는 없지 않나...?

그냥 생성자 여러개 두고 쓸까..? 더 생각해 볼 문제지만 그래도 지금 구조를 변경하기는 싫어서 패스함.

+) 지금은 연습 겸 짠 건데 정식으로 짜면 JPA 도입할 가능성도 있어서 User 객체는 건드리지 않고 따로 Request/Response Dto 두는 현재 구조대로 가기로 함

해결방안 2

select문을 한 번 더 써서 방금 insert한 row의 id 값을 리턴받는다. 어차피 auto increment니까 가장 마지막에 있는 user_id가 방금 insert한 user의 user_id 값일 거다. 

근데 고작 이런 걸로 쿼리를 한 번 더 날리기는 싫어서 패스함. 1번 방법으로도 처리할 수 있는 걸 굳이 스캔까지 해가면서 가져와야 할 이유는 없는 것 같다. 

최종 결정안

찾아봤는데 쓰라고 제공해주는 기능은 쓰는 게 맞다.

UserRequestDto에 user_id 변수를 추가해줬다. 클라이언트까지 넘어가거나 index로 쓰이는 용도가 아니라 쿼리 결과를 저장하기 위한 변수 느낌... 지금 한 번 정해두면 당분간은 수정할 여지가 없을 거라 User와 UserRequestDto를 잠깐이라도 동일한 구조로 만들기 싫었는데 그건 따로 처리해서 만족함. 대강 내가 이긴 듯.

 

 

마이바티스 만질 일은 없었는데 새롭다. 근데 짜면 짤수록 겉보기가 JPA 닮아감. 

 

내일 읽어볼 거

https://okky.kr/article/338325

반응형

'DataBase > MyBatis' 카테고리의 다른 글

[Mybatis] @Annotation vs XML, 파라미터 다루기  (0) 2021.10.31

댓글