Volley 통신 도중 응답을 받지 못하는 오류 해결| 삽질 노트

hoya·2021년 5월 30일
0

삽질 노트

목록 보기
1/8
post-thumbnail

😱 오류 발생

PHP와 Volley를 활용해 회원가입과 로그인을 만드는 도중, onResponse() 구절을 완전히 무시해버리는 오류가 발생하였다.

코드는 다음과 같다.

public class LoginActivity extends AppCompatActivity {
    private EditText ID, Password;
    private Button LogIn, Join, Find;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        ID = findViewById(R.id.ID);
        Password = findViewById(R.id.Password);
        LogIn = findViewById(R.id.LogIn);
        Join = findViewById(R.id.Join);
        Find = findViewById(R.id.Find);

        Join.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                System.out.println("이동중");
                Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
                startActivity(intent);
            }
        });

        LogIn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                System.out.println("클릭함");
                String id = ID.getText().toString();
                String password = Password.getText().toString();

                Response.Listener<String> responseListener = new Response.Listener<String>() {
                    // 서버로부터 데이터를 받아오는 부분
                    @Override
                    public void onResponse(String response) {
                        System.out.println("onResponse");
                        try {
                            System.out.println("MegaGenie" + response);
                            JSONObject jsonObject = new JSONObject(response);
                            boolean success = jsonObject.getBoolean("success");
                            if (success) { //로그인에 성공한 경우
                                String id = jsonObject.getString("id");
                                String password = jsonObject.getString("password");

                                Toast.makeText(getApplicationContext(), "로그인 성공!", Toast.LENGTH_LONG).show();
                                Intent intent = new Intent(LoginActivity.this, MenuActivity.class);
                                intent.putExtra("id", id);
                                intent.putExtra("password", password);
                                startActivity(intent);
                            } else { //로그인에 실패한 경우
                                System.out.println("로그인 실패");
                                Toast.makeText(getApplicationContext(), "로그인 실패ㅜㅜ", Toast.LENGTH_LONG).show();
                                return;
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                };
                LoginRequest loginRequest = new LoginRequest(id, password, responseListener);
                RequestQueue queue = Volley.newRequestQueue(LoginActivity.this);
                queue.add(loginRequest);
            }
        });
    }
}

보이는 코드 그대로, 로그인 버튼을 누르면 아이디값과 패스워드값을 전달함과 동시에 응답을 받아오는 동기식 통신을 하는 모습인데, onResponse()를 완전히 무시해버리는 결과가 나온다.

실행이 되는지 확인하기 위해 System.out.println 구문도 넣었으나, "클릭함" 까지만 로그에 입력되고 나머지는 입력이 안되는 모습에 현기증이 오기도 했다.

오류도 뜨지 않고, 빨간줄도 없고, 정말 막막한 상황에서 그나마 주어진 단서가 처음 버튼을 클릭했을 때 나오는 이 로그이다.

2021-05-26 23:09:25.555 17678-17743/com.cookandroid.megagenie2 D/NetworkSecurityConfig: 
Using Network Security Config from resource network_security_config debugBuild: true

🤪 헛발질

📌 1. AndroidManifest.xml에 코드 추가

<uses-permission android:name="android.permission.INTERNET" /> <!-- 인터넷 권한 선언 -->
 <application
android:usesCleartextTraffic="true"
</application>

인터넷 권한을 선언하고 플래그를 설정함으로서 모든 cleartext 트래픽은 허용처리가 되게끔 설정하고 앱을 제거 후 다시 설치하였으나, 전혀 효과가 없는 모습이었다.

📌 2. 네트워크 보안 구성 파일 작성 및 설정

<-- AndroidManifest.xml -->
</application
android:networkSecurityConfig="@xml/network_security_config"
</application>

<-- network-security-config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!--Set application-wide security config using base-config tag.-->
    <base-config cleartextTrafficPermitted="true"/>
</network-security-config>

앞에서 설명했던 코드의 속성과 맞는 것으로 보아, 이 코드 역시 http 차단을 해제하는 코드임을 확인할 수 있다. 물론 효과는 없었다.

📌 3. 보안 설정 변경하기

<-- AndroidManifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.cookandroid.megagenie2"
   android:targetSandboxVersion="1">

보안 설정을 변경함으로서 타파하려 했으나 당연히 실패하였다.

📌 4. 방화벽에서 80번 포트 열어주기

방화벽 네트워크 보호 -> 고급 설정 -> 인바운드 규칙 -> 새 규칙 -> 규칙 종류 중 포트 선택 -> 특정 포트 80 입력 -> 나머지는 모두 <다음> 실행

도 실행해보았지만 변하는 것은 없었다. 하지만 실행하면서도 느낀 것이, "wampserver의 apache가 80번 포트를 사용하니까, 당연히 열어줘야 하는 것이 아닐까?" 이다. 잘은 모르겠지만 어쨌든 시행착오로 이 방법을 사용한 것도 도움이 됐을 것 같다. (라고 믿는다.)


🤗 해결

📌 Request 에서 localhost가 아닌 IPv4 주소 사용하기

cmd에서 ipconfig를 입력하면 IPv4 주소가 나오는데, request 과정에서 넣는 URL에 localhost 가 아닌 IPv4 주소를 넣는 것이다.

final static private String URL = "http://IPv4 Address/login.php";

몇 시간이 넘는 사투끝에 해결책을 찾을 수 있었다. 변경된 것은 코드 한 줄뿐이지만, 그래도 실행이 되는 모습을 보니 천만다행이라는 생각뿐이다. 오늘도 열심히 전을 구웠고 해결할 수 있었다.


참고 및 출처

android studio & STS (server) 작업간 에러

profile
즐겁게 하자 🤭

2개의 댓글

comment-user-thumbnail
2022년 10월 21일

선생님 혹시 ip주소로 해도 무반응이 일어나면 어떻게 해야하나요..

1개의 답글