2022년도 면접 질문 모음
1. 객체 지향 언어
1.1 SOLID (객체 지향 설계)
- SRP : 단일 책임 원칙 (Single responsibility principle)
+ 한 클래스는 하나의 책임만 가져야 한다.
- OCP : 개방-폐쇄 원칙 (Open/closed principle)
+ “소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.”
- LSP : 리스코프 치환 원칙 (Liskov substitution principle)
+ “프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.” 계약에 의한 설계를 참고하라.
- ISP : 인터페이스 분리 원칙 (Interface segregation principle)
+ “특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.”[4]
- DIP : 의존관계 역전 원칙 (Dependency inversion principle)
+ 프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다.”[4] 의존성 주입은 이 원칙을 따르는 방법 중 하나다.
1.2 객체 지향 4대 요소: 캡상추다
- 캡슐화(Encapsulation) : 정보 은닉(information hiding)
- 상속(Inheritance) : 재사용
- 추상화(Abstraction) : 모델링
- 다형성(Polymorphism) : 사용 편의
2. SpringFramework
2.1 SpringFramework 의 중요 컨셉 3가지
1) IOC : 제어의 역전 / 의존성 주입
2) AOP : 관심의 분리
3) PSA : 일관성 있는 추상화
2.2 SpringBatch - The Domain Language of Batch
- 명확한 관심사 분리
- 인터페이스로 제공하는 명확한 아키텍처 레이어와 서비스
- 빠르게 적용하고 쉽게 응용할 수 있는 간단한 디폴트 구현체
- 크게 향상된 확장성
2.3 [Spring] Filter, Interceptor, AOP 차이 및 정리
- Filter : 필터(Filter)는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공
- Intercepter : Spring이 제공하는 기술로써, 디스패처 서블릿(Dispatcher Servlet)이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공
- AOP : AOP는 OOP를 보완하기 위해 나온 개념으로 객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리
2.4 Spring Security
- Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크
- Spring Security는 ‘인증’과 ‘권한’에 대한 부분을 Filter 흐름에 따라 처리
3. Spring Data JPA
- Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음
- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
- 인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함
3.1 JPA를 사용하면서 어려운점
1) 영속성 이해
2) 다중 JOIN QUERY
3) 관계 DB와 객체 지향적 DB 설계
4) N+1 문제
- 즉시 로딩으로 데이터를 가져오는 경우
- 지연 로딩으로 데이터를 가져온 이후에 가져온 데이터에서 하위 엔티티를 다시 조회하는 경우
4. Frontend Developer
4.1 Front-end-Developer-Interview-Questions
4.1.1 JAVASCRIPT
- this는 javascript에서 어떻게 작동하는지 설명해주세요.
- prototype 기반 상속은 어떻게 하는지 설명해주세요.
- 클로져(Closure)는 무엇이며, 어떻게/왜 사용하는지 설명해주세요
- 익명함수(anonymous functions)는 주로 어떤 상황에서 사용하나요?
- .call과 .apply의 차이점은 무엇인가요?
- ==와 ===의 차이점은 무엇인가요?
- Promise란 무엇인가요? 또 polyfills이란 무엇인가요?
- Promise를 사용방법과 사용했을 때 이점에 대해 설명해주세요.
- use strict;은 무엇이고, 사용했을때 장단점에 대해서 설명해주세요.
- mutable object와 immutable object에 대해 설명해주세요.
- 동기방식과 비동기방식에 대해 설명해주세요.
4.1.2 JQUERY
- "체이닝(Chaining)"에 대해서 설명 하세요.
- .end()는 무엇을 하는 것입니까?
- 이벤트 핸들러 선언 시, 언제 그리고 왜 namespace를 부여하는지를 설명해주세요.
- .get(),[] 그리고 .eq()의 차이점이 무엇인가요?
- .bind(),.live()그리고 .delegate()의 차이점이 무엇인가요?
- $과 $.fn 차이점이 무엇인지 설명 해주시오. 혹은, $.fn가 무엇인지 설명해주세요.
4.2 ReactJS
- React의 라이프사이클에 대해 설명해주세요.
+ React의 클래스형 컴포넌트에서 사용하는 LifeCycle API는, 컴포넌트가 DOM 위에 생성되거나 사라질 때, 혹은 업데이트될 때 호출되는 API입니다.
- Virtual DOM에 대해 설명해주세요.
+ DOM과 유사한 객체를 메모리에 올리고, 변경사항이 생기면 메모리에 올라간 Virtual DOM을 수정하고, DOM에 대해 비교를 수행하여 변경사항에 대해서만 DOM에 반영하는 것을 말합니다.
+ 이로 인해 더 반응성이 빠른 웹을 구현할 수 있습니다.
- Virtual DOM은 트리가 변경되었는지 어떻게 비교를 하나요?
+ React의 경우, Reconciliation을 사용합니다.
+React의 Reconciliation은 변경 전과 변경 후의 엘리먼트 노드에 대해 디핑(diffing) 비교 알고리즘을 수행합니다.
- 리액트 훅이란 무엇일까요?
+ 훅은 함수형 컴포넌트에서도 클래스형 컴포넌트의 기능을 사용할 수 있게 하는 기능입니다.
+ 훅을 통해서 함수형 컴포넌트에서도 컴포넌트의 상태값을 관리할수도, 컴포넌트의 생명 주기 메소드또한 이용할 수 있게 해줍니다.
+ 추가적으로 커스텀훅을 통해 재사용성 있는 함수를 여러 컴포넌트에서 쉽게 사용할 수 있습니다.
+ 이러한 훅은 React 버전 16.8에 추가되었습니다.
- 리액트에서 Key는 무엇인가요?
+ 리액트에서 Key는 컴포넌트 배열을 렌더링했을 때, 어떤 원소에 변동이 있었는지 알아내려고 사용합니다.
+ Key가 없을 대는 가상 DOM을 비교하는 과정에서 리스트를 순차적으로 비교하면서 변화를 감지합니다.
+ 하지만, key가 있다면 이 값을 사용하여 어떤 변화가 일어났는지 더욱 빠르게 알 수 있습니다.
- useEffect에 대해 설명해주세요.
+ useEffect 함수는 리액트 컴포넌트가 렌더링될 때마다 특정 작업을 실행할 수 있도록 하는 Hook입니다.
+ useEffect는 컴포넌트가 마운트 됐을 때, 혹은 언마운트되거나 업데이트 됐을 때, 특정 작업을 처리할 수 있습니다.
+ 클래스형 컴포넌트에서 사용할 수 있었던 생명주기 메소드를 함수형 컴포넌트에서도 사용할 수 있게 된 것입니다.
+ useEffect Hook을 사용할때는 첫 번째 인수로 실행할 콜백함수를 넣고, 두 번째 인수로 검사하고자하는 특정 값이나 빈 배열을 넣습니다.
- useCallback에 대해 설명해주세요.
+ useCallback 함수는 첫 번째 인수로 입력된 콜백의 메모이제이션 버전을 반환합니다.
+ 반환된 메모이제이션 버전은 콜백의 의존성이 변경되었을 때만 변경되며, 이는 불필요한 렌더링을 방지하기 위해 참조의 동일성에 의존적인 최적화된 자식 컴포넌트에 콜백을 전달할 때 유용합니다.
+ 예로 React의 Memo로 감싸진 컴포넌트에 프롭으로 전달하는 경우, 자주 사용됩니다.
- useMemo에 대해 설명해주세요.
+ useCallback 함수와 마찬가지로 메모이제이션된 값을 반환합니다.
+ 의존성이 변경되었을 때만 메모이제이션된 값을 다시 계산하므로, 불필요한 계산을 방지합니다.
- 메모이제이션에 대해 설명해주세요.
+ 일반적으로 메모이제이션은 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 + 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술입니다.
+ 이는 리액트에서도 불필요한 계산 혹은 리렌더링의 방지를 위해 사용됩니다.
- useRef에 대해 설명해주세요.
+ useRef 은 .current 프로퍼티로 전달된 인자로 초기화된 변경 가능한 ref 객체를 반환하며, 이 객체는 컴포넌트의 전 생애주기를 통해 유지될 것입니다.
+ 이 전 생애주기를 통한 유지란 컴포넌트가 리렌더링되어도 값이 유지가된다는 뜻입니다.
- 함수형 컴포넌트의 장점이 무엇인가요?
+ 클래스형 컴포넌트보다 선언이 간편합니다.
+ 클래스형 컴포넌트보다 메모리 자원을 덜 사용합니다.
+ 프로젝트 빌드 후 배포할 때 결과물의 파일 크기가 더 작습니다.
+ 이전에는 라이프사이클 API를 사용하지 못한다는 단점이 있었는데, 이제는 16.8부터 지원하는 Hook을 통해 이러한 단점이 사라졌습니다.
5. 디자인 패턴
- 장점
+ 개발자 간의 원활한 의사소통
+ 소프트웨어 구조 파악 용이
+ 재사용을 통한 개발 시간 단축
+ 설계 변경 요청에 대한 유연한 대처
- 단점
+ 객체지향 설계/구현 위주로 사용
+ 초기 투자 비용 부담
5.1 생성 패턴
- Abstract Factory (추상 팩토리)
+ 동일한 주제의 다른 팩토리를 묶어 준다.
- Builder
+ 생성(construction)과 표기(representation)를 분리해 복잡한 객체를 생성한다
- Factory Method
+ 생성할 객체의 클래스를 국한하지 않고 객체를 생성한다.
- Prototype (원형)
+ 기존 객체를 복제함으로써 객체를 생성한다.
- Singleton (단일체)
+ 한 클래스에 한 객체만 존재하도록 제한한다.
5.2 구조 패턴
- Adapter (적응자)
+ 인터페이스가 호환되지 않는 클래스들을 함께 이용할 수 있도록, 타 클래스의 인터페이스를 기존 인터페이스에 덧씌운다.
- Bridge (가교)
+ 추상화와 구현을 분리해 둘을 각각 따로 발전시킬 수 있다.
- Composite (복합체)
+ 0개, 1개 혹은 그 이상의 객체를 묶어 하나의 객체로 이용할 수 있다.
- Decorator (장식자)
+ 기존 객체의 매서드에 새로운 행동을 추가하거나 오버라이드 할 수 있다.
- Façade (퍼사드)
+ 많은 분량의 코드에 접근할 수 있는 단순한 인터페이스를 제공한다.
- Flyweight (플라이급)
+ 다수의 유사한 객체를 생성·조작하는 비용을 절감할 수 있다.
- Proxy (프록시)
+ 접근 조절, 비용 절감, 복잡도 감소를 위해 접근이 힘든 객체에 대한 대역을 제공한다.
5.3 행위 패턴
- Chain of Responsibility (책임연쇄)
+ 책임들이 연결되어 있어 내가 책임을 못 질 것 같으면 다음 책임자에게 자동으로 넘어가는 구조
- Command (명령)
+ 위의 명령어를 각각 구현하는 것보다는 위 그림처럼 하나의 추상 클래스에 메서드를 하나 만들고 각 명령이 들어오면 그에 맞는 서브 클래스가 선택되어 실행하는 것
- Interpreter (해석자)
+ 문법 규칙을 클래스화한 구조를 갖는SQL 언어나 통신 프로토콜 같은 것을 개발할 때 사용
- Iterator (반복자)
+ 반복이 필요한 자료구조를 모두 동일한 인터페이스를 통해 접근할 수 있도록 메서드를 이용해 자료구조를 활용할 수 있도록 해준다.
- Mediator (중재자)
+ 클래스간의 복잡한 상호작용을 캡슐화하여 한 클래스에 위임해서 처리 하는 디자인 패턴
- Memento (메멘토)
+ Ctrl + z 와 같은 undo 기능 개발할 때 유용한 디자인패턴. 클래스 설계 관점에서 객체의 정보를 저장
- Observer (감시자)
+ 어떤 클래스에 변화가 일어났을 때, 이를 감지하여 다른 클래스에 통보해주는 것
- State (상태)
+ 동일한 동작을 객체의 상태에 따라 다르게 처리해야 할 때 사용하는 디자인 패턴
- Strategy (전략)
+ 알고리즘 군을 정의하고 각각 하나의 클래스로 캡슐화한 다음, 필요할 때 서로 교환해서 사용할 수 있게 해준다.
- Template Method
+ 상위 클래스에서는 추상적으로 표현하고 그 구체적인 내용은 하위 클래스에서 결정되는 디자인 패턴
- Visitor (방문자)
+ 각 클래스의 데이터 구조로부터 처리 기능을 분리하여 별도의 visitor 클래스로 만들어놓고 해당 클래스의 메서드가 각 클래스를 돌아다니며 특정 작업을 수행하도록 하는 것
6. 기타 신기술 관련
6.1 MSA
6.1.1 장점 :
- 배포(deployment) 관점
+ 서비스 별 개별 배포 가능 ( 배포 시 전체 서비스의 중단이 없음)
- 요구사항을 신속하게 반영하여 빠르게 배포할 수 있음.
- 확장(scaling) 관점
+ 특정 서비스에 대한 확장성이 용이함.
- 클라우드 사용에 적합한 아키텍쳐.
- 장애(failure) 관점
+ 장애가 전체 서비스로 확장될 가능성이 적음
- 부분적 장애에 대한 격리가 수월함
6.1.2 단점 :
- 성능
+ 서비스 간 호출 시 API를 사용하기 때문에, 통신 비용이나, Latency가 그만큼 늘어나게 됩니다.
- 테스트 / 트랜잭션
+ 서비스가 분리되어 있기 때문에 테스트와 트랜잭션의 복잡도가 증가하고, 많은 자원을 필요로 합니다.
- 데이터 관리
+ 데이터가 여러 서비스에 걸쳐 분산되기 때문에 한번에 조회하기 어렵고, 데이터의 정합성 또한 관리하기 어렵습니다.
6.1.3 MSA 관련
1) Eureka
2) Zuul
3) Histrix
4) 서킷 브레이커 등
6.2 CQRS : Command Query Responsibility Segregation
- 명령(시스템 데이터 변경) 역할을 수행하는 구성 요소와 쿼리(시스템 데이터 조회) 역할을 수행하는 구성 요소를 나누는 것이 CQRS
- 쉽게 말해서 시스템 데이터를 변경하는 코드와 시스템 데이터를 조회하는 코드를 따로 만드는 것이라고 볼 수 있음 구현방식이나 시스템 규모에 따라서 DB를 나누기도하고 프로세스를 나누기도 함
참고 자료
- SOLID (객체 지향 설계)
- [TIL] 객체 지향의 4대 특성 - 캡!상추다 & 클래스 vs. 객체
- Spring 의 시작, 프레임워크의 구성요소와 동작원리
- The Domain Language of Batch
- [SpringBoot] Spring Security란?
- Spring JPA
- Frontend Developer
- Front-end-Developer-Interview-Questions
- 프론트엔드 개발자 면접 준비 (React)
- MSA 제대로 이해하기 -(1) MSA의 기본 개념
- [디자인 패턴] GoF의 디자인패턴 간단 정리
- [CQRS 아는 척하기] CQRS의 기본 개념?