=> MSA는 1개의 시스템을 독립적으로 배포 가능한 각각의 서비스로 분할하는 아키텍처다.
각각의 서비스는 API를 통해 데이터를 주고 받으며 1개의 큰 서비스를 구성한다.
모든 시스템의 구성요소가 한 프로젝트에 통합되어 있는 Monolithic Architecture(모놀리식 아키텍쳐)의 한계점을 극복하고자 등장했다.
=> 장점
일부 서비스에 장애가 발생해도 전체 서비스에 영향을 끼치지 않는다.
각각의 서비스들은 서로 다른 언어와 프레임워크로 구성될 수 있다.
서비스의 확장이 용이하다. 특정 서비스만 scale in/out이 가능해 트래픽에 유연한 대처가 가능하다.
=> 단점
서비스가 분리되어 있어 테스트나 트랜잭션 처리 등이 어렵다.
서비스 간에 API로 통신하기 때문에 그에 대한 비용이 발생한다.
서비스 간의 호출이 연속적이기 때문에 디버깅 및 에러 트레이싱이 어렵다.
=> 장점
1. 손쉬운 배포
=> 단점
1. 확장성
=> 제네릭이란 데이터의 타입을 일반화한다는 것을 의미한다.
다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 객체의 타입을 미리 명시해줌으로써 번거로운 형변환을 줄여주고
컴파일 시에 객체의 타입을 체크하기 때문에 런타임에 발생할 수 있는 오류를 줄여준다.
데이터 타입은 클래스 외부에서 설정하기 때문에 확장성을 가진다.
제네릭의 장점은 객체의 타입 안정성을 높일 수 있고, 반환 값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.
=> 컬렉션 클래스는 내부 메소드에 대해 다양한 타입을 지원한다.
제네릭을 사용하면 여러 타입의 파라미터를 삽입해 객체를 생성할 수 있기 때문에 코드를 간결하게 하고 재사용성을 높인다.
여러 데이터 타입을 제네릭을 통해 지원해서 확장성을 가진다.
=> 타입 안정성을 높인다는 것은 의도하지 않은 타입의 객체를 저장하는 것을 막고, 저장된 객체를 꺼낼 때에도 원래의 타입과 다른 타입으로 형변환 되는 오류를 줄인다는 것이다.
예를 들어 String형만 저장하고 싶을 때, 제네릭스를 사용하면 다른 형을 입력받지 못하게 하여 타입 안정성을 제공하는 것이다.
=> Object 타입을 사용해서도 데이터 타입을 일반화할 수 있는데, 이 경우 다시 원하는 타입으로 변환해야 하고 오류가 생길 가능성도 존재했다.
문제는 오류가 컴파일 타임이 아닌 런타임에 발생할 수도 있다.
=> ArrayList
=> LinkedList
open addressing, Separate Chaining이 있다.
자바에서는 Seperate Chaingng을 사용한다.
Separate Chaining방식은 찾은 해시값의 버킷이 이미 사용중인 경우 링크드 리스트를 만들어 순차적으로 저장한다.
index에 들어가있는 첫 인자는 링크드 리스트의 head 부분이 된다.
자바 7 까지는 기본적인 Separate Chaining을 활용하여 O(N)의 시간복잡도를 발생시켰지만. 자바 8에서 부터 링크드 리스트부분을 red-black-tree를 활용하여 O(logN)의 시간을 가지고 해결하도록 성능을 향상 시켰다.