전체 글

항상 최적의 코드를 고민합니다
· Back-end
1. 캐시란 반복 접근이 필요한 일일때 접근 시간을 줄이기 위해 데이터나 값을 가까운 곳에 미리 복사해 놓는것ex) cpu cache, dram, cdn, http cache, application cache, proxy cache 등  메모리는 크기와 속도가 반비례 캐시는 왜 필요한가파레토의 법칙원인 중 상위 20%가 전체 결과 80%를 만든다→ 전체 데이터 중 일부(약 20%)가 대부분의 접근(약 80%)을 차지할 가능성이 크다.따라서, 작은 메모리(캐시)를 사용해 전체 데이터를 커버 데이터 지역성의 원리 자주 쓰이는 데이터는 시간적, 공간적으로 몰려있을 가능성이 높다시간, 공간(+순차지역성)   2. CPU cache 캐시miss 종류Compulsory miss - 해당 메모리 주소를 처음 불렀을때..
· Memo
개발자 인생 처음으로 공모전에 참가하였다. 백엔드 개발자로서 잘하는 사람들과 프로젝트를 하며 한 단계 성장하고 싶었고 벽을 느껴보고 싶어서 참가하게 되었다. 어찌저찌 본선까진 갔지만 수상을 하진 못했다. 그 간의 5개월이 날아가버린 느낌도 들고... 많이 아쉬웠다. 팀원 중에서 직장 출퇴근하며 새벽까지 작업하던 분도 계시기도 했고, 그 분을 위해서라도 수상하고 싶었는데. 비록 뒤늦게 팀장을 맡긴했지만 어찌됐든 내가 이끌었던 팀이었고 높이 올라가지 못했던 것에 아직도 한참 부족함을 느꼈다. 팀의 성공은 거의 팀장이 결정한다고 생각하기 때문이다...조금 더 착실하게 쌓았다면, 팀 문화가 더 좋았다면, 기술적 식견이 넓었다면, 좀 더 단호했다면 달랐을까? 아직도 놓쳤던 포인트들이 아쉽게 느껴진다. 원했던 실력..
· Back-end
추상 클래스보다는 인터페이스를 우선하라 Java 8부터 인터페이스에 디폴트 메서드 기능이 추가되면서 인터페이스와 추상 클래스간의 차이가 모호해졌습니다. 하지만 둘은 추상 클래스를 상속한 하위 클래스는 그 추상 클래스에 확실하게 종속된다는 점에서 차이가 있습니다. 또한 인터페이스는 여러 면에서 추상 클래스보다 유용하므로 사용이 우선되는게 좋습니다. 1. 기존 클래스에도 쉽게 새 인터페이스를 구현해넣을 수 있다. 인터페이스의 경우 implements와 메서드 재정의만 해주면 확장이 가능합니다. 하지만 추상클래스는 다중 상속이 불가능하므로 확장하는것이 까다롭습니다. 추상클래스를 수정하는 순간 구현 클래스들 모두에게도 적용되기 때문입니다.  2. mixin 정의에 안성맞춤이다.1번과 유사한 내용인데 mixin은..
· Back-end
클래스와 멤버의 접근 권한을 최소화하라캡슐화가 잘되어 있을 수록 잘 설계된 컴포넌트라 할 수 있으며 이 캡슐화의 장점은 전반적인 유지보수에 큰 역할을 하고 규모가 클 수록 영향력이 있습니다.접근 범위는 최소부터자바에서는 접근 제어자를 활용해 정보 은닉을 할 수 있는데 모든 클래스와 멤버의 접근성을 최대한 좁혀야할 필요가 있습니다. 가장 큰 이유는 데이터의 수정을 막아서 자원이 독립적으로 존재하도록 하기 위함입니다. 따라서 처음에 최소한의 접근제어자로 설정하고 필요에 따라 점점 허용해주는 방식으로 관리하는 것이 좋습니다.private static 중첩을 이용해보자.public class HashMap extends AbstractMap implements Map, Cloneable, Serializa..
· Back-end
모든 객체의 조상 객체는 Object 클래스입니다. final이 아닌 메서드는 오버라이딩을 염두해두고 설계된 메서드인데 일반 규약을 반드시 지키면서 구현해야 합니다. equals는 일반 규약을 지켜 재정의하라 equals의 잘못된 재정의는 오류를 발생시킵니다. 가장 좋은 방법은 재정의 없이 Objects.equals()를 사용하는 것입니다. 재정의 하지 않아도 되는 경우동등성 비교가 필요없는 경우상위 클래스의 equals로 충분한 경우클래스가 private이거나 package-private인 클래스의 경우 equals 재정의 규약1. 반사성given NotNull x,x.equals(x) == true 2. 대칭성given NotNull x, y,x.equals(y) == y.equals(x) 3. 추이..
1. MySQL 엔진 아키텍처1. MySQL 전체 구조MySQL 엔진클라이언트 접속, 쿼리 요청 처리스토리지 엔진데이터를 디스크에 저장하거나 읽어옴스토리지 엔진은 핸들러 API(디스크와 통신)만 만족하면 어떤 것을 사용해도 됨여러 개 동시 사용 됨대표적으로 InnoDB, MyISAM이 존재InnoDB - 무결성, 트랜잭션 중심MyISAM - 읽기중심     2. MySQL 스레딩 구조MySQL은 프로세스 기반이 아닌 스레드 기반으로 작동Q. 다른 dbms는? 스레드 기반의 장단점은?ORACLE DATABASE가 있다고는 하는데 찾아봐도 자료가 잘 없음… 스레드 기반장점낮은 메모리 소비: 스레드는 프로세스보다 적은 메모리를 사용하므로, 스레드 기반 아키텍처는 메모리 사용이 효율적입니다.빠른 컨텍스트 스위칭..
· Back-end
JVM heap 지표Heap Memory UsageUsed Heap객체가 생성되고 GC가 수행되기 전까지 증가현재 사용 중인 힙 메모리 양Committed Heap힙 메모리 사용량이 증가할 때 JVM은 더 많은 메모리를 요청하여 커밋된 힙 메모리를 늘릴 수 있습니다.JVM이 운영 체제로부터 할당받은 힙 메모리의 양Max HeapJVM이 사용할 수 있는 최대 힙 메모리 양 heap 종류Eden Space새로운 객체가 처음 할당되는 영역Eden Space가 가득 차면 Minor GC가 발생하여, 살아남은 객체를 Survivor Space로 이동시키거나 필요 시 Old Generation으로 이동 (절벽 형태가 나타나는 이유)Survivor SpaceEden Space에서 살아남은 객체가 임시로 저장되는 공간..
· Back-end
부하테스트 과정 1. 현실적인 시나리오 설정실제 사용자 행동 모사테스트는 실제 사용자가 시스템을 어떻게 사용할지 반영다양한 부하 수준 적용가벼운 부하부터 극한 상황까지 다양한 부하 조건을 테스트하여 시스템의 반응을 평가 2. 정확한 모니터링과 측정성능 메트릭 수집CPU 사용률, 메모리 사용량, 네트워크 대역폭 등 다양한 성능 지표 수집응답 시간과 처리량 측정요청에 얼마나 빨리 응답하는지, 단위 시간당 처리할 수 있는 작업량은 어느 정도인지 평가 3. 분석 및 보고결과 분석수집된 데이터를 분석하여 성능 병목 지점 식별 후, 시스템의 최대 처리 용량을 평가종합 보고서 작성테스트 결과를 문서화하여 공유하고, 개선 사항 제안 4. 반복적 테스트와 튜닝성능 튜닝초기 테스트 결과를 바탕으로 시스템 최적화지속적인 테..
whitem4rk
high-end back-end