ABOUT ME

-

  • [ Spring Boot ] DTO 상속받아서 로그인 정보 사용하기
    BackEnd/Spring 2025. 3. 16. 21:16
    반응형

    백에서 요청받은 데이터를 DTO에 담고 DB에 저장시 현재 어떤 사용자가 로그인했는지 알기 위해서 Security에 담겨있는 데이터를 받아와서 처리를 해야하는데 일일이 해당 값을 가져와서 저장하는 과정이 불편하기에

    요청 받는 DTO에서 단순히 상속 받으면 자동으로 요청시에 해당 DTO에도 로그인 정보가 담기도록 구현

     


    UserDTO

    @Getter
    @Setter
    @AllArgsConstructor
    public class UserDTO {
        private Long id;
        private String email;
        private String username;
        private Set<com.blend.enums.Role> roles;
    
        public UserDTO() {
            Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    
            if (principal instanceof CustomUserDetails) {
                CustomUserDetails customUserDetails = (CustomUserDetails) principal;
    
                // customUserDetails.getUser()가 null이 아닌지 확인
                if (customUserDetails.getUser() != null) {
                    this.username = customUserDetails.getUser().getUsername();
                    this.id = customUserDetails.getUser().getId();
                    this.roles = customUserDetails.getUser().getRoles();
                    this.email = customUserDetails.getUser().getEmail();
                }
            }
        }
    }

     

    우선 상속을 시킬 DTO를 생성하고

    기본 생성자에서 이후 Security를 만들면서 생성하게된 CustomUserDetails  로그인 한 유저의 정보를 가져온다.

     

    이후 각각의 필드 값에 데이터를 넣어준다.

     

    생성자에서 현재 로그인한 유저의 정보를 가져와서 값을 넣어주므로

    해당 DTO가 다른 DTO에서 상속받을 때 생성자가 생성되면서 알아서 현재 로그인한 유저의 정보를 담아서 가져와준다.


    Useage

     

    이런식으로 요청 DTO에서 UserDTO를 상속받은 후

    @Getter
    @AllArgsConstructor
    @NoArgsConstructor
    public class CreateRequestDTO extends UserDTO {
        private List<String> list;
        private String text;
        private List<String> list2;
    }

     

    controller에서 값을 받으면

        public ResponseEntity<ResponseResultDTO> create(@RequestBody CreateRequestDTO requestDTO) {
            System.out.println(requestDTO.toString());
            System.out.println(requestDTO.getEmail());
            return null;
        }

     

    프론트에서 백으로 요청시에 알아서 UserDTO에도 값이 생기며 요청 DTO에도 해당 UserDTO값도 상속하여 사용할 수 있다.

     

    [ 출력 결과 ]

    CreateRequestDTO(list=[], text=test, list2=[])
    test
    728x90
    반응형