개발/공부

취업 면접 준비

IamBD 2022. 1. 26. 16:36

면접에 대비하여 실제 질문 - 답변 형식으로 상상하며 매우 주관적으로  작성했습니다.

 

Java & Programming

Q. 객체지향이란?

더보기

A. 현실 세계의 사물을 컴퓨터의 세계로 들고 와 사람이 이해하기 편하게 프로그래밍하는 것으로 추상화, 캡슐화, 상속, 다형성의 특징을 갖고 있습니다.

 

꼬리 Q. 각 특징에 대해 설명해주세요.

A. 추상화란 여러가지 사물의 공통점을 추출해서 하나의 이름으로 부르는 것을 의미합니다. 예를 들어 승용차, 승합차, 버스, 화물차 등은 자동차라는 하나의 이름으로 추상화할 수 있습니다. 캡슐화란 특정 기능을 하는 로직을 클래스라는 캡슐에 묶어 수정없이 사용하거나 사소한 수정만으로 재사용이 가능하게끔 하는 것과 접근 제어자를 통해 외부에 내부 코드나 상태를 숨길 수 있습니다. 상속이란 공통적인 기존 기능을 그대로 사용하되 일부분만 수정하거나 추가하여 사용할 수 있습니다. 다형성이란 오버 라이딩이나 오버 로딩을 예로 들 수 있는데 같은 이름의 메서드를 매개 변수를 다르게 하여 다양한 기능으로 구현할 수 있게 하는 것과 상속받은 기능을 필요에 맞게 재구현 하는 것입니다.

 

꼬리 2 Q. 접근 제어자에 대해 설명해주세요.

A. private, public, default, protected가 있습니다. private은 선언한 클래스 내부에서만, public은 모든 곳에서, default는 말 그대로 초기값으로 같은 패키지 내부에서만, protected는 default + 해당 클래스를 상속받은 자식 클래스에서만 접근이 가능합니다.

 

Q. 자바의 메모리 구조에 대해 설명해주세요.

더보기

A. 자바의 메모리 구조는 크게 다섯 가지로 구분됩니다. 먼저 각 스레드마다 PC Register, JVM Stack, Native Method Stack이 있고 스레드 공통으로 Heap과 Method Area가 있습니다. PC Register는 현재 각 스레드가 수행 중인 JVM 명령의 주소를 갖고 있고 JVM Stack은 메서드 호출시 메소드 내에서 쓰이는 매개변수, 지역변수, 리턴값들이 저장되고 메소드 수행이 끝나면 삭제됩니다. Native Method Stack은 JAVA가 아닌 C나 C++같은 다른 언어로 작성된 코드를 위한 공간이고 Method Area는 클래스를 올릴 때 초기화 되는 대상들을 위한 공간으로 전역변수, 정적 변수, 메소드 정보 등이 담겨있으며 Heap과 같이 GC에 의해 관리됩니다. 마지막으로 Heap은 클래스가 아닌 객체를 저장하기 위한 가상공간으로 최초 생성된 객체나 참조되고 있는 객체들의 공간으로 가득 차거나 GC 로직에 의해 초기화됩니다.

 

꼬리 Q. GC에 대해 설명해주세요.

A. JVM에서 메모리를 관리해주는 모듈로 Heap의 메모리를 재활용하기 위해 더 이상 참조되지 않는 객체를 정리해주는 역할을 하고 있습니다. 개발자가 메모리를 전부 관리할 필요가 없어져 편리함이 있으나 참조되지 않는 객체를 찾는 과정인 Mark and Sweep이 일어날 때 스레드가 잠시 중단되어 성능이 떨어진다는 단점이 있습니다.

 

Q. 테스트 주도 개발(TDD)에 대해 설명해주세요.

더보기

A. 추가적인 기능 개발 요청이 들어왔을 때 예상되는 input과 ouput을 정의해놓은 실패하는 테스트 코드를 먼저 작성을 해놓고 해당 테스트 케이스의 통과를 목적으로 작성하되 차후 리팩터링을 통해 보완하는 개발 방법론으로 알고 있습니다.

 

꼬리 Q. TDD의 장단점에 대해 설명해주세요.

A. 먼저 장점에 대해 설명드리겠습니다. 예상되는 input과 output을 정의함으로써 구현하고자 하는 기능을 좀 더 명확하게 알 수 있다는 것과 다양한 케이스에서의 검증과 기존 코드의 Side Effect를 검증을 할 수 있습니다. 단점으로는 아무래도 작성하는 코드의 양이 늘어나며 숙련되지 않는 개발자의 경우 모든 케이스를 테스트할 수 없기에 테스트 케이스 선정에 있어서 러닝 커브가 좀 있다고 생각됩니다.

 

