[망나니 개발자 Mangky's Diary] 기술 면접 준비를 위한 문제 구독 서비스 https://mangkyu.tistory.com/200
1. [OS] 멀티 쓰레드 개발할 때 주의해야할 점은 무엇인가요.
2. [SERVER] 웹 서버와 WAS(웹 어플리케이션 서버)의 차이와 대표적인 예시를 설명하세요.
웹 서버의 경우 정적 콘텐츠에 대한 요청을 처리하고 동적 컨텐츠에 대한 요청은 WAS에게 전달한다. WAS는 동적 컨텐츠에 대한 요청을 처리한다.
서버 부하를 막고 WAS의 환경 설정 파일을 외부에 노출시키지 않도록 하기 위해 WAS와 웹 서버는 구별하여 사용한다. WAS는 데이터베이스 조회나 비즈니스 로직 수행에 집중하도록 한다. 또한 로드 밸런싱을 위해 웹 서버를 이용할 수 있으며 여러 웹 어플리케이션 서비스 연결이 가능하다.
즉 자원 이용의 효율성과 장애 극복, 분산 처리, 배포 및 유지보수의 편의성을 위해 분리하여 사용한다.
3. [SPRING] 싱글톤 클래스를 직접 구현해보세요.
싱글톤 패턴이란 실제로 생성되는 객체는 하나이고 이후 호출 시 최초 생성자가 생성한 객체를 반환하는 패턴이다.
메모리 낭비를 방지하고 싱글톤 인스턴스는 전역으로 사용되기 때문에 데이터간 공유가 쉽다는 장점이 있지만 멀티스레딩 환경에서 하나의 인스턴스에 여러 스레드가 접근할 경우 동시성 문제가 발생할 수 있다.
public class EagerSingleton {
private static EagerSingleton instance = new EagerSingleton();
private EagerSingleton(){}
public static EagerSingleton getInstance() {
return instance;
}
}
public class StaticBlockSingletone {
private static StaticBlockSingletone instance;
private Singleton() {}
static {
try {
instance = new StaticBlockSingletone();
} catch (Exception e) { // 예외 처리 가능
throw new RuntimeException("Exception occured in creating instance");
}
}
public static StaticBlockSingletone getInstance() {
return instance;
}
}
public class LazySingletone {
private static LazySingletone instance;
public static LazySingletone getInstance() {
if(instance == null) {
instance = new LazySingletone();
}
return instance;
}
}
public class SynchronizedSingleton {
private static SynchronizedSingleton instance;
private SynchronizedSingleton() {}
public static synchronized SynchronizedSingleton getInstance() {
if (instance == null) {
instance = new SynchronizedSingleton();
}
return instance;
}
}
publci class DoubleCheckedLockingSingleton {
private static DoubleCheckedLockingSingleton singleton;
private DoubleCheckedLockingSingleton() {}
public static DoubleCheckedLockingSingleton getInstance(){
if(singleton == null){
synchronized (Singleton.class) {
if(singleton == null) singleton = new DoubleCheckedLockingSingleton();
}
}
return singleton;
}
}
class InnerSingleton {
private InnerSingleton() {}
public static InnerSingleton getInstance(){
return SingletonHelper.instance;
}
private static class SingletonHelper {
private static final Singleton instance = new InnerSingleton();
}
}
public enum EnumSingleton {
instance;
}
1. [JAVA] Stream API에 대해 설명하세요.
자바는 객체 지향 언어이기 때문에 기본적으로 함수형 프로그래밍이 불가능하다. 하지만 Java8부터 Stream API와 람다식, 함수형 인터페이스 등을 지원하며 자바를 이용한 함수형 프로그래밍 기능을 제공하고 있다.
그 중 Stream API는 데이터를 추상화하고 처리하는데 자주 사용되는 함수들을 정의해두었다. 데이터를 추상화하는 것은 데이터의 종류에 상관 없이 같은 방식으로 데이터를 처리할 수 있는 것을 의미하며 재사용성을 높힐 수 있다.
Stream API 특징으로는 원본의 데이터를 변경하지 않고 일회용이라는 것과 내부 반복으로 작업을 처리한다는 점이 있다.
Stream API는 연산에 3 단계를 거친다.
(참고 - https://mangkyu.tistory.com/112)
2. 사전에서 검색을 제공하는 어플리케이션을 구현하고자할 때, 어떤 자료구조를 사용해 구현할 것인가요?
사전에서 검색하는 방법은 첫 번째로 모든 데이터를 순회하여 일치하는지 비교하는 단순 탐색 방법과 절반의 지점을 찾아 비교하고 범위를 좁혀나가는 이분 탐색 방법이 있다.
하지만 사전 검색의 두 방법 다 데이터가 정렬되어있어야 한다는 전제가 있다. 사전이 아닌 무작위 데이터에서 검색을 하고자할 때에는 다른 방법을 이용해야한다. 바로 자료구조 트라이(Trie) 이다.
3. 객체 지향 프로그래밍(OOP)에 대해 설명해주세요.
객체 지향 프로그래밍이란 프로그램을 여러 개의 독립된 단위인 객체들의 모임과 그 관계로 파악하고자하는 패러다임이다.
객체 지향 프로그래밍의 특징으로는 동적 바인딩, 캡슐화와 데이터 은닉, 다형성, 상속 등이 있다.
1. [JAVA] Java에서 제공하는 synchronized 키워드에 대해 설명하고 언제 적용해야 하는지 설명해주세요.
멀티 쓰레드 환경에서 스레드간 자원의 동기화 문제가 발생할 수 있다. 스레드가 공유하는 한 자원에 수정과 검색 작업이 함께 이뤄지며 값이 동기화되지 않은 채 서로 다른 값을 조회할 수도 있다.
synchronized는 이를 해결하기 위한 키워드로 여러 쓰레드가 하나의 자원에 접근하고자할 때 현재 사용하고 있는 쓰레드를 제외하고 다른 쓰레드는 사용하지 못하도록 락을 거는 역할을 한다. 인스턴스와 메서드 또한 블럭을 지정하여 사용 가능하며 너무 남발하면 오히려 성능 저하를 유발할 수 있다.
하나의 객체를 여러 스레드에서 사용해야할 때나 static으로 선언한 객체를 여러 스레드에서 사용하고자할 때 사용한다.
* 예제로 확인
2. [DATABASE] 인덱스(Index)에 대해 설명해주세요.
추가 저장공간을 이용하여 데이터 정렬 후 데이터의 위치를 저장한다. 이를 이용하여 책의 목차처럼 데이터베이스 조회 속도를 향상시킬 수 있다. 쿼리 실행 시 인덱스가 있다면 인덱스를 먼저 조회 후 물리적인 저장 위치로 이동하게 된다.
인덱스의 경우 데이터가 항상 정렬되어있기 때문에 조건에 맞는 데이터를 찾거나 최대, 최소 값을 찾는데 유리하다.
하지만 테이블의 값을 항상 정렬 상태로 유지해야하고 수정과 삭제에 인덱스도 함께 관리해주어야하기 때문에 인덱스를 잘못 관리할 시 성능이 더 저하될 수 있다. 또한 추가 저장공간이 필요하다.
인덱스는 == 비교나 조인 조건, order by 조건에 많이 쓰이는 컬럼이나 중복 데이터 분포가 적은 컬럼에 사용하는 것이 좋다.
3. [SPRING] JPA에서 Open Session In View에 대해 얘기해주세요.
[BACKEND] 매일매일 준비하는 백엔드 기술면접 2/10-2/11 (0) | 2022.03.05 |
---|---|
[BACKEND] 매일매일 준비하는 백엔드 기술면접 2/3-2/5 (0) | 2022.02.07 |
[BACKEND] 매일매일 준비하는 백엔드 기술면접 2/1-2/2 (0) | 2022.02.04 |
[BACKEND] 매일매일 준비하는 백엔드 기술면접 1/29-1/31 (0) | 2022.02.03 |
[BACKEND] 매일매일 준비하는 백엔드 기술면접 1/26-1/28 (0) | 2022.02.03 |
댓글 영역