Schedule 테이블과 User 테이블을 연결할 때, User 테이블의 CRUD도 다 따로 만들어야 하는지 몰라서 조금 헤멨다. Schedule을 생성할 때 User까지 바로 생성되는 것으로 생각했다가 그렇게 된다면 Schedule 테이블과 User 테이블 모두에 email과 password 필드가 필요할 것 같았다. 튜터님께 여쭤보고나서 User 테이블이 존재하면 역시 CRUD가 필요하다는 것을 알게 되었다.
updateSchedule()과 마찬가지로 updateUser()도 다음과 같이 StringBuilder를 사용해 동적으로 UPDATE 쿼리를 생성했다. 또한 params 리스트에 SQL의 바인딩 값을 저장했다. 여러 조건이 추가될 수 있기 때문에 firstField 플래그를 사용하여 첫 번째 필드인지 여부를 확인했다.
StringBuilder query = new StringBuilder("UPDATE users SET");
List<Object> params = new ArrayList<>();
boolean firstField = true;
다음과 같이 각각의 필드가 존재할 경우를 모두 처리할 수 있다.
if (user.getName() != null) {
query.append(" name = ?");
params.add(user.getName());
firstField = false;
}
if (user.getEmail() != null) {
if (!firstField) query.append(",");
query.append(" email = ?");
params.add(user.getEmail());
}
if (user.getPassword() != null) {
if (!firstField) query.append(",");
query.append(" password = ?");
params.add(user.getPassword());
}
마지막에는 업데이트할 값이 없으면 예외가 발생하도록 한다.
if (params.size() == 1) {
throw new IllegalArgumentException("업데이트할 필드가 없습니다.");
}
그리고 이렇게 동적으로 생성된 쿼리를 실행한다.
return jdbcTemplate.update(query.toString(), params.toArray());
설 연휴동안 도전 과제를 모두 끝내고 싶었지만 생각대로 되지 않았다.😞 주말에 모두 끝내봐야할 것 같다.