상세 컨텐츠

본문 제목

[BACKEND] 매일매일 준비하는 백엔드 기술면접 2/6-2/8

취준/1. 기술면접

by ranlan 2022. 2. 7. 11:26

본문

728x90

[망나니 개발자 Mangky's Diary] 기술 면접 준비를 위한 문제 구독 서비스 https://mangkyu.tistory.com/200

 

[기술면접] CS 기술 면접 준비를 위한 문제 구독 서비스(신청하세요!)

1. 기술 면접 준비를 위한 문제 구독 서비스(신청하세요!) [ 서비스 소개 ] 개발자가 되기 위해 또는 새로운 회사로 이직하기 위해 기술 면접 준비는 필수입니다. 많은 분들이 기술 면접을 준

mangkyu.tistory.com

 

 

2022/02/06

1. [OS] 멀티 쓰레드 개발할 때 주의해야할 점은 무엇인가요.

 

 

 

 

2. [SERVER] 웹 서버와 WAS(웹 어플리케이션 서버)의 차이와 대표적인 예시를 설명하세요.

웹 서버의 경우 정적 콘텐츠에 대한 요청을 처리하고 동적 컨텐츠에 대한 요청은 WAS에게 전달한다. WAS는 동적 컨텐츠에 대한 요청을 처리한다.

  • 웹서버(Web Server)
    HTTP 프로토콜을 통해 요청을 받아들이고 HTML과 같은 정적 웹 페이지를 반환한다. 
    아파치, 엔진엑스(NGINX), IIS 등이 있다.
  • WAS(Web Application Server)
    DB 서버와 함께 데이터베이스 조회나 다양한 서비스 로직 처리를 하여 동적 컨텐츠를 제공한다.
    톰캣과 JBoss, IBM 웹 스피어 등이 있다.

    * 아파치는 웹 서버이고 톰캣이 WAS이나 2008년 톰캣5.5부터 정적 컨텐츠를 처리하는 기능이 포함되어있다. 

서버 부하를 막고 WAS의 환경 설정 파일을 외부에 노출시키지 않도록 하기 위해 WAS와 웹 서버는 구별하여 사용한다. WAS는 데이터베이스 조회나 비즈니스 로직 수행에 집중하도록 한다. 또한 로드 밸런싱을 위해 웹 서버를 이용할 수 있으며 여러 웹 어플리케이션 서비스 연결이 가능하다.

즉 자원 이용의 효율성과 장애 극복, 분산 처리, 배포 및 유지보수의 편의성을 위해 분리하여 사용한다.

 

3. [SPRING] 싱글톤 클래스를 직접 구현해보세요.

싱글톤 패턴이란 실제로 생성되는 객체는 하나이고 이후 호출 시 최초 생성자가 생성한 객체를 반환하는 패턴이다.

메모리 낭비를 방지하고 싱글톤 인스턴스는 전역으로 사용되기 때문에 데이터간 공유가 쉽다는 장점이 있지만 멀티스레딩 환경에서 하나의 인스턴스에 여러 스레드가 접근할 경우 동시성 문제가 발생할 수 있다.

  • Eager Initialization
    static을 통해 클래스가 로딩될 때 객체를 생성한다.

    * 동기화는 보장되나 객체를 사용하지 않더라도 무조건 생성되기 때문에 자원 낭비로 이어질 수 있고 예외에 대한 처리를 하지 않는다는 단점이 있다.
    public class EagerSingleton {
        private static EagerSingleton instance = new EagerSingleton();
    
        private EagerSingleton(){}
    
        public static EagerSingleton getInstance() {
            return instance;
        }
    }

  • statick block(초기화 블록, 클래스가 처음 로딩될 때 한 번만 수행되는 블록)
    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;
        }
    }
  • Lazy Initialization
    static으로 선언된 getInstance() 메서드를 통해 객체를 생성해준다.

    여러 곳에서 getInstance()를 호출하면 여러 객체가 생성될 수 있기 때문에 멀티 스레드 환경에서는 동기화 문제가 발생한다.
    public class LazySingletone {
        private static LazySingletone instance;
        
        public static LazySingletone getInstance() {
            if(instance == null) {
                instance = new LazySingletone();
            }
            return instance;
        }
    }
  • 간단한 synchronized 적용
    동기화 문제를 해결하기 위한 방법으로 getInstance()에 synchronized 키워드를 적용한다. 싱글톤 인스턴스를 가져올 때마다 락을 건다.

    * 빈번한 synchronized 호출로 많은 비용이 발생하고 이는 성능 저하로 이어진다.
    public class SynchronizedSingleton {
    	private static SynchronizedSingleton instance; 
    	
    	private SynchronizedSingleton() {} 
    	
    	public static synchronized SynchronizedSingleton getInstance() {
    		if (instance == null) {
                instance = new SynchronizedSingleton();
            }
    		return instance;
    	}
    }
  • Double Checked Locking
    synchronized를 붙이지 않지만 메서드 내부에서 synchronized를 사용한다.
    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;
    	}
    }
  • Bill Push Singletone Implementation(Lazy Holder)
    Innser Static Helper Class를 사용한다. SingletoneHelper 클래스는 Inner Class로 선언되었기 때문에 싱글톤 클래스 자체의 클래스 로더에 의해 로딩되지 않다가 getInstance()가 호출될 때 JVM에 로드되고 객체를 생성하게 된다.
    클래스 로드 시 객체가 생성되고 JVM이 알아서 하나의 객체만 로드하기 때문에 에 멀티 스레드 환경에서도 안전하게 사용이 가능하다.
    class InnerSingleton {
    
        private InnerSingleton() {} 
    	
        public static InnerSingleton getInstance(){
            return SingletonHelper.instance;
        }
        
        private static class SingletonHelper {
            private static final Singleton instance = new InnerSingleton();
        }
    }
  • Enum 타입을 이용해 싱글톤 패턴을 구현한다.
    public enum EnumSingleton {
        instance;
    }

 

 

