21년 2월 2일

한 일

  • 소켓 통신을 사용하여 HttpRequest와 HttpResponse 객체 구현하기

    1. URL 객체를 만들었다.

      • URL 객체를 생성할 때, url string값을 인자로 넣어준다.
      • 생성자에서 url을 파싱하여 protocol, domain, path, port를 프로퍼티로 저장한다.
      • 생성자에서 InetAddress를 사용하여 DNS서버로부터 호스트 IP를 받아온다(DNS Look up)


    2. HttpRequest 객체를 만들었다.

      • URL 객체를 인자로 생성할 수 있다.

      • Request메소드에 [GET, POST, UPDATE, DELETE] Method값(enum)과 body(JsonObject)를 넣어준다.

        1. 인스턴스의 URL과 인자로 받은 Method값, body를 조합하여 기본적인 Http 요청 String을 만든다.
        2. URL의 IP와 포트번호를 기준으로 Socket 연결한다.
        3. Socket 통신을 통해 만들어놓은 Http 요청을 보낸다.
        4. Socket으로 들어온 Response를 BufferedReader로 읽으며 HttpResponse를 생성한다.
          • 처음 등장하는 빈 줄을 기준으로 header와 body를 나눈다.
          • response header에 Content-Length가 있으면 Content-Length개 만큼 body를 읽는다.
          • Content-Length가 없으면 </html>값이 나올때까지 body를 읽는다.
          • 다 읽으면 바로 socket 연결을 끊는다.
        5. 생성한 HttpResponse를 반환한다.


    3. HttpResponse 객체를 만들었다.

      • header String(포맷에 맞아야 함)과 body String을 파라미터로 생성할 수 있다.

      • 그냥 생성할 경우, setHeader(String header) 와 setBody(String body)로 Response를 만들어줘야한다.

      • header String 을 파싱하여 protocol, statusCode, statusMessage를 생성하며, 나머지 헤더값은

        Map<String, String> 형태로 저장한다.


  • 프로그래머스 보석쇼핑 문제 풀기에 실패했다.

    • HashSet을 이용하여 보석 종류의 개수를 구한다.
    • 기본적으로 길이가 j 인 구간에서 모든 종류가 있는지 확인할 땐 sliding window기법을 사용했다.
      1. HashMap<String, Integer>을 사용한다.
      2. 1번째부터 j번째까지 돌며 HashMap에서 보석의 value를 1씩 증가시킨다.
      3. HashMap의 크기가 보석종류의 개수와 같으면 현재 구간을 반환한다.
      4. j+1번째부터 마지막까지 순회하며
        1. 직전 구간 첫번째 보석의 value를 1 감소시키고, value가 0이면 HashMap에서 삭제한다.
        2. 새로 포함된 보석의 value를 1 증가시킨다.
        3. HashMap의 크기가 보석종류의 개수와 같으면 현재 구간을 반환한다.
      5. 끝까지 답을 못찾으면 null을 반환한다.
    • 정답 구간의 길이 최대값은 gems의 개수, 최소값은 보석종류의 개수이다.
    • binarySearch로 정답 구간의 길이를 찾아가며 최소 길이의 구간을 찾아낸다.
    • 효율성에서 1개 빼고 모두 실패하였다. 방법 자체를 다시 생각해봐야겠다.

잘못한 것

잘한 것

  • HttpRequest와 HttpResponse를 내가 할수있는데까지 잘 구현하였다.
  • 네트워크에 대해 자신감이 없었는데 이번에 아주 재밌게 실습하고 배웠다.

느낌

할 일

  • 자바의 정석 읽기
  • 네트워크 공부하기
  • 프로그래머스 문제 풀기