
1. Spring MVC - Thread per request model로 구현되어 있다. - 보통 tomcat 서버는 디폴트로 200개의 thread를 가진 thread pool을 지원한다. 분산시스템에서 API 서버가 아닌, 다른 API 서버의 REST API를 호출해 데이터를 통합하는 경우가 매우 흔한데, Blocking I/O 방식으로 동작하기 때문에 시스템 부하가 높다면 context switching과 thread data loading으로 인해 overhead가 발생한다. 얼마 안되는 코어(많아봤자 8코어)에 200개의 thread가 존재하기 때문에 thread끼리의 경합이 일어나 큰 부하로 이어진다. - 리소스가 부족한 서버에서 처리할 수 있는 동시 처리량은 매우 제한적이다 (thread ..

1. 동기화란 [예]하나의 객체를 두개의 Thread가 접근할 때 생기는 일 귤 두박스가 있을때, 한 박스당 하나의 스레드가 담당하도록 설정하고 상한 귤을 골라 개수를 계산한다고 할때, badCounter는 두 박스가 공유함. heap 메모리 안에 badCounter 객체가 있고, cpu는 single core일때, Thread1과 Thread2에는 context switching이 일어나면서 실행이 될 것이다. t1이 담당하는 박스에 상한 귤이 2개이고, t2가 담당하는 박스에 상한 귤이 5면 state값이 7개 여야하는데, 그게 보장이 안될 수 있다. increment 메서드 안에 state++ 코드가 cpu레벨에서 어떻게 실행되는지가 중요하다. 프로그래밍언어를 cpu가 이해할 수 있는 명령어로 변환..

1. 데이터 베이스의 원칙 (1) 무결성 (Data integrity) - 데이터의 무결성은 데이터의 정확성(Accuracy), 일관성(Consistency)가 유지되는 것을 말하며, 데이터의 무결성을 유지하는 것은 DBMS의 중요한 기능이다. (2) 안정성 (Data reliability) - 데이터는 복원력이 있어야 하며(resilient), 고장이 나지 않아야 한다. - 인증/인가되지 않은 사용자로부터 데이터를 보호해야 한다. (3) 확장성 (scalability) - 데이터베이스는 확장할 수 있어야 한다. (Scale-up & Scale-out) 2. 다양한 데이터베이스 종류 데이터베이스는 일반적으로 컴퓨터 시스템에 전자 방식으로 저장된 구조화된 정보 또는 데이터의 체계적인 집합을 의미하는데, D..
자바 5 버전 부터 Varargs의 개념이 도입되었다. (아마 5부터 등장한 제네릭의 영향인것으로 개인적으로 추정한다) 따라서 여러 argument를 메서드에서 받을 수 있다. void foo(T... args); 위 코드에서 T...는 T[ ] 로 변환된다. 하지만 문제는 T의 값이 가 다른 타입의 파라미터일 경우 동작하지 않는다. new T[ ]를 사용할 수 없기 때문에 new Object[ ] 라는 것을 사용한다. 만약 내 메서드가 T... 타입의 argument를 가지고 있으면, Safe: array의 요소가 T의 인스턴스인지에 대해서만 달렸다. 사실에 내 메서드가 의존한다.If your method only depends on the fact that the elements of the arra..

자바에서 array를 list로 변환하는 방법에는 두 가지 방법이 있다. 자바에서 Array를 list로 변환하기 위해서 1. Arrays.asList(array) 방법 2. List.of(array) 방법 총 두 가지 방법이 있다. 차이점은 무엇일까? 1. 변경가능 여부 (Mutable / Immutable) Arrays.asList()로 반환된 list는 변경이 가능하다. 하지만, List.of()에서 반환된 메서드는 변경이 불가능하다. Arrays.asList 메서드를 뜯어보면 다음과 같이 List를 리턴한다. @SafeVarargs @SuppressWarnings("varargs") public static List asList(T... a) { return new ArrayList(a); } 반..

1. Unit testing의 장점 Unit test의 필요성은 의심의 여지가 없다. 장점이 너무 많기 때문이다. (1)간결하게 말하자면, 유닛 테스트는 빠르게 문제가 발생한 것을 확인할 수 있고, 빠르게 고칠수 있다. 버그를 찾는데 더 적은 자원이 소비되기 때문에, 팀은 프로젝트의 다음 단계로 옮겨갈 수 있다. 유닛 테스트를 작성하면, 소프트웨어 건설 단계에서 많은 버그가 발견되기 때문에 다음 단계로 버그가 이동하는 것을 막아준다. 결과적으로 많은 시간과 자원을 아낄 수 있는 것이다. (2) 또한, 유닛 테스트는 프로덕트의 살아있는 documentation이다. 유닛 테스트는 적절/부적절한 소프트웨어 컴포넌트의 사용 정보를 가지고 있는 지표이기 때문에, 이려한 지표를 통해 완벽한 documentatio..

1. Upstream과 Downstream 이때까지 모호하게만 알고 있던 개념을 확실하게 짚고 가고 싶었다. upstream, origin에 대한 정확한 것이 무엇일까? 아래 그림을 참고하자. upstream이 있으면 downstream이 있다. 영어로 상류, 하류라는 뜻이다. git에서 이러한 용어들을 이용하는 이유는 관계를 잘 표현해 주기 위한 것이다. 이것은 흐름을 나타내기 위한 상대적인 개념이다. git에서도 remote upstream, remote origin, local 로 점점 내려온다. fork한 저장소에서 나의 remote 저장소에서 나의 local 저장소인 컴퓨터로 내려온다. 이 관계를 표현해 주기 위해서 강의 상류와 하류를 표현하는 upstream과 downstream의 개념을 도입..
G1:한 소스파일에 여러 언어를 사용한다 이상적으로는 소스 파일 하나에 언어 하나만 사용하는 방식이 가장 좋다. 현실적으로는 여러 언어가 불가피하지만 각별한 노력을 기울여 소스파일에서 언어 수와 범위를 최대한 줄이도록 애써야 한다. G2: 당연한 동작을 구현하지 않는다 최소 놀람의 원칙에 의거해 함수나 클래스는 다른 프로그래머가 당연하게 여길 만한 동작과 기능을 제공해야 한다. 당연한 동작을 구현하지 않으면 코드를 읽거나 사용하는 사람이 더 이상 함수 이름만으로 함수 기능을 직관적으로 예상하기 어렵다. G3: 경계를 올바로 처리하지 않는다 코드는 올바로 동작해야 한다. 스스로의 직관에 의존하지 마라. 모든 경계 조건을 찾아내고, 모든 경계 조건을 테스트하는 테스트 케이스를 작성하라. G4: 안전 절차 무..
- Total
- Today
- Yesterday