[AndroidStudio, SpringBoot] KnockKnock 개발일지 - 0119 (안드로이드와 스프링프로젝트 연결2)

Hyebin Lee·2022년 1월 20일
0

knockknock 개발일지

목록 보기
16/29
post-thumbnail
post-custom-banner

오늘의 목표

  1. ✔AndroidStudio와 SpringBoot project DB 연결 성공하기
  2. ✔Android 클라이언트에 SpringBoot 회원 조회(로그인), 회원 가입 기능 구현하고 CR 확인하기
  3. 로그인, 회원가입 쿠키를 이용해서 구체적으로 구현하기

참고한 링크

  1. Retrofit 파헤치기
  2. Android 안드로이드와 Spring boot로 Retrofit2를 이용한 CRUD
  3. [안드로이드] Retrofit2 간단 예제
  4. [Android/Kotlin] 안드로이드 SharedPreferences 잘 사용하기

오늘의 이슈

  1. 안드로이드 서버 연결 안됨 - failed to connect to localhost:127.0.0.1:8081

1. local에서 Android 연결시 IPv4 주소 사용하기


안드로이드 서버를 연결해서 회원 정보를 조회하려고 하는 순간 연결실패 오류가 떴다.
해결 방법은 간단했다.

Retrofit을 build하는 과정에서 주는 url 주소(서버의 주소)를 localhost로 주는 것이 아니라 IPv4 형태로 주소로 주는 것이다.
참고로 IPv4 형태의 주소는 cmd 창에서 idconfig 명령어를 통해 확인할 수 있다.

2. Button 객체 할당은 반드시 onCreate 안에서!

Member domain 의 PK에 해당하는 Member 의 아이디와 nickname을 가져오는 GET 통신은 성공했으나
회원가입을 하는 POST 기능을 구현하고 해당 activity로 실행한 순간 activity가 실행되지도 않고 아래와 같은 오류가 난 채로 프로젝트가 종료되었다.

 --------- beginning of crash
2022-01-19 16:31:28.759 17496-17496/org.techtown.knockknock E/AndroidRuntime: FATAL EXCEPTION: main
    Process: org.techtown.knockknock, PID: 17496
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{org.techtown.knockknock/org.techtown.knockknock.RegisterActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3194)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
        at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:163)
        at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:174)
        at android.content.Context.obtainStyledAttributes(Context.java:738)
        at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:848)
        at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:815)
        at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:640)
        at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:259)
        at org.techtown.knockknock.RegisterActivity.<init>(RegisterActivity.java:18)
        at java.lang.Class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
        at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1243)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3182)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

이 문제는 의외로 HTTP 통신의 문제가 아니였다 😭😂
Button을 findViewById 할 때는 꼭 onCreate 메소드 안에서 지정해주어야 하는데 밖에서 지정해서 문제가 된 것이였다.
이를 수정하면 회원가입 form 에 맞게 회원가입이 완료된다! DB에도 데이터 잘 들어가구 ㅎㅎㅎ
근데 한 가지 추가적인 문제가 생겼다.
바로 아이디가 같으면 회원가입 못하도록 프로젝트에서 설정을 해두었는데 그것이 안드로이드에서 적용이 안되는 것이다
다시 말해 같은 기존에 존재하는 아이디로 새로운 회원 회원가입을 시키면 그게 그대로 DB에 새 회원으로 저장이 되었다. 대체 왜이러는 걸까 😭

-> 이 문제 이후에 같은 코드로 돌려보니까 또 돼서... 알 수가 없다 일단 되고 서버로직도 틀린게 없는거 같아서 넘어가기로 하자

post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 11월 19일

Spring서버주소는 어떨게 확임하나요?

답글 달기