[내일배움캠프] #211126 💻 TIL 💻

이수영·2021년 11월 26일
0

MY TIL 

목록 보기
43/50
post-thumbnail

📚 Springboot

✍🏻 mypage

  • 내가 좋아요기능 다음으로 맡았던 기능 !
  • mypage에서 프로필 수정 기능을 구현하며 데이터베이스의 영속성에 대해서 깨달을 수 있었다

📌 영속성

  • user 프로필을 업데이트하는 API
  • usercontroller

⚠ Problem

이 코드에서 userRepository.save(user); 이 아주 중요하다.
처음에 나는 userRepository.save(user); 를 안써서 분명 수정을 하고 업데이트 버튼을 누르고 response를 반환하면 제대로 나오는데 데이터베이스에서 update가 안되는 것이였다.

📖 Solution

  1. findById 같은 것으로 데이터베이스에서 select를 해주어 1차캐시에 올려놓는다음 update를 진행하면 내가 한 방법과 같이 userRepository.save(user)를 쓰지 않아도 된다.
  2. 내가 위에서 한 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

  1. 튜터님께서 원하는 정보만 response 해주기 위해서는 DTO의 방법도 있다고 하셨다.
    DTO로 원하는 정보만 설정해준 후 이것을 반환해주는 것이다.
    rank 기능 구현을 위해서는 username과 user가 쓴 til 갯수가 필요하다
  2. 나는 모든 user를 userlist에 넣어놓고 user마다 til갯수를 세어주었다.
  3. 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();


    }
profile
Hongik Univ 💻

0개의 댓글