기술 면접 예상 질문

5w31892p·2023년 3월 19일
0

CS_Study

목록 보기
2/9

인성 예상

지원동기

지원 동기

개발자가 되기로 한 이유

개발자가 되지 않았다면 어떤 일을 하고 싶은지?

이전 회사 입사 전에 법 공부를 하였는데, 흥미를 느끼며 했던 기억이 있어
아마 개발자가 되지 않았다면 법 관련 공부를 하여 법무와 관련된 일을 하고 싶습니다.

개발 관심 정도

즐겨보는 테크 유튜버나 뉴스레터?

평소에 유튜브를 즐겨보지 않아 즐겨보는 유튜버나 뉴스레터는 없습니다.
커리어리라는 어플을 통해 그냥 편하게 다른 개발자들이 쓴 글이나 공유한 글들을 보곤 합니다.

최근에 본 기술 아티클은?

최종 프로젝트에서 채팅 기능을 구현하기 위해 많이 알아봤던 웹소켓 stomp 입니다.
stomp는 웹소켓 위에서 동작하는 프로토콜로, 실시간 데이터를 주고 받을 수 있고,
구독을 통해 웹소켓 세션에 직접 메시지를 전달하지 않고도 채팅방을 고도화 하는 것이 가능합니다.

좋아하는 개발자가 있다면 누구고 그 이유는?

이고잉님입니다.
처음 강의를 들었을 때, 초보자 입장에서 너무나도 이해하기 쉽게 설명해주시는 것이 참 인상 깊었습니다.
본인을 아는 것을 남이 이해하기 쉽게 설명하는 것이 가장 어렵다고 생각하는데,
이를 쉽게 해내시는 것과 다양한 언어에 대해 아는 것이 많으셔 참 존경하는 분이라고 생각했습니다.

좋아하는 프로그램이 있다면? 이유는?

익숙해진 인텔리제이가 가장 좋기도 하고 편한 프로그램입니다.
최종 프로젝트를 진행하며 프론트페이지는 vscode로 진행하였는데, 개인적으로 vscode에 써진 코드를 보고 더욱더 인텔리제이가 가독성이 정말 좋다라고 생각했기 때문입니다.

개발자로 은퇴하기 전까지 만들어보고 싶은 프로그램이 있다면?

앞으로 2025년쯤에 우리나라는 초고령사회로 진입될 것이라는 기사를 본 적이 있습니다.
젊은이와 어르신들 모두 사용하기에 쉽고 편리하며, 특히 항상 집에 계시는 어르신들을 위해
어르신들의 소통의 장? 같은 느낌의 프로그램을 만들고 싶습니다.

메타인지

개발자로서 나의 강점과 근거가 되는 경험

제 강점은 책임감과 집요함이고 이 책임감과 집요함이 개발자로서의 제 강점이라고 생각합니다.
이번 최종 프로젝트 때에 채팅 기능을 맡아 하게 되었습니다.
서버쪽 구현은 이전에 공부했던 내용으로 했지만 프론트에 적용은 처음이라 많이 버벅였습니다.
하지만 내가 맡은 일이니 내가 끝내야한다라는 생각 하나로 잠도 줄이고, 자려고 누웠다가도 생각나면 노트북을 켜 구현해보는 등 프로젝트 기간 내에 끝냈습니다.

개발자로서 본인의 약점

제가 구현한 기능에 대해 입밖으로 꺼내 설명하는 부분이 조금 부족하다 생각합니다.
아마 머릿속으로 정리를 다 끝내지 않아 그럴 수도 있지만,
다른 사람들이 이해하기 쉽게끔 내가 구현한 기능을 문서화 해보고 입밖으로 꺼내 보는 연습을 하며
꾸준히 바꿔나가야 할 점 입니다.

앞으로 어떤 공부를 할 계획인지, 그러한 계획을 세운 이유는?

개발자는 공부에 끝이 없다고 생각합니다.
우선 제가 배우고 검색하여 알게된 기술들을 시작으로 회사의 방향에 맞는 기술을 꾸준히 공부하며 익힐 생각이며, 보다 나은 기술이 있다면 찾아보고 적용시켜보고 싶습니다.

누군가에게 피드백을 주었던 경험이 있는가? 그때 내 감정과 듣는 상대의 반응은?

