👍 개발 배경

  • 학교 급식과 시간표를 휴대폰으로 한 눈에 보고 싶다
  • 실력을 늘리기 좋은 예제가 필요하다

✌ 프로젝트 설명

  • 기능
    • 로그인
    • 회원가입
    • 급식
    • 시간표
    • 공지사항
      main.PNG
  • 사용 언어, 기술
    • Java
    • PHP
    • MySQL
    • Retrofit (통신)
    • Snoopy (급식 파싱)
    • cafe24 도메인 서버

👌 코드 리팩토링

  • 내부 DB에 유저 정보를 저장하는 코드

      SharedPreferences sharedPreferences = getSharedPreferences("userData",MODE_PRIVATE);
      SharedPreferences.Editor editor = sharedPreferences.edit();
    
      UserList.myID = userModel.getUserID();
      UserList.myName = userModel.getUserName();
      UserList.myPhone = userModel.getUserPhone();
      UserList.myGender = userModel.getUserGender();
      UserList.myMajor = userModel.getUserMajor();
      UserList.myGrade = userModel.getUserGrade();
      UserList.myClass = userModel.getUserClass();
      UserList.myPhoto = userModel.getUserPhoto();
      UserList.autoLogin = "true";
    
      editor.putString("id",UserList.myID);
      editor.putString("name",UserList.myName);
      editor.putString("phone",UserList.myPhone);
      editor.putString("gender",UserList.myGender);
      editor.putString("major",UserList.myMajor);
      editor.putString("grade",UserList.myGrade);
      editor.putString("class",UserList.myClass);
      editor.putString("photo",UserList.myPhoto);
      editor.putString("autoLogin","true");
    
      editor.commit();

    😒 유저 정보를 하나하나 SharedPreferences에 넣고 있음
    😊 SQLITE를 사용하여 DB에 쉽게 Table로 저장

  • 네트워크 연결 여부와 Binding 설정

    private boolean checkNetwork(LayoutInflater inflater, ViewGroup container) {
    
          if (!NetworkCheck.isNetworkConnected(getContext())) {
    
              view = inflater.inflate(R.layout.exception, container, false);
    
              view.findViewById(R.id.imageViewException).setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
    
                      getFragmentManager().beginTransaction().detach(SchoolInfoFragment.this).attach(SchoolInfoFragment.this).commit();
                  }
              });
    
              return true;
    
          }
    
          return false;
    }
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main_page);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 화면 꺼짐 방지

    😒 각각의 Activity에 다 똑같이 위의 코드를 쓰고 있다
    😊 BaseActivity를 만들어 위의 코드를 써준 후 모든 Activity가 상속 받도록 한다

  • 개체의 Id를 찾아 변수 저장

    private void initData() {
          dateNow = binding.textTime;
          schoolTimeText = binding.textSchoolTime;
          timer = new Timer();
    
          schoolNoticeListView = binding.listViewNotice;
          schoolNoticeList = new ArrayList<SchoolNotice>();
          createNoticeButton = binding.createNoticeButton;
    
          spinnerSchoolMeal = binding.spinnerSchoolMeal;
          imageViewSchoolMealTime = binding.imageViewSchoolMealTime;
          schoolMealText = binding.textSchoolMeal;
    
          spinnerSchoolPeriod = binding.spinnerSchoolPeriod;
    
          swipeRefreshLayout = binding.swipeRefreshLayout;
    }

    😒 바인딩 사용법이 잘못됬다
    😊 xml에 Binding을 사용하여 코드 수를 줄이고 사용하기 쉽도록 한다

  • 서버에서 급식을 받아오는 코드

    class SchoolMealTask extends AsyncTask<Void, Void, String> {
    
      String target;
    
      @Override
      protected void onPreExecute() {
          target = "http://rjsdnqkr1.cafe24.com/SchoolMeal.php";
    
          initList();
      }
    
      @Override
      protected String doInBackground(Void... voids) {
          try {
              URL url = new URL(target);
              HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
              InputStream inputStream = httpURLConnection.getInputStream();
    
              BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
              String temp;
              StringBuilder stringBuilder = new StringBuilder();
    
              while ((temp = bufferedReader.readLine()) != null) {
                  stringBuilder.append(temp + "\n");
              }
    
              bufferedReader.close();
              inputStream.close();
              httpURLConnection.disconnect();
    
              return stringBuilder.toString().trim(); // url에서 불러온 값을 하나씩 버퍼에 넣어주어 반환
          } catch (Exception e) {
              e.printStackTrace();
          }
          return null;
      }
    
      public void onPostExecute(String result) {
          try {
              JSONObject jsonResponse = new JSONObject(result);
              String schoolMealBreakfast = jsonResponse.getString("breakfast");
              String schoolMealLunch = jsonResponse.getString("lunch");
              String schoolMealDinner = jsonResponse.getString("dinner");
    
              breakfastString = schoolMealBreakfast;
              lunchString = schoolMealLunch;
              dinnerString = schoolMealDinner;
    
              sortSchoolMeal();
              setSchoolMealSpinner();
              setSchoolMealText();
    
          } catch (Exception e) {
    
          }
      }
    }

    😒 AsyncTask를 통해 길고 불필요한 코드를 사용하고 있다
    😊 Retrofit에서 GET을 사용해 코드를 간단화 한다

  • Retrofit LoginApi 코드
    @FormUrlEncoded
    @POST("UserLogin.php")
    Call<SuccessModel> login(@Field("userID") String userID, @Field("userPW") String userPW);
    😒 Call을 사용하여 여러번의 호출이 있을 수 있다
    😊 RxJava Single을 사용하여 단일 요청, 단일 처리를 하도록 한다
  • 기타
    😒 Activity에 모든 코드를 써서 코드수가 길어지고 가독성이 좋지 않다
    😊 MVVM 디자인 패턴을 사용한다

🙌 마무리

한 학기전 코드를 보니 많이 엉망이다. 한 학기후 나는 얼마나 더 발전할 수 있을지 기대가 된다😁😁