2022/02/07

1. [JAVA] Stream API에 대해 설명하세요.

자바는 객체 지향 언어이기 때문에 기본적으로 함수형 프로그래밍이 불가능하다. 하지만 Java8부터 Stream API와 람다식, 함수형 인터페이스 등을 지원하며 자바를 이용한 함수형 프로그래밍 기능을 제공하고 있다.

그 중 Stream API는 데이터를 추상화하고 처리하는데 자주 사용되는 함수들을 정의해두었다. 데이터를 추상화하는 것은 데이터의 종류에 상관 없이 같은 방식으로 데이터를 처리할 수 있는 것을 의미하며 재사용성을 높힐 수 있다.

 

Stream API 특징으로는 원본의 데이터를 변경하지 않고 일회용이라는 것과 내부 반복으로 작업을 처리한다는 점이 있다.

  • 원본의 데이터를 변경하지 않는다.
    원본의 데이터를 조회하여 별도의 요소들로 스트림을 생성한다. 원본 데이터는 읽기만 할 뿐 정렬이나 필터링 작업은 별도의 스트림에서 처리된다.
  • 일회용이다.
    한번 사용이 끝나면 재사용이 불가능하다. 또 필요한 경우 다시 생성해주어야한다(다시 사용하면 IllegalStateException 발생).
  • 내부 반복으로 작업을 처리한다.
    기존에는 반복문으로 구현하였지만 스트림은 메서드 내부에 반복 작업을 숨기고 있다.

Stream API는 연산에 3 단계를 거친다.

  • 스트림 객체를 생성한다.
  • 원본 데이터가 아닌 별도의 스트림 객체에 필요한 로직을 처리하여 가공한다. 중간 연산의 반환값 또한 스트림이다.
  • 가공된 데이터로부터 원하는 결과를 만들어낸다. 스트림의 요소들을 소모하며 수행되기 때문에 1번만 처리 가능하다.