전 팀원분이 깃 사용을 어려워했고, 매번 다른 팀원분께 여쭤봤는데 내가 느끼기에는 저렇게 말하면 자꾸 저 분이 물어볼거고 그럼 말하는 다른 팀원도 지치겠다라는 생각이 들어 다른 팀원들이 있는 공개적인 곳이 아닌 개인적으로 슬랙 dm 등을 통해 내가 사용 하는 방법을 설명하며 이렇게 사용하실 때 문제 없을거라고 설명을 해드렸습니다.
누군가에게 도움이 될 수 있다는 생각에 너무 뿌듯했고, 추후 그 분께 들었던 말은 배려해주시는게 보여 감사했다고 해주셨습니다.

누군가에게 피드백을 받았던 경험은? 그때 내 감정과 말하는 상대의 반응은?

이전 프로젝트를 사용할 때 각 기능에서 토큰 확인을 하는 부분에서 HttpServletRequest를 통해 토큰 확인하는 코드를 보고 팀원분께서 @AuthenticationPrincipal 어노테이션으로 UserDetails를 통해 확인하는 부분을 알려주셨고, 그때 감정은 너무 신기했고, 이런 부분들을 알려주셔 감사했습니다. 알려주신 팀원분도 제가 감사해하며 왜 그렇게 되는지 궁금해하고 하니 귀찮아 하지않고 친절하게 알려주셨습니다.

삶의 태도

가장 인상깊게 읽었던 책과 그 이유

삶에서 중요하게 생각하는 가치는?

삶에서 가장 중요한 것 가치는 바로 예의 입니다.
기본적인 예의도 갖추지 않은 상태로 일을 진행하게 된다면,
내 자신의 가치를 깎아내리는 것은 당연한것이고, 같이 일을 진행하게 되는 동료와의 사이도 안좋아져 협업에서 중요한 소통이 당연히 없어질 것이라고 생각하기 때문입니다.

롤모델 / 이유

즐겁고 행복했던 경험

힘들고 쉽지 않았지만 극복한 경험

조직 문화 적합성

이상적으로 생각하는 조직 문화는?

정말 어렵겠지만 저는 사람들이 서로 존중하는 문화가 가장 이상적이라고 생각합니다.
직급이 더 높다는 이유로, 더 오래 근무했다는 이유로 상대방의 의견을 묵살하는 것이 아닌 서로 존중이 바탕이 되어 이야기가 오가는 분위기가 가장 이상적인 조직 문화라고 생각합니다.

회사에 가장 기대하는 바가 있다면?

존중이 바탕이 되어 있다면, 복지는 무조건 따라오는 것이라 생각합니다.
직원들을 일하는 기계가 아닌 각각의 인격으로 대해준다면 구성원 간에도 서로를 존중하는 문화가 바탕이 될 것이고, 그에 따라 복지도 무조건 따라 오는 것이라 생각하기에 회사 역시도 구성원 하나하나에 대한 존중이 바탕이 되었으면 좋겠다는 기대를 가지고 있습니다.


기술 예상

알고리즘

시간복잡도와 공간복잡도 설명

시간복잡도는 문제를 해결하는데 걸리는 시간을 의미하고,
공간복잡도는 얼마나 많은 메모리를 차지하는지 분석하는 것을 의미한다.

재미있게 공부한 알고리즘은?

포트폴리오에서 시간복잡도를 낮춘 사례가 있다면?

이분탐색이란 무엇이고, 시간복잡도는 어떻게 되는지, 그리고 그 이유는?

  • 정렬된 배열에서 특정 값을 알고리즘
  • 시간복잡도는 O(log n)
    • 이분 탐색을 배열의 크기를 절반으로 줄임
    • 최악의 경우에도 배열의 크기를 O(log n)번 만큼 나눠야 하기 때문

시간복잡도가 높은 경우 취할 수 있는 일반 전략 3가지 정도 설명

공간복잡도가 높은 경우 취할 수 있는 일반 전략 3가지 정도 설명

  • 링크드리스트 대신 배열을 사용하여 메모리 사용을 줄일 수 있음

자료구조

좋아하는 자료구조가 있다면 무엇이고 그 이유는?

??

