usingColumns() 메서드 생략으로 인한 오류saveSchedule() 메서드를 구현하며 SimpleJdbcInsert 를 사용하던 중에 오류가 발생했습니다.
SimpleJdbcInsert 객체를 생성하고 값을 삽입하는 코드를 작성하였는데 해당 API를 실행하면 Column 'created_at' cannot be null 오류가 발생하였습니다.
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
Map<String, Object> parameters = new HashMap<>();
parameters.put("todo", schedule.getTodo());
parameters.put("pwd", schedule.getPwd());
parameters.put("author_id", schedule.getAuthorId());
return jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
SimpleJdbcInsert는 기본적으로 모든 컬럼에 대해 데이터를 삽입하려고 시도합니다. 따라서 컬럼이 비어 있는 경우 또는 필수 컬럼이 빠져 있을 경우 오류가 발생할 수 있습니다.
created_at과 updated_at 컬럼이 NOT NULL로 선언되어 있고, id는 AUTO_INCREMENT로 자동 생성되므로 이를 INSERT 시 명시적으로 제외해야 합니다.
SimpleJdbcInsert의 usingColumns() 메서드를 활용하면 삽입할 컬럼을 명시적으로 지정할 수 있습니다.
이를 통해 jdbcInsert.usingColumns("todo", "name", "pwd"); 코드를 추가하여 todo, name, pwd 컬럼만 삽입하도록 지정함으로써 오류를 해결할 수 있었습니다.
public Number saveSchedule(Schedule schedule) {
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("schedule").usingGeneratedKeyColumns("id");
// 사용할 컬럼을 명시적으로 설정
jdbcInsert.usingColumns("todo", "pwd", "author_id");
Map<String, Object> parameters = new HashMap<>();
parameters.put("todo", schedule.getTodo());
parameters.put("pwd", schedule.getPwd());
parameters.put("author_id", schedule.getAuthorId());
return jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
}
usingColumns() 메서드를 생략하면 SimpleJdbcInsert가 모든 컬럼에 값을 삽입하려 시도하므로 NOT NULL 제약이 있는 컬럼에 값이 제공되지 않으면 오류가 발생합니다. 따라서 삽입할 컬럼을 명시적으로 지정하여 오류를 방지해야 합니다.
조회 메서드를 구현하는 과정에서 SQL SELECT 문에서 오류가 발생했습니다.
schedule 테이블과 author 테이블을 조인하여 SELECT문을 작성하고 조회 API를 테스트하였더니 author_id 를 찾을 수 없다는 오류가 발생하였습니다.
SELECT s.id, s.todo, a.name, a.id, s.created_at, s.updated_at
FROM schedule s
JOIN author a ON s.author_id = a.id
WHERE s.id = ?
a.id는 author 테이블의 ID이지만, 조회 결과에서는 컬럼명이 단순히 id로 표시됩니다. 따라서 s.id와 a.id가 모두 id라는 동일한 이름으로 조회되면 중복으로 인해 컬럼명 충돌이 발생할 수 있습니다.
scheduleMapper() 에서 rs.getLong("author_id") 로 작성자 id를 가져올 때 author_id라는 컬럼이 존재하지 않으므로 오류가 발생합니다.
a.id AS author_id 와 같이 컬럼에 별칭을 지정하여 RowMapper 에서 정확히 매핑 되도록 하거나 a.id 대신 schedule 테이블의 s.author_id를 사용하여 데이터 매핑 과정에서의 오류를 방지할 수 있습니다.
SELECT s.id, s.todo, a.name, a.id AS author_id, s.created_at, s.updated_at
FROM schedule s
JOIN author a ON s.author_id = a.id
WHERE s.id = ?
정확한 컬럼명 지정을 하여 컬럼명 충돌과 매핑 과정에서 발생한 오류를 해결할 수 있었습니다.