현재 코드프레소 활동 중 객체지향 설계 및 Java, Spring boot 등 여러 강의를 수강하면서, 채용공고도 수시로 확인하여 서류접수하고 나날을 보내고 있다.
서류합격은 웬만해서 다 붙긴 했다. 내가 열심히 했는 지는 모르겠지만 주위에서 열심히 봐주고 구글링하면서 제 얘기를 스며들게 하는 자소설을 어느 정도 많이 썼다. 그래도 떨어진 것보단 붙은 게 나으니 항상 감사하면서 취업 준비를 했다.
그러나 아직 최종까지 붙지 못하여서 공부하고, 블로그 쓰고, 열심히 밥먹고 ㅋㅋㅋㅋㅋ
그렇게 사실 요즘은 바쁘지는 않다. 학교 막학기를 병행하면서 취준하고 알고리즘 공부도 하니... 지금 번아웃이 쎄게 왔지만, 그래도 아무것도 안하는 것보단 나아서 간간히 잡코리아, 사람인 즉시지원 정도 회사에 지원하고, 코드프레서 대외활동을 하고 있다.
이 대외활동도 결국 취업을 목적으로 하기에 서류는 척척 붙어도 코테나 면접에 척척 떨어졌기에

면접 준비했던 내용이나 후기..?정도 남겨서 복습차 상시 준비되어있는 개발자가 되려 한다.
일단 가장 먼저 면접장에 도착하면 다들 준비한 면접 질문을 허공을 바라보며 질문이 왔을 때에 답변 준비를 했다.
저는 허공에 대고 말할만큼 준비가 덜 됐어서 뚫어져라 답변 내용만 암기했었던거 같다..
지원분야는 항상 백엔드 관련 포지션으로 기초적인 예상 질문과 실제로 받은 질문을 리뷰를 할 것이다.
※워낙 주관적인 답변이라 다른 의견이나 피드백은 한번 고려해보고 수정하도록 하겠습니다.
1. 객체지향 프로그래밍에 대해 아는 대로 말하세요.
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간
의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다. 캡슐화, 상속, 다형성
등과 같은 기법을 이용할 수 있으며, 다형성은 하나의 메소드나 클래스가 다양한 방법으로 동작
하는 것을 의미합니다.
2. 캡슐화의 정의와 목적
객체의 속성과 행위를 하나로 묶고, 구현 내용 일부를 외부에 감추어 은닉(정보은닉)하는 과정입니다.
캡슐화 과정 중 코드의 중복을 피하기 위해서와 데이터를 처리하는 동작 방식을 외부에서 알리지 않기 위해서입니다.
3. MVC 패턴이란?
MVC- Model, View, Controller의 합성어로 애플리케이션을 세가지의 역할로 구분한 디자인 패턴입니다.
Model : 애플리케이션이 "무엇"을 할 것인지를 정의한다. 내부 비즈니스 로직을 처리하기 위한 역할로 DB의 테이블과 대응하는 경우가 많다.(처리되는 알고리즘, DB와 상호작용(CRUD),데이터 등등..)
View : 사용자가 보게 될 결과 화면을 출력한다. (html/css/javasript 등을 모아둔 컨테이너이다.)
Controller: 사용자의 입력처리와 흐름 제어를 담당한다.(사용자가 접근한 URL에 따라 사용자의 요청사항을 파악한 후, 그 요청에 맞는 데이터를 Model에 의뢰하고, 데이터를 View에 반영해서 사용자에게 알려준다.)
4. REST API
API 또는 애플리케이션 프로그래밍 인터페이스는 애플리케이션이나 디바이스가 서로 간에 연결하여 통신할 수 있는 방법을 정의하는 규칙 세트이며, REST API는 REST(REpresentational State Transfer) 아키텍처 스타일의 디자인 원칙을 준수하는 API입니다.
REST API는 HTTP 요청을 통해 통신함으로써 리소스 내에서 레코드의 작성, 읽기, 업데이트 및 삭제 등(CRUD)의 표준 데이터베이스 기능을 수행합니다.
예를 들어, REST API는 GET 요청을 사용하여 레코드를 검색하고, POST 요청을 사용하여 레코드를 작성하며, PUT 요청을 사용하여 레코드를 업데이트하고, DELETE 요청을 사용하여 레코드를 삭제합니다. 모든 HTTP 메소드는 API 호출에서 사용될 수 있습니다.
5. 완벽한 코드란?
6. TCP와 UDP의 차이점
TCP는 연결 지향형 프로토콜이고, UDP는 데이터를 데이터 그램 단위로 전송하는 비연결형 프로토콜입니다.
TCP는 가상 회선을 만들어 신뢰성을 보장하도록 흐름 제어, 혼잡 제어, 오류 제어하는 프로토콜로 신뢰성 보장이 안되는 UDP에 비해 속도가 느린 편입니다.
TCP는 파일 전송과 같은 신뢰성이 중요한 서비스에 사용되고, UDP는 스트리밍과 같은 연속성이 더 중요한 서비스에 사용됩니다.
7. GET과 POST의 차이점
GET요청은 서버에 존재하는 정보를 요청합니다. 이 때 반환되는 정보는 정보 자체가 아니라 정보의 표현입니다.
+) 일반적으로 Request Body는 입력하지 않는 것이 일반적이며, 레거시 시스템의 경우 요청을 받아들이지 않을 수 있습니다. 캐싱을 수행하기 때문에 캐싱되지 않는 요청은 GET 요청이 맞지 않을 수 있습니다.
POST요청은 서버에 정보를 생성하는 것을 요청합니다. 예전 HTTP 통신은 POST 요청으로 데이터 삭제, 수정도 form요청으로 같이 수행했습니다. POST 요청은 서버의 상태를 변경시키기 때문에 멱등성이 유지되지 않습니다. 보통 Request Body에 요청하는 데이터를 담아 전송합니다.
8. 프로세스와 스레드의 차이점
프로세스는 실행중인 프로그램을 의미하고, 스레드는 실행 제어만 분리한 것을 의미합니다.
프로세스는 운영체제로부터 자원을 할당받지만, 스레드는 프로세스로부터 자원을 할당받고, 프로세스의 코드/데이터/힙영역을 공유하기 때문에 좀 더 효율적으로 통신할 수 있습니다. 또한 컨텍스트 스위칭도 캐시 메모리를 비우지 않아도 되는 스레드쪽이 빠릅니다. 그리고, 스레드는 자원 공유로 인해 문제가 발생할 수 있으니 이를 염두에 둔 프로그래밍을 해야합니다.
9. 컨텍스트 스위칭 (문맥 교환)
컨텍스트 스위칭은 한 Task가 끝날 때까지 기다리는 것이 아니라 여러 작업을 번갈아가며 실행해서 동시에 처리될 수 있도록 하는 방법입니다.
10. 멀티스레드 프로그래밍
멀티스레드 프로그래밍은 하나의 프로세스에서 여러 개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것을 멀티스레드 프로그래밍이라고 합니다.
장점
- 멀티 프로세스에 비해 메모리 자원소모가 줄어듭니다.
- 힙 영역을 통해서 스레드간 통신이 가능해서 프로세스간 통신보다 간단합니다.
- 스레드의 컨텍스트 스위칭은 프로세스의 컨텍스트 스위칭보다 빠릅니다.
단점
- 힙 영역에 있는 자원을 사용할 때는 동기화를 해야합니다.
- 동기화를 위해서 락을 과도하게 사용하면 성능이 저하될 수 있습니다.
- 하나의 스레드가 비정상적으로 동작하면 다른 스레드도 종료될 수 있습니다.
11. 트랜잭션에 대해서 설명하세요.
트랜잭션이란 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위라고 할 수 있습니다. 트랜잭션에는 여러 개의 연산이 수행될 수 있습니다.
트랜잭션은 수행중에 한 작업이라도 실패하면 전부 실패하고, 모두 성공해야 Commit 작업이 이뤄지며 성공이라 할 수 있습니다.
12. 싱글톤 패턴에 대해서 설명하세요.
전역 변수를 사용하지 않고 객체의 인스턴스를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴입니다.
하나의 인스턴스만을 생성하며 getInstance메서드로 모든 클라이언트에게 동일한 인스턴스를 반환합니다.
private 생성자를 가지는 특징을 가지며, 생성된 싱글톤 오브젝트는 저장할 수 있는 자신과 같은 타입의 스태틱 필드를 정의합니다.
싱글톤 패턴을 사용하는 이유는 메모리 측면에서 new 연산자를 통해 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 방지를 할 수 있고, 이미 생성된 인스턴스를 활용하니 속도 측면에서 좋은 편으로 사용합니다.
+)
싱글톤 패턴의 문제점은
- 의존 관계상 클라이언트가 구체 클래스에 의존합니다. new 키워드를 직접 사용하여 클래스 내에 객체를 생성했기에, 이는 SOLID 원칙 중 DIP를 위반하게 됩니다.
- private 생성자 때문에 테스트가 어렵습니다. 싱글톤 인스턴스는 자원을 공유하고 있기에 테스트를 수행하려면 인스턴스의 상태를 매번 초기화하는 과정이 필요합니다.
- 객체 인스턴스를 하나만 생성해서 공유하는 방식 때문에 싱글톤 객체를 stateful하게 설계 했을 경우 큰 장애 발생요인이 됩니다.
싱글톤의 단점을 해결하기 위해 무상태(stateless)로 설계해야 합니다.
- 특정 클라이언트에 의존적인 필드가 있으면 안됩니다.
- 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안됩니다.
- 가급적 읽기 전용으로 만들고, 필드 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용합니다.
13. CI/CD란? 그리고 CI/CD가 장점이 되는 이유는?
(본인은 아직 CI/CD 경험은 없지만...ㅠ)
코드 버전 관리를 하는 VCS 시스템에 push가 되면 테스트와 빌드가 수행되어 안정적인 배포파일을 만드는 과정을 CI(지속적 통합, continuous integration)이라고 하며, 이 빌드 결과를 자동으로 운영 서버에 배포까지 되는 과정을 CD(지속적 배포, continuous delivery or continuous deployment)라고 합니다.
푸시가 될 때마다 코드를 병합하고, 테스트 코드와 빌드를 수행하면서 자동으로 코드가 통합되어 더는 수동으로 코드를 통합할 필요가 없어져 개발에만 신경을 쓸 수 있습니다.
이 CI / CD의 중요한 것은 테스트 자동화입니다. 프로젝트의 완전한 상태임을 보장하기 위해 테스트 코드가 구현되어 있어야 합니다.
14. SOLID (OOP 5대 원칙)에 대해서 설명해주세요.
(아직 이 질문은 받은 적은 없지만... 중요한 개념이고 만에 하나 나올 수 있다. 적어도 5대 원칙 정의는 몰라도 뭐가 있는 지는 알아야 한다고 생각한다.)
- SRP(단일책임원칙)은 한 클래스의 하나의 책임만 가져야 합니다.
- OCP(개방-폐쇄 원칙)은 확장에는 열려 있으나 변경에는 닫혀 있어야 하며, 다형성을 활용해야 합니다.
- LSP(리스코프 치환 원칙)은 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야하는 원칙으로 상위 타입을 상속해서 재정의 했을 때 프로그램이 깨지지 않아야 합니다.
- ISP(인터페이스 분리 원칙)은 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안되는 원칙입니다. 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 더 낫습니다. 즉, 비대한 인터페이스보단 더 작고 구체적인 인터페이스로 분리해야합니다.
- DIP(의존관계 역전 원칙)은 추상적인 것은 자신보다 구체적인 것에 의존하지 않고, 변화하기 쉬운 것에 의존해서는 안된다는 원칙입니다. 구체적으론 구현 클래스에 의존하지 말고, 인터페이스에 의존해야 하는 원칙입니다.
15. REST API란?
API 또는 애플리케이션 프로그래밍 인터페이스는 애플리케이션이나 디바이스가 서로 간에 연결하여 통신할 수 있는 방법을 정의하는 규칙 세트입니다.
REST API는 REST(REpresentational State Transfer) 아키텍처 스타일의 디자인 원칙을 준수하는 API입니다
REST API는 HTTP 요청을 통해 통신함으로써 리소스 내에서 레코드(CRUD 라고도 함)의 작성, 읽기, 업데이트 및 삭제 등의 표준 데이터베이스 기능을 수행합니다. 예를 들어, REST API는 GET 요청을 사용하여 레코드를 검색하고, POST 요청을 사용하여 레코드를 작성하며, PUT 요청을 사용하여 레코드를 업데이트하고, DELETE 요청을 사용하여 레코드를 삭제합니다. 모든 HTTP 메소드는 API 호출에서 사용될 수 있습니다.
16. 깊이 우선 탐색(DFS)와 너비 우선 탐색(BFS) 설명과 차이점
DFS와 BFS는 모두 그래프를 탐색하는 방법입니다.
DFS는 루트 노드 정점에서 시작해서 다음 간선으로 가기 전에 해당 간선을 완벽하게 탐색하는 방식입니다.
BFS는 루트 노드 정점에서 시작해서 인접한 노드부터 먼저 탐색하는 방법으로 시작 정점부터 가까운 정점을 먼저 탐색하고 멀리 떨어져 있는 정점을 나중에 탐색하는 방식입니다.
차이점은 검색 속도 차이, 구현 방식, 탐색 대상 그래프 규모에 따른 활용도 정도 있습니다.
검색 속도 차이에서는 BFS가 조금 더 빠릅니다. 하지만, 경로마다 특징을 저장해둬야 하는 경우 DFS를 사용하고,
최단거리를 구하는 방식은 BFS가 조금 더 유리합니다.
DFS는 스택 또는 재귀함수로 구현하고, BFS는 큐를 이용해서 구현합니다.
17. SQL의 DML, DCL, DDL
DML: SELECT, INSERT, DELETE, UPDATE
DCL: GRANT, REVOKE
DDL: CREATE, ALTER, DROP
일단 생각나는 대로 리뷰를 해보았다... 직접 받은 질문도 있고 참고를 해서 작성한 내용도 있는 데 확실히 작성하면서 많은 복습과 새로운 내용도 알아가서 많은 공부가 되었다.
아직 많은 내용을 공부해야 하고 복습도 꾸준히 하는 것이 중요하다고 느꼈다. (쓰면서 뭐더라...? 한 내용이 많았다.)
내용이 부실하거나 관련 내용 피드백은 환영입니다:)
계속 새로운 내용을 습득하면 내용 수정을 통해 작성할 것입니다.
많관부..^^7
'면접 대비' 카테고리의 다른 글
백엔드 개발자 예상 면접 질문 (Java) (2) | 2022.02.09 |
---|