Day3

이한주·2023년 2월 23일
0

MSA(Microservice Architecture)란?

=> MSA는 1개의 시스템을 독립적으로 배포 가능한 각각의 서비스로 분할하는 아키텍처다.
각각의 서비스는 API를 통해 데이터를 주고 받으며 1개의 큰 서비스를 구성한다.
모든 시스템의 구성요소가 한 프로젝트에 통합되어 있는 Monolithic Architecture(모놀리식 아키텍쳐)의 한계점을 극복하고자 등장했다.

=> 장점
일부 서비스에 장애가 발생해도 전체 서비스에 영향을 끼치지 않는다.
각각의 서비스들은 서로 다른 언어와 프레임워크로 구성될 수 있다.
서비스의 확장이 용이하다. 특정 서비스만 scale in/out이 가능해 트래픽에 유연한 대처가 가능하다.

=> 단점
서비스가 분리되어 있어 테스트나 트랜잭션 처리 등이 어렵다.
서비스 간에 API로 통신하기 때문에 그에 대한 비용이 발생한다.
서비스 간의 호출이 연속적이기 때문에 디버깅 및 에러 트레이싱이 어렵다.

모놀리식의 장단점

=> 장점
1. 손쉬운 배포

  • 실행 파일 또는 디렉토리가 하나여서 배포가 쉽다.
  1. 개발 편의
  • 하나의 코드 베이스로 애플리케이션을 구축하여 개발이 쉽다.
  1. 테스트 간소화
  • 모놀리식 애플리케이션은 하나의 중앙 집중식이므로 분산된 애플리케이션보다 엔드투엔드 테스트를 더 빠르게 수행 가능하다.

=> 단점
1. 확장성

  • 개별 컴포넌트를 확장하기 어렵다
  1. 안정성
  • 모듈에 오류가 있으면 애플리케이션 전체 가용성에 영향을 준다.
  1. 기술 채택의 장벽
  • 프레임워크 또는 언어를 변경하면 애플리케이션 전체에 영향을 미치므로 변경 시 비용과 시간이 많이 소요된다.

제네릭에 대해서 설명하고, 컬렉션 클래스에서 왜 제네릭을 사용하는 지 설명해주세요.

=> 제네릭이란 데이터의 타입을 일반화한다는 것을 의미한다.
다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 객체의 타입을 미리 명시해줌으로써 번거로운 형변환을 줄여주고
컴파일 시에 객체의 타입을 체크하기 때문에 런타임에 발생할 수 있는 오류를 줄여준다.
데이터 타입은 클래스 외부에서 설정하기 때문에 확장성을 가진다.
제네릭의 장점은 객체의 타입 안정성을 높일 수 있고, 반환 값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.

=> 컬렉션 클래스는 내부 메소드에 대해 다양한 타입을 지원한다.
제네릭을 사용하면 여러 타입의 파라미터를 삽입해 객체를 생성할 수 있기 때문에 코드를 간결하게 하고 재사용성을 높인다.
여러 데이터 타입을 제네릭을 통해 지원해서 확장성을 가진다.

타입 안정성이란

=> 타입 안정성을 높인다는 것은 의도하지 않은 타입의 객체를 저장하는 것을 막고, 저장된 객체를 꺼낼 때에도 원래의 타입과 다른 타입으로 형변환 되는 오류를 줄인다는 것이다.
예를 들어 String형만 저장하고 싶을 때, 제네릭스를 사용하면 다른 형을 입력받지 못하게 하여 타입 안정성을 제공하는 것이다.

Object와 차이

=> Object 타입을 사용해서도 데이터 타입을 일반화할 수 있는데, 이 경우 다시 원하는 타입으로 변환해야 하고 오류가 생길 가능성도 존재했다.
문제는 오류가 컴파일 타임이 아닌 런타임에 발생할 수도 있다.

List, Set, Map, HashMap의 차이에 대해서 설명해주세요.

  1. List
  • 순서가 있고 중복을 허용합니다.
  • 크기가 가변적입니다.
  • LinkedList, ArrayList가 있다.

LinkedList, ArrayList 차이

=> ArrayList

  • 내부적으로 배열로 데이터를 관리한다.
  • 인덱스를 통해 데이터 참조가 가능하다.
  • 데이터의 추가, 삭제를 위해 아래와 같이 임시 배열을 생성해 데이터를 복사하는 방법을 사용하고 있다.
  • 따라서 O(n)의 시간복잡도가 추가/삭제에 요구된다.

=> LinkedList

  • 데이터를 하나의 노드로 구성한다.
  • 노드는 이전 노드와 다음 노드와 연결된다.
  • 데이터의 추가/삭제에서 O(1)의 시간 복잡도를 가질 수 있다.
  1. Set
  • 데이터의 집합이며 순서가 없고 중복된 데이터를 허용하지 않습니다.
  • Hash 알고리즘을 통해 데이터 중복을 빠르게 구할 수 있다.
  • 인덱스가 따로 존재하지 않기 때문에 조회시 iterator를 사용합니다.
  • HashSet, TreeSet을 사용한다.
  1. Map
  • Key와 Value의 한쌍으로 이루어지는 데이터의 집합이다.
  • Key에 대한 중복이 없으며 순서를 보장하지 않는다.
  • 인덱스가 따로 존재하지 않기 때문에 조회시 iterator를 사용한다.
  • HashMap, HashTable, TreeMap 등의 종류가 있다.
  1. HashMap
  • Map 인터페이스를 구현한 대표적인 Map 컬렉션이고, Map의 성질을 그대로 가진다.
  • HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.
  • 동기화가 보장되지 않는다.
  • 검색에 가장 뛰어난 성능을 가진다.

해싱 해결

open addressing, Separate Chaining이 있다.
자바에서는 Seperate Chaingng을 사용한다.
Separate Chaining방식은 찾은 해시값의 버킷이 이미 사용중인 경우 링크드 리스트를 만들어 순차적으로 저장한다.
index에 들어가있는 첫 인자는 링크드 리스트의 head 부분이 된다.
자바 7 까지는 기본적인 Separate Chaining을 활용하여 O(N)의 시간복잡도를 발생시켰지만. 자바 8에서 부터 링크드 리스트부분을 red-black-tree를 활용하여 O(logN)의 시간을 가지고 해결하도록 성능을 향상 시켰다.

0개의 댓글