MSA(Microservice Architecture)란?
💡 **MSA(Microservice Architecture)**란 소프트웨어 시스템을 작고 독립적인 서비스 단위로 나누어 구축하는 아키텍처 디자인 패턴입니다. 각각의 서비스는 자체적인 데이터베이스를 가지고 있으며, 독립적으로 배포, 확장, 개발될 수 있습니다. 또한, 서비스 간 통신은 경량화된 프로토콜을 사용하고, RESTful API를 통해 이루어지기 때문에, 더욱 높은 유연성과 확장성을 제공할 수 있습니다.
장점
- 더 나은 확장성
- 각각의 서비스가 독립적으로 배포 및 확장이 가능
- 높은 유연성
- 독립적 → 다른 서비스에 영향 없이 필요에 따라 개발 및 수정이 가능
- 생산성 증가
- 각각의 서비스가 작고, 독립적으로 개발 → 개발 생산성과 테스트 생산성이 높아짐
- 기술적인 다양성
- 다양한 기술을 적용할 수 있음
- 개별적 서비스를 개발 → 프로젝트 전체적으로 종속성이 줄어듦
- 안정성 향상
- 각각의 서비스가 독립적으로 운영 → 전체 시스템 안정성 향상
단점
- 구현 및 운영 복잡도 증대
- 관리 및 운영이 복잡해 질 수 있음
- 테스트 증대
- 다수의 서비스에 대해 테스트를 진행해야 함
비교
- 모노리스(monolithic) 아키텍처
- 애플리케이션을 단일 코드 베이스로 구축하고 배포하는 방식.
- 이와 달리 MSA는 작고 독립적인 서비스로 분할되며, 각 서비스는 서로 다른 데이터베이스와 통신.
- SOA(Service Oriented Architecture)
- SOA도 마찬가지로 서비스를 독립적으로 개발하고 배포하며, 이들 서비스는 표준 인터페이스를 통해 통신
- 그러나 MSA는 SOA보다 더 작고 독립적인 서비스 단위를 사용하고, 더 가볍고 빠른 배포를 지향합니다. 또한 MSA는 컨테이너 기반 환경에서 구축되는 것이 일반적이며, 이는 자동화된 배포 및 확장이 가능하게 해줍니다
제네릭에 대해서 설명하고, 컬렉션 클래스에서 왜 제네릭을 사용하는 지 설명해주세요.
💡 **제네릭(Generic)**은 자바에서 클래스나 메소드를 정의할 때, 타입(type)을 일반화(일반적인 형태)시켜서 다양한 타입의 객체들을 다룰 수 있도록 하는 기법입니다. 제네릭은 클래스나 메소드를 작성할 때 구체적인 타입 대신 타입 매개변수(type parameter)를 사용하여 클래스나 메소드에서 사용될 실제 타입을 나중에 지정하는 방식입니다.
컬렉션 클래스에서 제네릭을 사용하는 이유는 다양한 타입의 객체를 컬렉션에 저장할 수 있기 때문입니다. 예를 들어 ArrayList 클래스는 객체를 배열 형태로 저장하는 자료구조이며, 컬렉션에 저장되는 객체의 타입을 미리 지정해주지 않으면 모든 타입의 객체를 저장할 수 있습니다. 이렇게 되면 컬렉션에서 객체를 꺼내올 때 형변환을 해야 하는 번거로움이 발생합니다. 제네릭을 사용하면 컬렉션에 저장되는 객체의 타입을 미리 지정해주므로, 객체를 꺼내올 때 형변환을 할 필요가 없어 편리합니다.
또한, 제네릭을 사용하면 컴파일러가 타입 검사를 수행하여 프로그램에서 발생할 수 있는 런타임 오류를 컴파일 시점에 잡아낼 수 있습니다. 따라서 타입 안정성(type safety)을 보장하고, 프로그램의 안정성과 유지보수성을 높일 수 있습니다.
예시
ArrayList list = new ArrayList();
list.add("hello");
String str = (String) list.get(0); // 타입 캐스팅 필요
위 코드에서는 ArrayList에 문자열 타입의 데이터를 추가한 후, get 메서드로 데이터를 가져와 사용함. 하지만 list.get(0)으로 가져온 데이터는 Object 타입으로 반환되기 때문에, String 타입으로 사용하기 위해서는 강제 형변환이 필요하게 됨. 이 때문에 컴파일러는 타입 안정성을 보장할 수 없으며, 런타임 시 예외가 발생할 수도 있습니다.
아래는 제네릭 코드를 사용.
ArrayList<String> list = new ArrayList<String>();
list.add("hello");
String str = list.get(0); // 타입 캐스팅 불필요
위 코드에서는 ArrayList를 생성할 때 타입 파라미터로 문자열(String) 타입을 지정함. 이렇게 타입 파라미터를 사용하면 ArrayList에 추가한 데이터를 get 메서드로 가져올 때, 강제 형변환을 할 필요 없이 바로 사용가능. 이를 통해 컴파일러는 타입 안정성을 보장할 수 있고, 런타임 시 타입 관련 예외가 발생할 가능성이 낮아집니다.
'스파르타 기술면접' 카테고리의 다른 글
| Filter / Interceptor / AOP (0) | 2023.04.11 |
|---|---|
| DI의 방식 중 필드 vs 생성자 주입 방식 (0) | 2023.04.11 |
| DI 방식, FIlter / Interceptor / AOP (0) | 2023.03.30 |
| DI , DB에서의 인덱스 사용(2일차) (0) | 2023.03.30 |
| 객체지향 프로그래밍(OOP) , REST API(1일차) (0) | 2023.03.30 |