대한민국 일반인이라면 누구나 신용등급을 갖고 생활하게됩니다.

다만 어떻게 산정되는것이며 점수와 등급은 어떻게 이루어지는지 모르는 경우가 대부분일 것입니다.

 

필자역시 어떤 점수가 어떤등급으로 산출되는지 단순한 호기심으로 조사를 해보았습니다.

 

 

먼저 우리나라 신용등급 평가기관으로는 nice지키미와 올크레딧이 있습니다.

nice지키미
올크레딧

위와 같이 기관이 2개가 있고, 이 2기관은 상호협력적 상호 배타적도아닌 독립적인 기관이기 때문에 제 각각의 기준을 가지고 저희를 평가하게됩니다.

 

그렇기에 저희의 신용점수와 등급은 저 2개의 기관이 따로따로 채점을 하기에 다르게 나올수도 있는것입니다.

 

그럼 2기관의 신용점수와 그에 매칭되는 등급은 어떻게 되는것일까요? 바로 아래와 같은 표로 이루어진다고합니다.

점수별 신용등급표  (추론)
신용등급 올크레딧(KCB) NICE지키미
1등급 1000~942 1000~900
2등급 941~891 899~870
3등급 890~832 869~840
4등급 831~768 839~805
5등급 767~698 804~750
6등급 697~630 749~665
7등급 629~530 664~600
8등급 529~454 599~515
9등급 453~335 514~445
10등급 334~0 444~0

 

왜 추론이냐면, 두 기관 모두 공식적으로 점수와 등급을 발표를하지는 않았기때문입니다.

 

그럼 위의 표는 무엇이냐고 질문하실 수 있는데, 이는 각점수별로 각각의 등급을 갖은 사람들의 데이터를 취합해보니 대략 위와 같은 표의 점수와 등급표를 추론할 수 있는것이었고, 수 많은 사람들이 자기점수와 등급을 알고있다보니 99%의 정확도에 맞게 도출해낼 수 있게 된것이지요.

 

 

대게 올크레딧이 NICE지키미보다 점수를 후하게 준다고합니다.

 

또한, 올크레딧이 신용정보변동사항에 대해 점수 반영이 빠른편이기도 합니다.

 

위의 표를 조사해보면서 신용등급을 올리는요소와 내리는 요소에 대해 살펴보았는데

 

결론부터 내리자면 올리기는 정말 더럽게? 힘들고 점수와 등급이 내리는건 한순간이라는것을 알게 되었습니다.

 

 

추가로 신용등급을 가장 빨리 내리게하는것은 대출인데 

 

그와중에 2금융 3금융 (단기카드, 장기카드론 포함)에서 받는 대출은 치명적이라 할 수 있습니다.

 

물론 갚으면 다시 회복하긴하지만, 회복하는데 걸리는 시간은 꽤 드는편입니다.

 

대출은 받으면 바로 깎이면서....

 

요즘같은시대에 대출을 받아서 투자를하면 더욱 돈을 벌 수 있는 시대라서 대출은 필수이긴하겠지만

 

너무 과하게 대출을 받으시면, 신용등급이 내려가기에 대출이 힘들어지게 되고,

 

정말 투자를해야할때 돈이없어서 발이 묶이는 상황이 올 수 있습니다.

 

그러니 신중하게 대출을 받으시면서 신용점수와 신용등급 관리를 하시기바랍니다.

최신 안드로이드 버전 (P OS이후?) 부터는 List view보다는 Recycler View를 사용하는게

구글에서도 권고되는 사항인데요.

 

Recycler view를 다루는게 매번 헷갈리고 어렵고 힘든것같아서 이참에 뼈대코드도 작성해보고

포스팅하기로 마음먹었습니다.

 

 

바쁘신분들은 아래 링크를 눌러서 소스코드를 바로확인해보시기 바랍니다.

https://github.com/control-man/android-simple-sample/tree/master/recycler_view_simple_exam

 

 

Recycler view 구현 예제 (Cow를 눌러서 Toast 가 출력되고 있음)

 

1. res/layout/activitiy_main.xml 작성

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
        android:id="@+id/rvAnimals"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

Recycler view를 생성해줍니다.

 

2. res/layout/recycler_row.xml 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="10dp"
    android:background="?android:attr/selectableItemBackground">
 
    <TextView
        android:id="@+id/tvAnimalName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20dp"/>
</LinearLayout>
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

Recycler view에서 각각의 item에 대한 view를 만들어줍니다.

여기선 LinearLayout안에 Textview한개를 두는 방식으로 배치할 것입니다.

 

 

3. MainActivity.java