스택과 큐에 대해 설명

  • 스택 : 데이터를 쌓아올리듯이 넣고 빼는 후입선출 방식
    • 책을 쌓아올리듯 마지막에 넣은 데이터가 가장 먼저 처리
    • 데이터 넣는 것은 push, 빼는 것은 pop
  • 큐 : 먼저 넣은 데이터가 먼저 나오는 선입선출 방식
    • 줄을 서서 기다리는 것과 같은 방식
    • 넣은 것은 enqueue, 빼는 것은 dequeue

배열, 링크드리스트를 비교하여 설명

  • 모두 데이터를 저장하는 자료구조
  • 배열
    • 데이터를 인덱스에 따라 순차적으로 저장
    • 생성시 크기를 정하기 때문에 동적인 크기 조절이 어려움
    • 그렇기 때문에 데이터의 삽입이나 삭제를 할 때 해당 위치에 있는 데이터를 이동시켜야 해서 번거로움
  • 링크드리스트
    • 여러개의 노드들이 순서대로 연결되어 있는 형태
    • 각 노드에는 다음 노드를 가르키는 포인터가 저장되어 있음
    • 그렇기에 데이터의 삽입과 삭제를 할 경우 노드와 연결된 포인터만 수정하면 되므로 삽입과 삭제가 유리

배열이 검색 성능이 좋은 이유
인덱스에 따라 순차적으로 저장되는 자료 구조이기 때문에 각 데이터의 인덱스를 알고 있다면 쉽게 데이터에 접근할 수 있으므로 검색 성능이 좋다.

링크드리스트가 검색 성능이 좋지 않은 이유
각 노드가 다음 노드를 가리키는 포인터를 가지고 있어 검색을 할 때 처음부터 시작해 순차적으로 탐색해야 하므로 노드의 개수가 많으면 많을수록 시간이 많이 소요되어 검색 성능이 좋지 않다.

해시테이블의 원리와 충돌 해소 전략은?

  • 데이터를 저장할 때 해시 함수를 이용하여 각 데이터를 고유한 인덱스에 매핑하여 저장하는 자료구조
  • 데이터의 검색, 삽입 매우 빠름
  • 내부적으로 배열을 이용해 데이터 저장
  • 각 데이터 인덱스를 해시 함수에 넣어 결과 값을 배열의 인덱스로 사용해 데이터에 저장
  • 개방주소법
    • 충돌 발생시 다른 빈 인덱스 찾아 데이터 저장
  • 분리 연결법
    • 충볼 발생시 해당 인덱스 연결리스트에 데이터 추가

우선순위 큐의 시간복잡도는 어떻게 되며 그 이유는?

  • 시간복잡도는 구현 방식에 따라 달라짐
  • 일반적으로 우선순위 큐는 힙을 이용한 구현 방식을 가장 많이 사용
  • 우선순위 큐의 시간복잡도는 삽입, 삭제시 O(logN)의 시간이 걸림
  • 큐와 비슷한 성질 이용하지만, 큐에서는 front 요소의 반환 시간은 O(1)임
  • 하지만 우선순위 큐에서는 가장 우선순위가 높은 값을 가져온 후 완전 이진트리로 다시 만드는 과정인 swap 과정 때문에 O(logN)만큼의 시간 복잡도가 걸린다.

삽입시 가장 마지막 위치에 요소를 추가시킨 후 부모 노드와의 비교후 swap 과정을 통해 알맞은 위치를 찾아감

삭제시 root node를 반환 후 가장 마지막 요소룰 root node에 위치시킨 후 자손과의 비교를 통해 swap 과정을 거쳐 알맞은 위치 찾아감
자손과의 swap은 둘 중 우선순위가 큰 node 와 swap 함

데이터베이스

인덱스란 무엇이고 일반적인 원리 설명

  • 데이터베이스의 데이터 검색 속도를 높이기 위해 사용하는 자료구조
  • 인덱스에 해당하는 컬럼을 검색하기 때문에 빠르게 원하는 결과 도출 가능
  • 인덱스 생성하면 인덱스 키 기준으로 값을 정렬
    • 정렬된 인덱스 키는 검색을 빠르게 수행할 수 있고, 검색시 전체 테이블 스캔하는 것보다 더 빠른 결과 가져옴