Q. 테스트 코드를 어떻게 작성하는지 설명해주세요.

더보기

A. 먼저 테스트할 기능을 선정 후 빠른 테스트를 위해 통합 테스트인지 단위 테스트인지 여부를 결정합니다. 그 후 given, when, then으로 나누어 어떤 값이 주어지며 어떤 행동을 할 때 바라는 행동이 무엇인지를 작성합니다.

 

꼬리 Q. 통합 테스트와 단위 테스트의 차이에 대해 설명해주세요.

A. 통합 테스트는 스프링을 직접 띄워서 테스트 하는 방법으로 외부 라이브러리의 사용이나 DB접근과 같은 더 큰 단위의 기능을 테스트하는데 목적을 두고 있으며 단위 테스트는 범위를 제한하여 빠르고 직관적인 테스트에 목적을 두고 있습니다.

 

Q. 테스트 커버리지에 대한 본인의 생각을 얘기해주세요.

더보기

A. 높으면 높을수록 많은 기능들에 대한 검증이 이루어지고 있다는건 맞겠지만 그렇다고 커버리지 100%가 완벽한 소프트웨어다! 라고 말할 수 없기 때문에 비즈니스 목표가 달성되는 적당한 비용과 충분한 속도가 보장되는 한도 내에서 높이려 노력하면 좋을 것 같습니다.

 

Q. 단위 테스트를 작성할 때 Mock를 하는 이유는 무엇일까요? 또한 기능이 정상 동작하려면 외부 모듈 또는 객체에 의존해야 하는데 왜 이 의존성을 끊으려고 할까요?

더보기

A. 여러가지 이유로 실제와 동일한 환경을 구축하기 어렵거나 테스트에 오랜 시간이 소요될 때 Mock을 사용합니다. 또한 테스트중인 기능이 외부 모듈이나 객체와의 결합도가 높다면 실행 시간도 길어질 것이며 테스트 실패시의 에러 위치를 특정할 수 없어 디버깅에 많은 시간이 들기 때문입니다.

 

Q. try-with-resources에 대해 설명해주세요

더보기

A. try에 감싸져있는 블록 안에서 객체를 생성시 별도로 close하지 않아도 Auto close 해주는 기능을 말하며 java 1.7부터 지원되었습니다. 다만 모든 객체에 대해 AutoClose를 지원하는것이 아닌 AutoCloseable 인터페이스를 구현한 객체만 지원됩니다.

 

Q. 인터페이스에 있는 protected 메서드를 오버 라이딩하여 구현하려고 합니다. 각각 private, protected, public으로 구현할 때 이 중 불가능한 것은 무엇이고 왜 그렇게 생각했는지 설명해주세요.

더보기

A. interface 내에서 protected 메서드는 선언할 수 없습니다. 애초에 inteface는 외부에 공개되기 위한 공용 API과 같은 성격을 지니고 있어 보호될 필요가 없다고 판단되기 때문입니다. 또한 private 메서드역시 inteface내에서만 사용 가능하며 이를 구현할 수 없습니다.

 

Q. Junit4와 Junit5의 차이점에 대해 설명해주세요.

더보기

A. Junit4는 단일 모듈로 되어있으며 최소 버전은 java 5 이상부터 지원하고 Junit5는 세 개의 모듈로 되어있으며 java 8부터 지원하며 람다 또한 지원하고 있습니다. 그 외에도 다양한 어노테이션의 변화가 있는걸로 알고있습니다.

 

Q. Collection 프레임워크 내 인터페이스들의 상속 구조와 각각의 특징에 대해 간단하게 설명해주세요.

더보기

A. Collection 프레임워크 내 주요 인터페이스들은 List, Set, Map으로 정의할 수 있습니다. 여기서 List와 Set만 Collection 라이브러리를 상속받으며 Map은 구조상의 차이로 Collection 라이브러리를 상속받지 않고 있습니다.

각각의 특징으로는 List는 순서가 있는 데이터의 집합으로 중복을 허용하고, Set은 순서가 없는 데이터의 집합으로 중복을 허용하지 않습니다. 마지막으로 Map은 키와 값의 한 쌍으로 이루어져 있으며 순서가 없고 key의 중복은 허용하지 않으나 value의 중복은 허용하고 있습니다.

 

Q. 파사드 패턴에 대해 설명하고 어떻게 사용할 수 있는지 예를 들어주세요.

더보기

