-
카테고리
-
세부 분야
백엔드
-
해결 여부
해결됨
Principal 인터페이스와 User 클래스의 관계
23.03.08 14:28 작성 23.03.08 14:29 수정 조회수 470
0
안녕하세요. 강의를 듣던 중 해결되지 않는 의문이 생겨 질문드립니다.
강의에서 Principal
은 인터페이스이며 UserDetailsService
에서 반환한 User
클래스가 구현체로 사용된다고 말씀해주셨는데 여기서 의문이 생겼습니다.
확인해보니 Principal
은 User
클래스의 인터페이스가 아닌 Authentication
의 구현체로 사용되는 UsernamePasswordAuthenticationToken
의 최상위 인터페이스였습니다.
하지만 Authentication에서 User
객체를 받아오는 메서드의 이름도 getPrincipal()
입니다. 그렇다면, 위 그림에서 나타난 Principal
인터페이스와 User
객체를 반환하는 getPrincipal()
의 principal
은 서로 다른 의미로 쓰이는 건가요?
디버깅을 해봐도 아래와 같이 Principal
인터페이스를 구현하는 XxxAuthenticaionToken
객체가 Authentication
타입으로 받아지고 User
객체는 그냥 Object
타입으로 받아져서 혼동이 되어 질문드립니다.
답변을 작성해보세요.
0
백기선
지식공유자2023.05.17
어.. 이 부분은 제가 잘못 설명드린거 같네요. Principal은 User의 인터페이스가 아니고 말씀하신 구조가 맞습니다.
Authentication에서 정의한 getPrincipal()에서의 Principal이 그려주신 Principal 인터페이스였다면, 굳이 Object 타입으로 리턴할 필요는 없었겠죠.
제가 설계한게 아니라서 확신은 없지만, 제 생각엔 getPrincipal()이 리턴하는 객체를 사용자가 직접 정의한 임의의 클래스 타입이라고 가정한 것 같습니다. 가령, User를 확장해서 만든 커스텀 타입이요. 그런 타입이 Principal이라는 인터페이스를 구현할 필요까지는 없고, 또 강제하고 싶지 않았을 것 같아요. (스프링은 비침투성을 추구하니까요.) 아마도 그래서 그런 혼란스런움 점이 생긴것 같습니다. 어디까지나 추측이지만요.
답변 1