MainActivity안에서 inner class인  MyRecyclerViewAdapter 를 정의합니다.

 

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public static class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {
 
        private List<String> mData;
        private LayoutInflater mInflater;
        private ItemClickListener mClickListener;
 
        // data is passed into the constructor
        MyRecyclerViewAdapter(Context context, List<String> data) { //// todo check
            this.mInflater = LayoutInflater.from(context);
            this.mData = data;
        }
 
        // inflates the row layout from xml when needed /////todo check
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = mInflater.inflate(R.layout.recycler_row, parent, false);
            return new ViewHolder(view);
        }
 
        // binds the data to the TextView in each row
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            String animal = mData.get(position);
            holder.myTextView.setText(animal);
        }
 
        // total number of rows
        @Override
        public int getItemCount() {
            return mData.size();
        }
 
 
        // stores and recycles views as they are scrolled off screen
        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            TextView myTextView;
 
            ViewHolder(View itemView) {
                //todo check
                super(itemView);
                myTextView = itemView.findViewById(R.id.tvAnimalName);
                //todo very important ---- if don't comment it's not ripple effect..........!!!!!!!!!!!!!!!!!!!
                 itemView.setOnClickListener(this);
            }
 
            @Override
            public void onClick(View view) {
                if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
            }
        }
 
        // convenience method for getting data at click position
        String getItem(int id) {
            return mData.get(id);
        }
 
        // allows clicks events to be caught
        void setClickListener(ItemClickListener itemClickListener) {
            this.mClickListener = itemClickListener;
        }
 
        // parent activity will implement this method to respond to click events
        public interface ItemClickListener {
            void onItemClick(View view, int position);
        }
    }
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

어댑터의 멤버필드로는 recycler view의 item을 표시하기 위해 필요한 mData가 있으며,

또한 recycler view의 해당하는 position을 클릭하였을때 응답하기위한 리스너 interface 를 들고있습니다.

 

Adapter내부로 ViewHolder 클래스와 ItemClickListener를 가지고 있습니다.

ViewHolder클래스는 recycler view의 item들을 구성하는 resource를 갖고오기 위해 사용되는 클래스이고

 

 

실제적으로 사용자눈에 보여지기위해 그려지는 부분은 Adpater 클래스의 onBindViewHolder 에서 완성되게 됩니다.

 

 

4.MainActivity.java

아래는 MainActiviity onCreate에서 recycler view를 그려주기위한 생성과정입니다.

Recylcer view를 구성하기위한 item 객체를 준비해야하며,

recycler view의 resource를 찾아와서 layout 설정을 해주고,

adpater를 생성하여 item 객체를 주입시키고, click listener 역시 연결해줍니다.

마지막으로 reycler view에 adpater를 연결 시켜주게되면 recycler view가 출력됨을 확인하실 수 있습니다.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // data to populate the RecyclerView with
        ArrayList<String> animalNames = new ArrayList<>();
        animalNames.add("Horse");
        animalNames.add("Cow");
        animalNames.add("Camel");
        animalNames.add("Sheep");
        animalNames.add("Goat");

        // set up the RecyclerView
        RecyclerView recyclerView = findViewById(R.id.rvAnimals);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        //todo common context가 아닌 this?
        adapter = new MyRecyclerViewAdapter(this, animalNames);
        adapter.setClickListener(new MyRecyclerViewAdapter.ItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(getApplicationContext(), "You clicked " + adapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show();
            }
        });
        recyclerView.setAdapter(adapter);

    }

 

 

안드로이드 앱을 개발하시다보면 앱이 업데이트되어서,

최신버전을 받을수있도록 앱스토어로 사용자가 가게끔 해야하는 경우가 있습니다.

 

어떤 아키텍쳐로 가져갈까 고민을 해보면 결국 서버가 필요하다는것을 모두 느끼실겁니다.

하지만 저같은 가난한 개발자의 경우는 서버 운영비용도 없기에 어떻게 해야할까

고민을 했는데, 그해답을 Google이 제공하는 Firebase를 이용하면 가능할 수 있음을 

알게 되었습니다.

 

구글 Firebase

Remote config를 사용하시려면 사전에 Firebase세팅이 끝나셔야 합니다.

 

1. Remote Config 파라메터 설정

https://console.firebase.google.com/project/lottomagic-b574d/config

위의 주소로 들어가신다음 앱에서 요청하여 받을 remote config를 추가하거나 수정 및 삭제 하실 수 있습니다.

로또매직 앱의 latest version을 앱에 알려주기 위해 아래와 같이 셋팅했습니다.

 

Remote config

2. app/src/main/res/xml/remote_config_defaults.xml

위의 경로의 xml을 추가해주고 아래와 같은방식으로 작성합니다.

작성하는 이유는, remote config를 읽어오는것을 실패하게되면 기본값으로 받아올 수 있는값을

설정하기 위함입니다.

<?xml version="1.0" encoding="utf-8"?>
<!-- START xml_defaults -->
<defaultsMap>
  <entry>
    <key>latest_version_code</key> 
    <value>0</value>
  </entry>
</defaultsMap>

 

 

3. app/build.gradle

gradle설정을 아래와 같이합니다.

...

implementation 'com.google.firebase:firebase-config:18.0.0'

....

 