A. 작업의 집합으로 특정 행위를 위해 하나의 기능을 위한 서브 클래스들을 모아놓은 객체입니다. 예를 들어 "샤워" 라는 작업을 한다고 가정했을 때 1. 옷을 벗는다. 2. 물을 튼다. 3. 머리를 감는다 .... 와 같은 "샤워"를 도와주는 서브 클래스들을 한곳에 모아 사용할 수 있습니다.

 

Q. final 키워드에 대해 설명해주세요.

더보기

A. 변수, 메소드, 클래스에 붙일 수 있으며 final 선언 이후 변경이 불가능한 특징을 갖고 있습니다.

 

Q. 싱글톤 클래스를 직접 구현해보세요.

더보기

A. public class Singleton {

private Singleton() {}

private static class SingletonAdapter{

private static fianl Singleton INSTANCE = new Singleton();

}

public static Singleton getInstance() {

return SingletonAdapter.INSTANCE;

}

}

 

Q. GC에 대해 설명하고, GC 과정에 대해 설명해주세요.

더보기

A. 사용하지 않는 메모리를 자동으로 해제해주는 기능을 GC라 부릅니다. GC가 동작할 때 Stop the World(STW)를 통해 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업을 중단시키고 Mark and Sweep을 통해 사용하고 있는 메모리와 사용하지 않는 메모리를 식별해 불필요한 메모리를 해제합니다. GC 과정으로는 GC가 관리하는 Heap 영역에는 Young 영역과 Old 영역이 있습니다. 먼저 Young 영역에는 1 개의 Eden 영역과 2 개의 Survivor 영역이 존재하는데 새롭게 할당된 메모리는 Eden 영역으로 들어가고 Edem 영역이 가득차면 Minor GC가 발생하는데 이 때 계속 사용중인 메모리는 Survivor 영역으로 이동되어집니다. 앞선 과정을 여러번 반복하다 지속적으로 Survivor 영역에서 살아남은 메모리는 Old 영역으로 이동되어 집니다. 반복되는 이동으로 Old 영역마저 가득차게 되면 Major GC가 발생합니다.

 

Q. GC에 의한 시스템 중단 시간을 줄이는 방법으로 무엇이 있을까요?

더보기

A. 최후의 방법으로는 GC 튜닝이 될 수 있겠지만 그 전에 GC가 관리할 객체 자체를 줄이는것이 좋을 것 같습니다. 사소한 습관으로는 String 대신 StringBuilder나 StringBuffer를 사용하는 것을 지양하는게 있습니다.

 

Q. MVC 패턴에 대해 설명해주세요.

더보기

A. 비즈니스 로직과 화면을 분리하여 개발을 효율적이고 빠르게 하기 위한 디자인 패턴중 하나입니다. Model 에서 비즈니스 로직을 수행하고 Controller 에서는 Model과 View를 중개하고 View에서는 실제 사용자가 볼 화면을 보여주는 역할을 수행합니다.

 

Q. 병렬 처리 프레임워크의 종류와 특징에 대해 설명해주세요.

더보기

A. hadoop과 Spark가 있습니다. 먼저 hadoop은 자체 HDFS(Hadoop Distributed File System)을 활용해 데이터를 주고받고 데이터를 여러 노드에 분산하여 저장하기 때문에 손실의 우려가 없습니다. 단점으로는 File I/O 기반으로 처리 속도가 느립니다. 다음으로 Spark는 In-Memory 연산으로 hadoop에 비해 100배 이상 빠른 속도를 보이나 Memory에서 처리하기 때문에 장애 발생시 데이터 손실이 발생하며 프로그램을 처음부터 다시 시작해야 한다는 단점을 갖고 있습니다.

 

Q. 캡슐화를 위해 클래스 변수는 private로 가져가고, Getter/Setter를 사용하곤 합니다. 클래스 변수를 public으로 쓰는 것과 비교해 어떠한 차이가 있나요?

더보기

A. 올바른 기능을 위해 변하지 말아야 할 변수가 public으로 되어 있다면 설계 의도를 모르는 사용자는 직접 접근하여 값을 변경함으로서 의도한대로 동작하지 않을 위험이 있습니다. 따라사 Getter을 통한 단순한 값의 복사나 Setter를 통한 검증을 해야합니다.

 

Q. 불변 객체가 무엇인지 설명하고 대표적인 Java의 예시를 설명해주세요.

더보기

