1101 - 1107
1101
프록시 서버
프록시 서버란 인터넷에서 유저를 대신해서 데이터를 가져오는 서버이다. 원래는 클라이언트가 서버에 직접 접근해서 요청한 내용을 가져와야 하지만 프록시 서버가 대신 서버에 요청하고 클라이언트에게 가져다 준다.
예를 들어, 클라이언트에서 url을 입력하면 이 요청은 서버로 가는게 아니라 프록시 서버로 간다. 프록시 서버가 url에 입력한 서버에 도착해서 웹페이지를 가져다가 클라이언트인 웹 브라우저에게 보내준다.
프록시에는 ‘대리’라는 뜻이 있는데, 이는 클라이언트를 대리한다는 뜻이다.
프록시 서버를 사용하는 이유
-
개인 정보를 보호할 수 있다. 프록시 서버 없이 클라이언트가 요청을 할 때 나의 IP 주소도 전달이 되지만, 프록시 서버를 사용하면 요청을 받은 서버는 나의 IP가 아니라 프록시 서버의 IP를 보게 된다
-
프록시 서버는 프록시 서버에 요청된 내용들을 캐시를 이용하여 저장한다. 프록시 서버가 웹페이지를 가져올 때 캐시에 최근 데이터를 저장해놓는다. 다른 클라이언트가 접속할 때 캐시된 웹페이지가 있으면 프록시 서버에서 바로 클라이언트에 전송함으로써 속도를 향상시킬 수 있다. 동시에 불필요하게 외부와의 연결을 하지 않아도 되기에 외부와의 트래픽을 줄이게 됨으로써 네트워크 병목 현상을 방지할 수 있다. 프록시 서버에서는 가비지 콜렉션을 해서 캐시 상태를 유지한다.
-
로그 기록 관리 서버에게 개인정보가 보호되지만 프록시 서버에는 클라이언트의 기록이 남아있다. 이 기록을 보면 어떤 IP에서 어디에 오래 접속했는지 기록을 확인할 수 있고, 방문할 수 있는 웹사이트를 제한할 수 있다. -> 연결된 클라이언트의 정보를 제어할 수 있기 때문에 회사에서 많이 사용
-
방화벽 방화벽과는 다른 것이지만 보안을 위해 함께 일한다. 프록시는 요청을 방화벽은 네트워크 패킷을 제어한다.
CORS와 Webpack DevServer Proxy
브라우저에서 기본적으로 API를 요청 할 때에는 브라우저의 현재 주소와 API 주소의 출처가 일치해야만 데이터를 접근할 수 있게 되어 있다. 만약 다른 출처에서 API를 요청해서 사용할 수 있게 해주려면 CORS 설정이 필요하다.
기본적으로 서버 쪽에 해당 출처를 허용하도록 구현을 해야하지만, 웹팩 DevServer에서 제공하는 Proxy 기능을 사용하여 이를 해결할 수 있다.
웹팩 DevServer의 프록시를 사용하게 되면, 브라우저 API를 요청할 때 백엔드 서버에 직접적으로 요청을 하지 않고, 현재 DevServer의 주소로 요청을 하게 된다. 그러면 웹팩 DevServer에서 해당 요청을 받아 그대로 백엔드 서버로 전달하고, 백엔드 서버에서 응답한 내용을 다시 브라우저쪽으로 반환하게 된다. 프록시와 서버의 통신은 서버간의 통신이기 때문에 방화벽만 열려있다면 cors 설정을 추가적으로 하지 않아도 문제가 발생하지 않는다.
1105
여행 가계부 프로젝트를 진행하며 느낀 점
- 시작이 반이다
- 웹팩을 설정하고, express라는 새로 배우는 기술 스택을 사용해서 폴더를 구성하려다보니 환경설정과 마크업만으로 정말 프로젝트 기간의 절반이 지나가 있었다. 프로젝트 환경 세팅의 어려움을 경험하면서 힘들기도 했지만, 웹팩이랑 익스프레스에 대해 공부하고 폴더 구성을 어떻게 할지 생각하면서 짧은 시간동안 많은 고민을 할 수 있었습니다.
- 데이터베이스 없이 백엔드서버를 구축해보며 데이터베이스의 소중함을 느끼게 되었다. 데이터의 키도 직접 함수를 작성해서 생성해줘야했고, join 기능이 없다보니 서로 다른 파일에 있는 데이터에 접근하는 것이 힘들었다.
- await와 async를 사용하고 여행 세부정보와 지출정보를 동시에 불러올 때 Promise.all 메서드를 사용해 병렬처리 해봄으로써 이에 대한 이해도가 높아졌다.
- 프로젝트 도중 의도치 않은 시간 지연이 발생하는 것을 몸소 경험하며 시간 배분을 좀 더 여유롭게 해야겠다는 생각이 들었다. 프로젝트를 진행하면서 웹팩 설정을 익히고, express를 사용하며 분명 개발자로서 한층 성장했다고 생각하지만 그만큼 프론트에 많은 시간 투자를 하지 못한것 같다는 생각이 들어서 그 점이 조금 아쉬웠다. 다음 프로젝트때는 이번 경험을 기반으로 프로젝트 시간 분배를 잘 할 수 있도록 기획하고, 외부 api를 사용해서 백엔드 작업을 조금 줄이고 프론트를 더 많이 사용하도록 해야겠다.
1106
우아한 테크코스 지원
벌써 일 년이라는 시간이 흐르고 우아한 테크코스 4기를 모집하는 글이 올라왔다.
이번에는 전적으로 네이버 카카오에 올인하기로 했기에 과정을 이어가지는 않지만, 작년에 지원했다가 무참히 떨어졌던 기억이 떠올라 코딩테스트라도 한 번 봐보자는 마음으로 지원했다.
문제는 거의 100% 구현력을 확인하는 테스트였고, 작년에 비해 난이도가 있었다.
하지만 시간 내에 모든 문제를 풀어서 제출했다는 것에 의의를 둔다. 6번은 예상할 수 없는 테스트케이스 가지고 있을 거 같아 정답일지 장담할 수 없지만 후련하다.
1107
객체지향 프로그래밍과 함수형 프로그래밍
객체지향 프로그래밍
객체를 집합으로 프로그램을 표현하는 프로그래밍 패러다임
추상화
객체들의 공통적인 특징을 도출하는 것
캡슐화
객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것
실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수있다.
상속
하나의 클래스가 가진 특징(프로터티, 메서드)를 다른 클래스가 그대로 물려받는 것
다형성
동일한 명령의 해석을 연결된 객체에 의존하는 것 ex) 오버라이딩, 오버로딩
객체 지향 프로그래밍의 장점
- 소프트웨어 생산성 향상
- 실세계에 대한 쉬운 모델링
- 보안성 향상
함수형 프로그래밍
함수형 프로그래밍을 이용해서 프로그램을 만든다는 것은 이런 함수들을 적용하고 묶어서 프로그램을 구성해나가는 것을 말한다.
순수함수
동일한 인자를 넣었을 때 항상 동일한 결과값을 반환해야하고, 외부에 전혀 영향을 받지 않도록 작성을 해야한다. 함수안에서 외부 상태값을 변경한다면 그것은 함수형 프로그래밍이 아닙니다.
비상태 불변성을 유지해야한다.
함수에서 전달된 데이터를 변경하는 것은 함수형이 아닙니다. 함수에서 인자로 전달된 데이터를 변경하는 것이 아니라 새로운 버전의, 새로운 오브젝트로 만들어서 결과값으로 전달해야한다. 그래서 side effect를 유발하지 않으므로(함수를 호출하면 외부 상태가 변경되거나, 예상하지 못한 에러가 발생하는 등) 불변성을 유지하기 때문에 안정적으로 동작할 수 있습니다.
-> 부수효과가 없는 순수 함수를 사용하여 부작용을 제거해서 프로그램의 동작을 이해하고 예측을 용이하게 함