묻고 답해요
137만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
코틀린으로 엔티티 작성
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의의 내용과 질문이 관계 없을수도 있지만 정답이 있는 부분이 아닌 것 같아 너무 궁금해서 남겨봅니다.. ㅠ 강의중에 코틀린을 사용할 때 되도록 불변으로 만드는 것이 좋다고 하셔서 User 엔티티를 이런식으로 작성했습니다. 이렇게 되면 유저의 필드를 변경하고 싶을 때 새로운 User 객체를 만들어야 합니다. 그래서 User 엔티티 안에 이런 메서드를 작성했습니다. 두 번째 방법으로 private set을 사용해서 setter만 막고 updateName 함수를 만들어줬습니다. 세 번째로 프로퍼티를 아예 private으로 설정하고 getter와 updateName 함수를 만들어줬습니다. 네 번째는 그냥 var로 만들어 기본 생성되는 getter와 setter를 사용한다 입니다. 정답이 있는 문제는 아니지만 저는 2, 3번이 좋은 방법이라는 생각이 듭니다. 그런데 자바의 저런 보일러 플레이트 코드들을 줄일 수 있는 것이 코틀린의 장점중 하나인데, 저렇게 사용하면 무슨 소용이 있나 싶기도 합니다. 그러다보니 코틀린은 getter, setter를 사용하는 것을 권장하게 설계되어있나? 라는 생각이 듭니다. 1번이나 4번 처럼 사용하는 것이 좀 더 코틀린스러운 개발 방법일까요?
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
프래그먼트 바인딩
똑같이 따라했는데 이런 오류가 생겼어요,, 검색해도 잘 안 나오고 뭐가 문제인지 모르겠습니다ㅠㅠ
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
함수 null 질문드립니다.
@nullable public String getName() { return name; } - 위 함수는 리턴타입이 reference 타입이니 어노테이션을 지우면 참조형식이 될거 같은데 플랫폼 타입이 되는데 함수만 그런 규칙이 적용이 되는건가요?
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
안녕하세요 질문이 있습니다!
안녕하세요~ 질문이있는데용 OPEN 키워드를 사용하지않고 사진의 코드를 실행시키면 값이 300으로 나오게되는데요~ Derived(300) 으로 부모가 호출이되고 자식의 프로퍼티가( override )가 아니기 때문에 부모의 초기화블록이 실행되면서 자식의 초기화되지 않는 init 블럭에 접근하지 않고 부모의 init에서 처리하기 때문에 300이 재대로 출력되는건가요?
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
처음 04:35초 메인패스트 부분부터 난관이네요..
MainFast에서 splashActivity 부분에 <intent-filter> 을 넣으니까 오류가 막 엄청뜨네요. 버전도 같은데 코드또한 약간 다릅니다. 강의에 안보이는 <activity 부분에 android:exported="ture" /> 도 저는 보입니다.. ERROR:C:\Users\i\AndroidStudioProjects\MySoloLife2\app\build\intermediates\packaged_manifests\debug\AndroidManifest.xml:25: AAPT: error: unexpected element <intent-filter> found in <manifest><application>. 라고 에러코드는 나와있습니다.
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
질문 있습니다.
코틀린에서는 null 사용을 안전하게 하기 위해서 null 이 들어갈 수 있는 변수를 완전히 다른 타입으로 간주하고 아래와 같이 효과적으로 관리할 수 있다. 라고 말씀해주셨는데요 그렇다면 String과 String? 타입은 엄연히 다른 타입 인것이고 String? 이 자체를 하나의 타입으로 간주해야하는건가요? String? 이렇게 생긴 타입은 코틀린에서는 클래스로 정의 되어 있지 않아서요..!
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
강의를 듣고 응용해봤는데 질문있습니다
강의의 게시판 만들기 부분을 실습하고 나서 게시글 양식으로 만드셨던 board_list_item.xml을 이렇게 변경해봤습니다. 나머지 글들은 강의에서 하던대로 따라해서 불러와지는게 되는데 제가 추가한 저 초록색사진은 글을 작성할때 즉 강의 상의 코드인 BoardWriteActivity.kt에서 사진이 첨부되면 그 첨부된 사진이 저 초록색사진에 같이 업로드 되게끔 만들고 싶습니다. 저 사진의 id값은 preview입니다. <?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".Sell"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar2" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" android:theme="?attr/actionBarTheme" app:titleTextColor="@color/white" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="판매글 작성" android:textSize="23sp" android:textStyle="bold"/> </androidx.appcompat.widget.Toolbar> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <EditText android:id="@+id/et_newtitle" android:layout_width="330dp" android:layout_height="50dp" android:layout_marginLeft="20dp" android:layout_marginTop="70dp" android:gravity="center" android:maxLength="15" /> <EditText android:id="@+id/et_originalname" android:layout_width="330dp" android:layout_height="50dp" android:layout_marginLeft="20dp" android:layout_marginTop="20dp" android:gravity="center" android:hint="※주의 : 책 제목 그대로 써주세요 ※" android:maxLength="100" /> <EditText android:id="@+id/et_price" android:layout_width="330dp" android:layout_height="50dp" android:hint="숫자 옆에 원을 붙여주세요" android:layout_marginLeft="20dp" android:layout_marginTop="20dp" android:gravity="center" android:maxLength="10" /> <ImageView android:id="@+id/imageupload" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/baseline_add_black_48dp" android:layout_marginTop="30dp" /> <EditText android:id="@+id/et_newdetail" android:layout_width="334dp" android:layout_height="260dp" android:layout_marginLeft="20dp" android:layout_marginTop="30dp" android:layout_marginBottom="10dp" android:background="@drawable/boxline" android:ems="10" android:gravity="top" android:hint="내용을 입력하세요." android:maxHeight="200dp" android:maxLength="200" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="96dp" android:layout_marginBottom="60dp" android:gravity="center" android:orientation="horizontal" android:paddingTop="30dp"> <Button android:id="@+id/upload" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="50dp" android:text="올리기" /> <Button android:id="@+id/cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="취소" /> </LinearLayout> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/newtitle" android:layout_width="35dp" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginTop="90dp" android:text="제목" android:textSize="16sp" /> <TextView android:id="@+id/newname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="12dp" android:layout_marginTop="160dp" android:text="상품명" android:textSize="15sp" /> <TextView android:id="@+id/price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="235dp" android:text="판매가격" android:textSize="13sp" /> <TextView android:id="@+id/newpicture" android:layout_width="35dp" android:layout_height="17dp" android:layout_marginLeft="15dp" android:layout_marginTop="300dp" android:text="사진" android:textSize="16sp" /> <TextView android:id="@+id/newdetail" android:layout_width="35dp" android:layout_height="28dp" android:layout_marginLeft="15dp" android:layout_marginTop="370dp" android:text="내용" android:textSize="16sp" /> </FrameLayout> </FrameLayout></ScrollView> package com.example.joonggo2import android.content.Intentimport android.graphics.Bitmapimport android.graphics.drawable.BitmapDrawableimport android.net.Uriimport android.os.Bundleimport android.provider.MediaStoreimport android.util.Logimport android.widget.Buttonimport android.widget.Toastimport androidx.appcompat.app.AppCompatActivityimport com.bumptech.glide.Glideimport com.example.joonggo2.databinding.ActivityBoardInsideBindingimport com.example.joonggo2.databinding.ActivityMainBindingimport com.example.joonggo2.databinding.ActivityMifBindingimport com.example.joonggo2.databinding.ActivitySellBindingimport com.google.firebase.ktx.Firebaseimport com.google.firebase.storage.ktx.storageimport java.io.ByteArrayOutputStreamclass Sell : AppCompatActivity() { private lateinit var binding: ActivitySellBinding private val TAG = Sell::class.java.simpleName val storage = Firebase.storage private var isImageUpload = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivitySellBinding.inflate(layoutInflater) setContentView(binding.root) binding.upload.setOnClickListener{ val title = binding.etNewtitle.text.toString() val originalname = binding.etOriginalname.text.toString() val price = binding.etPrice.text.toString() val content = binding.etNewdetail.text.toString() val uid = FBAuth.getUid() val time = FBAuth.getTime() Log.d(TAG, title) Log.d(TAG, content) val key = FBRef.writein.push().key.toString() FBRef.writein .child(key) .setValue(BoardModel(title, originalname, price, content, uid, time)) Toast.makeText(this,"게시물이 업로드 되었습니다.", Toast.LENGTH_LONG).show() if(isImageUpload == true) { imageUpload(key) } val intent = Intent(this, AfterLoginmain::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) startActivity(intent) } binding.cancel.setOnClickListener { val intent = Intent(this, AfterLoginmain::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) startActivity(intent) } binding.imageupload.setOnClickListener { val gallery = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI) startActivityForResult(gallery, 100) isImageUpload = true } } private fun imageUpload(key : String) {// Get the data from an ImageView as bytes val storageRef = storage.reference val mountainsRef = storageRef.child(key + ".png") val imageView = binding.imageupload imageView.isDrawingCacheEnabled = true imageView.buildDrawingCache() val bitmap = (imageView.drawable as BitmapDrawable).bitmap val baos = ByteArrayOutputStream() bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos) val data = baos.toByteArray() var uploadTask = mountainsRef.putBytes(data) uploadTask.addOnFailureListener { // Handle unsuccessful uploads }.addOnSuccessListener { taskSnapshot -> // taskSnapshot.metadata contains file metadata such as size, content-type, etc. // ... } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if(resultCode == RESULT_OK && requestCode == 100) { binding.imageupload.setImageURI(data?.data) } }} 위 사진두개는 강의에서 하신 BoardWriteActivity.kt와 역할이 같은 xml과 kt파일입니다. 지금 이 코드에서 글과 갤러리에서 사진을 첨부하는 기능은 모두 구현되어있습니다. 그런데 사진도 메인화면에 뜨게끔 하려니 너무 막막해서 질문드립니다...
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
게시판 만들기에서 게시글 ListView만들기 에서 발생한 문제 질문드립니다.
강의를 보며 개발자님과 똑같이 하지 않고 저에게 필요한 부분들을 제 스타일대로 바꾸면서 듣고 있습니다. 잘 되다 이번에 문제가 생겼습니다. 현재 레이아웃이 겹칩니다.. 어느 부분의 코드를 보여드리야할까요.. 추가적으로 어떤 걸 말씀드려야하는지 알려주시면 더 자세하게 질문하겠습니다. 도와주세요
-
미해결윤재성의 Kotlin 기반 안드로이드 앱 개발 Part4 - 실전 프로젝트
그대로 작성했는데.. 스플래시화면에 로고가 안보입니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. setTheme(R.style.Theme_MapService) 입력 전에는 MainActivity 테마에 로고가 잘 나오는걸 확인했는데요.. setTheme(R.style.Theme_MapService) 입력 후 확인해보면 splash.xml에서 설정한 android:src="@drawable/soft_logo"없이 android:drawable="@color/white"만 보이는데요 무슨문제일까요...
-
미해결1:1채팅 만들기(Android + Kotlin + Firebase)
개복님 말씀대루 다했는데 도중에 앱이 꺼져용
- 개복님 수업 잘듣고 있습니다. 이번에 최신버전 설치해서 말씀하신거 따라 하구 있는데 , 오류가 뜨는건 아닌데 앱을 구동시키니 팅겨버리네요. ㅠ 로그캣에서 에러난 곳을 살펴보니 auth=firebase.auth 여기서 오류가 난거 같습니다. 말씀하신거 중에서는 apply plugin: 'com.google.gms.google-services' 한개 못했는데, 최신버전에는 plugin { id' '} 이렇게 되있는 곳에 ' com.google.gms.google-services ' 집어넣으려고 하니 오류가 떠서 못집어넣었어요. 제가 잘못생각하는 건가용 .. 개복님이 보기에 한심해보이겠지만 ㅠㅠ 도와주세용 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결1:1채팅 만들기(Android + Kotlin + Firebase)
안녕하세요. 말씀하신 import 추가했는데 오류가 또 뜨네요 ㅠ
- 버전은 4.0.1입니다 . 처음에는 최신버전으로 하다가 바꿔서 4.12 로 했구. 방금 4.0.1로 했는데 똑같이 뜨네요 ㅠ 인프런 질문 검색해보니 다른분도 똑같이 질문했던데 답변이 안달렸더라구여. 밑에 사진은 그분거 입니다. 선생님 강의 들으면서 공부하고 있었는데 여기서 막히네요 ㅠ
-
미해결1:1채팅 만들기(Android + Kotlin + Firebase)
안녕하세욤 강의 잘보고 있습니다
- 붙여 넣기 하는 와중에 auth 마지막 부분이 오류가 발생해요. 어떻게 할수 있을까요?? 강의 잘보고 있습니다. 꾸벅 는 1:1 문의하기를 이용해주세요.
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
이미지 이름 오류
drawable 폴더에 splash 이미지 파일이 있는데 왜 이미지뷰에서 스플래쉬이미지가 적용이 안될까요?
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
파이어베이스 익명로그인 강의 09:01 부분 문의
해당 부분 에서 FirebaseAuth, Firebase는 자동으로 import가 되는데 Firebase.auth 부분에서 뒤에 auth가 자동 import가 뜨질 않고 Unresolved reference:auth 에러가 계속 발생합니다. 한 번만 확인해주시면 감사하겠습니다. // LoginActivity package com.fitdback.userinterface import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.Button import android.widget.Toast import com.fitdback.pointdetection.R import com.google.firebase.auth.FirebaseAuth import com.google.firebase.ktx.Firebase class LoginTestActivity : AppCompatActivity() { private lateinit var auth: FirebaseAuth override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login_test) // Initialize Firebase Auth auth = Firebase.auth val btnAnonymousLogin = findViewById<Button>(R.id.btnAnonymousLogin) btnAnonymousLogin.setOnClickListener { auth.signInAnonymously() .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Sign in success, update UI with the signed-in user's information Log.d("LoginTestActivity", "signInAnonymously:success") val user = auth.currentUser // updateUI(user) } else { // If sign in fails, display a message to the user. Log.w("LoginTesetActivity", "signInAnonymously:failure", task.exception) Toast.makeText( baseContext, "Authentication failed.", Toast.LENGTH_SHORT ).show() // updateUI(null) } } } } } // build.gradle(app) apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'com.google.gms.google-services' android { compileSdkVersion buildConfig.compileSdk defaultConfig { applicationId 'com.fitdback.userinterface' minSdkVersion buildConfig.minSdk targetSdkVersion buildConfig.targetSdk versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static' cppFlags "-std=c++11","-frtti", "-fexceptions" } } ndk { abiFilters 'armeabi-v7a' } } // externalNativeBuild { // cmake { // path "CMakeLists.txt" // } // } lintOptions { abortOnError false } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } aaptOptions { noCompress "tflite" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } sourceSets { main { jniLibs.srcDirs = ['libs'] } } } repositories { maven { url 'https://google.bintray.com/tensorflow' } flatDir { dirs 'libs' } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation project(':openCVLibrary341') implementation deps.kotlin.stdlib.jdk // implementation(name:'tensorflow-lite', ext:'aar') implementation deps.android.support.appcompatV7 implementation deps.android.support.constraintLayout implementation deps.android.support.design implementation deps.android.support.annotations implementation deps.android.support.supportV13 implementation deps.timber implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly' implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly' // Import the Firebase BoM implementation platform('com.google.firebase:firebase-bom:29.2.1') // Declare the dependency for the Firebase Authentication library // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-auth-ktx' testImplementation deps.junit androidTestImplementation(deps.android.test.espresso, { exclude group: 'com.android.support', module: 'support-annotations' }) }
-
미해결스프링 핵심 원리 - 고급편
lambda 사용관련하여 질문이 있습니다
강의 매우 잘 듣고 있습니다. 전략패턴 강의를 듣다가 V1 ... V4로 리팩토링 하는 과정에서 람다를 사용하신 것을 보았습니다. 저는 강의를 들으면서 코틀린으로 실습을 진행하고 있는데 ContextV1 context1 = new ContextV1(() -> log.info("비즈니스 로직1 실행")); 코틀린 언어를 사용하는 경우 위와 같이 람다를 사용할 수 없게 됩니다. 물론 저의 코틀린 실력이 부족한 탓이지만 간단한 이슈 때문에 신경쓰여서 다음 강의로 넘어가지 못하고 있습니다 ㅠㅠ 코틀린언어 사용시 위와같은 코드에서 람다를 어떻게 써야하는지 궁금합니다.
-
미해결윤재성의 Kotlin 기반 안드로이드 앱 개발 Part1 - UI Programming
41강 AutoCompleteTextView강의 영상 중 onItemClick 이벤트 관련 질문입니다.
안녕하세요. 41강 영상 13분 부분을 직접 실습해 보면 abcd, abca, abcb, abcc, bbaa, bcab, bdab <--data1 오토컴플리트텍스트뷰 창에 a를 입력했을 때 자동완성으로 뜬 것을 클릭하면 textView2 창에 제대로 된 데이타가 뜹니다. 하지만 b를 입력했을 때 자동완성으로 뜬 것을 클릭하면 엉뚱한 것이 뜹니다. 아마도 b를 입력한 상태에서 뜨는자동완성 리스트 중 첫번째인 bbaa를 포지션 0 값으로 넘겨주기 때문에 발생하는 문제 같습니다. 그렇기 때문에 단순히 data1[position]을 하게 되면 원래 data1의 첫번째인 abcd가 화면에 나오게 되네요. (여기서는 bbaa가 떠야되는데 말입니다) 아마도 OnItemClickListener 인터페이스를 구현하는 과정에서 onItemClick 메서드에 position 값으로 넘어오는 값의 문제 같은데, 이를 해결하는 방법이 없을까요?
-
해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
파이어베이스 사진 여러장 업로드 방법 좀 알려주세요.
당근마켓 같이 상품 올릴때 사진올리잖아요. 그런형태를 원합니다. 그래서 리사이클러뷰 형태로 아이템에 사진이 나오게는 했습니다. private fun imageUpload(key: String) {} saveBtn.setOnClickListener {imageUpload(key) finish()} 강의에서는 1개만 업로드 하셨는데 사진 여러장을 업로드는 어떻게 하나요? 구글링, 유튜브 찾아봤는데 여러장 올리는건 드물고 자바형식에..... 도저히 안되서 질문 드려요.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
프로젝트에서 lombok 사용
[질문 내용]안녕하세요. 저는 코틀린으로 코드를 짜며 수업을 듣고 있습니다. kotlin에서는 빌드 순서때문에 lombok을 적용하기 까다롭다고 알고 있는데, 실무에서 코틀린 프로젝트를 하실 때 lombok적용여부와 만약 lombok을 사용하신다면 적용방법이 궁금합니다! 항상 좋은 강의 감사합니다.
-
해결됨[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
메인 슬라이딩 화면구현 CardStackView 구현 강의 4분 30초쯤 질문드려요!
<com.yuyakaido.android.cardstackview.CardStackView android:layout_width="match_parent" android:layout_height="match_parent"/> 이렇게 작성하니 Class referenced in the layout file, com.yuyakaido.android.cardstackview. CardStackView, was not found in the project or the libraries Cannot resolve class com.yuyakaido.android.cardstackview.CardStackView 이런 에러가 뜨네요 뭐 따로 설치 해야하는건가요??
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
파이어베이스에 글이 정상적으로 입력되었는지 여부를 알 수 있어야
파이어베이스에 글이 정상적으로 입력되었는지 여부를 알 수 있어야 입력완료 메시지를 띄우고 그렇지 않고 글입력 실패일 경우에는 토스트 메시지가 달라질 것 같습니다. 물론 실패할 경우 finish도 실행하지 않게 되겠지요? 파이어베이스로부터 입력 결과를 알아를 확인하는 절차에 관해서도 함께 다루어주세요.