A. Java 뿐 아니라 OOP에서의 불변 객체는 생성 후 그 상태를 바꿀 수 없는 객체를 말합니다. 반대 개념으로는 가변 객체로 생성 후에도 상태를 변경할 수 있습니다. 불변 객체를 사용하는 가장 큰 이유는 초기 상태를 그대로 유지하기 때문에 값의 복제나 비교시 로직이 단순해지고 성능 향상 또한 기대할 수 있습니다. 대표적인 예로 값으 재할당은 가능하지만 수정은 불가능한 String을 들 수 있습니다.

 

Q. 도메인 주도 개발(DDD)에 대해 설명해주세요.

 

Q. 데코레이터 패턴에 대해 설명하고 언제 사용할 수 있는지 설명해주세요.

 

Spring

 

Q. JPA에 대한 간단한 설명과 사용해본 경험을 설명해주세요.

더보기

A. 자바 ORM에 대한 API 표준 명세로 인터페이스의 모음입니다. Java 어플리케션과 JDBC 사이에 존재하며 JPA에게 수행할 명령만 넘기면 JPA가 JDBC API를 알아서 호출하여 SQL을 생성하여 DB와 통신합니다. 기존 mybatis를 통해 직접 쿼리를 작성하고 수정사항이 발생시 일일히 모든 쿼리를 수정해야 했었던 반면 Spirng-data-jpa를 사용하고 난 후에는 복잡하지 않고 반복적인 CRUD 쿼리 작성을 할 필요가 없어져 생산성이 크게 증진되었던 경험이 있습니다.

 

Q. JPA 영속성 콘텍스트의 이점을 설명해주세요.

더보기

A. 첫 번째는 1차 캐시로 find시 매번 DB에서 조회하는게 아닌 캐시에 없을 경우에만 DB에서 조회하고 그 이후부터는 캐싱된 값을 반환하는 것으로 DB 트랜잭션이 끝날 때 같이 삭제되어 간단한 비즈니스 로직이 아닌 복잡한 로직에서는 성능 향상을 기대할 수 있습니다. 두 번째는 동일성 보장으로 하나의 트랜잭션 안에서 몇번을 조회하던 1차 DB 조회 이후 캐싱된 값만을 반환하기 때문에 안전합니다. 세 번째는 엔티티 등록 시 1차 캐시에 저장되어 커밋시 원하는 옵션대로 DB에 저장할 수 있어 옵션 설정을 통한 성능 개선을 기대할 수 있습니다. 네 번째는 수정 시 변경을 감지하는 것으로 별도의 Update를 해줄 필요 없이 엔티티의 데이터만 수정하면 DB의 데이터와 비교하여 자동으로 Update 쿼리를 작성 후 커밋해줍니다.

 

Q. JPA FetchType에 대해 설명하고 각각 어떤 기준으로 사용하시는지 설명해주세요.

더보기

A. 특정 Entity를 조회할 때 연관관계가 있는 다른 Entity의 정보를 어느 시점에 가져올 지 결정해주는 것입니다. FetchType에는 두 가지가 있는데 첫 번째로 Lazy는 조회 시점에 관련 Entity를 모두 조회하는 것이 아닌 실제 참조가 되었을 때 조회하는 방법이고 Eager는 조회시 연관 관계에 있는 모든 Entity를 한꺼번에 조회하는 방법입니다.

 

Q. JPA에서 Open Session In View에 대해 설명해주세요.

더보기

A. 기본 설정인 트랜잭션 범위를 넘어 API라면 응답이 올 때 까지, View라면 화면이 렌더링 될 때까지 영속성 컨텍스트가 살아있는 기능입니다. 동작 원리로는 클라이언트 요청시 서블릿 필터나 스프링 인터셉터에서 영속성 컨텍스트를 시작하며 서비스 계층의 트랜잭션의 커밋이 끝나도 살아있다가 생성 시점과 마찬가지로 서블릿 필터나 인터셉터에 응답을 내보낼 때 컨텍스트를 종료합니다.

 

 

Q. JPA에서 테이블 조인이 4 가지 이상일 때는 어떻게 처리할 수 있을까요?

 

Q. 의존성 주입 방법에는 어떠한 것들이 있고, 가장 좋은 방법은 무엇이고 그 방법에 대한 이유를 설명해주세요.

 

Q. AOP는 무엇이며 언제 사용할 수 있나요?

 

Q. Spring에서 템플릿 메소드 패턴을 사용해서 구현된 곳은 어디인가요?

 

Q. Spring 프레임워크의 트랜잭션에서 제공하는 전파 속성과 Isolation 레벨들에 대해 설명해주세요.

 

Q. Spring WebFlux에 대해 설명해주세요.

 

Q. Spring의 DI가 어떻게 동작하는지 설명해주세요.

 

