package com.sparta.bloglogin.dto;

import com.sparta.bloglogin.entity.User;
import lombok.Getter;

import java.util.Comparator;
import java.util.List;

@Getter
public class ProfileResponseDto {
    private String username;
    // private String password;
    private String realname;
    private String introduction;
    private List<ProfilePostListResponseDto> posts;

    public ProfileResponseDto(User user) {
        this.username = user.getUsername();
        this.realname = user.getRealname();
        this.introduction = user.getIntroduction();
        this.posts = user.getPostList().stream().map(ProfilePostListResponseDto::new).sorted(Comparator.comparing(ProfilePostListResponseDto::getCreatedAt).reversed()).toList();
    }
}

유저 프로필에서 작성한 글 목록을 볼 수 있게 posts를 추가했더니 다음과 같은 오류가 발생했다.

 

방법 1. getMyPage에 @Transactional 걸어주기  ➡️  실패

 

방법 2. postList의 FetchType을 EAGER로 설정하기  ➡️  해결

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
    private List<Post> postList;

 

프로필에서 작성글 목록 불러오기 성공!

@RestController
@RequestMapping("/dev")
@RequiredArgsConstructor
public class ProfileController {

    private final UserService userService;

    // 프로필 조회
    @GetMapping("/my-page")
    public ProfileResponseDto getMyPage(@AuthenticationPrincipal UserDetailsImpl userDetails) {
        return userService.getMyPage(userDetails.getUser());
    }

    // 프로필 수정
    @PutMapping("/profile")
    public ProfileResponseDto updateProfile(@AuthenticationPrincipal UserDetailsImpl userDetails, @RequestBody ProfileRequestDto profileRequestDto) {
        return userService.updateProfile(userDetails.getUser(), profileRequestDto);
    }

    // 비밀번호 변경
    @PutMapping("/profile/password")
    public ResponseEntity<ApiResponseDto> updatePassword(@AuthenticationPrincipal UserDetailsImpl userDetails, @RequestBody PasswordRequestDto passwordRequestDto) {
        try {
            userService.updatePassword(userDetails, passwordRequestDto);
            return ResponseEntity.ok().body(new ApiResponseDto("비밀번호 변경 성공", HttpStatus.OK.value()));
        } catch (RejectedExecutionException e) {
            return ResponseEntity.badRequest().body(new ApiResponseDto("비밀번호가 일치하지 않습니다.", HttpStatus.BAD_REQUEST.value()));
        }
    }

}

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;

    public void signup(SignupRequestDto requestDto) {
        String username = requestDto.getUsername();
        String password = passwordEncoder.encode(requestDto.getPassword());
        String realname = requestDto.getRealname();
        String introduction = requestDto.getIntroduction();
        UserRoleEnum role = UserRoleEnum.USER;

        // 회원 중복 확인
        if (userRepository.findByUsername(username).isPresent()) {
            throw new IllegalArgumentException("중복된 사용자가 존재합니다.");
        }

        // 사용자 등록
        User user = new User(username, password, realname, introduction, role);
        userRepository.save(user);
    }


    // 프로필 조회
    public ProfileResponseDto getMyPage(User user) {
        return new ProfileResponseDto(user);
    }

    // 프로필 수정
    @Transactional
    public ProfileResponseDto updateProfile(User user, ProfileRequestDto profileRequestDto) {
        user.setRealname(profileRequestDto.getRealname());
        user.setIntroduction(profileRequestDto.getIntroduction());
        userRepository.save(user);
        return new ProfileResponseDto(user);
    }

    // 비밀번호 변경
    @Transactional
    public void updatePassword(UserDetailsImpl userDetails, PasswordRequestDto passwordRequestDto) {
        User user = userDetails.getUser();

        if(!passwordEncoder.matches(passwordRequestDto.getPassword(), userDetails.getPassword())) {
            throw new RejectedExecutionException();
        }
        user.setPassword(passwordRequestDto.getNewpassword());
        userRepository.save(user);
    }
}

 

오늘의 삽질

ResponseDto에 @Getter 붙이는 걸 잊지 말자..!

@RequestBody는 여러 개 보낼 수 없다.

레포지토리에 save하는 걸 잊지 말자

 

 

+ Recent posts