Term project 진행(3. 로그아웃, 연결 끊기)

김영한·2020년 12월 5일
0

Festival_List_App

목록 보기
3/5

코드는 Github
KakaoDeveloper2, 참고


📢 카카오 api 로그아웃, 연결 끊기

💡 마이페이지 레이아웃

일단 로그아웃과 연결 끊기 기능을 구현하기 전에 2개의 버튼이 있는 마이페이지 레이아웃을 간단하게 만들어야한다.

이 레이아웃에서 로그 아웃과 연결 끊기를 진행해보겠다.

💡 로그아웃

로그아웃

	Logout.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "로그아웃 성공!", Toast.LENGTH_SHORT).show();

                // 로그아웃 부분
                UserManagement.getInstance()
                        .requestLogout(new LogoutResponseCallback() {
                            @Override
                            public void onCompleteLogout() {
                                // 로그아웃이 되었다면 로그인 액티비티로 넘어간다.
                                Intent intent = new Intent(MypageActivity.this, LoginActivity.class);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                startActivity(intent);
                            }
                        });
            }
        });

로그아웃은 사용자 액세스 토큰 및 리프레시 토큰을 만료시켜 현재 기기에서의 로그인 상태를 해제한다.
로그아웃 버튼을 눌렀을 때 로그아웃 요청 결과를 받아 처리할 LogoutResponseCallback을 구현하고 requestLogout을 호출한다.
로그아웃이 제대로 처리되면 oncompleteLogout을 호출한다.
로그아웃 성공 시 Kakao SDK는 토큰을 삭제하고 세션 연결을 종료한다.

나는 onCompleteLogout 호출 시 로그인화면으로 넘어가도록 구현했다.

💡 연결 끊기

연결 끊기

        Signout.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                new AlertDialog.Builder(MypageActivity.this).setMessage("회원 탈퇴를 진행하시겠습니까?")
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // 연결 끊기 부분
                                UserManagement.getInstance()
                                        .requestUnlink(new UnLinkResponseCallback() {
                                            @Override
                                            public void onSessionClosed(ErrorResult errorResult) {
                                                Toast.makeText(getApplicationContext(), "에러: "+errorResult+"로그인 세션이 닫혔습니다.", Toast.LENGTH_SHORT).show();
                                            }

                                            @Override
                                            public  void onFailure(ErrorResult errorResult) {
                                                int error = errorResult.getErrorCode();
                                                if(error == ApiErrorCode.CLIENT_ERROR_CODE) {
                                                    Toast.makeText(getApplicationContext(), "에러: "+error+"\n네트워크 연결이 불안정합니다.", Toast.LENGTH_SHORT).show();
                                                } else {
                                                    Toast.makeText(getApplicationContext(), "에러: "+error+"\n회원 탈퇴에 실패했습니다.", Toast.LENGTH_SHORT).show();
                                                }
                                            }
                                            @Override
                                            public void onSuccess(Long result) {
                                                Toast.makeText(getApplicationContext(), "성공: "+result+"\n회원 탈퇴 되었습니다.", Toast.LENGTH_SHORT).show();
                                                Intent intent = new Intent(MypageActivity.this, LoginActivity.class);
                                                startActivity(intent);
                                                finish();
                                            }
                                        });
                                dialog.dismiss();
                            }
                        })
                        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        }).show();
            }
        });

사용자와 앱의 연결을 해제하는 기능으로 연결 끊기 요청 결과를 받아 처리할 UnlinkResponseCallback을 구현하고 requestUnlink를 호출한다.
연결 끊기에 성공하면 사용자는 로그아웃되고, 사용자와 앱의 연결이 끊어진다.

먼저 팝업 창(AlertDialog)을 띄워서 경고 의사를 물어본다.

  • Yes
    • onSuccess : 연결 해제에 성공한 경우 동작한다.(ID를 반환)
      • 토스트로 성공했다는 메시지를 띄우고 로그인 액티비티로 넘어간다.
    • onSessionClosed : 세션이 닫혀있어서 실패한 경우 동작한다.(에러 반환)
      • 토스트로 오류메시지를 띄운다.
    • onFailure : 연결 해제에 실패한 경우 동작한다.(에러 반환)
  • No : 그냥 팝업창을 닫는다.