Q. AOP에서 Aspect, Advice, Pointcut 및 Joinpoint에 대해 설명해주세요.

 

Q. Spring에서 의존성 주입을 지원하는 이유가 무엇인가요?

 

Q. Spring이 제공하는 예외 처리 방법들에 대해 설명해주세요.

 

네트워크

Q. RESTful API란?

더보기

A. REST를 기반으로 구현한 API입니다. REST는 HTTP 통신의 장점을 살린 하나의 디자인 패턴이나 아키텍처로 설명드릴 수 있을 것 같습니다. URI를 통해 자원을 명시하고 HTTP Method를 적극 활용합니다.

 

꼬리 Q. HTTP Method와 무상태성에 대해 설명해주세요.

A. HTTP Method는 세세하게 나눈다면 9가지로 기억합니다만 자주 쓰이는 GET, POST, PUT, DELETE에 대해만 설명드리겠습니다. GET은 특정 정보의 조회 요청에 사용되고 POST는 데이터의 등록, PUT은 수정, DELETE는 데이터의 삭제에 사용되고 있습니다. 무상태성이란 서버의 확장성을 위한 방법으로 요청한 클라이언트의 상태 저장하지 않음으로써 어떤 환경에서 요청이 되었는가는 고려되지 않고 오직 요청한 행위와 데이터의 반환만을 고려합니다.

 

Q. OSI 7 계층이란?

더보기

A. 인터넷 환경에서 통신을 하기 위해 네트워킹에 대한 표준을 7 계층으로 나눈 것입니다. 최하단 레이어부터 물리계층 => 데이터링크 계층 => 네트워크 계층 => 전송 계층 => 세션 계층 => 표현 계층 => 응용계층이 있습니다.

 

응용계층(Application Layer)

 - 사용자가 직접 데이터를 주고받고 가공하는 사용자 단계

 

표현 계층(Presentation Layer)

 - 인코딩, 암복호화 등 송신 측과 수신 측의 데이터 표준화를 위해 변환하는 계층 (표준으로 표현한다로 생각하면 편함)

 

세션 계층(Session Layer)

 - 사용자와 사용자의 연결을 담당하는 계층 (양방향, 단방향 등)

 

전송계층(Transport Layer)

 - 수신 포트를 정하고 연결 방법인 TCP(안전지향)나 UDP(속도 지향)를 정함 (목적지 포트번호로 생각하면 됨)

 

네트워크 계층(Network Layer)

 - 목적지까지의 경로를 정함 (택배로 치면 특정 건물까지로 생각하면 됨)

 

데이터링크 계층(Data Link Layer)

 - 목적지 내에서 구체적인 수신자, 즉 컴퓨터 MAC 주소가 예로 될 수 있음

 

물리 계층 (Physical Layer)

 - 전송된 디지털 신호를 전기 신호로 변환하는 단계로 데이터를 어떤 식으로 읽을 것인지, 부호화는 어떻게 할 것인지 등 물리적인 단계

 

Q. DNS란?

더보기

A. naver.com과 같이 문자열로 된 도메인 주소를 숫자 형식의 IP 주소로 변환해주는 시스템입니다.

 

꼬리 Q. 동작 방식에 대해 설명해 주실 수 있나요?

A. 최초 URL 입력 시 ISP(통신사 등 인터넷 연결 주체)가 관리하는 DNS 해석기에 해당 요청을 라우팅 합니다. 해석기는 루트 서버에 top-level부터. 을 기준으로 서버 주소를 요청하며 목적지 IP를 변환합니다.

 

Q. 브라우저에 URL을 쳤을 때 동작 순서를 설명해주세요.

더보기

A. 입력된 도메인을 IP 주소로 변환하기 위해 DNS 서버에 입력한 도메인에 해당하는 IP 주소를 요청합니다. DNS 서버로부터 IP를 반환받으면 서버에 요청할 Request를 생성하고 TCP 프로토콜을 이용하여 라우터를 거쳐 해당 IP주소로 전송됩니다. 전송된 Request는 HTTP 프로토콜을 이용하여 웹 페이지 URL로 변환되고 URL에 해당하는 데이터를 찾게 됩니다. 그 후 Response는 Reqeust와 동일한 방식으로 요청자에게 반환됩니다.

 

Q. Close Wait와 Time Wait의 차이점에 대해 설명해주세요.

더보기

