[Spring] UserDetails 정보 불러오기 - 게시글에 닉네임 넣기

이신영·2024년 4월 13일
0

S0S

목록 보기
7/8
post-thumbnail

로그인 시 User객체로 반환되는 정보들은 username, password, authorities였다. 여기서 username과 별개로 nickname을 추가하기위해서 User객체를 커스텀해야한다.

@Getter
public class CustomUser extends User {

    private final String nickname;

    public CustomUser(String username, String password, List<GrantedAuthority> authorities, String nickname){
        super(username, password, authorities);
        this.nickname = nickname;
    }

}

그 후 회원가입에 쓰이는 loadUserByUsername을 수정

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        ...

        return new CustomUser(member.getUsername(), member.getPassword(), authorities, member.getNickname());
    }

닉네임 넣어주기(1안)

서비스 수정

    @Override
    @Transactional
    public void uploadProduct(ProductDTO productDTO, MultipartFile[] imageFiles) {
        
        ...
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        // 현재 사용자의 닉네임 가져오기
        String writerName = ((CustomUser) authentication.getPrincipal()).getNickname();


        // ProductDTO로부터 상품 정보를 추출하여 Product 엔티티를 생성
        Product product = Product.builder()
				...                
                .writerName(writerName)               
				...
        
        // 상품을 저장
        productRepository.save(product);
    }

흠.. 근데 좀 번거로운거같은데.. 라는 생각이 든다.

그래서 방법을 찾아보니까 Post요청시에 @AuthenticationPrincipal 이라는 어노테이션을 사용한다면 해결할수있었다.

참고

닉네임 넣어주기(2안)

@AuthenticationPrincipal은 세션정보 UserDetails에 접근할 수 있어는데 위의 1안과 동일하게 SecurityContextHolder에서 principal를 가져오는 어노테이션이다.

컨트롤러 수정

    @PostMapping("/upload")
    public String uploadProduct(@Valid @ModelAttribute("productDTO") ProductDTO productDTO,
                                @RequestParam("imageFiles") MultipartFile[] imageFiles,
                                BindingResult bindingResult,
                                @AuthenticationPrincipal CustomUser customUser
    ) {
        if (bindingResult.hasErrors()) {
            return "product/uploadForm";
        }

        // 이미지 파일들과 함께 상품 정보를 서비스로 전달하여 상품을 업로드
        productService.uploadProduct(productDTO, customUser.getNickname(), imageFiles);

        return "redirect:/product/list";
    }

서비스 수정

    @Override
    @Transactional
    public void uploadProduct(ProductDTO productDTO, String nickname, MultipartFile[] imageFiles) {
		
        ...
        // ProductDTO로부터 상품 정보를 추출하여 Product 엔티티를 생성
        Product product = Product.builder()
                .productName(productDTO.getProductName())
                .category(productDTO.getCategory())
                .writerName(nickname)
			...
        // 상품을 저장
        productRepository.save(product);
    }

테스트


이제 찜기능 구현하면 될거같은데 이거 구현하고 뷰좀 다듬고 서버배포하면 끝날듯?

profile
후회하지 않는 사람이 되자 🔥

0개의 댓글