작성자 없음
작성자 정보가 삭제된 글입니다.
작성
·
192
0
<UserDaoService>
public User updateByName(int id, String name){
User user = findOne(id);
user.setName(name);
user.setJoinDate(new Date());
return user;
}
이렇게 명시하였고
<UserController>
@PutMapping(path = "/users/{id}/{name}")
public void updateUser(@PathVariable int id, @PathVariable String name){
User user =service.updateByName(id, name);
if(user==null){
throw new UserNotFoundException(String.format("ID[%s] not found", id));
}
}
이렇게 받아서 처리하는 방식을 사용하였고 정상적으로
이름이 바뀌는 것을 확인했습니다. 혹시 이 코드 말고
좀 더 괜찮은 코드로 리팩토링하거나 그럴 수 있을까요?!
힌트만 주셔도... 좋습니다!!
항상 감사하고 수업 정말 잘 듣고 있습니다.
답변 3
1
변경될 대상을 찾는 id는 url상에 노출되어도 괜찮다고해도 이름은 url에 노출 시키기보다는 create처럼 body에 태우는게 좋지 않을까요?! 회원정보 수정하는데 떡하니 "홍길동" 이런 정보가 url에 노출되는 것은 유쾌한 상황은 아닌 것같아서욥. 조심스레..의견을 내봅니다.
1
안녕하세요, 이도원입니다.
updateByName() 메소드에서 NullPointerException 처리를 하시는 것도 가능하지만, NullPointerException 발생한 원인은 findOne()에서 데이터를 찾지 못했기 때문이기 때문에, UserNotFoundException으로 처리해 주시는 것이 좋을 것 같습니다.
추가로, JpaRepository를 사용하시는 경우라면, 다음과 같이 사용해 보실 수도 있습니다.
Optional<User> userOptional = userRepository.findById(id);
if (!userOptional.isPresent()) {
throw new UserNotFoundException("id-" + id);
}
findById() 메소드의 반환 값이 null 인 경우를 판단해서 UserNotFoundException을 던지거나, 빈 User 객체를 생성하여 반환해서 처리해 보실 수도 있을 것 같습니다.
감사합니다.
0
지금 코드내용만 보고 말씀드리면,
updateByName() 메서드에서
findOne() 메서드를 호출하였는데, 유저를 찾지 못해 null 이 반환되었다면
user.setName() 은 null.setName() 과 같은 말이 되겠지요? 이렇게 되면 NullPointerException이 납니다.
리포지터리에서 user가 null일때의 처리를 추가하시거나,
컨트롤러에서 updateByName()를 호출하기전에 user가 존재하는지 체크하는 부분을 추가하는게 나을것 같습니다.
먼저 좋은 지적해주셔서 정말 감사합니다 ㅜㅜ 코드를 잘못된 값을 넣어서 일부러 NULL 값을 집어 넣으니 405 NOT ALLOWED 에러?가 발생하더라구요! 그래서 제가 의도한대로 NOT FOUND 에러처리가 되지 않아서 이렇게 수정은 해봤는데 정답일지 모르겠습니다.
service에 있는 코드를 try catch 문으로 고쳐봤습니다. 제가 findOne()을 수정했고 만약 잘못된 값이 들어올경우 제가 의도한 Wrong ID가 출력되는 것도 확인했습니다. 혹시 잘 고친게 맞을까요!
물론 여기서 걱정되는건 리턴을 위해 try문 밖에 User를 선언해서 잘못된 값이 들어가고 NullpointException이 아닌 에러가 발생을 하게되면 user가 그대로 반환되는 것입니다만... Not Found와 nullpointException을 제어하는거니까 혹시 문제가 없을까...해서 고미하다가 올려봅니다!
혹시 예측하지 못한 오류때문에 걱정이 되시면 NullPointerException 을 Exception 으로 잡아버리는것도 방법입니다. 어차피 유저정보를 조회하지 못했다면 그 이후의 프로세스가 중단되어야 하니까요. 제 생각엔 지금 하신것처럼 서비스에서 예외에 대한 처리를 해주시는게 괜찮은 방법인것 같습니다.
위와 같이 put을 따라해보고 200 OK 나왔지만 웹브라우저상에는 이름이 안바뀌는데 왜 그럴까요?
postman에서도 get으로 조회를 해 보면 바뀌지 않습니다