모든 요소에 인덱스를 걸지 않는 이유는?

  • 인덱스 생성 시간 길어짐
  • 인덱스 유지 관리 비용 증가
  • 인덱스 크기 커지고, 그에 따라 데이터 베이스의 크기가 커짐
  • 인덱스 생성할 떄에는 테이블 특성을 고려하여 필요한 요소에만 인덱스를 걸어야 함

복합 인덱스란 무엇이고 그 원리는?

  • 두개 이상의 컬럼을 합쳐서 인덱스를 만드는 것
  • 여러개의 컬럼을 기반으로 검색이 가능
  • 여러 컬럼을 조합하여 하나의 인덱스를 생성하기 때문에 생성할 컬럼의 선택이 중요
  • 인덱스는 조합된 컬럼의 데이터를 통해 생성되고, 검색할 때에도 해당 컬럼들을 통해 검색을 수행

트랜잭션이란 무엇이고, 원자성, 일관성, 고립성, 지속성 이 무엇인지 설명

  • 트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위
  • 특징에는 원자성, 일관성, 고립성, 지속성이 있음
    • 원자성: 데이터베이스에 모두 반영되거나 아예 모두 반영되지 않아야 함, 중간에 실패시 이전 상태로 롤백
    • 일관성 : 트랜잭션 수행 전과 수행 후의 데이터 베이스의 일관성이 유지되어야 함
    • 고립성 : 여러 개의 트랜잭션이 동시에 수행될 때 한 트랜잭션이 다른 트랜잭션에 영향 끼칠 수 없음
    • 지속성 : 성공적으로 완료되었을 때 결과는 영구적으로 반영

정규화란 무엇이고 대표적인 장점과 단점은?

  • 데이터 중복을 줄여 데이터 구조화하는 과정
  • 장점 : 중복 데이터를 줄여 데이터베이스 용량을 줄일 수 있고, 데이터를 구조화하여 유지보수가 쉬워짐
  • 단점 : 정규화된 데이터베이스는 설계가 복잡해지기 때문에 개발비용이 많이 듦

네트워크

HTTPS의 원리

  • HTTP의 보안 강화 버전
  • 공개키 암호화 방식으로 세션키 안전하게 전송
    1. 클라이언트가 HTTPS로 웹서버 연결 요청
    1. 웹서버는 클라이언트에게 공개키 제공
    2. 클라이언트는 공개키 사용하여 세션키 생성
    3. ct는 세션키를 서버에 보내기 위해 공개키 암호화
    4. 서버는 개인키 사용하여 세션키 복호화
    5. ct와 서버는 세션키를 사용하여 암호화된 데이터 주고 받음

TCP 2 way handshake란?

  • TCP에서 연결을 성립하기 위한 과정 중 하나
  • 클라이언트와 서버간의 테이터 통신을 시작하기 전에 수행
  • 이를 통해 클라이언트와 서버간 신뢰성 있는 통신을 할 수 있음

TCP와 UDP 비교하여 설명

  • 모두 IP 프로토콜 기반으로 데이터 전송하기 위한 프로토콜
  • TCP는 연결지향적으로 연결 수립 후 유지하며 데이터 전송, UDP는 비연결성이며 데이터 전송 전에 연결 수립 안함
  • TCP는 데이터 전송의 신뢰성을 보장하며, 데이터의 손실 및 중복을 방지하기 위한 메커니즘을 제공하고, UDP는 데이터 신뢰성을 보장하지 않으며, 데이터 손실이나 중복 전송이 발생할 수 있음
  • TCP는 신뢰성 보장을 위해 송신 전 상대방의 수신 확인 받아야 하여 데이터 전송 속도가 느리지만, UDP는 데이터 전송속도가 빠르며 전송지연이 적음
  • 즉, TCP는 연결성이 있고, 신뢰성이 높은 프로토콜로 대용량의 데이터 전송에 적합
  • UDP는 연결성이 없고 신뢰성이 낮은 프로토콜로 실시간 서비스에 적합

CORS란 무엇이고 어떻게 구현?

  • 웹 브라우저의 동일 출처 정책에 의해 차단되는 다른 도메인에서 온 리스소에 접근하는 것을 허용하기 위한 것
  • 서버측에서 CORS 활성화
    • 도메인에 접근 허용할 origin 지정
    • @CrossOrigin 어노테이션 사용하여 CORS 활성화

기타

