[기술공부]MSA, 제네릭

allnight5·2023년 3월 29일
0

기술공부

목록 보기
7/33

순서
1. MSA란?
2. 제네릭이란?
3. 제네릭 사용의 이점
4. 컬렉션 클래스에서 제네릭을 사용하는 이유?
5. 제네릭의 제거 시기
6. 컬렉션은 무엇이있나(List, Map, Set)?
7. iterator

1. MSA(Microservice Architecture)란?

MSA는 하나의 서비스를 만들 때 도메인별로 서비스를 쪼개어 독립적으로 서비스하고, 배포할 수 있도록 구성하는 아키텍쳐이다.
MSA는 1개의 시스템을 독립적으로 배포 가능한 각각의 서비스로 분할하며, 각각의 서비스는 API를 통해 데이터를 주고 받으며 1개의 큰 서비스를 구성한다.

모든 시스템의 구성요소가 한 프로젝트에 통합되어 있는 Monolithic Architecture의 한계점을 극복하고자 등장하게 되었다.

MSA는 각각의 서비스들을 서로 다른 언어와 프레임워크로 구성할 수 있어 일부 서비스에 장애가 발생해도 전체 서비스에 영향을 끼치지 않고, 확장에 용이하다는 장점이 있다.

반면, 서비스가 분리되어 있기 때문에 테스트나 트랜잭션 처리 등이 어렵고, 서비스 간에 API로 통신하기 때문에 그에 대한 비용이 발생한다는 단점이 있다.
서버가 분할 되어있기 때문에 데이터도 분할되어있기 때문에 성능또한 저하될 가능성이 있다.
또 서비스 간의 호출이 연속적이기 때문에 디버깅 및 에러 트레이싱이 어렵다.

1-1 Monolithic Architecture

장점


-하나의 언어와 프레임워크에 종속되어 구현하는 사람 입장에서는 하나의 언어와 프레임워크만 사용하면 된다.

-하나의 프로그램을 실행하면 모든 서비스가 동작되어 End to End 테스트를 하기 쉽다.

-초기 개발을 빠르게 가져갈 수 있다. (스타트업 입장에서 극초기에 서비스 모델이 성공할지 실패할지 모르니 빠르게 시장의 평가를 받아볼 수 있어서 사용할 것 같음)

단점


-하나를 고치면 전체 시스템에 영향을 주기 때문에 다시 빌드하고 배포하는 과정, 테스트를 하는 과정에서 상당히 비용이 많이 든다. 또한 테스트를 마쳤다고 해도 사이드 이펙트가 터지지 않는 것은 아니다.

-알맞는 언어, 프레임워크를 선택하기 어려울 수 있다.

-일단 개발을 시작하면 언어, 프레임워크를 변경할 수 없다.(수정하는데 비용과 시간 측면에서 최악이다.)

-부분 장애 때문에 시스템 전체 장애가 날 수 있는 구조이다.

-시스템의 크기가 커지면 커질수록 빌드와 배포가 오래걸린다.

-모든 개발자들 전체적인 코드를 이해하고 있어야 한다.(하나를 수정하면 다른 서비스에도 영향을 주기 때문에)

-위의 단점들로 인해 전반적인 유지보수가 힘들고 어렵다.

이런 단점을 보안한 것이 SAGA패턴이다.

SAGA의 패턴은 두가지가 있는데
하나는 Choreography based SAGA pattern
하나는 Orchestration based SAGA pattern

2. 제네릭이란?

제네릭스 사용자의 시점에서 타입을 지정해주는 클래스
자바에서 제네릭(generic)이란 데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미한다.
제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다.
자바에서 제네릭은 클래스와 메소드에만 다음과 같은 방법으로 선언할 수 있습니다.

class MyArray<T> {
    T element;
    void setElement(T element) { this.element = element; }
    T getElement() { return element; }
}

제네릭 타입의 매개변수
E: element/ T : Type / V : Value / K: key

3. 제네릭 사용의 장점

1.동적로 타입이 결정되지 않고 컴파일시 타입이 결정 되므로 안전한 프로그래밍이 가능하다
2. 런타임 타입 충돌 문제 방지
3. 개발시 타입 캐스팅 절차 불필요(타입 변환이 없어 성능 저하가 없다.)
4. ClassCaseException 방지 -> 부모클래스가 자식 클래스를 캐스팅

제네릭을 사용하여 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 객체의 타입을 미리 명시해줌으로써, 번거로운 형변환을 줄여주고 컴파일 시에 객체의 타입을 체크하기 때문에 런타임에 발생할 수 있는 오류를 줄여준다.

4. 컬렉션 클래스에서 제네릭을 사용하는 이유?

List<E>, Set<E>, Map<K,V>
List<Integer>

만 사용할 수도 있다. 하지만 객체자체를 넣고 싶을때도 있지 않은가?
컬렉션 타입 매개변수에는 E, K, V를 다 지원해준다.
저자리에가 넣어주면 적용이 된다는 것이다.

제네릭이 나오기 전에는 Object를 넣어서 사용했는데 이것을 원하는 것으로 다시 instansof와 같이 형변환을 해줘야 했는데 이때 오류가 발생할 수 있다.
ClassCaseException 방지 -> (부모클래스가 자식 클래스를 캐스팅)
이런 것을 방지할수 있께 해준다.

