인프런 커뮤니티 질문&답변

오스즈님의 프로필 이미지

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

언체크 예외 활용

JdbcTemplate update 사용시 반환값 질문

해결된 질문

작성

·

158

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오) 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예

[질문 내용]
여기에 질문 내용을 남겨주세요.

안녕하세요. 수업에 배운 내용을 바탕으로 작은 메모 어플을 만들면서 질문이 있어 질문 남깁니다.

@Repository
public class JdbcMemoRepository implements MemoRepository{

    private final JdbcTemplate template;

    public JdbcMemoRepository(DataSource dataSource) {
        this.template = new JdbcTemplate(dataSource);
    }

    @Override
    public Memo memoSave(Memo memo) {
        String sql = "insert into memo (memo, created, dTime) values (?, ?, ?)";
        template.update(sql, memo.getMemo(), LocalDateTime.now(), memo.getDTime());
        return memo;
    }

이런식으로 코드를 짜서 memoSave의 반환값을 확인해 보면 반환값이 memo와 dTime 필드에만 있고, created와 id는 null값으로 반환이 됩니다. 이유는 클라이언트쪽에서 requestBody로 건내주는 필드가 memo와 dTime뿐이고, created는 서버에서 LocalDateTime.now()로, id는 mysql에서 auto increment로 생성하고 있어서 parameter로 받는 memo를 그대로 반환하면 id와 created가 null이 되는 것 같습니다. 이 문제를 해결 하기 위해서는 memoSave로 데이터베이스에 넣어준 후 바로 그 레코드 값을 데이터베이스에서 꺼내서 반환을 해야 할 것 같은데 방법을 모르겠어서 질문드립니다.

답변 1

2

안녕하세요. 오스즈님, 공식 서포터즈 OMG입니다.

KeyHolder를 사용해서 아래와 같이 key값과 INSERT 결과를 받아올 수 있습니다.

확인해보시겠어요?

    public Memo memoSave(Memo memo) {
        String sql = "insert into memo (memo, created, dTime) values (?, ?, ?)";
        KeyHolder keyHolder = new GeneratedKeyHolder();
        template.update(connection -> {
            PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"});
            ps.setString(1, memo.getMemo());
            ps.setTimestamp(2, Timestamp.valueOf(LocalDateTime.now()));
            ps.setTimestamp(3, Timestamp.valueOf(memo.getDTime()));
            return ps;
        }, keyHolder);

        Long generatedId = keyHolder.getKey().longValue();
        memo.setId(generatedId);
        memo.setCreated(LocalDateTime.now());

        return memo;
    }
}

 해결이 안될 경우 테이블 create DDL문도 올려주세요.

 

감사합니다.