A. Close Wait은 연결 해제 요청을 받았을 때 해당 포트를 사용하는 프로세스가 종료될 때까지 기다리는 상태이고 Time Wait는 연결 해제 요청을 한 대상이 연결 해제할 준비가 끝났을 때 ACK를 송신 후 약 60초간 기다리는 상태입니다. 여기서 기다리는 이유는 기존 연결에서 데이터 패킷이 늦게 도착하여 이후 연결과의 ID 값이 꼬이는 것을 방지하기 위함입니다.

 

Q. Rest API에서 가장 중요한 것은 무엇이라고 생각하나요?

 

Q. 알고 있는 Http Response들에 대해 얘기해주세요.

 

Q. 쿠키는 클라이언트 어느 부분에 저장되나요?

 

Q. CSRF에 대해 설명하고, 이를 막기 위한 방법들에 대해 설명해주세요.

 

Q. JWT 변조 공격에 대해 어떻게 대처해야 할까요?

 

Q. 세션 기반의 인증과 토큰 기반의 인증의 차이에 대해 설명해주세요.

 

Q. JWT 토큰에 대해 설명해주세요.

 

 

DB

 

Q. Redis에 대해서 간단히 설명해주세요.

 

Q. 데이터베이스 정규화에 대해 설명해주세요.

 

Q. 데이터베이스를 직접 설계해 본 경험이 있나요? 있다면 어떠한 기준으로 설계를 했는지 설명해주세요.

 

Q. 데이터베이스 클러스터링과 리플리케이션의 차이에 대해 설명해주세요.

 

Q. Elastic Search의 키워드 검색과 RDBMS의 LIKE 검색의 차이에 대해 설명해주세요.

 

Q. 데이터베이스를 설계할 때 ERD 도구를 사용해본 경험이 있나요? 있다면 어떤 것을 사용했나요?

 

Q. 메모리에 모두 실리지 못하는 1억 로우의 칼럼이 있다고 가정했을 때, 해당 컬럼에 대해 어떻게 전처리 과정을 진행할 것인지 설명해주세요.

 

Q. 인덱스의 구현에 사용되는 대표적인 자료구조에 대해 설명해주세요.

 

Q. Elastic Search에 대해 간단히 설명해주세요.

 

Q. 데이터베이스를 설계하는 과정에서 어려웠던 경험이 있다면 얘기해주세요.

 

Q. 인덱스의 종류와 각각의 특징에 대해 설명해주세요.

 

Q. Elastic Search의 인덱스 구조와 RDBMS의 인덱스 구조의 차이에 대해 설명해주세요.

 

Q. 데이터베이스 힌트에 대해 설명해주세요.

 

Q. 대표적인 RDBMS와 NoSQL에는 어떤것들이 있고 어떠한 차이점이 있나요?

 

서버

 

Q. 세션이 무엇인지 설명하고, 서버가 여러 대일 때 세션을 어떻게 처리해야 할지 설명해주세요.

 

Q. Docker와 Kubernates에 대해 설명해주세요.

 

Q. 대칭키, 비대칭키 암호화 방식에 대해 설명해주세요.

 

Q. 무중단 배포 방법에는 어떤 게 있나요?

 

Q. gRPC는 무엇이며, RPC는 무엇인가요? 또 이것들을 왜 사용할까요?

 

Q. MSA에 대해 설명하고 MSA가 갖는 장단점에 대해 설명해주세요.

 

Q. CDN에 대해 설명해주세요.

 

Q. OAuth의 흐름에 대해 설명해주세요.

 

Q. 로드밸런서에 대해 설명해주세요.

더보기

A. 서버의 부하를 분산시켜주는 시스템으로 크게 L4 스위치와 L7 스위치로 나누어 사용하고 있습니다. 먼저 L4 스위치는 MAC 주소, IP주소, 포트 정보와 같은 4 계층 이하의 정보들을 가지고 분산을 정하며 L7은 요청 패킷까지도 확인하여 분산시킬 수 있습니다만 L7과 같이 섬세한 분산을 위한 장비일수록 가격이 비싸지는 걸로 알고 있습니다.

 

Q. 메시지 큐에 대해 설명하고, 알고 있는 메시지 큐에 대해 얘기해주세요.

 

Q. 트래픽이 많아지면 어떻게 되며 어떻게 대처해야 하는지 설명해주세요. (예상되는 현상과 해결 방법)

 

Q. 성능이나 부하 테스트를 어떤 방법으로 진행할 수 있을까요?

 

자료구조

Q. ArrayList와 LinkedList의 차이점에 대해 설명해주세요.

더보기

