자바 안드로이드 앱개발 강좌, 태스크 관리

안녕하세요! 이번 강좌에서는 자바를 사용하여 안드로이드에서 태스크 관리 애플리케이션을 만드는 방법에 대해 알아보겠습니다. 태스크 관리 앱은 일상적인 업무를 관리하고 효율적으로 진행하는 데 필요한 다양한 기능들을 제공합니다. 이번 강좌를 통해 기본적인 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) 기능을 구현했습니다. 이 프로젝트를 기반으로 더 많은 기능을 추가하여 완성도 높은 태스크 관리 앱을 만들어보세요.

© 2023, 안드로이드 개발 강좌