본문 바로가기
비전공자의 코딩 일지/학원 수업 정리

코딩 학원 17일차 (Java json과 multi-thread)

by Hoder2 2022. 6. 29.

어제에 이어서 json 수업이 진행되었다.

이런 순서로 버스 승하차 데이터의 파싱을 진행해보라 하셨다.

위가 하루 치 데이터를 뽑아오는 소스이다. 최근 자료에 하루 데이터 갯수가 39000개 정도가 있어서 최대치를 4만개로 잡았고 1000개 단위로 조회가 가능하여 1000개씩 늘어나게 반복문을 만들었다. 강사님이 하시는걸 봤는데 num에 1000을 더하면서 반복이 되니 최대치는 39002로 잡았어도 충분했다.

뽑아오는 날짜 값을 스트링으로 바꾸기 위해 ""를 더해주는 것이지만 형변환 형식으로 (String)를 앞에 붙여도 .toString()을 써도 아무 상관 없다 다만 저게 제일 편해서 저렇게 하는 것이라고 하셨다.

 

utf-8에 대한 부연설명을 해주셨는데 보통 이런 큰 용량의 데이터를 다룰 때는 일반 pc가 아닌 서버급 pc 정도 되는 것으로 다루는데 보통 서버의 운영체제는 Linux고 이 Linux에서는 utf-8이 아니면 전부 깨지기 때문에 전 세계적으로 utf-8을 주력으로 쓰는게 아닌가 싶다고 하셨다.

이렇게 월, 일을 반복문에서 증감 시켜서 데이트 값을 늘려주고

링크 값에 넣어 값을 올려가며 데이터를 받아오게 해준다.(가운데 모자이크는 키 값이다.)

단체로 하루에 몇만개 되는 데이터를 1년치 씩이나 받아오려니까 서울열린데이터광장 사이트가 터진 것 같다 ㅋㅋㅋ

잘 진행되고 있는지 확인차 한 사이클 돌면 콘솔 출력 되게 해놨었는데 하다가 뚝 하고 전부 멈춰버렸었다.

 

이건 이제 중단하고 카카오 개발자사이트로 가보라 하셨다.

로그인 후 내 에플리케이션에서 에플리케이션을 추가하고 대충 입력 해주면 내 앱 키를 확인 할 수 있다.

 

아무튼 이제 아래 처럼 한번 해보라 하셨다.
카카오 지도 json을 가져와서 음식 이름 콘솔창에 입력하면 설정한 지역 주변 음식점이 콘솔창에 다 나오게 해보라 하셨다.

 

앵간치 만들고 키 값 넣어서 데이터 뽑히나 확인해볼려고 했는데

이게 도저히 어떤식으로 값을 넣어야하는지 감이 안 잡혔다.

강사님도 이걸로 애 좀 먹었었다는데 이런 방식으로 입력하라는 건지 누가 알아 듣겠나 싶었다.

콘솔로 받아온 Json을 복, 붙 해서 줄정리 해놓은 모습.

위 Json의 내용을 보면 알겠지만 모든 내용이 documents라는 [ ] 배열 안에 들어있다. 그렇기에 반복문을 통해 0번째 배열, 1번째 배열 이런식으로 값을 스캔하고 그 중 필요한 내용들만 콘솔창에 출력 되게끔 만든 구조다.

이런식으로 값이 잘 나온다. 어디선가 데이터를 가져올 때는 주소를 쓰는 방식 그러니까 값을 가져오는 형식을 맞추는 것이 참 중요한 것 같다. (+ 키 값 넣는 방식도) 그래도 이제 json 사용법은 어느정도 익혀진 것 같다.

 

이번엔 진짜 실시간 날씨로 뭔가 해보자 하셨다.

https://openweathermap.org/
전 세계 실시간 날씨를 확인 가능한 사이트이다.

접속하고 api에서 Current Weather Data를 json으로 받아왔다.

 

