암튼 나도 신청을 해서 매일 새벽에 메일로 질문 3개씩 받고 있다. 설 연휴와 그간 일정들 땜시 완벽히 보진 못했지만 누워서 자기 전 문제들을 한번씩 훑고 생각해보고있다. 역시나 기록을 안남겨두면 계속 까먹기에 망나니 개발자님 허락을 받고 메일로 받은 질문들과 새로 배운 내용들을 정리해보려구 한당
기술면접을 준비중인 누군가가 내 블로그를 본다면 꼭 신청하세용 추천추천
2022/01/26
1. [JAVA] Java의 Optional API에 대해 설명하라
Optional 클래스란 자바는 Optional 이라는 래퍼 클래스를 제공한다. 해당 클래스는 NullPointerException을 대응하기 위한 클래스로 널값이 될 수 있는 값을 감싸는 클래스이다. 따라서 값이 널이더라도 NPE(NullPointerException)이 발생하지 않는다.
사용 시 장점 NullPointerException을 방지하고 애플리케이션이 안정적으로 운영된다.
사용 시 주의사항 Optional은 널 또는 실제 값을 래퍼로 감싸는 래퍼 클래스이다. 따라서 Optional을 반환하는 메서드는 절대 널을 갖는 value를 반환해서는 안된다. 또한 Optional은 값을 래핑하고 다시 풀고, 널일 경우 대체하는 함수를 호출하는 등 추가 작업으로 인해 성능이 저하될 수 있음으로 반환값이 널이 절대 아니라면 Optional을 사용하지 않는 것이 좋다. 즉, Optional은 메서드의 결과가 널이 될 수 있으며 클라이언트가 이 상황을 처리해야할 때 사용하는 것이 좋다.
Optional 남발의 위험성
Optional의 값의 존재 여부를 확인하지 않으면 NullPointerException 대신 NoSuchElementException이 발생한다.
직렬화 시 문제가 발생한다. 기본적으로 Optional은 직렬화를 제공하지 않기 때문에 캐시나 메시지큐등 연동 시 문제가 발생할 수 있다.
객체 자체의 NPE와 값의 NoSuchElementException 방지를 위해 코드가 더 복잡해지고 가독성이 떨어진다.
Optional은 객체를 감싸는 컨테이너이므로 기존의 값을 저장하기 위한 메모리보다 더 많은 메모리가 할당된다. 또한 컨테이너안의 값에 접근해야함으로 접근 비용도 증가한다.
올바른 사용법
Optional 변수에 Null을 할당하지 않는다. 필요할 시 Optional.empty()로 초기화한다.
isPresent() 확인 후 get()을 통해 값을 얻기 보다는 orElseX()를 활용해 처리한다.
단순히 값을 얻으려는 목적에 Optional을 남발하지 않는다.
메서드 파라미터로 Optional을 넘기지 않는다.
Collection의 경우 Optional을 사용하지 말고 빈 Collection으로 처리한다.
인덱스란 인덱스란 책의 목차처럼 추가적인 저장공간에 위치(주소) 정보를 저장하여 데이터베이스의 성능을 높히는 방법이다. 인덱스를 생성하면 데이터 정렬 후 별도의 메모리 공간에 데이터의 물리적인 주소 정보를 <키, 포인터> 형태로 저장한다. 해당 컬럼이 조회 조건에 포함되면 full-scan 전 인덱스를 먼저 탐색하기 때문에 검색속도를 향상시킬 수 있다.
3. [SERVER] REST API 사용 전과 후의 느낀점 REST란 웹에 존재하는 모든 자원에 고유한 URI를 부여하여 활용하는 방법론으로 이러한 특징을 기반으로 API를 제공하는 것이 REST API이다.
2022/01/27
1. [OS] 데드락(DeadLock)에 대해 설명하세요. 데드락(교착상태)은 두 작업이 서로 상대방의 수행이 끝나는 것을 기다리다 결과적으로 두 작업 모두 종료되지 못한채 무한히 대기하는 상태를 말한다. 교착상태가 발생하기 위해서는 4가지 조건이 충족되어야하며 예방하기 위해서는 네 조건 중 어느 하나라도 발생하지 못하게하며 된다.
상호배제 자원은 한번에 한 프로세스만 사용할 수 있다.
점유대기 최소 하나의 자원을 점유하고 있으면서 다른 프로세스가 사용중인 다른 자원을 점유하기 위해 대기한다.
비선점 사용중인 자원은 작업이 끝날 때까지 다른 프로세스에게 넘겨줄 수 없다.
환형대기 공유 자원과 공유 자원을 대기하는 프로세스들이 원형으로 구성되어있다.
2. [DATABASE] 인덱스(Index) 구현에 사용되는 대표적인 자료구조에 대해 설명하세요.
해시테이블 컬럼의 값으로 생성된 해시를 기반으로 (키, 값) 형태의 인덱스를 구현한다. 검색 시간 복잡도가 O(1)으로 매우 빠르나 부등호(<, >)와 같은 연속적인 데이터를 위한 순차 검색이 불가능하다.
B-Tree Balanced Tree의 일종이며 B-Tree는 하나의 노드가 가질 수 있는 자식 노드 개수가 2개 이상이다(하나의 노드에 여러 데이터 저장이 가능하다). 방대한 양의 자료를 검색하는 경우 자료를 일일이 비교하는 방식은 비효율적임으로 B-트리를 이용해 자료를 정렬된 상태로 보관하여 성능을 높힌다.
데이터가 정렬된 상태를 유지하기 때문에 등호(=)뿐 아니라 부등호(<, >) 연산이 가능하다.
데이터 탐색 뿐 아니라 저장, 수정, 삭제에도 O(logN) 시간복잡도를 지닌다.
포인터 접근 방식이 적어 데이터 양이 커도 속도 이슈가 적다.
B+Tree 모든 노드에 값을 저장한 B-Tree와 달리 리프 노드만 인덱스와 함께 값을 갖고 있고 나머지 노드는 키(인덱스)만 지닌다. 리프 노드들을 연결리스트로 연결하였다.
빈 스코프(Bean Scope) 빈(스프링에서 관리하는 자바 객체)이 존재할 수 있는 범위. 스프링은 기본적으로 싱글톤 타입의 스코프를 제공한다.
싱글톤(Singltetone) 기본 스코프로 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 싱글톤은 실제로 생성되는 객체는 하나이고 최초 생성 이후 호출된 생성자는 최초의 생성자가 생성한 객체만 반환하는 스코프 패턴이다. 스프링 컨테이너가 빈의 초기화부터 종료까지 관여하기 때문에 빈의 종료 메서드가 알아서 실행된다. 멀티스레드 환경에서 문제가 발생한다.
프로토타입(Prototype)
@Component @Scope("prototype")
빈의 생성과 의존관계 주입까지 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. 항상 같은 인스턴스를 반환하는 싱글톤과 달리 호출 시 항상 새로운 인스턴스를 생성해 반환한다. 스프링 컨테이너가 생성과 의존관계 주입까지만 관여하기 때문에 컨테이너가 종료되어도 @PreDestroy가 실행되지 않는다. 따라서 빈을 받은 클라이언트에서 빈의 사용 종료를 처리해주어야 한다.
웹 관련 스코프
Request 웹 요청이 들어오고 나갈 때까지 유지되는 스코프
Session 웹 세션이 생성, 종료될 때까지 유지되는 스코프
Application 웹 서블릿 컨텍스트와 같은 범위로 유지하는 스코프
싱글톤 빈과 프로토타입 빈
프로토타입 빈에서 싱글톤 타입 빈 참조 문제가 발생하지 않는다.
싱글톤 타입 빈에서 프로토타입 빈 참조 싱글톤 타입 빈을 사용할 때 처음 주입받은 프로토타입 빈이 갱신(변경)되지 않는다.
1. [DATABASE] 대표적인 RDBMS와 NoSQL에는 어떤 것들이 있고 두 데이터베이스 시스템 사이 차이점에 대해 설명하세요.
RDBMS 행과 열의 2차원 형태로 구성된 데이터를 다루는 데이터베이스 시스템이다. 정해진 스키마에 따라 데이터를 관리하기 때문에 데이터 정합성 유지와 관리가 편하지만 시스템이 커질수록 쿼리가 복잡해지고 성능이 저하되며 수평확장이 어렵다. 예로 MySQL, MS SQL, PostgreSQL 등이 있다.
NoSQL 정해진 스키마 없이 키: 값 형태로 데이터를 저장하는 시스템이다. 데이터베이스 모델 종류로는 Key-Value, Document, Column-Family, Graph 네가지로 나눌 수 있다. 유연한 데이터 관리와 새로운 필드 지정 등 수평 확장이 용이하다. 하지만 중복 데이터에 대한 관리가 필요하다. 정확한 데이터 구조를 알 수 없는 경우 사용하기 좋다. 예로 MongoDB, Redis, 카산드라(Cassandra), 파이어베이스의 파이어스토어와 실시간 데이터베이스 등이 있다.
2. [SERVER] Restful API에 대해 설명하세요.
REST란 웹에 존재하는 모든 자원에 고유한 URI를 부여하여 활용하는 방법론이다. Rest의 이러한 특징을 기반으로 Rest 아키텍처 규칙을 지켜 API를 제공하는 것이 Restful API이다. 누구나 이해하기 쉽고 사용하기 쉬운 Rest API 설계를 목적이다.
소문자를 사용한다.
밑줄(_) 대신 하이픈(-)을 사용한다. 가급적 하이픈 사용도 최소화한다.
슬래시(/)는 계층 관계를 나타낼 때 사용한다. URL의 마지막에 슬래시(/)를 포함하지 않는다.
URI는 정보의 자원을 표현해야한다. 리소스명은 동사가 아닌 명사를 사용한다.
자원의 행위는 URL 대신 HTTP 메서드에 포함시켜야 한다. URL는 자원을 표현하는데 중점을 두어야하기 때문에 정보의 자원을 표현해야하며 동사보다는 명사를 사용해야한다. 컨트롤 자원을 의미하는 경우 예외적으로 동사를 허용한다.
확장자를 사용하지 않는다.
3. [DATABASE] 이상현상이 무엇인가요.
이상현상이란 데이터 중복으로 인해 발생하는 데이터 불일치 현상이다. 데이터 중복 문제는 정규화를 통해 해결할 수 있다.
댓글 영역