[내일배움캠프] #211126 💻 TIL 💻
📚 Springboot
✍🏻 mypage
- 내가 좋아요기능 다음으로 맡았던 기능 !
- mypage에서 프로필 수정 기능을 구현하며 데이터베이스의 영속성에 대해서 깨달을 수 있었다
📌 영속성
- user 프로필을 업데이트하는 API
- usercontroller
⚠ Problem
이 코드에서 userRepository.save(user); 이 아주 중요하다.
처음에 나는 userRepository.save(user); 를 안써서 분명 수정을 하고 업데이트 버튼을 누르고 response를 반환하면 제대로 나오는데 데이터베이스에서 update가 안되는 것이였다.
📖 Solution
- findById 같은 것으로 데이터베이스에서 select를 해주어 1차캐시에 올려놓는다음 update를 진행하면 내가 한 방법과 같이 userRepository.save(user)를 쓰지 않아도 된다.
- 내가 위에서 한 save 방법. 나는 save를 하면 새로운 개체가 하나 더 생성돼서 저장될 줄 알았는데 이것은 아니였고 똑같은 아이디를 찾아 그냥 수정되는 것이였다.
💻 Source Code
@PutMapping("/user/update")
public void updateUser(@AuthenticationPrincipal UserDetailsImpl userDetails, @RequestBody UserUpdateDto userUpdateDto) throws SQLException{
User user = (User) userDetails.getUser();
userService.updateUser(user, userUpdateDto);
}
- userservice
@Transactional
public User updateUser(User user , UserUpdateDto userUpdateDto)throws SQLException {
user.updateUser(userUpdateDto);
userRepository.save(user);
return user;
}
✍🏻 rank 기능
TIL을 많이 쓴 순서대로 메인페이지에서 보여주는 기능이다,
⚠ Problem
- user 별로 til 개수를 세어야 하는데 이미 user개체에 til 과 연관이 있으므로 이것을 이용해주어야한다고 생각했다. user 하나는 여러 개의 til을 쓸 수 있으므로 일대다 관계이므로 Til을 list로 선언해주었다
@JsonIgnore
@OneToMany(mappedBy = "user")
private List<Til> til_list;
📖 Solution
- 튜터님께서 원하는 정보만 response 해주기 위해서는 DTO의 방법도 있다고 하셨다.
DTO로 원하는 정보만 설정해준 후 이것을 반환해주는 것이다.
rank 기능 구현을 위해서는 username과 user가 쓴 til 갯수가 필요하다 - 나는 모든 user를 userlist에 넣어놓고 user마다 til갯수를 세어주었다.
- UserTilCountDto에 username과 til_count를 setting 해주고 모든 user의 UserTilCountDto를 리스트에 담아 return 해준다.
💻 Source Code
- userservice
public List<UserTilCountDto> getAllUser(){
List<User> user_list= userRepository.findAll(); // 모든 user 를 리스트에 담음
int til_count;
List<UserTilCountDto> CountTilList=new ArrayList<>();
for(User user : user_list) { //모든 user 조회
// user의 til갯수 가져오기
String username=user.getUsername();
til_count=TilCount(user);
UserTilCountDto userTilCountDto=new UserTilCountDto();
userTilCountDto.setTil_count(til_count);
userTilCountDto.setUsername(username);
CountTilList.add(userTilCountDto);
}
return CountTilList;
}
public int TilCount(User user){
List<Til> user_tils=user.getTil_list();// 모든 user 를 리스트에 담음
return user_tils.size();
}
Author And Source
이 문제에 관하여([내일배움캠프] #211126 💻 TIL 💻), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dltndudvlzm/내일배움캠프-211122-TIL저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)