비전공자의 코딩 일지/학원 수업 정리

코딩 학원 24일차(MVC 패턴, Json과 SQL)

Hoder2 2022. 7. 9. 12:39

오늘 오전에는 어제 하던 배민DB 작업을 마무리 했다.

 

그 중에서도 전체 메뉴가 있으면 1 페이지당 메뉴 갯수를 정한 뒤 이용자가 입력한 페이지의 숫자에 해당하는 메뉴만 출력이 되는 작업을 하였다.

 

일단 전체메뉴갯수가 나오게만 만들어보라하셨다.

지금까지 만든 것 처럼 조회할 때 마다 DB에 연결해서 값을 보여주는 형식으로 소스를 짰는데 강사님이 그럴필요가 있겠냐며 그냥 멤버변수 하나 만들어서 그곳에 값을 저장해 놓고 프로그램 첫 시작 시 그 갯수를 띄어주고 메뉴 등록 기능에 등록 성공 시 Count ++가 되게 하면 되지 않겠냐고 하셨다.

전체 메뉴 갯수 출력 기능
멤버변수
정보 업데이트 성공할 시 카운트 갯수 늘어남.

싱글턴 패턴을 쓴 중요한 이유 중 하나가 일반적인 객체로 위 소스를 전개할 시 계속해서 새로운 객체가 생겨나면서 카운팅 하는 숫자를 셀 수가 없고 그냥 static을 써버리면 아예 쓸 수 조차 없기에 싱글턴으로 한다.

 

그럼 이제 페이지 설정을 해보자.

 

전체 메뉴 수에서 설정한 페이지(나는 1페이지 당 3개로 지정했다.)를 나누는게 기본일 것이다.
만약 16개의 메뉴가 있다면 3으로 나눴을 때 5.1이 되고 총 6페이지가 나와야 되는데 그럴려면 올림이 필요하다.

(allMenuCount는 아까 만든 전체 메뉴 수 값을 담은 변수고 munuPerPage는 내가 설정한 페이지당 메뉴 갯수이다.)

 

그냥 올림 기능이 있었다. 위 주석은 강사님이 우리들에게 바라는 올림 기능을 사용하기 위한  생각의 흐름도이다.

이제 입력한 페이지 번호에 해당하는 메뉴가 나오게 하자.

 

아까 만들었던 pageCount를 멤버변수로 만들어주고 값을 저장해준 다음

 

기본적인 틀은 같지만 sql에서 페이지의 범위를 적용해줄 rownum(rn)의 범위를 지정해 주기 위해 이용자가 입력한 값을 통해 3페이지에 해당하는 범위를 지정해야한다. ex) 1입력시 1, 2, 3 번째 해당하는 메뉴가 나오게끔
그러기 위해 입력한 값을 토대로 시작 범위(start)와 끝 범위(end)의 값을 설정해준다음 setInt를 통해 넣어준다.

 

end 같은 경우 내 메뉴의 갯수가 13개 있다면 5페이지 까지 있다는 것인데 그때 이용자가 5페이지를 입력한다면 13, 14, 15 번째에 해당하는 메뉴가 나오게 설정이 되더라도 딱히 문제가 없기에 별다른 설정 없이 저 소스를 사용해도 된다.

 

그리고 실행했더니 오류 떠서 보니까 rs = 어쩌구 쿼리 이게 setInt 위에 있었어서 밑으로 옮겨 줬다. (학원 형이 찾아주셨다.)

 

지금 우리가 하는 MVC 패턴 같은 경우 콘솔창에 출력하는 것이기에 String으로 뽑아내고 있지만 사실 진짜 디자이너에게 값을 줄 때는 배열로 만들어서 준다고 한다.

 

소스를 바꿔쓰자면

 

전에 DTO용으로 만들었던 객체 MenuInfo를 통해 rs.next 한 값들을 객체로 만들어주고 그 객체를 계속해서 컬렉션에 추가해준다.

 

그리고 그 컬렉션을 받아서 출력해줄 메소드를 V 쪽에 만들어주고

 

C에서 컨트롤 한다.

 

그리고 위에서 Java는 진짜 끝이라며 우리들에게 어떻게 하고 싶냐고 물어보셨다.

그냥 이대로 웹 기초로 넘어갈지 아니면 복습을 좀 더 할지 사람들끼리 일주일 정도의 미니프로젝트를 하나 해볼지 말이다.

사람들이 다 딱히 대답이 없길래 내가 Json으로 데이터 가져오고 파싱해서 바로 DB에 넣는 작업을 해보자고 말씀드렸다. 그랬더니 그거 괜찮네 하면서 바로 시작 되었다. 내가 하자고 했는데 시작 부터 머리가 어질어질하다.

 

http 통신 걸어서 콘솔출력 먼저 해보잖다.
파싱할 데이터는 모기로 정했다.

 

내 DB라면 파싱을 할 필요가 없지만 파싱을 하겠다는건 남의 DB를 가져오겠다는 것이다.

 

하루에 한번씩 실행하면 그날 모기지수를 내 DB에 저장해주는 프로그램을 만들 것이다.

우선 파싱해서 콘솔출력 가능하게 만들었다. 오랜만에 Json을 하려 하니 기억이 잘 안났지만 또 쓰다보니까 익숙해졌다.

 

그리고 하루에 한번씩 현재날짜로 실행이 되게끔 URL 주소를 Date와 simpledateformat을 이용하여 now2에 값을 넣어주고 URL 주소에서 날짜에 해당하는 부분에 now2를 넣어준다.

 

그리고 강사님 같은 경우 굳이 메소드 2개로 나눌 필요 없을 것 같아서 한 메소드에서 파싱, sql업데이트 까지 한번에 넣어 놨다고 하셨는데 나는 필요한 값을 파싱하고 DTO 객체 하나 만들어서 데이터를 보내 놓고 sql 업로드 하는 메소드에서 객체를 불러와 작업하는식으로 소스를 짰다.


그리고 중간에 보면 회괴망측하게 double 형변환이 적혀져있는데

 

json을 보면 값의 형식이 "asdf" 이런식으로 들어가있다. 그렇다 String으로 값을 밖아놔서 파싱해서 가져온 값도 String으로 뽑아온 다음 Double로 바꾸고 다시 double로 바꿔줘야 한다.
저 double로의 형변환이 없다면 왜 갑자기 스트링을 더블에 박아넣냐고 오류가 떠서 꼭 필요한 작업이었다.

 

그리고 DTO 값으로 sql 없데이트를 하는 메소드, 형변환도 다 해놨기에 그냥 sql 형식에 맞춰서 값만 넣어주고 성공 여부 출력 되게 해준다.

 

사실 메소드 하나로 합쳐놨으면 V(ConsoleScreen 객체)가 할 일이 전혀 없는데 약간 어거지로 만들어준 기분이다.

(위 작업에서는 성공, 실패 값 출력 기능만 있음)

 

오늘 하루 종일 저 배민DB 완성하는 거랑 내가 제안 했던 데이터 Json 파싱해서 가져오고 SQL로 바로 DB에 저장하는 이 두가지 작업만 했다. 뭐 어찌됐든 정상 작동 되니 나름 뿌듯했다. MVC 패턴과 DTO, DAO에 대한 이해와 응용도도 많이 올라간 듯하고 말이다.