TIL - 21.01.19

1 minute read

JDBC 자동 생성 된 ID를 검색 : KeyHolder

DB에 insert한 데이터의 키값을 가져오는 방법 KeyHolder는 키 검색을위한 인터페이스로, 일반적으로 JDBC 삽입 문에서 반환 될 수있는 자동 생성 키에 사용된다.

@Override
  public User insert(User user) {
    KeyHolder keyHolder = new GeneratedKeyHolder();
    jdbcTemplate.update(conn -> {
      PreparedStatement ps = conn.prepareStatement("INSERT INTO users(seq,email,passwd,login_count,last_login_at,create_at) VALUES (null,?,?,?,?,?)", new String[]{"seq"});
      ps.setString(1, user.getEmail().getAddress());
      ps.setString(2, user.getPassword());
      ps.setInt(3, user.getLoginCount());
      ps.setTimestamp(4, timestampOf(user.getLastLoginAt().orElse(null)));
      ps.setTimestamp(5, timestampOf(user.getCreateAt()));
      return ps;
    }, keyHolder);

    Number key = keyHolder.getKey();
    long generatedSeq = key != null ? key.longValue() : -1;
    return new User.Builder(user)
      .seq(generatedSeq)
      .build();
  }
KeyHolder holder = new GeneratedKeyHolder();

getJdbcTemplate().update(new PreparedStatementCreator() {           

                @Override
                public PreparedStatement createPreparedStatement(Connection connection)
                        throws SQLException {
                    PreparedStatement ps = connection.prepareStatement(sql.toString(),
                        Statement.RETURN_GENERATED_KEYS); 
                    ps.setString(1, person.getUsername());
                    ps.setString(2, person.getPassword());
                    ps.setString(3, person.getEmail());
                    ps.setLong(4, person.getRole().getId());
                    return ps;
                }
            }, holder);

Long newPersonId = holder.getKey().longValue();

응답 본문의 Json Array 값 테스트

MockMvc의 result를 받아서 응답 확인

.perform()에 .andReturn(); 를 추가하고 MvcResult 로 받으면 된다.

MvcResult result = mockMvc.perform(get(url)
        .accept(MediaTypes.HAL_JSON))
        .andDo(print())
    .andExpect(status().isOk())
    .andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaTypes.HAL_JSON_VALUE))
    .andReturn();

String content = result.getResponse().getContentAsString();

JSON Array 형태의 String 값을 ArrayList로 변환

ObjectMapper mapper = new ObjectMapper(); 
List<Student> list = Arrays.asList(mapper.readValue(jsonString, Student[].class));

테스트 코드

@Test
@Order(2)
@DisplayName("회원 목록 요청")
void viewUserList() throws Exception {
    // Given
    String url = "/api/users";

    // When

    // Then
    MvcResult result = mockMvc.perform(get(url)
            .accept(MediaTypes.HAL_JSON))
            .andDo(print())
        .andExpect(status().isOk())
        .andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaTypes.HAL_JSON_VALUE))
        .andReturn();

    String content = result.getResponse().getContentAsString();
    List<UserListDTO> users = Arrays.asList(objectMapper.readValue(content, UserListDTO[].class));
    UserListDTO user = users.get(users.size() - 1);
    assertThat(user.getEmail()).isEqualTo(email);
}

REF

  • https://stackoverflow.com/questions/17037340/converting-jsonarray-to-arraylist