연결이 정상적으로 해제되면 로그인 창으로 돌아간다.


⚡ 원래 intent로 액티비티 전환하는 곳에서 MainActivity를 띄워줘야 맞지만 지금은 테스트 단계이므로 바로 MypageActivity를 띄워서 테스트해보았다.(Manifest도 변경해줘야함)
각자 환경에 맞는 액티비티로 변경하자!

로그아웃 시

탈퇴 후 다시 가입


📢 메인 엑티비티와 병합

팀원이 만든 메인 레이아웃과 병합을 해야한다.
메인 레이아웃은 Github를 참고

로그인 액티비티 -> 메인 액티비티 -> 1. 축제 정보 액티비티, 2. 마이페이지 액티비티 이런 느낌이다.

📍 수정된 코드들

InformationActivity

        // 로그인 인텐트 부분(코드 병합하고 MainActivity로 옮겨주기)
        Intent intent = getIntent();
        String id = intent.getStringExtra("ID"); // id가져오기
        Toast.makeText(getApplicationContext(), id+" 로그인 성공!", Toast.LENGTH_SHORT).show();

이 부분을 메인 액티비티로 옮겨서 로그인 액티비티에서 보낸 인텐트를 메인 액티비티가 받게 수정한다.

ReviewActivity

protected void onCreate(Bundle savedInstanceState) {
...
        // main으로 돌아가는 부분
        Button button = findViewById(R.id.go_main2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = getIntent();
                setResult(RESULT_OK, intent);
                finish();
            }
        });
...
}

메인 액티비티와 게시판 액티비티를 연결시켜준다.

LoginActivity

...
public void onSuccess(MeV2Response result) {
	Intent intent = new Intent(getApplicationContext(), MainActivity.class);
	intent.putExtra("ID", ""+result.getId());
	startActivity(intent);
	finish();
}
...

메인 액티비티로 intent를 보내준다.

MainActivity

...
protected void onCreate(Bundle savedInstanceState) {
	public static final int REQUEST_CODE_MENU = 101;
...
        // 로그인 인텐트 부분(코드 병합하고 MainActivity로 옮겨주기)
        Intent intent = getIntent();
        final String id = intent.getStringExtra("ID"); // id가져오기
        Toast.makeText(getApplicationContext(), id+" 로그인 성공!", Toast.LENGTH_SHORT).show();

        // 마이페이지로 이동 인텐트
        Button btn_page = findViewById(R.id.go_mypage);
        btn_page.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), MypageActivity.class);
                intent.putExtra("USERID", ""+id); // ID 보내주기
                startActivityForResult(intent, REQUEST_CODE_MENU);
            }
        });
        
        //후기 게시판으로 이동 인텐트
        Button btn_review = findViewById(R.id.go_review);
        btn_review.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent review_intent = new Intent(getApplicationContext(), ReviewActivity.class);
                review_intent.putExtra("USERID", ""+id); // ID 보내주기
                startActivityForResult(review_intent, REQUEST_CODE_MENU);
            }
        });
...
}
...
  • 로그인 액티비티 인텐트를 받는 코드
  • 마이페이지로 인텐트를 보내고 다시 돌아올 수 있게 기다리는 코드

MypageActivity

protected void onCreate(Bundle savedInstanceState) {
        final Intent intent = getIntent();
        String userid = intent.getStringExtra("USERID");

        //유저 ID 나타내는 부분
        TextView ID = findViewById(R.id.ID);
        ID.setText(userid);

        // main으로 돌아가는 부분
        Button button = findViewById(R.id.go_main);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setResult(RESULT_OK, intent);
                finish();
            }
        });
}

메인 액티비티가 보낸 인텐트를 받고 다시 메인으로 돌아갈 수 있는 코드


이번 포스팅에서는 카카오 api를 이용해 로그아웃과 연결 해제까지 만들었고 팀원이 만든 메인 액티비티와 병합해 전체적인 틀을 만들었다.
(로그인 - 메인 - 마이페이지 - 메인)
다음 포스팅에는 메인 레이아웃에서 축제 정보 레이아웃의 db 구축과 연동을 구현해보도록 하겠다.

0개의 댓글