Dec 16, 2019 - jvm 옵션 관리

jvm 옵션은 기본옵션을 유지하는 것이 좋다고 하여, 옵션을 안건드렸으나,

ehcache의 내부 메모리의 크기가 기하급수적으로 증가하는 로직이 하나가 추가되면서, 서버에 부하가 생기게 되었습니다.

서버 장애원인을 찾아보니,

ehcache가 잡아먹는 JVM 의 메모리에 의해, 강제 FULL GC가 발생하고, 그 발생한 부분의 지연현상때문에, 전체적인 서비스가 지연되는 문제였습니다.

java version 은 1.8 을 사용하고 있었는데,
JDK8 에서는 Default 로 ‘Parallel GC’ 를 사용합니다.

그래서, 결국 jvm 옵션을 건드릴 수 밖에 없었습니다.

-XX:+UseG1GC

G1 GC의 가장 큰 장점은 성능입니다.

JAVA_OPTS="-verbosegc -server -Xms6g -Xmx6g -XX:MaxGCPauseMillis=700 -XX:+PrintConcurrentLocks -Djava.security.egd=file:/dev/./urandom -Dscouter.config=/usr/local/tomcat7/conf/scouter.conf -Duser.timezone=GMT+09:00 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat7/logs/memory_err.log"

기존 옵션에서 ‘-XX:+UseG1GC’ 만 추가하였습니다.

JDK 8 부터 G1 이 안정적이 되었기에 많은 서비스들이 G1 GC 를 사용 중으로 알고 있습니다.
(JDK8 에서는 Default 로 ‘Parallel GC’ 를 사용하기 때문에 G1 GC를 사용하지 않습니다. )

‘Parallel Collector’ 는 Compaction 단계 때문에 G1 GC 보다 FGC (Full Gabage Collection) 시간이 오래 걸리며,
실제 제 서비스에서는 점점 GC시간이 늘어나는 상태였습니다.

JAVA_OPTS="-verbosegc -server -Xms9216m -Xmx9216m -XX:NewRatio=5  -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=0 -XX:CMSInitiatingOccupancyFraction=75 -Djava.security.egd=file:/dev/./urandom -Dscouter.config=/usr/local/tomcat7/conf/scouter.conf -Duser.timezone=GMT+09:00 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat7/logs/memory_err.log"

현재 75% 로 GC가 강제로 찾을 경우 강제 GC를 떨어뜨니는 기능과 단순하게 G1GC 나머지는 디폴트값으로 설정하는 것과 비교할 예정이며, 현재로써는 G1GC 로 하는것이 개인적으로 관리할때는 편해보여, 상태를 보다가 전체 적용할 예정입니다.

Nov 18, 2019 - gitignore 와 git commit 제외

회사에서 git에서 import 받은 설정파일에 DB관련 접속정보를 local 에서는 select 권한만 받습니다. 각각 개인이 관리하고 보호를 위해, 해당 datasource 를 .gitignore에 예외를 추가하였지만, 이미 사람들의 실수로 인해 push 된 이력들이 많아졌습니다.

그로 인해, git이 수정여부를 여전히 체크를 하여 실수로 commit 및 push가 이루어지고 있었습니다.

한번이라도 버전 관리에 들어갔다면 단순하게 gitignore에 등록한다고 그때부터 버전 관리를 안하는건 아니고, 기존에 버전관리 했던 내역을 삭제해주어야합니다.

git update-index --assume-unchanged [file path]

형태로 처리하고 있었으나, 지속적으로 문제가 발생하여, 그럴 경우마다 전부 –assume를 풀었다가 넣었다가 해야하는 문제가 발생하여 아예 캐시를 삭제하도록 하였습니다.

git rm --cached [file path]

이후에 add, commit, push 등을 테스트하면, gitignore가 정상 적용되어있는것을 확인할 수 있었습니다.

Sep 30, 2019 - 프로그래밍 원칙

– 면접봤던 질문 내용에 대해 간략하게 정리합니다.–

SOLID (객체 지향 설계)

두문자 약어 개념 설명
S SRP 단일 책임 원칙 (Single responsibility principle) 한 클래스는 하나의 책임만 가져야 함.
O OCP 개방-폐쇄 원칙 (Open/closed principle) 소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 함
L LSP 리스코프 치환 원칙 (Liskov substitution principle) 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야함.
I ISP 인터페이스 분리 원칙 (Interface segregation principle) 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 나음.
D DIP 의존관계 역전 원칙 (Dependency inversion principle) 프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안됨

YAGNI

You aren’t gonna need it