Kim ByeungHyun
WIL 기술 면접 질문I 본문
데일리 과제
3/27
- 객체지향 프로그래밍(OOP)에 대해 설명해주세요. 알고 있는 원칙이나 키워드를 언급해주세요
- 객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나로, 객체(Object)들의 상호작용을 중심으로 프로그래밍하는 방법입니다.
- 객체란 데이터와 해당 데이터를 처리하는 함수(메서드)를 포함한 하나의 개체를 말합니다. 이러한 객체들은 클래스(Class)라는 틀을 기반으로 만들어집니다. 클래스는 객체의 특징이나 속성을 정의하고, 객체 수행 할 수 있는 행동들(메서드)을 포함합니다.
- 캡슐화(Encapsulation) : 객체의 상태와 행동을 하나로 묶고, 외부에서 직접 접근하지 못하도록 정보를 은닉합니다.
- 상속(Inheritance) : 이미 존재하는 클래스를 기반으로 새로운 클래스를 만들고, 상위 클래스의 특징을 몰려받아 하위 클래스에서 재사용합니다.
- 다형성(Polymorphism) : 동일한 인터페이스를 제공하는 여러 객체가 다른 방식으로 동작하는 능력입니다.
- REST API란 무엇인가요? (모두가 답변) 프로젝트에 REST API를 사용한 이유가 무엇인가요? (프로젝트에 REST API를 사용하셨을 경우에만 추가 답변), REST API 말고 다른 비교할만한 것을 알고 있나요?
- REST API는 Representational State Transfer API의 약자로, HTTP 프로토콜을 사용하여 클라이언트와 서버간의 통신을 가능하게 하는 소프트웨어 인터페이스입니다. REST API를 사용하면 클라이언트는 서버에게 요청을 보내고 서버는 해당 요청에 대한 응답을 반환합니다. REST API는 웹 애플리케이션과 모바일 애플리케이션에서 많이 사용됩니다.
- REST API를 사용하는 이유
- 유연성 : REST API는 다양한 클라이언트에서 사용 할 수 있도록 설계되어 있으며, 다양한 프로그래밍 언어와 플랫폼에서 호환됩니다.
- 확장성 : REST API는 스케일링이 용이하며, 서버 측에서 일관된 구현 방법을 유지할 수 있습니다.
- 캐싱 가능 : REST API는 HTTP 캐싱을 지원하므로, 클라이언트는 서버로부터 리소스를 반복해서 요청하지 않아도 됩니다.
- 보안성 : REST API는 HTTPS를 통한 보안 통신을 지원합니다.
- REST API 말고도 SOAP, GrapgQL등의 인터페이스가 있습니다 SOAP는 XML 기반의 프로토콜로, 데이터 형식이 정해져 있어 서버와 클라이언트 간의 데이터 형식이 일치해야 합니다. GraphQL은 Facebook에서 개발한 쿼리 언어로, 클라이언트가 필요한 데이터만 요청할 수 있어 데이터 전송량을 최소할 수 있습니다.
3/28
- DI(Dependency Injection)에 대한 설명과 해당 기술의 장점에 대해 설명해주세요.
- DI의 핵심 아이디어는 개발자가 일반적으로 직접 생성하는 대신, 외부에서 객체를 생성하고 그것을 애플리케이션에 주입하는 것입니다. 이를 통해 객체 간의 의존성을 줄이고, 코드 재사용성을 높일 수 있으며, 유닛 테스트 등의 작업이 간편해집니다.DI를 사용하면 단위 테스트를 수행할 때 모의 객체(mock object)를 사용하여 객체 간의 의존성을 쉽게 모사할 수 있습니다. 이를 통해 테스트 케이스를 빠르게 구성하고, 테스트를 실행하며, 코드의 결함을 신속하게 찾아내고 수정할 수 있습니다.
- DI는 현대적인 소프트웨어 디자인에서 필수적인 개념 중 하나입니다. 코드를 유지보수하기 쉽고, 개발과 테스트를 더욱 효율적으로 수행할 수 있으며, 확장성과 유연성을 제공합니다.
- DI를 사용하면 코드의 결합도가 낮아져 의존성이 높은 객체를 변경할 때 다른 객체에 영향을 미치지 않습니다. 또한 DI를 사용하면 애플리케이션의 유연성을 높일 수 있으며, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
- DI(Dependency Injection)는 객체 간의 의존성을 낮추고 느슨한 결합을 유지하기 위한 소프트웨어 디자인 패턴입니다. 이 패턴은 객체를 생성하고 이를 다른 객체에 주입하는 방식으로 작동합니다.
- DB에서 인덱스를 잘 사용하면 어떤 장점이 있을까요?
- 빠른 검색 속도: 인덱스를 사용하면 데이터베이스에서 레코드를 검색하는 속도가 빨라집니다. 인덱스가 있는 열을 검색할 때 데이터베이스는 해당 인덱스를 참조하여 빠르게 검색할 수 있습니다.
- 더 적은 디스크 I/O: 인덱스를 사용하면 데이터베이스가 검색할 때 더 적은 디스크 I/O 작업이 필요합니다. 이는 더 적은 디스크 액세스로 인해 데이터베이스의 전반적인 성능이 향상됩니다.
- 쿼리 성능 향상: 인덱스를 사용하면 쿼리의 실행 속도가 빨라집니다. 인덱스가 있는 열을 조건으로 사용하는 쿼리는 해당 열을 검색할 때 인덱스를 사용하여 빠르게 검색할 수 있습니다.
- 정렬 및 그룹화 성능 향상: 인덱스를 사용하면 정렬 및 그룹화 작업에서도 성능이 향상됩니다. 인덱스를 사용하면 데이터베이스는 해당 열의 인덱스를 참조하여 빠르게 정렬하거나 그룹화할 수 있습니다.
- 데이터 무결성 보장: 인덱스를 사용하면 데이터베이스에서 중복 데이터나 잘못된 데이터가 존재하는지 확인할 수 있습니다. 인덱스를 사용하여 유일한 값을 가진 열을 정의하면 중복 데이터를 허용하지 않게 됩니다.
- 데이터베이스에서 인덱스는 테이블의 검색 속도를 높이는 데 중요한 역할을 합니다. 인덱스를 잘 사용하면 다음과 같은 이점이 있습니다
3/29
- MAS(Microservice Architecture)란?
- 각각의 마이크로서비스는 특정한 비즈니스 기능을 담당하고 독립적인 프로세스로 실행됩니다. 이렇게 분할된 서비스들은 서로 다른 프로그래밍 언어, 데이터베이스, 라이브러리 등을 사용할 수 있으며, 이를 통해 유연성과 확장성을 제공합니다.하지만 , 각각의 마이크로 서비스를 효율적으로 관리하기 위해서는 추가적인 인프라 및 관리 비용이 필요하며, 분산 시스템에서 발생할 수 있는 복장성과 디버깅의 어려움이 있습니다.
- MSA의 장점으로는, 서비스 분할에 따른 더 빠른 베포, 서비스 간의 독립성으로 인한 안정성, 확장성 및 가용성 향상, 그리고 특정 마이크로서비스의 장애로 인한 전체 시스템 장애 방지 등이 있습니다.
- Microservice Architecture(MSA)는 소프트웨어 시스템을 작은 서비스들로 분할하고 이를 개별적으로 개발, 배포, 운영하는 아키텍처입니다.
- 제네릭에 대해서 설명하고, 컬렉션 클래스에서 왜 제네릭을 사용하는 지 설명해주세요.
- 제네릭을 사용하면 클래스 또는 인터페이스에서 사용되는 타입을 정의할 수 있습니다. 이러한 타입을 제네릭 타입이라고 하며, 일반적으로 대문자 알파벳으로 표시됩니다. 예를 들어, ArryList 클래스의 선언은 다음과 같습니다.여기서 E는 제네릭 타입 매개변수입니다. 이를 통해 ArrayList 클래스를 생성할 때 저장될 요소의 타입을 지정 할 수 있습니다. 예를 들어, ArrayList<String>은 문자열만 저장할 수 있는 리스트를 생성합니다.첫째, 제네릭을 사용하면 타입 안전성을 보장할 수 있습니다. 제네릭을 사용하지 않으면 컴파일러가 타입 일치 여부를 검사하지 않으므로, 런타임에 잘못된 타입이 사용될 수 있습니다. 하지만 제네릭을 사용하면 컴파일러가 컴파일 시점에 타입 일치 여부를 검사하므로, 런타임 에러를 방지할 수 있습니다.셋째, 제네릭을 사용하면 코드의 재사용성을 높일 수 있습니다. 제네릭을 사용하면 같은 코드를 여러 타입에 대해 재사용할 수 있습니다. 이는 클래스나 메서드를 작성할 때 유용합니다.
- 따라서, Java의 컬렉션 클래스에서 제네릭을 사용하는 이유는 이러한 이점을 취하기 위해서 입니다. 제네릭을 사용하면 컬렉션 클래스가 저장할 요소의 타입을 명확히 지정할 수 있으며, 이를 통해 타입 안전성을 보장할 수 있습니다.
- 둘째, 제네릭을 사용하면 코드의 가독성을 높일 수 있습니다. 제네릭을 사용하면 코드에서 타입 변환을 수동으로 수행할 필요가 없으므로, 코드가 간결해집니다.
- 컬렉션 클래스에서 제네릭을 사용하는 이유는 여러 가지가 있습니다.
- public class ArrayList<E> extends AbstreacList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
- 제네릭(Generic)은 Java에서 도입된 타입 안전성을 보장하는 기능입니다. 제네릭은 코드의 재사용성과 가독성을 높이고 타입 안정성을 보장합니다.
3/30
- List, Set, Map, HashMap의 차이에 대해서 설명해주세요.
- List : 리스트는 데이터를 순차적으로 저장하고, 인덱스를 사용하여 데이터를 검색합니다. 리스트는 중복된 값을 가질 수 있습니다. 리스트의 대표적인 예시로는 배열(Array)이 있습니다.
- Set : 세트는 순서가 없이 값을 저장하고, 중복된 값을 허용하지 않습니다. 즉, 같은 값을 여러 번 저장 할 경우, 한개의 값만 저장합니다. 이러한 특성 때문에 집합 연산(합집합, 교집합, 차집합 등)을 수행하기에 유용합니다.
- HashMap : 해시맵은 맵의 한 종류로, 내부저긍로 해시 함수를 사용하여 값을 저장하고 검색합니다. 해시 함수는 입력값을 특정한 값으로 매핑하는 함수이며, 이를 사용하여 데이터를 빠르게 검색할 수 있습니다. 해시맵은 순서가 없으며, 키와 값 모두 중복될 수 없습니다.
따라서, 각각의 자료구조는 다른 용도와 특성을 가지고 있으며, 필요에 따라 적절한 자료구조를 선택하여 사용해야 합니다.
- List, Set, Map, HashMap은 모두 데이터를 저장하고 관리하는 자료구조(data structure) 중 일부입니다. 각각의 구조는 다른 목적과 사용 방법이 있습니다.
- Parameter와 Argument의 차이에 대해 설명해주세요.
- Parameter(매개변수)는 함수를 정의할 때 함수가 받아 들일 값의 종류와 개수를 지정하는 변수입니다. 함수의 매개변수는 함수 본문 내에서 사용되는 지역 변수와 같은 역할을 합니다.
- 코드로 예시를 보면
여기서 x와 y는 매개변수입니다.
이때 함수를 호출할 때 2와 3인 인자 입니다.따라, 매개변수는 함수 정의 시에 지정되는 변수이고, 인자는 함수 호출 시에 전달되는 값입니다.add(2, 3)
- def add(x, y); result = x + y; return result;
- 이때 함수는 2와 3을 x와 y에 각각 할당하고, x+y의 결과 값인 5를 반환합니다.
- Argument(인자)는 함수를 호출할 때 함수에 전달되는 값입니다. 함수가 호출될 때 인자는 매개변수와 일치해야 합니다.
- 함수를 정의할 때, 함수는 인자(Argument)를 받아들이며 그 값들은 함수 안에서 파라미터(Parameter)로 참조 됩니다. 파라미터와 인자는 서로 다른 개념입니다.
- Parameter(매개변수)는 함수를 정의할 때 함수가 받아 들일 값의 종류와 개수를 지정하는 변수입니다. 함수의 매개변수는 함수 본문 내에서 사용되는 지역 변수와 같은 역할을 합니다.
3/31
- 프로세스와 스레드의 차이에 대해 설명해 주세요
- 프로세스와 스레드는 모두 운영체제에서 실행되는 작업 단위입니다. 그러나 두 가지의 차이점을 보면,
- 프로세스는 실행중인 프로그램의 인스턴스입니다. 각각의 프로세스는 운영체제에 의해 자신만의 메모리 공간과 시스템 자원(CPU 시간, 파일 핸들 등)을 할당 받습니다. 프로세스는 독립적인 실행 흐름이며, 다른 프로세스와는 완전히 분리된 메모리 공간을 가지므로, 한 프로세스에서 다른 프로세스로 데이터를 전달하기 위해서는 IPC(Inter-Process Communication) 기법을 사용해야 합니다.그러므로, 프로세스와 스레드는 모두 운영체제에서 실행되는 작업 단위입니다. 그러나 프로세스는 독립적인 실행 흐름을 가지며, 각각의 프로세스는 자신만의 메모리 공간과 시스템 자원을 할당받지만, 스레드는 하나의 프로세스 내에서 실행되는 작은 실행 흐름으로, 프로세스와 같은 메모리 공간을 공유하며 시스템 자원도 공유합니다.
- 스레드는 프로세스 내에서 실행되는 작은 실행 흐름입니다. 스레드는 프로세스와 같은 메모리 공간을 공유하므로, 한 스레드에서 생성한 변수나 데이터를 다른 스레드에서 바로 접근할 수 있습니다. 이를 통해 스레드간 통신이 더욱 쉬워집니다. 그러나 스레드는 프로세스보다 더 작은 단위이기 때문에, 스레드는 CPU 시간과 같은 시스템 자원을 할당받지 않습니다. 대신, 프로세스가 할당 받은 시스템 자원을 공유합니다.
- @SpringBootTest와 @WebMvcTest의 차이점을 설명해 주세요.
- @SpringBootTest는 Spring Boot 애플리케이션을 통합 테스트 할 때 사용됩니다. 이 어노테이션을 사용하면 Spring Boot 애플리케이션이 로드되고, 애플르케이션의 모든구성 요소(컨트롤러, 서비스, 레포지토리 등)가 실제로 실행됩니다. 이렇게 하면 실제 환경과 가능한 유사한 환경에서 애플리케이션을 테스트할 수 있습니다.따라서, @SpringBootTest 애플리케이션의 전체적인 통합 테스트에 적합하며, @WebMvcTest Spring MVC 컨트롤러의 테스트에 적합합니다.
- 반면 @WebMvcTest는 Spring MVC 컨트롤러를 테스트 할 때 사용됩니다. 이 어노테이션은 애플리케이션 컨텍스트를 로드하지 않고, Spring MVC 관련 반만 로드합니다. 이렇게 하면 커트롤러의 동작을 테스트하는 것이 가능하며, 컨트롤러의 의존성에 대한 가짜(mock) 객체를 생성하거나 설정할 수 있습니다. 이렇게 하면 컨트롤러에 대한 테스트를 더 빠르고 효과적으로 수행할 수 있습니다.
- @SpringBootTest와 @WebMvcTest는 모두 Spring Boot 애플리케이션의 테스트를 작성할 때 사용되는 어노테이션입니다. 하지만 두 어노테이션은 서로 다른 목적을 가지고 있습니다.
'공부 > 항해99' 카테고리의 다른 글
WIL 기술 면접 질문II (1) | 2023.04.09 |
---|---|
<WIL> 10.17 ~ 10.23 / 주특기 심화, CORS (0) | 2022.10.23 |
<WIL> 10.3 ~ 10.9 / 주특기 입문, DI, IoC, Bean (1) | 2022.10.09 |
<WIL> 9.26 ~ 10.2 / Java알고리즘, 객체지향, JVM (0) | 2022.10.03 |
<WIL> 9.19 ~ 9.25 / 웹 개발 미니 프로젝트, API, JWT (0) | 2022.09.25 |