안녕하세요! 이번 강좌에서는 자바를 사용하여 안드로이드에서 태스크 관리 애플리케이션을 만드는 방법에 대해 알아보겠습니다. 태스크 관리 앱은 일상적인 업무를 관리하고 효율적으로 진행하는 데 필요한 다양한 기능들을 제공합니다. 이번 강좌를 통해 기본적인 UI 구성 요소, 데이터베이스 관리, 사용자 입력 처리, 그리고 앱을 실행하면서의 완성도 있는 기능 구현 방법을 배울 것입니다.
목차
- 1. 프로젝트 설정
- 2. UI 설계
- 3. 데이터베이스 구성
- 4. 태스크 추가 기능 구현
- 5. 태스크 목록 표시
- 6. 태스크 삭제 및 수정 기능
- 7. 앱 최적화 및 마무리
- 8. 결론
1. 프로젝트 설정
안드로이드 스튜디오를 열고 새로운 프로젝트를 생성합니다. “Empty Activity” 템플릿을 선택하고, 프로젝트 이름과 패키지 이름을 설정한 후 “Finish” 버튼을 클릭하여 프로젝트를 생성합니다.
프로젝트가 생성되면 Gradle에 필요한 종속성을 추가하여 데이터베이스와 UI 관련 라이브러리를 설정할 수 있습니다. 다음은 build.gradle 파일에서 추가해야 할 코드입니다:
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'androidx.room:room-runtime:2.3.0'
annotationProcessor 'androidx.room:room-compiler:2.3.0'
}
2. UI 설계
이제 UI를 설계해 보겠습니다. res/layout/activity_main.xml 파일을 열고 아래와 같은 레이아웃을 추가합니다:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/taskEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="새 태스크를 입력하세요"/>
<Button
android:id="@+id/addTaskButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="추가"/>
<ListView
android:id="@+id/taskListView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
3. 데이터베이스 구성
태스크 데이터를 저장하기 위해 Room 데이터베이스를 설정합니다. 아래와 같이 엔티티 클래스를 생성합니다:
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity
public class Task {
@PrimaryKey(autoGenerate = true)
private int id;
private String description;
public Task(String description) {
this.description = description;
}
// Getter와 Setter
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
}
다음으로, DAO 인터페이스를 생성합니다:
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;
import java.util.List;
@Dao
public interface TaskDao {
@Insert
void insert(Task task);
@Query("SELECT * FROM task")
List getAllTasks();
}
마지막으로, 데이터베이스 클래스를 생성합니다:
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import android.content.Context;
@Database(entities = {Task.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract TaskDao taskDao();
private static AppDatabase INSTANCE;
public static AppDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (AppDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, "task_database")
.build();
}
}
}
return INSTANCE;
}
}
4. 태스크 추가 기능 구현
Activity에서 UI 요소와 데이터베이스를 연결하여 사용자가 입력한 태스크를 추가하는 기능을 구현합니다. MainActivity.java 파일을 열고 다음 코드를 추가합니다:
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private EditText taskEditText;
private Button addTaskButton;
private AppDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
taskEditText = findViewById(R.id.taskEditText);
addTaskButton = findViewById(R.id.addTaskButton);
db = AppDatabase.getDatabase(this);
addTaskButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String taskDescription = taskEditText.getText().toString();
if (!taskDescription.isEmpty()) {
Task task = new Task(taskDescription);
new Thread(() -> db.taskDao().insert(task)).start();
taskEditText.setText("");
}
}
});
}
}
5. 태스크 목록 표시
태스크 목록을 보여주기 위해 ListView와 어댑터를 사용합니다. 먼저, 커스텀 어댑터 클래스를 만듭니다:
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.List;
public class TaskAdapter extends ArrayAdapter {
public TaskAdapter(Context context, List tasks) {
super(context, 0, tasks);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Task task = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
}
TextView taskTextView = convertView.findViewById(android.R.id.text1);
taskTextView.setText(task.getDescription());
return convertView;
}
}
이제 MainActivity.java에서 ListView를 설정합니다:
import android.widget.ListView;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
public class MainActivity extends AppCompatActivity {
// ...
private ListView taskListView;
private TaskAdapter taskAdapter;
private List taskList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ...
taskListView = findViewById(R.id.taskListView);
taskList = new ArrayList<>();
taskAdapter = new TaskAdapter(this, taskList);
taskListView.setAdapter(taskAdapter);
loadTasks();
}
private void loadTasks() {
new Thread(() -> {
taskList.clear();
taskList.addAll(db.taskDao().getAllTasks());
runOnUiThread(() -> taskAdapter.notifyDataSetChanged());
}).start();
}
}
6. 태스크 삭제 및 수정 기능
각 태스크를 클릭하여 삭제하거나 수정할 수 있는 기능을 추가합니다. 태스크 아이템을 삭제하는 기능을 추가하려면 ListView의 클릭 이벤트를 처리합니다:
taskListView.setOnItemClickListener((parent, view, position, id) -> {
Task task = taskList.get(position);
new Thread(() -> {
db.taskDao().delete(task); // delete 메서드를 올바르게 구현해야 함
taskList.remove(position);
runOnUiThread(taskAdapter::notifyDataSetChanged);
}).start();
});
태스크 수정 기능은 별도의 EditText와 Confirm 버튼을 추가하면 구현할 수 있습니다.
7. 앱 최적화 및 마무리
앱 테스트를 통해 버그를 수정하고 개선할 점을 찾아 최적화합니다. 다양한 디바이스에서 테스트하여 레이아웃이 정상적으로 작동하는지 확인합니다.
8. 결론
이 강좌를 통해 자바를 사용하여 안드로이드에서 태스크 관리 앱을 개발하는 방법을 배웠습니다. 데이터베이스와 사용자 인터페이스 구성 요소를 통합하여 기본적인 CRUD(Create, Read, Update, Delete) 기능을 구현했습니다. 이 프로젝트를 기반으로 더 많은 기능을 추가하여 완성도 높은 태스크 관리 앱을 만들어보세요.