[TIL-CH3] 일정 관리 과제 트러블슈팅

김유란·2025년 2월 3일

CH 3 일정 관리 과제 트러블슈팅🚨


1️⃣ 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_atupdated_at 컬럼이 NOT NULL로 선언되어 있고, idAUTO_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 제약이 있는 컬럼에 값이 제공되지 않으면 오류가 발생합니다. 따라서 삽입할 컬럼을 명시적으로 지정하여 오류를 방지해야 합니다.



2️⃣ 컬럼명 충돌 오류

💡 배경

조회 메서드를 구현하는 과정에서 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.idauthor 테이블의 ID이지만, 조회 결과에서는 컬럼명이 단순히 id로 표시됩니다. 따라서 s.ida.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 = ?

📌 결말

정확한 컬럼명 지정을 하여 컬럼명 충돌과 매핑 과정에서 발생한 오류를 해결할 수 있었습니다.

0개의 댓글