A. 먼저 ArrayList는 순서대로 길게 늘어진 List입니다. 순서대로 늘어져있기에 원하는 데이터의 인덱스를 알고있으면 O(1)만에 접근이 가능해 조회에 유용한 리스트로 알려져있습니다. 하지만 데이터의 추가나 삭제시 비어있는 자리를 채우기 위해 왼쪽 혹은 오른쪽으로 shift 해야하기에 O(n)으로 빈번한 데이터의 변경에는 적합하지 않다고 알려져 있습니다. 다음으로 LinkedList는 순서없이 데이터 Value와 다음 데이터의 주소값만을 갖고있는 List 입니다.

ArrayList와는 다르게 데이터의 추가나 삭제 시에도 주소 값의 변화만으로 작업이 가능하기에 O(1)만에 가능합니다. 하지만 데이터의 조회 시 순서가 없기에 Index로 접근이 불가능해 원하는 데이터를 찾을 때까지 확인해야 해서 O(n)의 수행 과정이 필요합니다. 따라서 빈번한 데이터의 조회에는 적합하지 않다고 알고 있습니다. 하지만 Linked List는 Tree 구조에서 더 유용하고 다양하게 사용되고 있기 때문에 필수적으로 알아야 하는 데이터 구조입니다.

 

꼬리 Q. Tree에 대해 설명해주세요.

A. 비선형 자료구조로 각 노드는 다음 노드의 주소를 갖고 있는 일종의 LinkedList로 볼 수 있습니다. 먼저 말씀드린 탐색 시 찾고자 하는 자료가 나올 때까지 확인해야 한다는 LinkedList의 단점을 보완하기 위해 사용한다는 특징을 갖고 있습니다.

 

Q. Hash Table에 대해 설명해주세요.

더보기

A. Hash Table은 ArrayList처럼 내부적으로 인덱스를 사용하고 있기 때문에 검색 속도가 빠른 게 특징인 자료구조입니다. 다만 ArrayList와 다르게 번호로 된 인덱스를 사용하는 게 아닌 내장된 Hash Function에 의해 인덱스, 즉 Key를 고윳값으로 변경하며 이를 통해 데이터에 빠르게 액세스 하는 것입니다. 아무리 특별한 Hash Function을 사용한다고 해도 Key가 충돌되는 경우는 발생할 수 있는데요 이 때는 체이닝과 개방 주소법을 사용하여 이를 해결할 수 있습니다. 체이닝이란 충돌된 데이터에 LinkedList로 데이터를 연결하는 방식이고 개방 주소법이란 비어있는 다른 버킷에 데이터를 담는 방법입니다.

 

Q. 스택, 큐를 직접 구현할 때 어떻게 구현할 것인지 설명해주세요.

 

Q. 스택 2개로 큐를 구현해보세요.

 

Q. 버블소트, 힙소트, 머지소트, 퀵소트, 삽입소트와 각각의 시간 복잡도에 대해 설명해주세요.

 

Q. 레드블랙 트리에 대해 설명해주세요.

 

OS

Q. 페이징과 세그멘테이션에 대해 설명해주세요.

더보기

A. 페이징은 고정 크기를 가지고 메모리를 배치하는 방법이고 세그멘테이션은 가변 크기를 가지고 메모리를 배치하는 방법입니다. 두 방법 모두 메모리 단편화를 방지하기 위해 사용합니다.

 

꼬리 Q. 메모리 단편화가 뭔지 설명해주세요.

A. 

 

Q. 세마포어와 뮤텍스의 차이에 대해 설명해주세요.

 

Q. 페이지 교체 알고리즘과 LRU에 대해 설명해주세요.

 

Q. 멀티 프로세스와 멀티 스레드의 차이에 대해 설명해주세요.

 

Q. CPU의 메모리 I/O 도중 생기는 병목 현상을 어떻게 해결할 수 있을까요?

 

Q. 가상 메모리와 페이지 폴트에 대해 설명해주세요.

 

인성 & 경험

 

Q. 간단한 자기소개 부탁드립니다.

 

 

Q. 좋은 코드가 뭐라고 생각하시나요?

더보기

