[Spring] SimpleJdbcInsert로 컬럼 지정하기

2025. 2. 4. 13:52Backend/Spring

개요

이번 내배캠에서 과제로 일정 관리 앱을 만들면서 생겼던 트러블에 대해서 이야기를 해보자.

 

 

배경

가장 먼저 데이터를 삽입을 할 때 자동으로 생성시간과 수정 시간에 대해서 자동으로 입력을 해주는 방법에 대해서 찾아보았다.

 

CREATE TABLE schedule (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '스케줄 ID',
    todo VARCHAR(200) NOT NULL COMMENT '할일',
    author VARCHAR(50) NOT NULL COMMENT '작성자',
    password VARCHAR(15) NOT NULL COMMENT '비밀번호',
    createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '생성일',
    updatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일'
);

 

 

DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP

 

위의 쿼리문을 사용을 해서 데이터베이스를 만든다면 자동으로 생성 시간과 수정 시간에 시간을 자동으로 넣어주는 기능이 있다.

 

 

발단

하지만 데이터를 입력을 하면 전부다 값이 Null 값으로 나오는 부분을 확인을 하였다.

{
    "id": 1,
    "todo": "오늘 뭐하려했더라",
    "author": "creator1",
    "createdAt": null,
    "updatedAt": null
}

 

문제 해결

 

검색을 하며 문제를 해결하려고 검색을 하는 도중에 문제점을 찾았다.

@Override
    @Transactional
    public ScheduleResponseDto saveSchedule(Schedule schedule) {
        SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
        jdbcInsert
                .withTableName("schedule")
                .usingGeneratedKeyColumns("id")
                .usingColumns("todo", "authorId");

        Map<String, Object> paramaters = new HashMap<>();
        paramaters.put("todo", schedule.getTodo());
        paramaters.put("authorId", schedule.getAuthorId());

        Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(paramaters));

        Schedule resultSchedule = findScheduleByIdOrElseThrow(key.longValue());

        return new ScheduleResponseDto(resultSchedule);
    }

 

 

해당 문제는 .usingColumns를 사용하여 값을 제한을 주지 않았던 문제였다.

 

.usingColmns를 사용하지 않고 usingGeneratedKeyColumns("id")에서 끝냈다면

 

schedule 테이블에 있는 모든 컬럼에 데이터를 입력을 하도록 한다.

 

그러면 값이 없는 애들은 당연하게도 null 값이 들어가게 된다.

 

 

결말

이번에 과제를 하면서 여유롭게 진행을 하기도 하고

설날과 주말에는 뭔가 열심히 돌아다녔는데, 남는게 없는 시간을 보내고 나니

과제에 시간이 너무 없었다..

 

거의 과제를 2~3일에 몰아서 했더니 이게 코드가 어디서 부터 짠건지 기억도 나질 않는다..

 

야매로 진행을 하긴 했는데, Lv6까지 끝내니까 이게 되네 라는 생각이 먼저 든다..

 

다음부터는 좀 부지런하게 먼저 미리 해놔야겠다.

 

추가적인 진행도 하질 못한게 너무 아쉽다.

 

조금씩 리펙토링을 진행해야지..