본문 바로가기
📝 회고/✅ 22년 회고

[일일 회고] 22.02.10~11 - 웹클라이언트, 소켓 프로그래밍

by kukim 2022. 2. 11.

📚TIL

웹브라우저와 동일하게 작동하는 간단한 웹 클라이언트를 구현했다. DNS Lookup으로 URI에서 IP 주소를 알아내고 간단한 Socket 프로그래밍을 통해 서버와 HTTP 통신을 하였다. socket()과 입출력 스트림을 제외하고 HTTP 표준 라이브러리 없이 직접 구현했다. 

 

✅  구현해보니 디자인 패턴이었다? 

처음 Client와 Request, Response 객체를 설계했다. 특히 Request 객체 생성 시 많은 매개변수를 넣어 한 번에 생성하고 싶었다. (uri, get, header 들) 처음엔 매개변수 별 생성자를 많이 만들었다. 하지만 header의 개수가 정해진 것이 아니었기 때문에 문제가 있었다. 그래서 처음에 빈 객체를 리턴하고 이를 세터 메서드로 초기화했다. 그렇게 구현하던 중 표준 라이브러리(Java 11의 HttpRequest)가 궁금해 소스코드를 분석했다. 함수들의 체인 형태였고 비슷하게 구현했다. 세터를 활용한 코드보다 가독성이 좋았다.

import org.junit.jupiter.api.Test;

public class BrowserTest {
  @Test
  void 기본요청() {
    Browser browser = Browser.newBrowserClient(); // 브라우저 생성

    Request request = Request.newRequest() // Request 생성
            .uri(URI.create("http://www.khan.co.kr"))
            .GET()
            .header("Accept", "text/html")
            .header("User-Agent", "Mozilla/5.0");

    Response response = browser.send(request); // 브라우저에서 Request을 전송 후 응답을 Response에 받기
    System.out.println(response.header());
  }
}

과제를 마치고 책 '이펙티브 자바'를 넘기다 구현한 코드와 유사한 패턴을 발견했다. 아니나 다를까 생성자 많이 만들었던 패턴은 Telescoping constructor 패턴, 세터로 만든 패턴은 자바빈즈 패턴, 마지막 함수 체인 형태는 빌더 패턴이라고 불렸다. 완벽한 빌더 패턴은 아니었다.(Builder 객체, build() 메서드가 없음) 하지만 경험을 통해 디자인 패턴을 역으로 찾았다는 뿌듯함이 컸다. 빌더 패턴은 잊지 못할 거 같다.

 

이펙티브 자바 item 2 요약 : 생성자에 매개변수가 많다면 빌더 패턴을 써볼까?! (HTTPClient와 lombok @Builder) 🧰

 

🧐 개선점 1

싱글 스레드 + 동기 + 블록킹으로 구현되어있다. 이를 멀티 스레드 + 비동기 + 논블록킹으로 구현해봐야겠다.

 

🧐 개선점 2

chunked 파싱에 실패했다. 매번 주먹구구식으로 파싱을 하는 편이다. 컴파일러 파서를 구현해보면 막힘없이 파싱 할 수 있지 않을까?

정규표현식도 자주 써야겠다.

 


👍 Keep

- 문제를 작게 쪼갠 것

- 표준 라이브러리 분석하여 코드에 참고한 것

🔥Problem

- 아침에 일어나 1~2 시간 시간 날린 것(핸드폰 하거나 뒹굴)

🚒 Try

- 아침 건강 루틴을 회복해야겠다. (눈 뜨자마자 물 한 잔 마시기, 가벼운 스트레칭이라도 하기)

댓글