4. app/src/main/java/com/jinlab/android/lottomagic/remote/config/RemoteConfigManager.java

    public void init() {
     mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
     if (BuildConfig.DEBUG) {
      L.d(TAG, "debug config");
      mFirebaseRemoteConfigSettings = new FirebaseRemoteConfigSettings.Builder()
       .setMinimumFetchIntervalInSeconds(60 * 10) // 10 mins
       .build();
     } else {
      // Release
      mFirebaseRemoteConfigSettings = new FirebaseRemoteConfigSettings.Builder()
       .setMinimumFetchIntervalInSeconds(ONE_DAY_SECONDS)
       .build();
     }
     mFirebaseRemoteConfig.setConfigSettingsAsync(mFirebaseRemoteConfigSettings);
     mFirebaseRemoteConfig.setDefaultsAsync(R.xml.remote_config_defaults);
    }

위의 매니져 클래스에 init부분을 정의하고 MainActivity가 열릴때 init메서드를 호출하게끔 구현하였습니다.

init메서드에서는, remote config를 셋팅하는데, 디버그버전일때는 10분에 한번씩 firebase 서버에서 fetch할 수 있도록하였고, 실제 릴리즈버전에서는 하루가 지나야 fetch하도록 하였습니다.

 

구글에서는 실시간으로 앱에서 정보를 받아오는 목적이라면 remote config가 아닌 실시간 데이터베이스를 사용하라고 권장하고있습니다.

 

로또매직의 앱업데이트같은경우는 매번 쿼리를 날리는게 아니라 하루에 한번정도면 족하다라고 생각하여 remote config로 구현하였습니다.

 

 

 

5. app/src/main/java/com/jinlab/android/lottomagic/remote/config/RemoteConfigManager.java

 

MainActivity에서 remote config를 fetch하고 사용할 수 있도록 다음과 같은 wrapper 메서드를 생성하였습니다.

    public void fetchAndActivate(Activity activity, OnCompleteListener < Boolean > onCompleteListener) {
        mFirebaseRemoteConfig.fetchAndActivate().addOnCompleteListener(activity, onCompleteListener);
    }

 

 

 

6. app/src/main/java/com/jinlab/android/lottomagic/main/ui/MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        // Remote config
        RemoteConfigManager.getInstance().init();
        RemoteConfigManager.getInstance().fetchAndActivate(thisnew OnCompleteListener<Boolean>(){
            @Override
            public void onComplete(@NonNull Task<Boolean> task) {
                if (task.isSuccessful()) {
                    boolean updated = task.getResult();
                    L.d(TAG, "Config params updated: " + updated);
                    try {
                        mLatestVersionCode = Integer.parseInt(RemoteConfigManager.getInstance().getString(LATEST_VERSION_KEY));
                        if (mLatestVersionCode > BuildConfig.VERSION_CODE) {
                            showUpdatePopup();
                        }
                    } catch (NumberFormatException e) {
                        L.e(TAG, "NumberFormatException for mLatestVersionCode");
                        mLatestVersionCode = 0;
                    }
                } else {
                    L.e(TAG, "Fail to load remote config");
                }
            }
        });
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

MainActivity에서는 remote config fetch가 성공하고 active가 되는시점의 리스너를 등록하였습니다.

현재버전과 firebase로부터 받은 latest version을 비교하여, Firebase에 올린 latest version의 정보가 더높은경우 

update popup이 뜨도록 구현하였습니다.

 

 

7.  app/src/main/java/com/jinlab/android/lottomagic/remote/config/RemoteConfigManager.java

    public String getString(String key) {
        return mFirebaseRemoteConfig.getString(key);
    }

fetch가 성공하면 Firebase에 설정해놓은 파라메터의 value를 받아올 수 있습니다.

 

 

 

Fetch의 시간이 10분이라면, 10분뒤에 remote config를 원격의 firebase에서 받아오게 됩니다.

만약 10분전에 운영자가 Firebase remote config를 추가하거나 update하고나서,

곧바로 앱에서 fetch를 요청하게되면 반영된값을 받아오지못하고 이전에 firebase에 반영되어있는 값을 리스너에서 받을수있습니다.

즉 10분이 지나서야 요청하게되면 새로 생신된 값을 받아오게 됩니다.

 

 

성공적인 구현 기원합니다.

 

 

Remote config로 App update logic을 추가한 로또매직 구경하러 가기

 

 

*참고

RemoteConfig 구글 가이드
https://firebase.google.com/docs/remote-config/use-config-android

 

Android에서 Firebase 원격 구성 시작하기

Firebase 원격 구성으로 클라우드에서 앱의 매개변수를 정의하고 값을 업데이트하면 앱 업데이트를 배포하지 않고도 앱의 모양과 동작을 수정할 수 있습니다. 이 가이드에서는 시작하는 단계를 안내하고 샘플 코드를 제공합니다. 샘플 코드는 firebase/quickstart-android GitHub 저장소에서 클론하거나 다운로드할 수 있습니다. 앱에 Firebase 추가 Android 프로젝트에 Firebase를 추가하지 않았다면 먼저 추가합니다. Andr

firebase.google.com

 

+ Recent posts