년, 월, 일, 시, 날씨, 기온, 습도 이런 형식으로 내 pc 파일에 쓰이고 저장 되게 만들라 하셨다.

이제 파싱 할 때의 형식은 어느 정도 이해가 가서 굳이 설명할 필요 없을 것 같다.

(내가 복습하기 위해 만든 블로그이기 때문이다.)


다만 이번 파싱 때는 반복문을 이용하지 않았는데

이상하게 이 전체 Json을 묶어주는 {} (객체)의 이름이 없고 또 이상하게 weather만 배열로 하나 딱 만들어놔서

이렇게 weather 배열만 빼서 weather 배열의 첫번째를 뜻하는 get(0)을 이용해 오브젝트로 빼주고 그 값을 bw로 파일에 기록해줬다. (배열이 한개 밖에 없어서 0 밖에 못 쓰는 거기도 해서 반복문이 굳이 필요가 없었다.)
나머지 필요한 값인 기온, 습도는 main이라는 객체 안에 있어서 2개만 따로 빼줬다.

왜 날씨가 실 비로 나오는지는 나도 모른다. 사이트 자체적인 원인일 것이라고 하셨다.

 

이제 하이라이트 끝냈으니 쓸 데 없는 클래스에 대해서 알려줄거라고 잘 사람은 자라 하셨다.

(졸았던 적은 있어도 자본적은 없다..!)

 

-Multi-Thread programming

 

갑자기 반복문 10번 반복 만들라고 하셨다. 그리고 Thread를 걸었다. 그리고 그런거 한번 더 만들라고 하셨다.

이러면 ㅋㅋㅋㅋ 나오고 ㅎㅎㅎㅎ 나올텐데 이걸 동시에 나오게 작업하는게 오늘의 주제이다.

 

저번 수업 때 JVM이 클래스의 메소드 중 main 메소드를 제일 먼저 실행한다는 것을 알려주셨었는데  정확히 말하면

JVM이 Thread를 만들어서 UCMain.main(...)으로 보내고 위에서 아래로 왼쪽에서 오른쪽으로 움직이게 하고 Thread에 닿으면 실행이 되게끔 한다. 이때 Thread가 mainThread다.

 

mainThread : JVM이 만들어준 Thread
subThread : 사람이 만든 Thread

multi-thread : 동시에 여러작업 해주는 Thread

 

1. 새로운 클래스를 만들고 Thread를 extends 한다.
2. ru를 치고 ctrl + spacebar을 하면 run override가 있는데 그걸 쓴다.
3. 아까 ㅎ이 들어간 반복문을 가져온다.

아까 ㅋ 있는 클래스에 객체 생성해주고 start라는 기능을 이용한다. 이 start는 새 thread 만들어서 run을 호출해준다.

그리고 실행하면 콘솔창의 한계로 ㅋㅎ이 교차로 나온다.

같이 나오는걸 보기 위해 ㅎ은 JFrame에 띄워준다. 같은 속도로 ㅋ과 ㅎ이 딱딱 나오는데 뭔가 하찮다.

 

다음은 두번째 방법이다.

 

첫번째는 상속을 막아버리기 때문에 이 두번째 방법을 더 많이 쓴다고 하셨다.

클래스를 하나 더 만들고 Runnable을 implements 해줬다.

아까 ㅎ에 있던 거 고대로 가져와서 setLocation 추가와 글자를 ㅇㅇ으로만 바꿔줬다.

그리고 Thread 객체를 쌩으로 만들고 안에 ㅇㅇ나오는 객체를 생성한다.

그럼 귀엽게 ㅋ과 ㅎ과 ㅇㅇ이 톡톡톡 하찮게 나온다.

 

이제 오랜만에 real word로 가보자 하셨다.
사람이 하나 있는데 자기소개 기능이 있다.

