프로젝트/Android Project) 가장 가까운 주유소 찾기 app

가장 가까운 주유소 찾기 (2차 업데이트) 내용 (1)

roder 2022. 9. 9. 21:02

https://github.com/leeugun123/find_gas_station

 

GitHub - leeugun123/find_gas_station: find_gas

find_gas. Contribute to leeugun123/find_gas_station development by creating an account on GitHub.

github.com

 

업데이트가 끝났다...... 

업데이트가 끝나고, 약 1달이 지났다.

업데이트 내용과 유저의 증가수 또 업데이트를 진행하면서 어떤 문제가 있었는지 포스팅 하고자 한다.

 

# 업데이트 내용

1.  recyclerview 맨 위로 올리기

설정 했을때 recyclerView

 

 

이 어플의 정렬 기준은 딱 2가지이다.

1. 가격순 

2. 거리순

 

이 기준으로 recyclerView를 보여줄때 가격순으로 보여준다면 가장 저렴한 기름 값을 우선적으로 보여주고, 마찬가지로 거리순으로 보여준다면 가장 가까운 주유소부터 recyclerview에 차례대로 보여줘야 한다. 그렇다면 가장 가까운것/가장 저렴한 것이 사용자의 View에 먼저 보여야 하는데 설정 후, recyclerView를 보면, 사용자의 View가 리사이클러뷰의 중간에 위치하여 스크롤을 통해 사용자가 맨 위로 올려야하는 불상사가 발생했다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void upRecyclerView(){
 
        //Log.d("TAG", "리사이클러뷰 위로 올리기!");//locationList의 size는 0 이상이다.
 
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
 
            @Override
            public void run() {
                RecyclerView.SmoothScroller smoothScroller = new LinearSmoothScroller(mRecyclerView.getContext()) {
 
                    @Override protected int getVerticalSnapPreference() {
                        return LinearSmoothScroller.SNAP_TO_START;
                    }
                };
 
                smoothScroller.setTargetPosition(NAME.size()); //itemPosition - 이동시키고자 하는 Item의 Position
                //마지막 배열 = 사용자 View 첫번째 List
                mRecyclerView.getLayoutManager().startSmoothScroll(smoothScroller);
 
            }
        },100);
        //핸들러를 사용하여
        // 리사이클러뷰가 완전히 형성된 후 최상단으로 리사이클러뷰 올리기
 
    }
cs

 

upRecyclerView()라는 메소드를 작성 후,  Handler 객체를 생성하여  smoothScroller로 내가 원하는 위치로 스크롤바를 자동으로 위치시켜주는 코드를 구글링을 통해 복사  작성하였다. 

 

 

2.  유저가 설정한 정보를 계속 유지 할 수 있도록 구현

기존에는 자신의 속성 값을 설정 한 후, 어플이 종료되면 값이 초기화되어 또 다시 속성 값을 설정해야하는 불편함이 있었다. 하지만 JetPack 라이브러리인 RoomDB를 사용하여 자신의 설정 값을 계속 유지해 어플을 재실행해도 자신이 설정한 값들이 지속될 수 있게 구현하였다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
 
                //싱글톤 패턴을 사용하지 않고 무조건 강제 실행
                //나중에 문제가 생길 수 있음
                RoomDB db = Room.databaseBuilder(getApplicationContext(),
                        RoomDB.class,"RoomDB-db").allowMainThreadQueries().build();
 
                
                db.setDao().insert(new Set("B027","1000","1"));
 
                Set set = db.setDao().getAll();
 
                oil_intel[0= set.getOil_rad();
                //반경
                oil_intel[1= set.getOil_sort();
                //정렬 기준
                oil_intel[2= set.getOil_name();
                //기름 종류
 
                init_reset();
 
                Log.e("TAG","실행이 됩니다.");
 
                array_first = findViewById(R.id.array_first);
 
                if(oil_intel[1].equals("1")){
                    array_first.setText("가격순");
                }
                else
                    array_first.setText("거리순");
 
 
            }
        },100);
 
        //Handler를 이용하지 않으면 googleMap 오류가 생기므로 핸들러 처리
 
        upRecyclerView();
 
    }
cs

 

오류를 통해 mainThread에서 RoomDB에 접근하는 것이 불가능하다는 것을 깨달았다. 이 부분에서 구글링을 통해 알아보니

MainThread에서 RoomDB에 접근하는 것이 매우 무거운 작업이이 때문에  UI가 잠길 수 도 있다는 문제가 있다는 것을 알게 되었다.

 

이를 allowMainThreadQueries()를 통해 일단 MainThread에서 실행 할 수 있게 하였으나 만약 데이터의 속성 값이 점점 커질 경우 그에 따른 이슈가 생길 수 있기 때문에 다음 업데이트를 할 때 이 부분에 대해 충분한 고려가 필요하다.

 

또한 배포를 했을 때 값이 들어있지 않는 속성에 계속 접근하려다보니 어플이 튕기는 문제가 발생하였다. 이후 비어있는 속성에  초기값을 설정하여  NullPointerException을 방지하여 어플이 정상 작동 할 수 있게 하였다.

 

이 과정에서  CS를 알고 프로그래밍을 하는 것과 모르고 코딩하는 것의 차이를 알게 되었다.

학부 시간 때 배우는 전공지식이 단순히 학점을 채우기 위해서 듣는 것이 아닌

코더와 프로그래머의 차이가 이런 CS 지식을 아냐 모르냐의 차이라는 것을 통해 다시 한번 CS의 중요성을 깨닫게 되었다.

 

진정한 개발자라면 스택, 툴을 잘 다루는 것 뿐만 아니라 기본적인 CS지식을 바탕으로 내가 만든 코드가 미칠 수 있는 부분을 고려하고, 이후 나중에 큰 이슈가 생기지 않게 프로그램을 설계해야 한다는 것을 다시 한번 상기시키게 되었다.