(참고 - https://mangkyu.tistory.com/112)

 

2. 사전에서 검색을 제공하는 어플리케이션을 구현하고자할 때, 어떤 자료구조를 사용해 구현할 것인가요?

사전에서 검색하는 방법은 첫 번째로 모든 데이터를 순회하여 일치하는지 비교하는 단순 탐색 방법과 절반의 지점을 찾아 비교하고 범위를 좁혀나가는 이분 탐색 방법이 있다.

 

하지만 사전 검색의 두 방법 다 데이터가 정렬되어있어야 한다는 전제가 있다. 사전이 아닌 무작위 데이터에서 검색을 하고자할 때에는 다른 방법을 이용해야한다. 바로 자료구조 트라이(Trie) 이다.

 

 

3. 객체 지향 프로그래밍(OOP)에 대해 설명해주세요.

객체 지향 프로그래밍이란 프로그램을 여러 개의 독립된 단위인 객체들의 모임과 그 관계로 파악하고자하는 패러다임이다.

객체 지향 프로그래밍의 특징으로는 동적 바인딩, 캡슐화와 데이터 은닉, 다형성, 상속 등이 있다.

  • 동적 바인딩
    컴파일 시점이 아닌 실행 시점에서 바인딩(프로그램내 각종 요소에 실제 값이 부여됨)되는 것을 의미한다.
  • 캡슐화와 데이터 은닉
    데이터와 데이터를 처리하는 함수를 묶어 캡슐화하여 외부에서는 내부에 접근하지 못하도록 하고 허용된 메서드를 통해서만 접근할 수 있다.
  • 다형성
    여러 객체에 동일한 명령을 내렸을 때 다르게 반응하는 것을 말한다.
  • 상속
    부모 클래스를 자식 클래스가 이어받아 그대로 사용할 수 있으며 기능의 일부분을 변경해야할 경우 수정하여 사용할 수 있다.

 

 

2022/02/08

1. [JAVA] Java에서 제공하는 synchronized 키워드에 대해 설명하고 언제 적용해야 하는지 설명해주세요.

멀티 쓰레드 환경에서 스레드간 자원의 동기화 문제가 발생할 수 있다. 스레드가 공유하는 한 자원에 수정과 검색 작업이 함께 이뤄지며 값이 동기화되지 않은 채 서로 다른 값을 조회할 수도 있다. 

synchronized는 이를 해결하기 위한 키워드로 여러 쓰레드가 하나의 자원에 접근하고자할 때 현재 사용하고 있는 쓰레드를 제외하고 다른 쓰레드는 사용하지 못하도록 락을 거는 역할을 한다. 인스턴스와 메서드 또한 블럭을 지정하여 사용 가능하며 너무 남발하면 오히려 성능 저하를 유발할 수 있다.

하나의 객체를 여러 스레드에서 사용해야할 때나 static으로 선언한 객체를 여러 스레드에서 사용하고자할 때 사용한다.

 

* 예제로 확인

 

2. [DATABASE] 인덱스(Index)에 대해 설명해주세요.

추가 저장공간을 이용하여 데이터 정렬 후 데이터의 위치를 저장한다. 이를 이용하여 책의 목차처럼 데이터베이스 조회 속도를 향상시킬 수 있다. 쿼리 실행 시 인덱스가 있다면 인덱스를 먼저 조회 후 물리적인 저장 위치로 이동하게 된다.

인덱스의 경우 데이터가 항상 정렬되어있기 때문에 조건에 맞는 데이터를 찾거나 최대, 최소 값을 찾는데 유리하다.

하지만 테이블의 값을 항상 정렬 상태로 유지해야하고 수정과 삭제에 인덱스도 함께 관리해주어야하기 때문에 인덱스를 잘못 관리할 시 성능이 더 저하될 수 있다. 또한 추가 저장공간이 필요하다.

인덱스는 == 비교나 조인 조건, order by 조건에 많이 쓰이는 컬럼이나 중복 데이터 분포가 적은 컬럼에 사용하는 것이 좋다.

 

3. [SPRING] JPA에서 Open Session In View에 대해 얘기해주세요.

 

 

 

 

728x90

관련글 더보기

댓글 영역