# 로그인/로그아웃

SDK를 사용하려면 사용자 로그인이 필요합니다. 앱의 로그인 플로우에 맞춰 SDK 로그인도 함께 처리합니다.

## 로그인

### 기본 로그인

```typescript
import { AdchainSdk } from '@1selfworld/adchain-sdk-core-react-native';

await AdchainSdk.login({
  userId: 'user123',
  gender: 'MALE',
  birthYear: 1990,
});
```

### userId는 뭘 써야 하나요?

앱에서 사용자를 식별하는 ID를 그대로 쓰시면 됩니다. 이메일, 전화번호, UUID, 숫자 ID 뭐든 상관없습니다. 단, 다음 조건을 지켜주세요:

* **고유해야 함**: 같은 사용자는 항상 같은 ID
* **변하지 않음**: 사용자가 앱을 삭제하고 다시 설치해도 같은 ID
* **개인정보 아님**: 가능하면 이메일이나 전화번호보다는 해시된 ID가 좋습니다

### 성별과 출생연도는 왜 필요한가요?

선택사항이지만, 제공하면 광고 타겟팅 정확도가 향상되어 매출에 도움이 됩니다. 예를 들어:

* 20대 남성에게는 게임 광고
* 30대 여성에게는 쇼핑 광고

다음과 같이 적합한 광고를 표시할 수 있습니다. 사용자에게는 관심 있는 광고가 표시되고, 광고주에게는 높은 전환율을 제공합니다.

### 성별 옵션

`gender` 필드에는 다음 값을 사용할 수 있습니다:

* `'MALE'` — 남성
* `'FEMALE'` — 여성
* `'OTHER'` — 기타
* `'M'` — 남성 (단축 표기)
* `'F'` — 여성 (단축 표기)

## 로그인 상태 확인

로그인 됐는지 확인:

```typescript
const isLoggedIn = await AdchainSdk.isLoggedIn();
if (isLoggedIn) {
  const user = await AdchainSdk.getCurrentUser();
  console.log('현재 사용자:', user.userId);
}
```

## 로그아웃

사용자가 앱에서 로그아웃할 때 SDK 로그아웃도 같이 해야 합니다:

```typescript
await AdchainSdk.logout();
```

로그아웃하면 SDK가 가지고 있던 사용자 데이터가 모두 지워집니다. 다시 오퍼월을 쓰려면 로그인을 새로 해야 합니다.

## 자동 로그인

앱을 다시 실행했을 때 자동으로 로그인되게 하려면, 앱이 갖고 있는 사용자 정보로 시작 시점에 다시 `login()`을 호출하면 됩니다:

```typescript
import { AdchainSdk } from '@1selfworld/adchain-sdk-core-react-native';

useEffect(() => {
  const restoreSession = async () => {
    const savedUser = await loadUserFromStorage();  // 앱의 사용자 정보 로드
    if (savedUser) {
      await AdchainSdk.login({
        userId: savedUser.id,
        gender: savedUser.gender,
        birthYear: savedUser.birthYear,
      });
    }
  };
  restoreSession();
}, []);
```

## 사용자 정보 업데이트

사용자 정보가 변경되면(예: 프로필에서 성별 변경) 다시 `login()`을 호출합니다. SDK가 자동으로 업데이트합니다:

```typescript
await AdchainSdk.login({
  userId: currentUser.id,
  gender: 'FEMALE',       // 변경된 값
  birthYear: 1995,        // 변경된 값
});
```

## 여러 사용자 지원

한 기기에서 여러 사용자가 번갈아가며 쓸 수 있는 앱이라면, 사용자가 바뀔 때마다 `logout()` 후 `login()`을 호출하세요:

```typescript
const switchUser = async (newUser) => {
  await AdchainSdk.logout();
  await AdchainSdk.login({
    userId: newUser.id,
    gender: newUser.gender,
    birthYear: newUser.birthYear,
  });
};
```

이렇게 하면 각 사용자의 데이터가 섞이지 않습니다.

## 문제 해결

### 로그인이 계속 실패해요

1. **SDK 초기화 확인** — `AdchainSdk.isInitialized()`로 초기화 여부 확인
2. **인터넷 연결 확인** — 로그인할 때 애드체인 서버와 통신합니다
3. **appKey/appSecret 확인** — 초기화할 때 넣은 값이 맞는지 확인
4. **에러 메시지 확인** — `try/catch`로 에러를 잡아 메시지 확인

```typescript
try {
  await AdchainSdk.login({ userId: 'user123' });
} catch (error) {
  console.error('로그인 실패:', error.message);
}
```

### 로그인은 되는데 오퍼월이 안 열려요

로그인이 완료된 후 오퍼월을 열어야 합니다. `await`로 로그인이 끝날 때까지 기다리세요:

```typescript
await AdchainSdk.login({ userId: 'user123' });
// 로그인이 완료된 후
await AdchainSdk.openOfferwall('main_offerwall');
```

## 다음 단계

* [오퍼월 사용하기](/undefined-2/offerwall.md)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://adchain-doc.1self.world/undefined-1/authentication.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
