Bmob를 활용한 모바일 백엔드 구축
모바일 애플리케이션 개발 시 서버 인프라를 직접 구축하고 유지보수하는 것은 많은 시간과 비용이 소요된다. 이를 해결하기 위해 등장한 개념이 BaaS(Backend as a Service)다. BaaS는 클라우드 기반의 백엔드 서비스를 제공하여, 개발자가 서버 로직에 집중하지 않고도 데이터 저장, 사용자 인증, 푸시 알림 등의 기능을 빠르게 구현할 수 있도록 돕는다.
국내외 대표적인 BaaS 플랫폼 중 하나인 Bmob는 간편한 API와 SDK를 제공하며, 특히 Android 및 iOS 앱 개발에 최적화되어 있다. 본 문서에서는 Bmob를 기반으로 사용자 로그인 및 회원가입 기능을 구현하는 방법을 단계별로 설명한다.
1. Bmob 프로젝트 설정
먼저 Bmob 공식 사이트에 접속하여 계정을 생성하고, 새 애플리케이션을 등록한다. 프로젝트 생성 후 발급되는 Application ID는 이후 SDK 초기화 시 필요하므로 안전하게 보관한다.
2. Android 프로젝트 준비
Android Studio 또는 Eclipse에서 새 프로젝트를 생성한 후, Bmob에서 제공하는 Android SDK를 다운로드한다. 압축 해제 후 libs 폴더에 다음 JAR 파일들을 추가한다:
bmob-sdk-x.x.x.jarokhttp-*.jargson-*.jar
Gradle 기반 프로젝트라면 의존성 설정을 통해 추가할 수도 있다.
3. 권한 선언
앱이 네트워크 통신을 수행하려면 매니페스트 파일에 필요한 권한을 명시해야 한다. AndroidManifest.xml 내에 아래 권한들을 추가한다:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
4. 사용자 데이터 모델 정의
Bmob는 객체 기반 데이터 처리를 지원하므로, 사용자 정보를 담을 Java 클래스를 생성한다. 이 클래스는 BmobObject를 상속받아야 한다.
public class UserAccount extends BmobObject {
private String username;
private String userPassword;
// 기본 생성자
public UserAccount() {}
public UserAccount(String username, String userPassword) {
this.username = username;
this.userPassword = userPassword;
}
// Getter 및 Setter 메서드
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
}
5. 메인 액티비티 구현
로그인 및 회원가입 UI와 로직을 포함한 MainActivity를 작성한다. 먼저 SDK를 초기화하고, 뷰 요소를 바인딩한다.
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText editUsername, editPassword;
private Button btnSignIn, btnSignUp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Bmob SDK 초기화 (Application ID 입력)
Bmob.initialize(this, "YOUR_APPLICATION_ID_HERE");
setupViews();
}
private void setupViews() {
editUsername = findViewById(R.id.edit_username);
editPassword = findViewById(R.id.edit_password);
btnSignIn = findViewById(R.id.btn_signin);
btnSignUp = findViewById(R.id.btn_signup);
btnSignIn.setOnClickListener(this);
btnSignUp.setOnClickListener(this);
}
@Override
public void onClick(View v) {
String name = editUsername.getText().toString().trim();
String pass = editPassword.getText().toString().trim();
if (name.isEmpty() || pass.isEmpty()) {
Toast.makeText(this, "모든 필드를 입력하세요", Toast.LENGTH_SHORT).show();
return;
}
switch (v.getId()) {
case R.id.btn_signin:
authenticateUser(name, pass);
break;
case R.id.btn_signup:
registerUser(name, pass);
break;
}
}
6. 로그인 기능 구현
BmobQuery를 사용해 서버에서 일치하는 사용자 정보를 조회하고, 비밀번호를 비교한다.
private void authenticateUser(String username, String password) {
BmobQuery<UserAccount> query = new BmobQuery<>();
query.addWhereEqualTo("username", username);
query.findObjects(new QueryListener<List<UserAccount>>() {
@Override
public void done(List<UserAccount> userList, BmobException e) {
if (e == null && !userList.isEmpty()) {
UserAccount user = userList.get(0);
if (user.getUserPassword().equals(password)) {
Toast.makeText(MainActivity.this, "로그인 성공", Toast.LENGTH_SHORT).show();
} else {
editPassword.setText("");
Toast.makeText(MainActivity.this, "비밀번호가 잘못되었습니다", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(MainActivity.this, "등록되지 않은 사용자입니다", Toast.LENGTH_SHORT).show();
}
}
});
}
7. 회원가입 기능 구현
새로운 사용자 정보를 객체로 생성하여 Bmob 서버에 저장한다.
private void registerUser(String username, String password) {
UserAccount newUser = new UserAccount(username, password);
newUser.save(new SaveListener<String>() {
@Override
public void done(String objectId, BmobException e) {
if (e == null) {
Toast.makeText(MainActivity.this, "회원가입 완료", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "등록 실패: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
}
8. UI 레이아웃 구성
간단한 로그인 화면을 위한 레이아웃을 작성한다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/edit_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="사용자 이름"
android:inputType="text" />
<EditText
android:id="@+id/edit_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="비밀번호"
android:inputType="textPassword" />
<Button
android:id="@+id/btn_signin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="로그인" />
<Button
android:id="@+id/btn_signup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="회원가입" />
</LinearLayout>