본문 바로가기

모두 보기

(96)
[스터디] OOP - 상속과 코드 재사용 2021. 11. 25. 21:09 요약 상속을 통해 코드를 재사용하면 부모-자식이 강하게 결합된다. 특히 `super` 참조를 통해 자식에서 부모 클래스의 메소드를 직접 호출하면 두 클래스는 강하게 결합되고, 자식이 부모의 내부 구현을 알아야 하여 캡슐화를 위반한다. 높은 결합도는 변경에 취약한 클래스를 낳는데, 이를 취약한 기반 클래스 문제라고 한다. 취약한 기반 클래스 문제는 다음 세가지 문제를 야기한다. 1. 상속받은 부모 클래스의 메소드가 자식 클래스의 내부 구조에 대한 규칙을 깨트릴 수 있다. 2. 자식 클래스가 부모 클래스의 메소드를 오버라이딩하는 경우, 부모 클래스가 자신의 메소드를 사용하는 방법(내부 구현)을 자식이 알아야 한다. 3. 높은 결합도로 인해 자식 클래스와 부모 클래스의 구현을 fix하던가, 아니면 동시에 변경..
keepalive 설정 2021. 11. 23. 21:23 KeepAlive 설정을 nginx에서 하는것과 Http에서 하는것이 어떤 차이가 있는지 궁금해서 찾아보았다. Nginx keepalive - 어플리케이션 레벨에서의 keepalive - 클라이언트가 먼저 종료되지 않는이상 keepalive_timeout 시간 동안 연결을 유지함 - 클라이언트가 브라우저라면, 브라우저는 http 1.1 사용 시 기본적으로 keepalive가 활성화되어있음. (해제 가능) - nginx 입장에서는 클라이언트와의 연결을 유지할지를 결정하는 것. (호스트 입장에서 keepalive를 설정하는 것) Http keepalive - NodeJS의 http 모듈의 keepalive 설정 (http.Agent({keepAlive: true})) - Default로 NodeJS는 kee..
Jenkins, Github Action으로 CI 환경 구축 경험기 2021. 11. 13. 20:15 공교롭게도 금주에 젠킨스와 Github Action으로 동시에 CI 환경을 구축할 일이 있었다. 사내 Github Enterprise에서는 아직 Github Action이 미지원이라 Jenkins를 사용했다. 기존에 사용하던 젠킨스가 있었지만 메모리 이슈가 잦아져, 우리 파트만 사용하는 Jenkins를 새롭게 구축하기로 했다. (겸사겸사 물리 서버가 아닌 Docker 컨테이너 환경으로 이전도 포함) Github Action은 사이드 프로젝트에서 새로 CI 설정을 위해 Github Action을 사용하기로 했다. 결론부터 말하면 젠킨스는 구축까지 대략 하루 걸리고, Github Action으로는 공부시간 포함 1시간 정도 걸렸다. 이건 젠킨스보다 Github Action이 쉽고 빠른 점도 있었지만 사내 망..
[스터디] OOP - 의존성 관리하기 2021. 11. 4. 20:58 의존성 어떤 객체가 협력하기 위해 다른 객체를 필요로 할 때 두 객체 사이에 의존성이 존재한다고 말할 수 있다. class A implements I { methodOfA(b: B) { return b.methodOfB().filter((item) => item.chceked) } } class B { methodOfB(c: C) { return c.methodOfC() } } class C { methodOfC() {} } 위 예제의 클래스 A는 methodOfA 메소드에서 클래스 B를 인자로 받아 B에게 methodOfB 메시지를 전송한다. 이 경우, A는 자신의 작업을 수행하기 위해 B 객체를 필요로 하는데 이 경우 A는 B에 의존한다고 한다. 의존성은 변경과 관련이 있다. 의존되는 요소(B)가 변..
정규표현식 일치탐색 수행 시 놓치기 쉬운 이슈 2021. 11. 2. 16:04 사내 앱 환경은 UserAgent 문자열을 보고 앱에서 접근했는지 여부를 알 수 있다. const UA_SAMPLE = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/605.1 APP_NAME(inapp; search; 1000; 11.5.5.2; 11)' 따라서 정규표현식으로 UserAgent를 분해해서 디바이스 환경 및 앱 환경 여부를 검사하는 parseDeviceInfo 함수를 선언했다. const appUserAgentRegEx = /APP_NAME\([inapp]+;[^0-9]*(search);[^0-9]*..
[스터디] OOP - 책임 할당하기 2021. 10. 25. 13:18 책임 주도 설계를 향해 아래 두 가지 원칙을 기억하고 따른다. 데이터보다 행동을 먼저 결정하라. 협력 문맥 속에서 책임을 결정하라. 협력 문맥 속에서 책임을 결정하라. 책임은 객체의 입장이 아니라 객체가 참여하는 협력에 적합해야 한다. 다시 말해, 메시지 전송자에게 적합한 책임을 말한다. ⌲ 따라서, 메시지 송신자는 메시지 수신자에 대한 어떠한 가정도 할 수 없다. (캡슐화) 객체가 수행할 책임이 정리될 때까지 객체의 상태에 대해 정의하지 않는다. GRASP 패턴 GRASP 패턴이란? General Responsibility Assignment Software Pattern의 약자로, 객체에게 책임을 할당할 때 지침으로 삼을 원칙들의 집합을 패턴 형식으로 정리한 것 설계 순서 1. 도메인 개념에서 출발하..
react 16.8 -> 16.9 업그레이드로 인한 react-testing-library 실패 해결 2021. 10. 5. 16:36 팀 내 react 16.8 버전을 이번에 npm7로 버전 업하면서 함께 16.9로 올렸다. 그런데 올리고 보니 기작성되었던 일부 테스트 케이스들이 실패했다. 실패하는 원인을 보니 비동기 실행으로 인해 HTMLElement를 찾기 전에 fireEvent 나 userEvent를 실행해버려서 실패되었다. 따라서 아래처럼 HTMLElement도 비동기로 찾게끔 수정하였다. test('', async () => { const container = render() // ... 중략 ... const button await waitFor(() => { button = findButton(container) expect(button).not.toBeUndefined() }) fireEvent.click(button) ..
[스터디] OOP - 역할과 책임, 협력 2021. 9. 28. 22:16 조영호님의 '오브젝트'(2021) 의 3장을 읽으면서 요약한 것입니다. 많은 사람들이 객체지향 패러다임을 설계할 때 클래스를 어떻게 정의하고, 어떤 걸 상속할지 등등 구체적인 구현에 초점을 맞춘다. 그러나 객체지향의 핵심은 역할, 책임, 협력에 있다. 다시 말하면 협력을 구성하기 위해 적절한 객체를 찾고 적절한 책임을 할당하는 것이 핵심이다. 협력이란 어떤 기능을 구현하기 위해 객체들 간 상호작용을 말한다. 책임은 객체가 협력에 참여하기 위해 수행하는 로직을 말한다. 이러한 책임들의 집합이 객체의 역할을 구성한다. 협력 객체지향 : 자율적인 객체들의 공동체 즉, 객체가 다른 객체에게 도움을 요청할 때 협력이 가능하다. ('메세지 전송'이라고도 한다.) * 메세지 !== 메서드이다. 객체는 메세지를 받고,..
[회고] 넥스터즈 19기를 마무리하며 2021. 8. 30. 21:55 저번주로 넥스터즈 19기 정규 활동이 막을 내렸다. 지금까지 개발로그를 작성하면서 어떤 서비스인지 꽁꽁 숨기고 있었는데 이제는 어느정도 안정화되어서 블로그에도 소개하고 회고를 작성한다. 안녕, 나야 안녕, 나야 오늘의 내가, 미래의 나에게 보내는 편지(코시국편) halo-its.me 한줄 소개 : 과거의 내가 미래의 '나'에게 쓰는 편지 (코시국 편) 모토 : 현재의 우울함을 잊게 해주고, 훗날 지금을 회상하며 미소 지을 수 있는 서비스 2주일 전부터 배포 준비를 하고 있어서 발표시간 하루 전날 마지막 QA를 마무리하고 픽스 후 팀에 사전 공유할 수 있었다. 이벤트성 서비스라 미리 편지를 작성하면 팀발표 때 맞춰 메일을 발송해드리기로 했다. 최종 발표 당일 (본인이 속한 팀 빼고) 투표를 통해 1,2,3..
8/26 Nexters 9주차 : HTTPS 적용 2021. 8. 26. 22:08 구글 OAuth2.0 로그인을 대외로 오픈하기 위해서는 https 적용이 된 호스트 URL이 필요했다. 따라서 어제 부랴부랴 SSL 인증서를 구입하고 Nginx에 작성하는 시간을 가졌다. nginx.conf nginx.conf에 ssl 적용은 nginx 설치 후 default.conf에 가이드되어 있어서 쉽게 적용할 수 있었다. 😊 9번째 줄에서 http로 접근했을 때 https로 리디렉션하는것을 잊지 말자. k8s 배포 ssl이 설정된 nginx를 이미지로 재빌드하여 Pod를 재생성해야한다. 필자가 선택한 방법은 ssl 인증서(.pem 파일들)들을 Secret으로 생성하고 이를 Deployment에서 volumeMount로 주는 것이다. Secret 생성 kubectl create secret gene..
[NCP] Helm 사용하여 Kubernetes 기반으로 서비스 배포하기 2021. 8. 24. 20:18 넥스터즈에서 배포를 준비하는 글에서 Kubernetes를 사용하여 배포하는 것을 최종 목표로 잡았었다. 네이버 클라우드 플랫폼(NCP) 에서 제공하는 Kubernetes 서비스와 Container Registry 를 사용하여 배포한 과정을 기록한다. 아직 초보라 많은 설정을 써보진 못해서 차차 개선해나가기로 한다. 목차 0. 배포해볼 구조 및 용어 정리 1. 설치 2. docker image 레지스트리에 저장 3. helm chart 생성 및 배포 4. 이미지 재배포 5. 정리 0. 배포해볼 구조 먼저 서비스를 어떻게 배포하는가를 짚고 넘어간다. 정말 단순하게 End User가 Load Balancer* 외부 IP를 통해 접속하면 부하 분산에 의해 적절한 Pod로 접근하고, nginx가 프록시하는 구조이..
8/20 Nexters 8주차 : Docker 기반 배포 2021. 8. 20. 00:06 넥스터즈가 벌써 8주차로 곧 끝이 보이고 있다. 시간 진짜 빠르다... 내가 맡은 개발 분량은 끝났다. 개발중인 API가 완료되면 API 호출하는 거랑 정적 페이지 하나랑 리팩터링 정도 남은거 같다 그래서 배포를 신경쓰고 있는데 현재는 간단하게 vercel로 띄운 상태이다. (꼼수지만 vercel은 organization에 속한 저장소는 돈을 내야하기 때문에 개인 저장소로 포크 떠서 배포했다 🙄) 하지만... 뭔가 있는 툴을 사용하는 건 내 성에 안차기도 하고, 이것저것 건드리면서 공부해보고 싶었다. (참고) vercel에서도 콘텐츠 캐싱과 폰트나 이미지 캐싱또한 제공하고 있었다 ㅋㅎ; 그래서 직접 nginx와 docker, 그리고 최종 목표는 kubernetes까지 적용된 구조로 배포 환경을 구축해보기..