# 현재 사용자 가져오기

이전 장에서 (의존성 주입 시스템을 기반으로 한)보안 시스템은 *경로 작동 함수*에서 `str`로 `token`을 제공했습니다:

```Python hl_lines="10"
{!../../../docs_src/security/tutorial001.py!}
```

그러나 아직도 유용하지 않습니다.

현재 사용자를 제공하도록 합시다.

## 유저 모델 생성하기

먼저 Pydantic 유저 모델을 만들어 보겠습니다.

Pydantic을 사용하여 본문을 선언하는 것과 같은 방식으로 다른 곳에서 사용할 수 있습니다.

=== "파이썬 3.7 이상"

    ```Python hl_lines="5  12-16"
    {!> ../../../docs_src/security/tutorial002.py!}
    ```

=== "파이썬 3.10 이상"

    ```Python hl_lines="3  10-14"
    {!> ../../../docs_src/security/tutorial002_py310.py!}
    ```

## `get_current_user` 의존성 생성하기

의존성 `get_current_user`를 만들어 봅시다.

의존성이 하위 의존성을 가질 수 있다는 것을 기억하십니까?

`get_current_user`는 이전에 생성한 것과 동일한 `oauth2_scheme`과 종속성을 갖게 됩니다.

이전에 *경로 동작*에서 직접 수행했던 것과 동일하게 새 종속성 `get_current_user`는 하위 종속성 `oauth2_scheme`에서 `str`로 `token`을 수신합니다.

=== "파이썬 3.7 이상"

    ```Python hl_lines="25"
    {!> ../../../docs_src/security/tutorial002.py!}
    ```

=== "파이썬 3.10 이상"

    ```Python hl_lines="23"
    {!> ../../../docs_src/security/tutorial002_py310.py!}
    ```

## 유저 가져오기

`get_current_user`는 토큰을 `str`로 취하고 Pydantic `User` 모델을 반환하는 우리가 만든 (가짜) 유틸리티 함수를 사용합니다.

=== "파이썬 3.7 이상"

    ```Python hl_lines="19-22  26-27"
    {!> ../../../docs_src/security/tutorial002.py!}
    ```

=== "파이썬 3.10 이상"

    ```Python hl_lines="17-20  24-25"
    {!> ../../../docs_src/security/tutorial002_py310.py!}
    ```

## 현재 유저 주입하기

이제 *경로 작동*에서 `get_current_user`와 동일한 `Depends`를 사용할 수 있습니다.

=== "파이썬 3.7 이상"

    ```Python hl_lines="31"
    {!> ../../../docs_src/security/tutorial002.py!}
    ```

=== "파이썬 3.10 이상"

    ```Python hl_lines="29"
    {!> ../../../docs_src/security/tutorial002_py310.py!}
    ```

Pydantic 모델인 `User`로 `current_user`의 타입을 선언하는 것을 알아야 합니다.

이것은 모든 완료 및 타입 검사를 통해 함수 내부에서 우리를 도울 것입니다.

!!! 팁
    요청 본문도 Pydantic 모델로 선언된다는 것을 기억할 것입니다.

    여기서 **FastAPI**는 `Depends`를 사용하고 있기 때문에 혼동되지 않습니다.

!!! 확인
    이 의존성 시스템이 설계된 방식은 모두 `User` 모델을 반환하는 다양한 의존성(다른 "의존적인")을 가질 수 있도록 합니다.

    해당 타입의 데이터를 반환할 수 있는 의존성이 하나만 있는 것으로 제한되지 않습니다.

## 다른 모델

이제 *경로 작동 함수*에서 현재 사용자를 직접 가져올 수 있으며 `Depends`를 사용하여 **의존성 주입** 수준에서 보안 메커니즘을 처리할 수 있습니다.

그리고 보안 요구 사항에 대한 모든 모델 또는 데이터를 사용할 수 있습니다(이 경우 Pydantic 모델 `User`).

그러나 일부 특정 데이터 모델, 클래스 또는 타입을 사용하도록 제한되지 않습니다.

모델에 `id`와 `email`이 있고 `username`이 없길 원하십니까? 맞습니다. 이들은 동일한 도구를 사용할 수 있습니다.

`str`만 갖고 싶습니까? 아니면 그냥 `dict`를 갖고 싶습니까? 아니면 데이터베이스 클래스 모델 인스턴스를 직접 갖고 싶습니까? 그들은 모두 같은 방식으로 작동합니다.

실제로 애플리케이션에 로그인하는 사용자가 없지만 액세스 토큰만 있는 로봇, 봇 또는 기타 시스템이 있습니까? 다시 말하지만 모두 동일하게 작동합니다.

애플리케이션에 필요한 모든 종류의 모델, 모든 종류의 클래스, 모든 종류의 데이터베이스를 사용하십시오. **FastAPI**는 의존성 주입 시스템을 다루었습니다.

## 코드 사이즈

이 예는 장황해 보일 수 있습니다. 동일한 파일에서 보안, 데이터 모델, 유틸리티 기능 및 *경로 작동*을 혼합하고 있음을 염두에 두십시오.

그러나 이게 키포인트입니다.

보안과 종속성 주입 항목을 한 번만 작성하면 됩니다.

그리고 원하는 만큼 복잡하게 만들 수 있습니다. 그래도 유연성과 함께 한 곳에 한 번에 작성할 수 있습니다.

그러나 동일한 보안 시스템을 사용하여 수천 개의 엔드포인트(*경로 작동*)를 가질 수 있습니다.

그리고 그들 모두(또는 원하는 부분)는 이러한 의존성 또는 생성한 다른 의존성을 재사용하는 이점을 얻을 수 있습니다.

그리고 이 수천 개의 *경로 작동*은 모두 3줄 정도로 줄일 수 있습니다.

=== "파이썬 3.7 이상"

    ```Python hl_lines="30-32"
    {!> ../../../docs_src/security/tutorial002.py!}
    ```

=== "파이썬 3.10 이상"

    ```Python hl_lines="28-30"
    {!> ../../../docs_src/security/tutorial002_py310.py!}
    ```

## 요약

이제 *경로 작동 함수*에서 현재 사용자를 직접 가져올 수 있습니다.

우리는 이미 이들 사이에 있습니다.

사용자/클라이언트가 실제로 `username`과 `password`를 보내려면 *경로 작동*을 추가하기만 하면 됩니다.

다음 장을 확인해 봅시다.