A. 이게 좋은 코드다! 라고 정의하기엔 어려우니 주관적인 생각을 말씀드리자면 가독성이 좋고 열려 있는 코드라고 생각합니다. 가독성이 좋다는 건 말 그대로 함수나 변수의 네이밍이라던지 코드 자체가 간결하고 명확할 수도 있고 적재적소에서 필요한 만큼의 주석 정도가 될 것 같고 실제로 현업에서도 신규 개발을 위해 코드를 작성하는 시간보다 작성한 코드를 읽는 시간이 많았었던 걸로 기억합니다. 열려 있는 코드는 간단하게 말하자면 자기 역할에 충실하고 다양한 요구사항에 유연한 코드라고 설명드릴 수 있을 것 같습니다. 이전 직장에서 신규 프로젝트를 나가게 되거나 기존 시스템의 수정 개발을 할 때 여러 가지 이유로 요구사항은 자주 바뀌었었습니다. 하지만 최초 개발부터 항상 시간에 쫓겨 비즈니스 요구의 충족을 위한 개발을 진행해왔기에 코드는 유연하지 못했고 사소한 수정이나 추가 기능에도 부수 효과를 테스트하기 위해 많은 시간을 허비했던 경험이 있었습니다. 따라서 주어진 시간 내에서 열린 코드를 작성하기 위한 노력은 필요할 것 같습니다.

 

꼬리 Q. 열려있는 코드는 어떻게 작성해야 하나요?

A. 다양한 설계 방법과 규칙이 있겠지만 당장 기억나는 건 SOLID 원칙이 생각납니다.

 

꼬리 2 Q. SOLID 원칙에 대해 설명해주세요.

A. S, 단일 책임 원칙으로 하나의 클래스는 하나의 책임만 가져야 한다. O, 개방-폐쇄 원칙으로 확장에는 열려있되 변경에는 닫혀있어야 한다. L, 리스 코프 치환 원칙으로 상위 타입의 객체를 사용하되 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상 동작해야 한다. I, 인터페이스 분리 원칙으로 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다. D, 의존 역전 원칙으로 상위 레이어의 모듈은 하위 레이어의 모듈에 의존적이어서는 안 된다로 외우고는 있습니다만 각각의 원칙에 대해 적절한 예시와 적용 방법까지는 공부가 더 필요한 부분인 것 같습니다.

 

Q. 개발자로서 단기적인 목표와 장기적인 목표에 대해 얘기해주세요.

 

Q. 취미나 스트레스 관리법이 따로 있나요?

 

Q. 개발이 재미있고 적성에 맞나요?

 

Q. 본인의 하루 루틴에 대해 설명해주세요.

 

Q. 입사 후 업무나 팀이 본인과 맞지 않으면 어떻게 할 건가요?

 

Q. 이전 직장에서의 퇴사 사유가 어떤 건가요?

 

Q. 야근에 대한 본인의 생각을 말해주세요.

 

Q. 일하게 될 팀이 코드 리뷰에 대해 보수적이고 페어를 완강하게 거부한다면 어떻게 할 건가요?

 

Q. 신규 기술을 도입해본 사례가 있다면 말씀해주세요.

 

Q. 하나의 비즈니스 로직을 작성할 때 어느 수준으로 작성하는지(라인수, 파라미터 수 등), 무엇을 중요하게 생각하는지 말씀해주세요.

 

Q. 기억에 남는 프로젝트와 어떤 역할을 했는지 설명해주세요. 그리고 여기서 느낀 아쉬웠던 점과 개선 방안을 설명해주세요.

 

Q. 최근에 관심을 갖고 있는 기술이 있나요?

 

Q. 존경하는 인물과 그 이유를 설명해주세요.

 

Q. 본인이 구현했던 핵심 기능들과 동작 방식에 대해 설명해주세요.

 

Q. 본인의 개발 실력을 상/중/하로 나누었을 때 어느정도 된다고 생각하고 그 이유가 무엇인가요?

 

Q. 인생을 살면서 성공한 경험이나 자신 만의 강점이 있다면 얘기해주세요.

 

Q. 만들고 싶거나 관심있는 서비스가 있나요?

 

Q. 지원자분의 경쟁력은 무엇이고 왜 채용해야 하는지 설득해주세요.

 

Q. 업무적으로 가장 감명받았던 경험이나 크게 성장했던 경험이나 저희가 모를 수 있는 지원자분만의 경험이 있다면 설명해주세요.

 

Q. 일을 하며 가장 큰 성과를 낸 업무가 어떤 것인가요?

 

Q. 최근에 읽을 기술 관련 책 이름이 무엇이고 인상 깊었던 부분을 얘기해주세요.

 

Q. 팀 내에서 본인의 주된 역활에 대해 설명해주세요.

 

Q. 적용해본 디자인 패턴과 어떠한 상황에서 사용했는지 설명해주세요.

 

Q. AWS 인프라를 구축해본 경험이 있나요? 있다면 말씀해주세요.

 

Q. 멀티 프로세스나 멀티 쓰레드를 이용해 기능을 구현해본 경험이 있다면 말씀해주세요.

 

Q. 커뮤니케이션 스타일에 대해 말씀해주세요.