1. 개요
JPA에서 벗어나 MyBatis를 사용하던 도중 만났던 사소한(?) 시행 착오를 설명해보고자 합니다.
2. 테스트 코드
간단한 테스트 코드를 작성해보았습니다.
@Test
void 메모를_작성하고_확인한다() {
// given: 테스트에 필요한 데이터와 객체를 준비
String info = "메모를 테스트 합니다";
int page = 1;
String uid = "user123"; // 예제에 uid가 누락되어 추가
MemoCreateRequest createRequest = new MemoCreateRequest(uid, info);
// when: 실제 작업을 수행
Long memoId = memoService.createMemo(createRequest);
System.out.println("생성된 메모 ID: " + memoId);
// then: 결과를 검증
Memo findMemo = memoMapper.findMemoById(memoId).orElseThrow(
() -> new IllegalArgumentException("메모를 찾을 수 없습니다.")
);
List<Memo> memos = memoMapper.findAll(uid, page);
assertThat(findMemo.getInfo()).isEqualTo(info);
assertThat(memos).hasSize(1);
memos.forEach(memo -> System.out.println("메모 내용: " + memo.getInfo()));
}
Java
복사
문제가 생겼던 부분은 memoService.createMemo() 를 했음에도 불구하고 반환되는 id 값에 null이 주입되는 것이었습니다.
2. 해결
public Long createMemo(MemoCreateRequest request) {
// 요청받은 데이터로 메모 객체 생성
Memo memo = Memo.of(request.getUid(), request.getMemoInfo());
// 메모를 데이터베이스에 저장
memoMapper.insert(memo);
// 데이터베이스에 저장되면서 자동으로 할당된 ID 반환
return memo.getId();
}
Java
복사
MyBatis에서는 memoMapper를 통해 데이터를 저장하는 순간 Memo 객체에 id가 주입됩니다.
쉽게 말해서 원래는 비워져 있었지만 insert(혹은 save) 하는 순간에 해당 값이 객체로 들어오게 됩니다.