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
<uses-permission android:name="android.permission.INTERNET" /> <!-- 인터넷 권한 선언 -->
<application
android:usesCleartextTraffic="true"
</application>
인터넷 권한을 선언하고 플래그를 설정함으로서 모든 cleartext 트래픽은 허용처리가 되게끔 설정하고 앱을 제거 후 다시 설치하였으나, 전혀 효과가 없는 모습이었다.
<-- 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 차단을 해제하는 코드임을 확인할 수 있다. 물론 효과는 없었다.
<-- AndroidManifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cookandroid.megagenie2"
android:targetSandboxVersion="1">
보안 설정을 변경함으로서 타파하려 했으나 당연히 실패하였다.
방화벽 네트워크 보호 -> 고급 설정 -> 인바운드 규칙 -> 새 규칙 -> 규칙 종류 중 포트 선택 -> 특정 포트 80 입력 -> 나머지는 모두 <다음> 실행
도 실행해보았지만 변하는 것은 없었다. 하지만 실행하면서도 느낀 것이, "wampserver의 apache가 80번 포트를 사용하니까, 당연히 열어줘야 하는 것이 아닐까?" 이다. 잘은 모르겠지만 어쨌든 시행착오로 이 방법을 사용한 것도 도움이 됐을 것 같다. (라고 믿는다.)
cmd에서 ipconfig를 입력하면 IPv4 주소가 나오는데, request 과정에서 넣는 URL에 localhost 가 아닌 IPv4 주소를 넣는 것이다.
final static private String URL = "http://IPv4 Address/login.php";
몇 시간이 넘는 사투끝에 해결책을 찾을 수 있었다. 변경된 것은 코드 한 줄뿐이지만, 그래도 실행이 되는 모습을 보니 천만다행이라는 생각뿐이다. 오늘도 열심히 전을 구웠고 해결할 수 있었다.
참고 및 출처
선생님 혹시 ip주소로 해도 무반응이 일어나면 어떻게 해야하나요..