SSAFYcial

[3월 기획 기사] 안드로이드, 일주일 배운 결과물을 공개합니다!

five2week 2023. 3. 30. 10:09

 

안녕하세요. 9기 SSAFYcial 오희주입니다. 

앞으로 다음 기수에 모바일 트랙에 들어오고 싶은 분, 그리고 모바일 반이 궁금하신 분들을 위해서 모바일반 소식을 가져왔습니다.

# 모바일반의 진도

모바일반은 자바반의 학습범위 + 모바일이기 때문에, 다른 반보다 진도의 속도가 조금 빠릅니다.

이번에 spring 부분까지 끝나고, 이제 안드로이드를 배우기 시작했습니다. 현재는 싸피를 들어온지는 3달 정도 지났고, 안드로이드 강의는 일주일을 수강한 상태입니다. 안드로이드에 대해서 체계적으로 배우고 싶어서, 모바일 반을 지원했던 만큼 기다렸던 시간입니다.

 

# 안드로이드 강의에서 학습한 것들

기대했던 만큼 교수님도 강의를 정말 잘하시고, 진도가 빨라서 일주일 동안에 많은 정보에 대해서 알게 되었습니다.

배우는 것을 잊어버리지 않기 위해서 따로 프로젝트를 만들어서 복습하고 있습니다. 그 프로젝트에 앞으로 배우는 것들을 적용하여 기능을 계속 추가할 예정입니다. 

 

일주일 동안 만든 앱은 현재 아래와 같은 기능을 제공하고 있습니다.

  1. SQLite를 사용하여 메모에 대한 CRUD(생성, 조회, 수정, 삭제) 기능을 제공합니다.
  2. 텍스트 메모와 리스트 메모 두 가지 유형의 메모를 관리할 수 있습니다.
  3. 메모 위젯을 생성할 수 있습니다.
  4. 다양한 화면을 통해 메모를 확인할 수 있습니다:
    • 달력 화면: 어떤 날짜에 메모를 작성했는지 확인할 수 있습니다.
    • 제목 리스트 화면: 메모의 제목과 날짜들을 모아 볼 수 있습니다.
    • 요약 리스트 화면: 메모의 제목과 내용들을 간략하게 확인할 수 있습니다.
    • 상세 화면: 메모를 클릭하여 상세 내용을 볼 수 있습니다.
    • 작성 화면: 새로운 메모를 작성할 수 있습니다.
  5. 메모를 최신순, 사전순, 생성순으로 정렬해서 볼 수 있는 기능을 제공합니다.
  6. 중요 메모를 리스트 상단에 고정할 수 있는 기능을 제공합니다.
  7. 다국어 처리가 되어있어 사용자의 언어에 따라 메세지가 다르게 제공됩니다.
  8. 많은 오류와 강제 종료를 제공합니다.

이러한 기능들을 통해 사용자는 효과적으로 메모를 관리하고 필요한 정보를 손쉽게 찾을 수 있습니다.

 

위의 기능들을 싸피에 들어와서 학습한 것들을 활용해서 만들었습니다. 

데이터베이스 학습 기간에 배웠던 쿼리문을 통해서 여러 조건의 메모 조회 기능 부분을 구현할 수 있었고, 또한 두 종류의 메모에 대해서 데이터베이스를 생성할 수 있었습니다.

@SuppressLint("Range")
    fun selectAllMemos(sortOption: Int = 1): ArrayList<MemoItem> {
        val memoItems = ArrayList<MemoItem>()
        val selectQuery = when (sortOption) {
            1 -> "SELECT * FROM $TABLE_NAME ORDER BY $COLUMN_IS_FIXED DESC, $COLUMN_DATE DESC"
            2 -> "SELECT * FROM $TABLE_NAME ORDER BY $COLUMN_IS_FIXED DESC, $COLUMN_TITLE COLLATE NOCASE ASC"
            else -> "SELECT * FROM $TABLE_NAME ORDER BY $COLUMN_IS_FIXED DESC, $COLUMN_DATE ASC"
        }
        val db = readableDatabase
        val cursor = db.rawQuery(selectQuery, null)

        if (cursor.moveToFirst()) {
            do {
                val id = cursor.getLong(cursor.getColumnIndex(COLUMN_ID))
                val title = cursor.getString(cursor.getColumnIndex(COLUMN_TITLE))
                val date = DateFormatUtil.stringToDate(cursor.getString(cursor.getColumnIndex(COLUMN_DATE)))
                val isFixed = cursor.getInt(cursor.getColumnIndex(COLUMN_IS_FIXED)) == 1
                val memoType = MemoType.fromInt(cursor.getInt(cursor.getColumnIndex(COLUMN_MEMO_TYPE)))

                val memoItem = when (memoType) {
                    MemoType.LIST -> ListMemoItem(id, title, deserializeListContent(cursor.getBlob(cursor.getColumnIndex(COLUMN_LIST_CONTENT))), date, isFixed)
                    else -> TextMemoItem(id, title, cursor.getString(cursor.getColumnIndex(COLUMN_CONTENT)), date, isFixed)
                }
                memoItems.add(memoItem)
            } while (cursor.moveToNext())
        }

        cursor.close()
        db.close()

        return memoItems
    }

 