자기소개를 하려면 이름도 말하고 취미도 말하고 다양하게 있지 않을 것 아니냔다. 그리고 자기 소개를 하기 위한 뇌가 필요할 거고 뇌에서 이름을 생각하고 그 생각하는 빠를터니 0.2초 정도면 되지 않을까 하셨다.

이건 또 무슨 빌드업일까..

취미는 생각하는데 오래 걸릴테니까 1초 정도 걸릴 것이고

이제 이걸 멀티스레드로 해보잖다.

이렇게 Thread 객체 하나 불러주고 run override 해준다음 취미나 이름 중 하나 넣어주고 저번에 알려준 익명성 클래스였나?를 이용하셨는데 왜 인지는 모르겠고 메소드에서 멀티쓰레드 하는 방법인가보다.

그런데 강사님의 표현을 빌리자면 "뇌가 꼬여서 이렇게 나옵니다." 라고 하셨다.

자원 하나를 여러 쓰레드가 사용하게 된다면 지금 처럼 타이밍이 꼬여버리는 경우가 발생하고 이게 멀티 쓰레드가 위험한 이유이다.

 

웹사이트가 이용자가 들어오면 새로운 쓰레드가 생기고 그래야 여러 이용자가 한번에 웹사이트 이용이 가능하단다. 그런데 좌석 예매 같은 경우 동시에 결제를 시도 하면 먼저 결제한 사람이 차지하게 되는 그런 상황이 벌어진다.

 

그래서 Critical section[임계 영역]을 설정해야 된단다.

방금 전 brain을 두 쓰레드가 같이 쓰고 있어서 출력 값이 꼬이게 되는데
이 brain에 여러 쓰레드가 동시에 못 건들게 하는 것이 임계 영역 설정이다.

이론은 거창하지만 별거 없다.

이렇게 synchronized를 붙혀주면 끝이다.
이게 붙은 메소드는 이 메소드의 기능이 끝나야지만 다음 기능을 실행할 수 있도록 한번에 하나만 가능하게 한다.
출력해보면 홍길동 다 나오고 독서가 나와서 멀티쓰레드 같지 않아 보이지만 정확히는 멀티쓰레드가 맞다 하셨다.

 

그리고 자동생성 기능을 보면 어떤 건 그냥 초록색인데 어떤 것은 시계 모양이 붙어있다. 이 시계 모양이 붙어있는 것이 synchronized 기능을 포함한 것이다.

그렇다면 이런식으로 메인 쓰레드는 10회 반복에서 멈추게 하고 서브 쓰레드는 무한 루프를 돌려주면 어떻게 될까?
메인쓰레드가 끝난다고 서브 쓰레드가 자동으로 끝나는건 없기 때문에 무한으로 반복하게 된다.

 

아무튼 이렇게 보니까 웹사이트를 생각하면 이건 쓸 데 없는 개념이 아닌 것 같다.
웹사이트는 기본적으로 동시에 여러명이 접속할텐데 그럼 그 사람만을 위한 쓰레드가 각자 만들어져야 한다라고 생각 했지만 JSP/Spring에서 알아서 해주기 때문에 그냥 이론만 알고 넘어가는게 맞다고 하셨다. 내가 직접 저 처리들을 해줄 일은 없다고 하셨다.

그런데 Android는 메인쓰레드에서 통신 못하게 해서 서브쓰레드에서만 통신이 가능하고 이것을 다루는 방법이 매우 중요하지만 사실 Android만의 서브쓰레드 처리방법이 존재하기에 이러나 저러나 우리가 지금 해본 것들은 필요가 없다 하셨다.

 


그런 다음 이 멀티 쓰레드를 저번에 만든 클라이언트와 서버의 채팅 기능에 넣어서 실시간으로 채팅을 주고 받는 기능을 추가 해보라고 하셨는데 비대면 수업 때 만든 거라서 강의장 pc에 없어서 못하고 있다가 옆 자리 친구의 도움을 받아 같이 채팅 치고 놀았다.