다른 객체를 형변환 없이 사용하기 위해서 컬렉션 클래스에서 제네릭을
사용하는 것이라고 생각한다.

또 다른 이유는 3번의 제네릭의 장점을 보면된다.

5. 제네릭의 제거 시기

자바 코드에서 선언되고 사용된 제네릭 타입은 컴파일 시 컴파일러에 의해 자동으로 검사되어 타입 변환. 이후 코드 내의 모든 제네릭 타입은 제거되어, 컴파일된 class 파일에는 어떠한 제네릭 타입도 포함되지 않게 된다.

이런 식으로 동작하는 이유는 제네릭을 사용하지 않는 코드와의 호환성을 유지하기 위함이다.

6. 컬렉션은 무엇이있나?

  1. 런타임 시점타입 안전성
  2. 타입 불일치를 통한 재사용성
  3. 컴파일러가 타입검사를 실행할때 문제를 바로 발견할수 있기때문에

컬렉션 클래스

  • 여러 개의 주소를 보관할 때 사용하는 클래스이다.
  • 사용 목적 :
    배열의 문제는 인스턴스를 배열 크기 만큼만 저장할 수 있다는 것이다.
    더 추가로 저장하고 싶다면, 새 배열을 만들어야 하니 컬렉션 클래스라는 것을 만듬

자바에서 제공하는 컬렉션 클래스의 종류

1) List 계열

- null 값을 저장할 수 있다.

- 값을 중복 저장할 수 있다.

- 값을 넣는 순서대로 저장한다.

  그래서 값을 꺼낼 때도 넣은 순서대로 꺼낼 수 있다.

- 값을 꺼낼 때 숫자 인덱스를 사용하여 꺼낸다.

- 예) ArrayList, LinkedList

2) set계열

- HashSet

- null 값을 저장할 수 있다.

- 값을 중복 저장할 수 없다.

   이유 -> 집합이기 때문

- 값을 넣을 때 인스턴스의 해시값을 기준으로 저장하기 때문에

  순서대로 저장되지 않는다.

  그래서 값을 꺼낼 때도 순서대로 꺼낼 수 없다.

- 값을 꺼낼 때 숫자 인덱스로 꺼낼 수 없다.

- 예) HashSet

3) Map 계열

- 값을 저장할 때 key 개체의 해시 값(hash value)을 사용하여 저장한다.

- 값을 꺼낼 때도 key 객체의 해시 값을 사용하여 꺼낸다.

- 값을 중복 저장할 수 없다.

- 순서대로 저장하고 순서대로 꺼낼 수 없다.

- 보통 문자열 라벨을 사용하여 값을 저장하고 꺼낼 때 주로 사용한다.

 - 예)

   HashMap :

    - key나 value로 null을 허용한다.

    - 동기화를 지원하지 않는다.

      => 여러 스레드가 동시에 접근하여 값을 변경하는 것을 막지 않는다.

      => 데이터의 입출력 속도가 빠르다.

      => 대신 여러 스레드가 동시에 값을 바꿀 수 있기 때문에 

         멀티 스레드 상황에서 사용할 때 주의해야 한다.

   Hashtable : 

    - key나 value로 null을 허용하지 않는다.

    - 동기화를 지원한다.

      => 여러 스레드가 동시에 접근하더라도 그 중 한개의 스레드만이 접근할 수 있다.

      => 데이터의 입출력 속도가 느리다.

      => 대신 여러 스레드가 동시에 값을 바꿀 수 없기 때문에
		 멀티 스레드 상황에서 안전하게 사용할 수 있다.

7. iterator

바에서 Iterator는
컬렉션 프레임워크(Collection Framework)에서
값을 가져오거나 삭제할 때 사용하는데
먼저 컬렉션 프레임워크는
List, Set, Map, Queue 등을 말한다 

다음으로 컬렉션 프레임워크를 생성한 뒤
Iterator<데이터타입> iterator명 = 컬렉션.iterator();
이렇게 사용하게 된다
 

list.get(값); 이런 식으로 가져올 수 있는데
직접 꺼내올 수 없는 Set이 아니라면야
사용 이유가 있나? 뭣하러 쓰나 싶으나

장점

  1. Iterator는 모든 컬렉션 프레임워크에 공통으로 사용 가능
  2. 컬렉션 프레임워크에서 쉽게 값을 가져오고 제거할 수 있음
  3. 3개의 메소드만 알면 되어서 사용하기 매우 쉽다
Iterator.hasNext() 
- Iterator 안에 다음 값이 들어있는지 확인 
들었으면 true, 안들었음 false 

Iterator.next() 
- iterator의 다음 값 가져오기 

Iterator.remove() 
- iterator에서 next() 시에 가져왔던 값을 
반드시 next() 후에 사용해야 함

단점

1.처음부터 끝까지의 단방향 반복만 가능
2.값을 변경하거나 추가가 불가능
3.대량의 데이터를 제어할 때 속도가 느리다

참고자료
제네릭1
제네릭2
컬렉션
Monolithic Architecture

profile
공부기록하기

0개의 댓글