안드로이드 학습 기간에 배웠던 다국어 처리를 적용해서, 메모에 뜨는 작성 및 수정 날짜의 형태를 다르게 제공하고 있습니다. 또한 strings.xml 파일들에도 처리가 되어있습니다.

fun formatDate(date: Date): String {
    val locale = Locale.getDefault()
    val format = getFormatForLocale(locale)
    val formatter = SimpleDateFormat(format, locale)
    return formatter.format(date)
}

private fun getFormatForLocale(locale: Locale): String {
    return when (locale.language) {
        "en" -> "MMMM d, yyyy"
        "ko" -> "yyyy년 MM월 dd일"
        "zh" -> {
            if (locale.country == "CN") "yyyy年MM月dd日" // Simplified Chinese
            else "yyyy年MM月dd日" // Traditional Chinese
        }
        "ja" -> "yyyy年MM月dd日"
        "es" -> "d 'de' MMMM 'de' yyyy"
        else -> "yyyy-MM-dd" // Default format
    }
}

 

마지막으로 평소 익숙했던 intent의 사용 방법이 아주 다양한 것을 알게되었습니다. 

 

Pending Intent

안드로이드에서 Pending Intent는 다른 애플리케이션에서 발생한 액션을 대리 실행할 수 있는 권한을 부여하는 인텐트(Intent)의 형태입니다. Pending Intent는 일반적으로 다른 애플리케이션이나 시스템 자원(예: 알람 매니저, 위치 서비스 등)에게 요청을 보내고, 해당 요청이 트리거될 때 애플리케이션이 실행될 수 있도록 하는 데 사용됩니다.
Pending Intent를 사용하면, 실행될 애플리케이션의 컨텍스트나 권한 등의 정보를 보유하면서도, 다른 애플리케이션에서 실행될 수 있으므로, 일부 상황에서 유용합니다.

 

예를 들어, 사용자가 앱에서 설정한 특정 시간에 알림을 표시하려면, Pending Intent를 사용하여 해당 시간에 알림을 표시할 수 있는 알람 매니저 서비스에 요청을 보낼 수 있습니다. Pending Intent는 일반적으로 AlarmManager, NotificationManager, LocationManager 등과 같은 안드로이드 시스템 서비스와 함께 사용됩니다. PendingIntent를 생성하려면, PendingIntent.getXXX() 또는 PendingIntent.getActivity()와 같은 정적 메서드를 사용할 수 있습니다. 이러한 메서드는 인자로 받은 액션과 데이터를 가지고 PendingIntent를 생성하여 반환합니다.

    private fun setWidgetClickEvent(
        context: Context,
        views: RemoteViews,
        appWidgetId: Int,
        memoId: Long
    ) {
        if (memoId == -1L) {
            views.setOnClickPendingIntent(R.id.widget_memo, null)
            return
        }
        // 인텐트를 생성하여 EditMemoActivity를 시작하도록 설정합니다.
        val intent = Intent(context, MemoEditActivity::class.java)

        // 위젯 인스턴스에 대한 정보를 전달하기 위해 인텐트에 extra 데이터를 추가합니다.
        intent.putExtra(EXTRA_WIDGET_ID, appWidgetId)
        intent.putExtra(EXTRA_MEMO_ID, memoId)

        // PendingIntent를 사용하여 인텐트를 설정합니다.
        val pendingIntent = PendingIntent.getActivity(
            context,
            appWidgetId,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )

        // 위젯 뷰의 클릭 리스너를 설정합니다.
        views.setOnClickPendingIntent(R.id.widget_memo, pendingIntent)

    }

 

# 싸피 모바일 트랙 3달 후기

처음 싸피 모바일반에 대해서 알게 되었을 때는 기대도 많이 했지만, 안드로이드에 대해 깊게 배울 수 있을까?에 대한 걱정도 있었습니다. 하지만 지금은 과거의 제가 무슨 자신감이었는지 잘 모르겠다고 생각합니다. 강의를 들을수록, 평소 쓰던 컴포넌트나 레이아웃 등에 모르는 기능이 있었다는 것을 알게 되었습니다.

 

안드로이드를 공부한 경험이 있어서 커뮤니티, 게시판 등의 CRUD 기능 개발에는 익숙하지만, 서비스(Service), 방송 수신자(Broadcast Receiver), 콘텐츠 제공자(Content Provider) 등은 잘 모르는 부분입니다. 앞으로 남은 시간동안 알차게 배우고 복습하며, 최대한 많은 것을 배워가고 싶습니다.

 

또한 싸피 과정 덕분에 안드로이드뿐만 아니라, 웹과 서버에 대해서 한 번 더 복습을 했기 때문에, 만들고 싶은 서비스가 있다면 안드로이드에 국한되지 않고 개발할 수 있다는 장점이 있습니다. 지금 일주일 동안 만든 메모 앱에 앞으로 클라우드 동기화 또는 계정을 생성하여 웹에서도 메모 기능을 사용할 수 있는 기능을 만들고 싶습니다.

 

https://github.com/noion0511/Log.M

 

GitHub - noion0511/Log.M

Contribute to noion0511/Log.M development by creating an account on GitHub.

github.com

https://play.google.com/store/apps/details?id=com.likewhile.meme&hl=ko&gl=US 

 

Log.M - 할 일과 중요 사항 메모장 - Google Play 앱

할 일과 중요 사항을 저장해둘 수 있는 메모 앱

play.google.com