Spring Data JDBC 수업을 위한 인메모리(In-memory) DB인 H2와 인텔리제이를 연결하는 중 오류가 발생했다.
오류가 발생한 부분은 연결의 마지막 부분인 메세지를 요청한 후 데이터베이스에 저장되었는지 확인만 하면 되는 부분이었지만 예상밖의 오류가 발생했다.
오류 발생까지의 연동 방식은 이러했다.
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
runtimeOnly 'com.h2database:h2'
먼저 저 오류의 의미는 식별자로 저장된 후에는 null값이 나오면 안된다 라는 의미이다.
그렇다면 Primary key를 지정할때 실수를 했을까, SQL에서 오타가 있었나 싶어 확인해보았다.
# .sql
CREATE TABLE IF NOT EXISTS MESSAGE (
message_id bigint NOT NULL AUTO_INCREMENT,
message varchar(100) NOT NULL,
PRIMARY KEY (message_id)
);
.sql 파일에서는 잘못된걸 발견할 수 없었다.
id를 Primary key로 하기 위해 값을 입력하지 않아도 자동으로 값을 포함시켜주는 AUTO_INCREMENT도 잘 적었다.
그래서 더 알아보았더니 알게된게 있었다.
// MessageRepository.Interface
public interface MessageRepository extends CrudRepository<Message, Long> {
}
CrudRepository.Interface는 Spring에서 지원해주는 인터페이스이다.
MessegeService.class에서 DI를 통해 MessageRepository.Interface를 주입받아 사용할 때 save()
메서드를 사용했다.
public Message createMessage(Message message) {
return messageRepository.save(message);
}
save()
사용시 컬럼을 명시하지 않으면 null값으로 덮어쓰는 현상이 발생한다이 사실을 앎과 동시에 Message.class 파일을 바로 열어보았더니..
// Message.class
public class Message {
private long messageId;
private String message;
}
.............
잠시 할 말을 잃고 쳐다보다가 천천히 어노테이션을 추가해 주었다.
import org.springframework.data.annotation.Id;
public class Message {
@Id
private long messageId;
private String message;
}
오류가 언제 있었냐는듯이 해결되었다!
내 말도 안되는 실수 덕분에 오늘도 지식이 상승한다!!😂