[TIL][내일배움캠프]

[내일배움캠프][TIL] 24.03.07 (목) - 최종 프로젝트 3주차 : 개발 8일차

kimlaurant 2024. 3. 7. 21:27
1. 최종 프로젝트 3주차

 

어느덧 MVP를 완성해야 할 시간이 약 이틀밖에 남지 않았다.

이제는 필수적인 기능들은 거진 완성하고, 남은 시간 동안 버그는 없는지 검토해야 하는데 아직 필수적으로 구현하려 했던 기능 중 하나인 좋아요 기능은 쩔쩔매고 있고, 날씨 기능은 시작도 하지 못했다.

 

이러다 MVP도 다 구현하지 못하는 게 아닐까하는 불안감이 드는 와중, 개발 외적인 부분에 시간을 들여야 하는 순간이 왔다.

 

 

구글 플레이스토어 앱 등록하기

 

바로 구글 플레이스토어에 우리가 만든 앱을 등록하는 절차를 진행해야 한다.

 

특히나 최근 들어서 구글 앱 심사가 꽤나 까다로워져서 사전에 적어야할 것들이 꽤나 많았다.

 

아래는 최근에 새로 바뀐 테스트 요구사항이다.

 

새로운 개인 개발자 계정의 앱 테스트 요구사항 - Play Console 고객센터 (google.com)

 

 

앱 비공개 테스트 절차

막 이것저것 적으라는 것들을 적고, 수정해야 하는 부분들을 다 수정하고 다 끝내고 보니 6시간이 지나갔다.

 

어이쿠. 확실히 뭔가가 굉장히 복잡했다.

 

 

산 리스트 Fragment에서 산을 클릭하면 DetailActivity로 이동

 

이렇게 테스트 절차를 끝낸 다음에 다시 개발에 착수했다.

마침, 오늘 드디어 산 리스트 Fragment가 완성되어서 이제 직접 연결시키는 작업을 하였다.

 

메커니즘은 다음과 같다.

 

  1. 산 리스트 Fragment에서 산을 클릭하면, 산 리스트 Fragment에 있는 정보 중에서 산 이름을 골라서 Intent 형식으로 DetailActivity에 전달한다.
    binding.ivSelectedImage.setOnClickListener {
        Log.d(TAG,"Selected Image $sanName")
        val intent = Intent(requireActivity(), SanDetailActivity::class.java)
    
        if (sanName == null) {
            intent.putExtra("name","계룡산")
        } else {
            intent.putExtra("name", sanName)
        }
        startActivity(intent)
    
    }​
  2. DetailActivity에서 이 Intent를 받는다.
    val sanName = intent.getStringExtra("name") ?: ""​
  3.  이 Intent로 이제 각 산의 데이터를 구별해서 받으면 된다.
    firestore.collection("sanlist")
    .get()
    .addOnSuccessListener { documents ->
        for (document in documents) {
            if (document["name"] == sanName) {
                val sanlist = SanDetailUiState(
                    document.getString("name") ?: "none",
                    document.getString("address") ?: "none",
                    document.getLong("difficulty") ?: 0,
                    document.getDouble("height") ?: 0.0,
                    document.getLong("time_uphill") ?: 0,
                    document.getLong("time_downhill") ?: 0,
                    document.getString("summary") ?: "none",
                    document.getString("recommend") ?: "none",
                    document.getBoolean("isLiked") ?: false
                )​

다음은 이 결과다.

 

 

각 산마다 다른 데이터를 보여주고 있는 것이 아주 잘 되고 있다.

이제 거의 다 왔구나!

 

 

그런데 사실 이걸 구현하면서 한 가지 문제점이 있었다.

 

현재 저 Intent는 onCreate()에 선언되어 있다.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        _binding = ActivitySanDetailBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val sanName = intent.getStringExtra("name") ?: ""
        Log.d(TAG, "산이름 : ${sanName}")

        initData()
        initImage()

        initBackButton()
    }

 

그런데 이렇게 onCreate에 선언을 하니 막상 private fun으로 작성된 다른 함수에서는 인식을 하지 못하는 문제가 생겨서 저 Intent 선언을 각각 따로 해야 써지더라.

 

그러다보니 불필요하게 코드를 쓰는 것이 아닌가하는 생각이 들었지만, 이렇게 적은 데에는 다 이유가 있다.

 

처음에는 onCreate 바깥에

private val sanName = intent.getStringExtra("name") ?: ""

 

이렇게 먼저 선언을 하고나서 실행해봤는데 바로 앱이 강제종료 되었다.

알고보니 sanName이 null값을 받더라.

 

왜 이런 현상이 일어나는지, 그리고 이걸 어떻게 고쳐야하는지 여러 시간을 들였지만, 결국 채택한 방법이 바로 저것이다.

 

 

아직 좋아요 기능과 날씨 기능은 완성되지 못했지만, 적어도 산 리스트를 클릭했는데 아무것도 안 뜨거나 앱이 강제종료되는 불상사는 막았으니 그래도 앱의 구실은 하고 있잖아? 하하하하