기술 면접을 위해 공부한 내용을 간단하게 정리한 글 입니다.
절차지향 vs 객체지향
- 절차지향 프로그래밍 : 물이 위에서 아래로 흐르듯이 순차적 처리를 중시하는 프로그래밍 기법
- 대표적으론 C언어가 있다
- 컴퓨터의 처리구조와 유사하기에 속도가 빠르다는 장점이 있다
- 하지만, 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다
- 객체지향 프로그래밍 : 실세계의 사물을 객체로 모델링 하여 개발을 진행하는 기법
- 대표적으론 Java가 있다.
- 캡슐화,상속,다형성 등을 통해 재사용성 및 변형 가능성을 높일 수 있다.
- 절차지향에 비해 속도가 느리다
객체지향 설계 5원칙 (SOLID)
- SRP : 단일 책임 원칙, 클래스는 단 하나의 목적을 가져야 하고 변경하는 이유 또한 단 하나여야 한다.
- 즉, 다른 클래스의 변경으로 자신이 변경되
- OCP : 개방 폐쇄의 원칙, 확장은 가능하지만 변경엔 닫혀있어야 한다.
- LSP : 리스코프 교체의 원리, subType이 baseType을 대체할 수 있어야 한다.
- 즉, 상위 타입의 객체를 하위 타입으로 바꾸어도 프로그램은 일관되게 동작해야 함
- ISP : 인터페이스 분리의 원칙, Client들은 자신이 쓰지 않은 method에 의존을 강요받아서는 안된다
- DIP(Dependency Inversion principle,의존관계 역전의 원리)
- 상위 레벨의 모듈은 하위레벨의 모듈에 의존해서는 안된다
- 클라이언트는 추상화(인터페이스)에 의존해야 하고 구체화(구체 클래스)에 의존해선 안된다.
RESTful API
- HTTP통신에서 어떤 자원에 대한 CRUD요청을 Resource와 Method로 표현하여 특정한 형태로 전달하는 방식
- Resource(URI), Method(Get,Post,Put,DELTE,PATCH, OPTION ..), 자원의 형태 (json,xml..)들로 구성된다.
메모리 구조
- 코드 영역 : 실행할 프로그램의 코드가 저장되는 영역
- 데이터 영역 : 프로그램의 전역변수와 정적 변수가 저장되는 영역
- 힙 영역 : 프로그래머가 직접 관리할 수 있는 메모리 영역으로 동적으로 할당할 수 있는 영역이다.
- java에선 GC(가비지 컬렉터)가 자동으로 메모리 관리를 해준다.
- 스택 영역 : 함수의 호출과 함께 할당되며 지역변수, 매개변수가 저장되는 영역이다.
- 함수의 호출이 완료되면 소멸한다.
Parameter vs Argument
- Parameter : 함수를 선언할 때 사용된 변수
- Argument : 함수가 호출되었을 때 파라미터로 전달된 실제 값
Framework vs Library
- Framewrok : 전체적 흐름을 자체적으로 제어한다
- 프레임 워크를 사용하면 사용자가 관리해야 하는 부분을 프레임워크에 넘기게 되는데 이를 IoC(Inversion Of Control,제어의 역전)이라고 한다.
- Libraray : 사용자가 흐름을 제어하고 필요한 상황에 가져다 쓰는 것
TDD란?
- Test Driven Development의 약자로, 매우 짧은 개발 사이클에 의존하는 개발 프로세스이다. 개발자는 요구사항에 맞는 테스트 케이스를 작성하고 그에 맞는 코드를 작성하여 테스트를 통과시키고 후에 리팩토링을 하는 테스트 주도 개발 방식을 의미한다.
DDD란?
- Domain Driven Development의 약자로, 실세계에서 사건이 발생하는 집합인 Domain을 중심으로 설계하는 방법이다. 쇼핑몰에서 고객이 주문을하는 도메인, 판매자가 관리를 하는 도메인 등을 예로 들 수 있다.
- 도메인들이 서로 상호작용하며 서비스를 제공하는 것으로, MSA를 적용하기 적합하다.
- 또한, 같은 객체도 도메인에 따라 다른 정보를 담을 수 있다. 즉, 문맥에 따라 객체의 역할이 바뀔 수 있다.
MSA란?
- 모든 시스템의 구성요소가 한 프로젝트에 통합된 Monolithic Architecture의 한계점을 극복하고자 등장한 아키텍처이다.
- 프로젝트를 여러개의 서비스로 분할하여 각각의 서비스가 API를 통해 데이터를 주고받으며 모여 하나의 큰 서비스를 주고 받는 형태이다.
- 일부 서비스에 장애가 발생해도 전체 서비스까지 장애가 전파되지 않고, 각 서비스마다 다른 언어, 프레임워크로 만들 수 있으며, 확장이 용이하다는 장점이 있다
- 하지만, 서비스가 분리되어 있기에 테스팅, 트랜잭션 처리가 어렵고, 서비스간 통신에 따른 비용이 발생하며, 디버깅 및 에러 트레이싱이 어렵다는 단점이 있다.
참고
https://mangkyu.tistory.com/88
https://gyoogle.dev/blog/interview/%EC%96%B8%EC%96%B4.html