Base64 인코딩이란?

  • 0과 1로 이루어진이진데이터를 아스키 문자로 변환
  • 이진데이터는 8비트 단위, 아스키 문자는 7비트 단위 변환시 데이터 손실 가능성 있음
  • 방지를 위해서 이진데이터를 6비트로 묶어 64개의 문자 중 하나로 변환함
    • 6비트씩 묶은 후 10진수로 변환
    • 10진수롤 다시 문자로 변환 (대문자 26개, 소문자 26개, 숫자 10개, + , / )
    • 변호나된 문자열을 이어붙여 인코딩된 문자열로 완성
  • 즉, 9비트 단위로 구성된 이진데이터를 6비트로 묶는 것이 Base64 인코딩을 사용하여 이진데이터를 텍스트 데이터로 변환하는 것
  • 주로 이메일, HTTP 등에서 이진데이터를 전송할 때 사용

사용자 패스워드를 전송하고 보관하는 방법 설명

  • 사용자로부터 패스워드를 받으면 평문으로 서버에 전송
  • 서버는 평문으로 받은 패스워드를 단방향 해시 함수로 암호화 하여 보관
    • 단방향 해시 함수 : 원본 데이터를 완전히 다른 암호화된 데이터로 변환하는 것
    • 단방향: 복호화 불가능 // 양방향 : 복호화 가능
  • 이후 로그인할 때에 사용자로부터 패스워드 요청을 받으면 마찬가지로 해시 함수로 암호화 하여 보관된 패스워드와 비교한다.

프로세스와 스레드 비교하여 설명

  • 프로세스와 스레드는 운영체제에 동시에 실행되는 실행단위
  • 프로세스는 운영체제로부터 자원할당 받아 실행되는 인스턴스이고, 스레드는 프로세스 내에서 실행되는 실행 단위
    • 프로스세 내에서 스레드 간에는 코드. 데이터 등의 자원을 공유함
  • 프로세스는 각각의 독립적인 메모리 영역과 핸들러 등을 가지지만, 스레드는 프로세스 내에서 실행되기 때문에 프로세스 자원을 공유
  • 프로세스는 자신만의 메모리 공간을 할당 받기 때문애 프로세스가 종료되면 해당 메모리 영역이 해제 되고, 스레드는 프로세스 내에서 생성되고 실행 종료되면 해당 스레드만 소멸됨
  • 즉, 프로세스는 독립적인 실행단위이자 실행 중인 프로그램 전체를 나타내는 것이고, 스레드는 프로세스 내에 실행되는 작은 실행단위이자 프로세스의 자원을 공유하면서 동작한다.
  1. 동기와 비동기 비교하여 설명
  • 동기는 요청한 쪽이 작업을 기다리며 해당 작업이 완료될 때까지 대기하는 방식으로 작업의 결과를 직접 받아와야해서 요청한 쪽은 작업 완료되기 전까지 다른 작업을 수행할 수 없다.
  • 비동기는 요청한 쪽이 작업 완료를 기다리지 않고 다른 작업을 수행하는 방식으로, 요청받아 작업 수행하는 쪽이 작업이 완료되는 결과를 알려주기 때문에 이전 작업이 완료되지 않더라도 다른 작업 수행이 가능하다.
  • 동기는 요청한 쪽이 결과를 기다리기 때문에 요청과 결과가 순차적으로 이뤄지고,
  • 비동기는 요청한 쪽이 결과를 기다리지 않기 때문에 동기 방식에 비해 더 빠른 응답과 높은 처리량을 가진다.
  1. call by reference란 무엇이고 어떻게 쓰이는지
  • 함수 호출시 인자로 전달되는 변수의 메모리 주소를 전달하고, 함수에서 해당 주소를 이용해 변수의 값을 직접 변경하는 방식
  • 즉, 전달된 변수의 레퍼런스(참조)를 이용하여 값을 변경하는 방식
  1. 동시성과 병렬성을 비교하여 설명
  • 모두 여러 작업을 동시에 처리하는 개념
  • 동시성은 여러 작업이 동시에 실행되는 것처럼 보이지만 실제로는 하나의 프로세서에서 작업들을 번갈아가며 수행하는 것
  • 병렬설은 실제로 동시에 실행되는 것이고, 여러개의 프로세서나 코어를 사용하여 작업 분할 하여 동시에 처리하는 것

0개의 댓글