반응형
    
    
    
  유저의 프로필 화면에 유저가 등록한 이미지들을 보이게 할거다.
Userservice
-userProfile 메소드는 해당페이지 유저의 사진을 반환한다.
- findById로 매개변수로 넘어온 유저아이디로 유저를 찾는다. 
  만약 유저정보가 없다면 orElseThrow로 예외를 발동하고,  CustomException을 throw한다. 
@RequiredArgsConstructor
@Service
public class UserService {
    private final UserRepository userRepository;
    private final BCryptPasswordEncoder bCryptPasswordEncoder;
    @Transactional(readOnly = true)
    public UserProfileDto userProfile(int pageUserId, int principalId){
        UserProfileDto dto = new UserProfileDto();
        //SELECT * FROM image WHERE USERiD = :userId;
        User userEntity = userRepository.findById(pageUserId).orElseThrow(() -> {
            throw new CustomException("해당 프로필 페이지는 없는 페이지입니다.");
        }); 
        dto.setUser(userEntity);
        //pageUserId 와 principalId가 같은지 비교
        dto.setPageOwnerState(pageUserId == pageUserId);
        dto.setImageCount(userEntity.getImages().size());
        return dto;
    }
  ...
}
CustomException
- 에러 메시지만 받도록 한다. 
public class CustomException extends RuntimeException{
    private static final long serialVersionUID = 1L;
    public CustomException(String message){
        super(message);
    }
}
ControllerExceptionHandler
@RestController
@ControllerAdvice //모든 Exception들을 낚아챔
public class ControllerExceptionHandler {
...
    @ExceptionHandler(CustomException.class) //CustomValidationException 발동하는 모든 Exception을 이 함수가 가로챔
    public String exception(CustomException e){
       return  Script.back(e.getMessage());
    }
...
}
UserController
- user/profile 로 유저 정보 뿐만 아니라 유저와 연관된 이미지, 팔로우 정보도 가져가야 한다. 
- 그래서 user셀렉 할때 이미지 정보 등을 가져오게 해야하고, 이는 양방향 매핑으로 구현 가능하다.
@RequiredArgsConstructor
@Controller
public class UserController {
    private final UserService userService;
    @GetMapping({"/user/{pageUserId}"})
    public String profile(@PathVariable int pageUserId, Model model,
                          @AuthenticationPrincipal PrincipalDetails principalDetails){
        UserProfileDto dto = userService.userProfile(pageUserId, principalDetails.getUser().getId());
        model.addAttribute("dto", dto);
        return "user/profile";
    }
......
}
User
- mappedyBy: 
1. 나는 연관관계의 주인이 아니다. 그러므로 테이블에 컬럼을 만들지마 
2. User를 select할때 해당 유저 Id로 등록된 image들을 다 가져와 
- OneToMany에서는 FetchType.LAZY이 기본 옵션 
 1. Lazy = User를 SELECT할때 해당 유저 ID로 등록된 image들을 가져오지마
   대신 getImages()함수의 image들이호출될때 가져와! 
 2. Eager = User를 SELECT할때 해당 유저 ID로 등록된 image들을 전부 Join해서 가져와!
@Builder
@AllArgsConstructor
@NoArgsConstructor  //Bean생성자
@Data
@Entity //DB에 테이블 생성
public class User {
    ...
 
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    @JsonIgnoreProperties({"user"}) //Image내부에 있는 user를 무시하고 파싱한다.
    private List<Image> images;
  ...
}'Study > SpringBoot' 카테고리의 다른 글
| [Springboot] 팔로우(언팔로우)기능 - 2 팔로우 언팔로우 기능 구현 (0) | 2022.05.24 | 
|---|---|
| [Springboot] 팔로우(언팔로우)기능 - 1 팔로우상태 및 팔로우수 구하기 (0) | 2022.05.23 | 
| [Springboot] 이미지 업로드 - 1 이미지 저장(로컬 및 DB) (0) | 2022.05.21 | 
| [Springboot] user follow 설정 (0) | 2022.05.20 | 
| [Springboot] 회원정보 수정1 - 로그인한 유저 정보 보이기 (0) | 2022.05.18 |