[Intel] 16주차 회고록

LHW·2023년 11월 3일
0

Intel교육과정

목록 보기
15/15

Intel AI for Future workforce 16주차 회고록

🤖 Android Studio 심화

이번주는 계속 사용해오던 Android Studio를 약간 심화시키는 한 주였다. DB연결과 연동하여 문서 관리 애플리케이션을 만들었는데, 공문서에 지식이 전무하다 보니 코드를 짜는 것 보단 기능을 생각해내는게 힘들었던 한 주였던 것 같다.

이번주는 공문서 관리 프로그램을 만드는게 거의 주였기에 이번 게시글은 내가 만들었던 공문서 관리 애플리케이션에 대해서 리뷰하려고 한다.

MainActivity

로그인 화면을 담당하는 MainActivity이다. 크게 기능을 나누자면 두 개의 기능을 구현했다.

  • 로그인 : 회사의 한 사원이 입력하는 ID와 PW에 대해서 DB에 등재된 PW와 일치하지 않으면 ID 혹은 PW를 확인하라는 Toast 메세지를 띄운다.

  • 사원등록 : 새로 입사한 사원의 경우 아직 DB 테이블에 해당 사원의 정보가 없을 것이기에 직접 정보를 등록할 수 있는 사원 등록 Activity로 이동할 수 있는 버튼을 만들었다.

MainActivity에서는 하나의 피드백을 제공받았는데, 그 내용은 아래와 같다.

사원등록의 경우 실제 프로그램에서는 없을법한 기능이라고 하셨다. 실제로 이런 문서 관리 애플리케이션을 사용하는 큰 회사의 경우, 사원의 비밀번호 정도만 받아서 ID는 사번으로 설정하고, PW만 해당 사원이 불러주는 PW로 설정한다고 하셨다.

✔ SignUp Activity

사원등록 액티비티이다. 딱히 별다르게 무언갈 사용하지는 않았고, DB에 이미 등록되어 있는 정보라면 다시 MainActivity로 전환시켜서 다시 로그인하게끔 했고, 신규 등록의 경우 PW1과 PW2가 일치해야만 등록이 되게끔 진행했다.

여기서도 한 가지의 피드백을 받았는데, 그 내용은 아래와 같다.

물론 현재 하고 있는 방식도 동작은 하니 상관없다만, 좀 더 편하게 하고 싶다면 DB 테이블 내부에서 Unique 제약조건을 설정한다면 좀 더 편하게 할 수 있을 것이라고 하셨다.

📃 MenuList Activity

사원이 로그인을 완료하고 나면 확인할 수 있는 네 가지 기능이 보여지는 액티비티다. 그 내용은 아래와 같다.

    1. 새 문서 기안하기
    1. 모든 공문서 확인하기
    1. 미결재 문서 확인하기
    1. 결재하기

MenuList Activity에서는 각 기능을 담당하는 액티비티로 전환하는 메소드들밖에 없으며, 결재 메소드로 이동할 때는 직급이 대표이사이거나 대표가 아닌 이상은 결재 권한이 없다는 Toast 메세지를 표출하는 정도로 마무리했다.

여기는 마땅한 피드백은 없었지만, 새로 넣었으면 하는 기능은 있었다.

결재 라인 형성

강사님의 예시를 보면서 느꼈던 거지만, 결재라는게 대표님이나 대표이사님만 진행하는게 아니라, 특정 다수의 결재가 필요한 경우도 있을 것이다. 이럴때는 결재 라인을 형성해서 특정 인원이 결재를 완료하고 나면 그 다음 사람에게 공문서가 표출되도록 하는 기능을 넣고 싶다.

결재 반려 목록 확인

모든 문서가 결재되는 일은 결코 없을 것이다. 내용을 확인하고 이건 좀.. 하는 느낌이 든다면 결재를 반려시키는 경우도 있을 것이다. 이런 경우에는 결재 반려당한 문서가 있다는 전제 하에 해당 사원의 MenuList Activity에 반려 당한 문서가 있다는 TextView를 Set하고, 반려 사유와 이유를 확인할 수 있게끔 조치하는 경우도 있으면 좋을 것 같다.

📝 NewDoc Activity

새 문서를 기안하는 기능을 담당하는 액티비티다. 여기서 넣었던 핵심 기능은 아래와 같다.

  • 문서번호 할당 자동화
    DB에서 가장 큰 문서 번호를 MAX함수로 가져와서 새 글을 DB에 INSERT하기 전에 1씩 더해서 INSERT한다.
  • 작성일자를 현재 날짜와 시간으로 삽입하기
    작성 일자의 경우 JAVA의 DateTimeFormatter를 활용하여 현재 시간을 INSERT한다.

📑 DocList Activity

모든 공문서를 확인할 수 있는 Activity이다. 게시판처럼 레이아웃을 구성했고, 각 공문서의 제목을 누르면 상세한 정보를 확인할 수 있는 Detail Activity로 이동할 수 있게 했다.

위에서 언급했던 것 처럼, 기능 네 가지 중에는 모든 공문서를 확인할 수 있는 Activity와 결재 대기중인 문서만 확인할 수 있는 Activity가 있는데, 이 두 기능을 현재 이 DocList Activity에서 처리한다.

