TIL - 21.01.19
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