인프런 커뮤니티 질문&답변

김동준님의 프로필 이미지

작성한 질문수

스프링 시큐리티 완전 정복 [6.x 개정판]

커스텀 UserDetailService 구현하기

커스텀 UserDetailService 구현하기 중 질문사항이 있습니다!

24.06.18 16:49 작성

·

115

0

항상 퀄리티 높은 강의 감사합니다!

몇가지 궁금한게 있어서 질문드립니다.

  1. @Service어노테이션으로 인해 이미 빈으로 등록되어서

    .userDetailsService(userDetailsService)을 쓰지 않아도 자동으로 등록이 되는걸로 알고있었는데 코드를 쓰는 이유가 있나요?

  2. 왜 @Service 이름을 "userDetailsService"로 하신건지 궁금합니다.

  3. SecurityConfig 에서

     

    private final UserDetailsService userDetailsService; 에서 FormUserDetailsService대신 UserDetailsService을 쓰는 이유가 뭔지 궁금합니다. (그냥 클래스를 그대로 쓰면 안되는건가요?)

     

답변 2

1

인프런 AI 인턴님의 프로필 이미지

2024. 06. 20. 16:51

안녕하세요, 인프런 AI 인턴입니다.

김동준님의 질문에 대해 답변드리겠습니다.

  1. @Service 어노테이션으로 빈이 자동으로 등록된다고 하더라도, .userDetailsService(userDetailsService)를 명시적으로 사용하는 것은, 개발자가 커스텀 UserDetailsService를 통해 사용자 인증 정보를 처리하고 싶을 경우 명확히 스프링 시큐리티 설정에 통합하기 위함입니다. 이렇게 하면 스프링 시큐리티가 기본적으로 제공하는 UserDetailsService 대신, 개발자가 정의한 로직을 따르게 됩니다.

  2. @Service의 이름을 “userDetailsService”로 하는 것은 스프링 시큐리티에서 기본적으로 사용하는 인터페이스 이름과 같게 하여, 개발자 및 동료들이 이 서비스의 역할을 쉽게 이해할 수 있도록 하기 위한 관례입니다. 따라서, 이 이름을 사용함으로써 이 서비스가 UserDetailsService를 구현하고 있음을 명확히 알 수 있습니다.

  3. SecurityConfig에서 UserDetailsService 인터페이스 타입을 사용하는 이유는, 이 타입을 사용함으로써 다형성의 장점을 활용할 수 있기 때문입니다. FormUserDetailsService 같은 구현체 대신 UserDetailsService 인터페이스를 사용함으로써, FormUserDetailsService 외에도 다른 UserDetailsService 구현체를 필요에 따라 쉽게 교체할 수 있습니다. 이는 코드의 유연성과 확장성을 높여주는 방법입니다.

각 질문에 대한 답변이 도움이 되길 바랍니다!

0

정수원님의 프로필 이미지
정수원
지식공유자

2024. 06. 27. 16:38

  • @Service어노테이션으로 인해 이미 빈으로 등록되어서

    .userDetailsService(userDetailsService)을 쓰지 않아도 자동으로 등록이 되는걸로 알고있었는데 코드를 쓰는 이유가 있나요?

네 좀 더 명확하게 설정하기 위함입니다. 그리고 그렇게 하면 코드를 보고 쉽게 이해할 수 있습니다.

 

  • 왜 @Service 이름을 "userDetailsService"로 하신건지 궁금합니다.

네 그건 특별한 이유는 없습니다. 관례적으로 많이 쓰는 이름이기 때문입니다. 이름은 자유롭게 사용해서 됩니다.

 

  • SecurityConfig 에서

     

    private final UserDetailsService userDetailsService; 에서 FormUserDetailsService대신 UserDetailsService을 쓰는 이유가 뭔지 궁금합니다. (그냥 클래스를 그대로 쓰면 안되는건가요?)

     

네 상관없습니다. 다만 구체적인 클래스 타입보다는 인터페이스처럼 추상화된 타입을 사용하것이 좀 더 객체지향적으로 좋은 코드라 보시면 됩니다. 다만 어떤 특정한 상황에서는 구체적인 클래스 타입으로 설정해야 할 때도 있습니다.