![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/begGlq/btsIAyT5z1a/HAcqaeOEm7ADO4ZNAEG4oK/img.png)
기록하게 된 이유팀 서비스 중 OOM으로 장애를 겪은 회고를 적어본다.장애가 실제 발생했을 때는 사실 GC나 jvm memory에 대한 경험이 부족해서원인 분석을 위해 어디부터 확인해야 될지 몰랐고, 추후에 원인 분석을 한 장애 보고서를 봐도 이해가 잘 안됐다.하지만 지금 다시 내용을 처음부터 살펴보니, 에러가 발생한 원인은 정말 생각지도 못한 부분이라 개인적으로 흥미로웠고,공부할 만한 내용들이 많다고 생각들어서 늦게나마 회고 형태로 정리해본다. 장애 상황서비스 중인 open-api 서버 10대 중 대부분의 서버에서 DB Connection 에러와 함께 java oom 이 발생했다.1차 대응으로 전체 was를 재기동 해봤지만, 얼마 지나지 않아 서비스 중단은 계속됐다. 용의자 1. Slow Query이 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bEkkfk/btsAbasY1V2/TSON88QgYdijxsykf2kkeK/img.png)
1. 프록시 패턴이란? 특정 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴. 구성요소 1) Proxy - 프록시 객체가 RealSubject에 대해 접근할 수 있도록 참조를 갖는다. - RealSubject와 Subject 인터페이스가 동일하다면 프록시는 Subject에 대한 참조를 할 수 있다. - RealSubject에 대한 접근을 제어하며, 생성/참조에 대한 권한을 가질 수 있다. 2) Subject - RealSubject와 Proxy의 공통 인터페이스이며, RealSubject가 필요한 곳에 Proxy를 통해 사용할 수 있도록 한다. 3) RealSubject - 프록시가 대신하는 실제 객체를 정의한다. 프록시의 종류 1) Remote Proxy: 요..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bgWzRN/btszK9uLx8B/czlOYLWA6EoMFkSmMGF8pK/img.png)
기존 레거시를 msa 서버 어플리케이션으로 이관하는 작업을 중 마주한 에러다. 1. 내용 파악 이관된 비즈니스 로직에 오류가 있었다면 들어오는 request 마다 오류가 나야하는데 하루 1~2개 꼴로 간헐적으로 발생한다. IOException이라고 해서 헤더 값이나 Payload에 이상한 구분자가 있는지.. 스트림에 영향을 끼쳤을만한 내용을 확인해봐도 아무 문제가 없음. 스테이지에서 디버깅을 해봐도 재현이 되질 않음. 특정 인스턴스 문제인가 했지만 골고루 찍힌다. 2. 원인 Okhttp3 버그로 보인다. 클라이언트↔ 서버 간 keep-alive timeout 차이로 발생하는 이슈인데 이걸 IOException으로 던지고 있어서 파악하기 어려웠던 것. - retrofit2로 서버로 request 보내는 클..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cBaEkX/btszkn8FAtg/Ltm1jXMoZRgNOhIKdVHCRk/img.png)
1. 스테이트 패턴이란? 스테이트 패턴을 이용하면 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다. 구성요소 Context - 클라이언트가 필요한 인터페이스르 정의한다. - 현재 상태를 나타내는 ConcreteState 서브클래스를 유지한다. State - 특정 상태에 해당되는 기능들이 정의된 인터페이스를 선언하고 있다. ConcreteState - 각 서브클래스는 해당되는 상태의 기능들을 구현한다. 2. 동기 장점 - 상태에 특화된 행동들을 분리하고, 새로운 행동을 추가하더라도 다른 행동에 영향을 주지 않는다. - 코드 복잡도를 줄일 수 있다. - 상태의 전환이 명시적으로 변한다. 단점 - 구조의 복잡도가 증가한다. 3. 구현..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bQgRwl/btszlJQEuJD/7tHqsdltlshdIrSvlrrK7K/img.png)
1. 컴포지트 패턴이란 컴포지트 패턴을 이용하면 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있다. 구성요소 Composite라는 단어 자체가 복합적인, 합성적인이라는 뜻이다. 어떤 객체 구조가 여러 계층으로 구성되어 있는 복잡한 구조일 때 적용하는 패턴인데, 전형적인 컴포지트 객체는 이런 식으로 생겼다. Component - 복합적인 구조를 지닌 객체 (Composite object) 들의 공통 인터페이스 - 모든 객체들이 가지고 있는 default한 기능을 여기서 구현할 수 있다. - 자녀 컴포넌트에 접근하거나 관리하는 인터페이스를 선언한다. - (선택사항) 필..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/dBM6LY/btsyWjrl7sp/23CLoOwomrf6KCRGlEso1K/img.png)
1. 이터레이터 패턴이란? 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해 주는 방법을 제공해준다. 구성요소 1) Iterator - 아이템에 접근할 수 있도록 해주는 인터페이스를 정의한다. 2) ConcreteIterator - Iterator 인터페이스를 구현한다. - 집합체 내부를 접근할 때 현재 위치를 기억한다. 3) Aggregate - Iterator 객체를 생성하기 위한 인터페이스를 제공한다. 4) ConcreteAggregate - Iterator 생성 인터페이스를 구현하고 해당하는 ConcreteIterator 인스턴스를 반환한다. 2. 동기 이터레이터 패턴의 핵심은 집합체(리스트, 맵, 등등)의 각 아이템에 대한 접근과 순회하는 책임을 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/4Tnd5/btsyyoAzsLn/GlRk28fkRo6kpLcDjEM8Hk/img.png)
1. 템플릿 메소드 패턴이란 템플릿 메소드는 알고리즘의 골격을 정의한다. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있다. 템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스의 특정 단계를 재정의 할 수 있다. 구성요소 1) AbstractClass - 추상화된 기본 함수들을 정의한다 (나중에 ConcreteClass가 구현할). - 알고리즘의 뼈대를 정의하는 템플릿 메소드를 구현한다. 이 템플릿 메소드는 추상 메소드로 정의한 기본 함수들을 호출할 수 있으며 다른 내/외부 함수들을 호출할 수도 있다. 2) ConcreteClass - 상속한 AbstractClass의 기본 함수들을 구체적으로 구현한다. 적용된 디자인원칙 일부 구체적인 로직은 하위 ConcreteClass..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/ABKiV/btsxslRX2Jh/F0RKnDun7KlC189SRaRsq1/img.png)
1. 어댑터 패턴? 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다. 구조 Target - Client가 사용할 특정 도메인에 한정되는 인터페이스 Client - Target와 연관된 객체들을 사용한다. Adaptee - 변환이 필요한 인터페이스 Adapter - Adaptee 인터페이스를 Target 인터페이스의 규격에 맞춘다. 간단하게 말하자면: Adaptee를 Target의 형식에 끼워 맞추는 역할을 Adapter가 담당하는 것이다. - 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴 - 클라이언트가 사용하는 인터페이스를 따르지 않는 기존 코드를..
- Total
- Today
- Yesterday
- digital tree
- PatternSyntaxException
- IOC
- WORA
- 2019 Kakao Blind
- 카카오
- trie 소스코드
- 프로그래밍 모델
- 디자인패턴
- nginx 내부
- Java
- Java #JIT #JVM
- 스프링
- 코테
- WORE
- 스프링 컨테이너
- decorator
- okhttp3
- 신규 아이디 추천
- Java #GC #가비지콜렉터 #Garbage Collector
- 모던 자바 인 액션
- 카카오 코테
- 2020 KAKAO
- 카카오 인턴
- 카카오코테
- Kakao Blind
- behavior parameterization
- jvm
- KAKAO 2021
- 2021
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |