안녕하세요! 오늘은 안드로이드 앱을 개발하는 흥미로운 여정을 시작해 보겠습니다. 본 강좌에서는 자바를 활용하여 간단한 뉴스 앱을 만드는 과정을 단계별로 설명할 것입니다. 여러분이 앱 개발에 대한 깊은 이해를 갖게 되길 바라며, 이 강좌를 통해 유용한 기술들을 배우시기 바랍니다.
1. 앱 기획 및 요구사항 분석
뉴스 앱을 만들기 전에 우선 앱의 주요 기능과 요구사항을 정리해 보겠습니다. 다음은 기본 요구사항 목록입니다:
- 뉴스 목록을 보여준다.
- 각 뉴스 항목을 클릭할 수 있어야 한다.
- 뉴스의 상세 내용을 볼 수 있어야 한다.
- 뉴스 기사는 인터넷에서 API를 통해 가져온다.
2. 개발 환경 설정
앱 개발을 위해 먼저 Android Studio를 다운로드하고 설치해야 합니다. Android Studio는 공식 안드로이드 IDE로, 다양한 기능을 제공합니다. 아래의 단계에 따라 환경을 설정해보세요:
- Android Studio를 공식 웹사이트에서 다운로드하여 설치합니다.
- 설치 후 새로운 프로젝트를 생성합니다.
- 프로젝트 템플릿에서 ‘Empty Activity’를 선택합니다.
- 프로젝트 이름을 ‘NewsApp’으로 설정하고, 언어는 ‘Java’를 선택합니다.
- 마무리 후 프로젝트가 생성되면, 왼쪽의 파일 탐색기에서 ‘app/src/main’ 디렉토리로 이동합니다.
3. API 선택하기
뉴스 데이터를 가져오기 위해 사용할 수 있는 여러 뉴스 API가 있습니다. 여기서는 ‘News API’를 사용하여 데이터를 가져올 예정입니다. 뉴스 API를 사용하려면 API 키가 필요합니다. 다음과 같은 절차를 진행하세요:
- News API 웹사이트에 가입합니다.
- API 키를 생성합니다.
- 받은 API 키를 안전하게 저장합니다.
4. 의존성 추가하기
Android Studio에서 Gradle을 사용하여 쉽게 의존성을 추가할 수 있습니다. 뉴스 API에 접근하기 위해 ‘Retrofit’과 ‘Gson’ 라이브러리를 사용할 것입니다. 아래의 코드를 ‘build.gradle (Module: app)’ 파일에 추가해주세요:
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}
5. 모델 클래스 생성하기
뉴스 데이터를 처리하기 위해 모델 클래스를 정의할 필요가 있습니다. ‘Article’이라는 클래스를 생성하겠습니다. 프로젝트의 ‘java’ 디렉토리 아래 ‘model’ 패키지를 생성하고, 그 안에 ‘Article.java’ 클래스를 만들어주세요.
package com.example.newsapp.model;
public class Article {
private String title;
private String description;
private String url;
private String urlToImage;
// Getters and Setters
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUrlToImage() {
return urlToImage;
}
public void setUrlToImage(String urlToImage) {
this.urlToImage = urlToImage;
}
}
6. Retrofit 설정하기
Retrofit을 사용하여 API와 통신하기 위해 Service 클래스를 생성해야 합니다. ‘api’라는 패키지를 생성하고 그 안에 ‘NewsApiService.java’ 파일을 만들어보세요.
package com.example.newsapp.api;
import com.example.newsapp.model.Article;
import com.example.newsapp.model.NewsResponse;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface NewsApiService {
@GET("top-headlines")
Call getTopHeadlines(
@Query("apiKey") String apiKey,
@Query("country") String country
);
}
7. 뉴스 응답 모델 생성하기
API에서 반환되는 JSON 데이터를 매핑하기 위해 ‘NewsResponse’라는 클래스를 만들어야 합니다. 앞서 생성한 ‘model’ 패키지 안에 ‘NewsResponse.java’ 클래스를 생성합니다.
package com.example.newsapp.model;
import java.util.List;
public class NewsResponse {
private String status;
private List articles;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public List getArticles() {
return articles;
}
public void setArticles(List articles) {
this.articles = articles;
}
}
8. MainActivity 구현하기
이제 MainActivity를 구현하여 API에서 뉴스를 가져오고 사용자에게 보여줄 준비를 합니다. ‘MainActivity.java’ 파일을 열고 다음 코드를 작성하세요.
package com.example.newsapp;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.newsapp.api.NewsApiService;
import com.example.newsapp.model.NewsResponse;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
private static final String BASE_URL = "https://newsapi.org/v2/";
private static final String API_KEY = "YOUR_API_KEY"; // API 키 입력
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadNews();
}
private void loadNews() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
NewsApiService newsApiService = retrofit.create(NewsApiService.class);
Call call = newsApiService.getTopHeadlines(API_KEY, "kr");
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if (response.isSuccessful()) {
// 뉴스 데이터 처리
} else {
Toast.makeText(MainActivity.this, "뉴스를 가져오는 데 실패했습니다.", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call call, Throwable t) {
Toast.makeText(MainActivity.this, "네트워크 오류: " + t.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
}
9. 뉴스 목록 보여주기
뉴스 목록을 보여주기 위해 RecyclerView를 사용합니다. ‘res/layout’ 폴더에 ‘item_article.xml’ 레이아웃 파일을 생성하고 다음 코드를 작성해 주세요.
10. RecyclerView 어댑터 만들기
RecyclerView를 사용하기 위해 어댑터 클래스를 작성해야 합니다. ‘adapter’라는 패키지를 생성하고 ‘ArticleAdapter.java’ 파일을 만들어 주세요.
package com.example.newsapp.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.newsapp.R;
import com.example.newsapp.model.Article;
import java.util.List;
public class ArticleAdapter extends RecyclerView.Adapter {
private List articleList;
static class ArticleViewHolder extends RecyclerView.ViewHolder {
TextView textTitle;
TextView textDescription;
ArticleViewHolder(View itemView) {
super(itemView);
textTitle = itemView.findViewById(R.id.textTitle);
textDescription = itemView.findViewById(R.id.textDescription);
}
}
public ArticleAdapter(List articleList) {
this.articleList = articleList;
}
@NonNull
@Override
public ArticleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_article, parent, false);
return new ArticleViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ArticleViewHolder holder, int position) {
Article article = articleList.get(position);
holder.textTitle.setText(article.getTitle());
holder.textDescription.setText(article.getDescription());
}
@Override
public int getItemCount() {
return articleList.size();
}
}
11. RecyclerView 초기화 및 데이터 설정하기
MainActivity에서 RecyclerView를 초기화하고, API를 통해 가져온 데이터를 어댑터에 설정합니다. ‘MainActivity.java’를 수정하여 다음과 같이 업데이트 합니다.
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
private RecyclerView recyclerView;
private ArticleAdapter articleAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
loadNews();
}
private void loadNews() {
...
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if (response.isSuccessful()) {
articleAdapter = new ArticleAdapter(response.body().getArticles());
recyclerView.setAdapter(articleAdapter);
} else {
...
}
}
...
});
}
12. MainActivity 레이아웃 파일 수정하기
마지막으로 MainActivity의 레이아웃 파일을 수정하여 RecyclerView를 추가합니다. ‘res/layout/activity_main.xml’ 파일을 수정하여 다음과 같이 작성합니다.
13. 사용해보기 및 마무리
이제 모든 설정이 완료되었습니다! 앱을 실행해보면 최신 뉴스 기사를 목록으로 확인할 수 있습니다. API에서 가져온 데이터를 통해 사용자에게 유용한 정보를 제공하는 간단한 뉴스 앱이 완성되었습니다.
14. 추가 기능 구현하기
이번 강좌에서는 기본적인 뉴스 앱을 만드는 과정을 배우았습니다. 더 나아가 다음과 같은 추가 기능들을 구현해보세요:
- 뉴스 상세 페이지 구현하기
- 뉴스 기사 검색 기능 추가하기
- 즐겨찾기 기능 추가하기
- 다양한 뉴스 카테고리 추가하기
15. 결론
뉴스 앱 만들기를 통해 자바와 안드로이드의 기본적인 사용법을 익힐 수 있었습니다. 앞으로 더 많은 앱을 개발하면서 실력을 키워나가시길 바랍니다. 질문이나 의견이 있으신 분들은 댓글로 남겨주세요!