MenuList Activity에서 Intent를 생성할 때, stringExtra를 넘기는데, mode라는 이름으로 docList라는 String과 check라는 String으로 넘긴다. 이 mode라는 String에 따라 query문에 변화를 주고 있다. 아래의 코드를 참고하자.

if (mode.equals("docList")){
     query = "SELECT DOC_NAME, WRITER, TO_CHAR(WRITE_DATE, 'YYYY-MM-DD') FROM DOCUMENT ORDER BY WRITE_DATE";
}else{
     query = "SELECT DOC_NAME, WRITER, TO_CHAR(WRITE_DATE, 'YYYY-MM-DD') FROM DOCUMENT WHERE ISAPPROVED='결재 대기' ORDER BY WRITE_DATE";
}

그리고 여기서는 약간 고민을 했던 부분이 있다. 지금까지 해오던 방식의 경우에는 layout파일에 TextView를 설정하고 거기에 setText를 사용해서 글자들을 띄우곤 했는데, DB내부에 공문서 데이터는 계속 쌓일테고, 그렇다면 동적으로 계속 텍스트들을 띄워야 한다는 건데... 어떡하지...

이는 동적으로 그냥 생성해서 해결했다(?). 아래의 코드를 참고하자.

String[] newData = stringBuffer.toString().split(",");

int idx = 0;
for (int i = 0; i < newData.length / 3; i++) {
    TextView newTitle = new TextView(getApplicationContext());
    newTitle.setWidth(188);
    if (newData[idx].length() >= 13){
        newTitle.setText(newData[idx].replace(newData[idx].substring(11), "..."));
    }else{
        newTitle.setText(newData[idx] + "\n");
    }
    newTitle.setTextSize(17);
    newTitle.setTypeface(Typeface.SERIF, Typeface.BOLD);

    TextView newWriter = new TextView(getApplicationContext());
    newWriter.setWidth(108);
    newWriter.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
    newWriter.setText(newData[idx+1] + "\n");
    newWriter.setTextSize(17);
    newWriter.setTypeface(Typeface.SERIF, Typeface.BOLD);

    TextView newWriteDate = new TextView(getApplicationContext());
    newWriteDate.setWidth(117);
    newWriteDate.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
    newWriteDate.setText(newData[idx+2] + "\n");
    newWriteDate.setTextSize(17);
    newWriteDate.setTypeface(Typeface.SERIF, Typeface.BOLD);

    TableRow newRow = new TableRow(getApplicationContext());
    newRow.addView(newTitle);
    newRow.addView(newWriter);
    newRow.addView(newWriteDate);

    newRow.setOnClickListener(new View.OnClickListener(){
          @Override
          public void onClick(View v){
                Intent toDetail = new Intent(DocList.this, Details.class);

                toDetail.putExtra("title", newTitle.getText().toString());
                toDetail.putExtra("userName", userName);
                toDetail.putExtra("userGrade", userGrade);
                startActivity(toDetail);
         }
   });

   TableLayout table = findViewById(R.id.tableLayout);
   table.addView(newRow);

   idx += 3;
}

코드가 쓸데없이 길다.. 하나씩 살펴보면

    1. 공문서 제목, 작성일, 작성자를 담을 TextView 객체를 따로 3개를 생성하되, 넓이와 textAlign, font, font option을 설정한다.
    1. 이렇게 생성한 세 개의 TextView 객체를 TableRow 객체를 만들어 그 안에 담는다.
    1. 그 Row를 layout에 배치되어 있는 TableLayout에 삽입한다.
    1. 이를 데이터베이스에 있는 행의 개수만큼 반복한다.

근데 이런 방식을 사용하긴 할까 싶었는데 아니나다를까 강사님은 ListView라는 걸 사용하셨고, 다른 블로그나 인터넷을 찾아보니 요즘은 RecyclerView를 많이 사용한다고 한다...

그래도 혼자 생각해냈다는 것에 뿌듯했는데... 안쓰는 방식이라니... 😂

📌 Approve Activity

결재 진행 액티비티다. 여기서는 위에서 본 긴 코드와 같은 걸 사용해서 동적생성을 진행하되, 공문서 제목 부분은 CheckBox로 구성해서 박스 내부에 텍스트로 공문서 제목을 set하는 방식으로 진행했다.

결재할 문서들을 체크하고 결재하기 버튼을 누르면 결재가 완료되게끔 해서 기능은 끝 !

느낀 점

에뮬레이터 깜빡이는 현상 도대체 어떻게 고치는건데....

그리고 생각보다 사양이 중요한 것 같았다. 기능 하나 뭐 잘못 넣었더니 에뮬레이터가 스스로 꺼져버리기도 하는 현상을 확인했기에....

이제 다음주 화요일부터는 조별로 어플 만들기 프로젝트를 진행한다고 하시는데 또 주제 생각한다고 머리가 엄청 아플거같다.. 파이팅하자..😂

profile
하루가 다르게 성장하기

0개의 댓글