Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Kim ByeungHyun

WIL 기술 면접 질문II 본문

공부/항해99

WIL 기술 면접 질문II

sandbackend 2023. 4. 9. 14:19

데일리 과제

4/3

  • 트랜잭션이 무엇인지 설명해 주세요.
    • 예를 들면, 은행 계좌 이체를 수행하는 경우, 이체가 완료되기 전까지는 계좌 잔액이 변하지 않아야 합니다. 이러한 일관성을 유지하기 위해, 이체 작업은 하나의 트랜잭션으로 처리됩니다. 만약 이체 작업 중 문제가 발생하면, 데이터베이스는 이전 상태로 롤백됩니다.원자성은 트랜잭션의 모든 작업이 완료되거나 모두 취소되어야 함을 의미합니다. 일관성은 트랜잭션이 완료된 후 데이터베이스가 일관된 상태를 유지해야 함을 의미합니다. 격리성은 여러 개의 트랜잭션이 동시에 수행될 때 각각의 트랜잭션이 서로 영향을 주지 않도록 보장해야 함을 의미합니다. 지속성은 트랜잭션이 완료된 후에도 데이터베이스가 계속 유지되어야 함을 의미합니다.
    • 트랜잭션은 데이터베이스에서 중요한 개념으로, 데이터의 정합성과 일관성을 보장하기 위해 사용됩니다.
    • 트랜잭션은 ACID 4가지 특성을 갖고있습니다. 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability) 입니다.
    • 트랜잭션은 데이터베이스 관리 시스템에서 하나의 논리적인 작업 단위를 의미합니다. 즉, 데이터베이스에서 일련의 작업들을 수행하고 그 결과를 유지하려면, 모든 작업이 완료되어야만 데이터의 일관성을 보장할 수 있습니다.
  • 웹 서버와 WAS의 차이는?
    • 웹 서버는 클라이언트로부터 HTTP 요청을 받아 정적인 웹 페이지나 파일 등을 제공하는 역할을 합니다. 또한 웹 서버는 클라이언트와 통신하기 위해 필요한 프로토콜(HTTP)을 지원하며, 보안적인 기능(SSL, TLS)도 제공합니다.웹서버와 WAS는 일반적으로 같이 사용됩니다. 웹서버는 정적인 파일 제공 및 보안 기능을 처리하고, WAS는 동적인 컨텐츠 생성을 위해 사용됩니다. 이러한 구성을 통해 성능 향상과 서버 부하 분산 등의 이점을 얻을 수 있습니다.
    • WAS는 동적인 컨텐츠를 처리하며, 웹 서버와 달리 비즈니스 로직을 수행합니다. 웹 서버에서 처리할 수 없는 데이터베이스 연동, 트랜잭션 처리, 세션 관리 등의 역할을 수행합니다.WAS는 JaveEE, NET 등 다양한 언어와 프레임워크를 지원하며, JavaEE를 기반으로 한 WAS는 서블릿 컨테이너와 EJB컨테이너등의 구성요소를 가지고 있습니다.
    • 웹 서버와 WAS(Web Application Server)의 기능과 역할

4/4

  • Stack과 Queue 그리고 Array와 Linked List 자료구조에 대해 말씀해주시고 차이점에 대해 설명해주세요.
    • Queue : 데이터를 줄지어 세워서 저장하며,가장 먼저 추가된 데이터가 가장 먼저 제거되는 선입선출(FIFO) 구조입니다. 즉, 가장 오래된 데이터가 가장 먼저 제거됩니다. 큐는 작업 대기열, 메시지 대기열 등에서 사용됩니다.LinkedList : 각 노드가 데이터와 다음 노드를 가리키는 포인터로 엱결된 자료구조입니다. 연결 리스트는 크기가 가변적이며, 데이터의 삽입, 삭제가 매우 빠르게 이루어질 수 있습니다. 그러나 연결리스트는 인덱스를 사용하여 데이터를 조회하는 것이 어렵고, 각 노드가 다음 노드를 가리키는 포인터를 저장해야 하므로 메모리 공간이 더 필요합니다.
    • 따라서, 스택과 큐는 데이터의 삽입과 제거에 특화되어 있으며, Array와 Linked List는 데이터의 저장과 조회에 특화되어 있습니다. 스택과 큐는 일반적으로 Linked List를 사용하여 구현할 수 있습니다.
    • Array : 고정된 크기의 메모리 공간에 데이터를 순서대로 저장하는 자료구조입니다. 배열은 인덱스를 사용하여 데이터를 빠르게 조회할 수 있습니다. 그러나 배열은 크기가 고정되어 있으므로, 추가적인 메모리 할당이 필요하거나 크기가 커지는 경우 비용이 높아질 수 있습니다.
    • Stack : 데이터를 쌓아 올리듯이 쌓아서 저장하며, 가장 나중에 추가된 데이터가 가장 먼저 제거되는 후입선출(LIFO) 구조입니다. 즉, 가장 최근에 추가된 데이터가 가장 먼저 제거됩니다. 스택은 함수 호출, 괄호 검사, 브라우저 뒤로가기 등에서 사용됩니다.
  • 절차지향 / 객체지향 / 함수형 프로그래밍이란 무엇이고 차이점은 무엇인가?
    • 프로그래밍 패러다임(Programming Paradigm)으로, 프로그래밍을 구성하는 기본 철학과 같은 방법을 말합니다.
    • 절차지향 프로그래밍 (Procedural Programming) :
      • 순차적으로 실행되는 명령어들의 모음으로 구성된 프로그램을 작성하는 방법
      • 프로그램을 일련의 프로시저로 나누어, 데이터와 프로시저를 분히라여 코드의 유지보수 및 재 사용성을 높이는 것을 목적으로 함
      • 대표적인 예로 C언어가 있음
      객체지향 프로그래밍 (Object-Oriented Programming) :
      • 프로그램을 객체(Object)의 집합으로 구성하는 방법
      • 객체는 데이터와 메서드(함수)를 포함하며, 객체간의 상호작용을 통해 프로그램을 작성함
      • 코드의 재사용성과 유지보수성을 높이는 것을 목적으로 함
      • 대표적인 예로 Java, Phthon, C++ 등이 있음
      함수형 프로그래밍 (Funtional Programming) :
      • 함수(Funtion)의 조합으로 작성된 프로그램을 작성하는 방법
      • 상태 변경이나 가변 데이터보다는 불변 데이터와 순수함수(Pure Funtion)를 이용해 프로그램을 작성함
      • 코드의 가독성, 재사용성, 유지보수성을 높이는 것을 목적으로 함
      • 대표적인 예로 Haskell, Scala, F# 등이 있음
      → 자바에서의 함수형 프로그래밍을 살표보자
    • Java에서 함수형 프로그래밍은 Java8에서 추가된 Lambda 표현식과 스트림 API를 이용하여 구현합니다.
    • Lambda 표현식은 이름이 없는 함수를 만들기 위한 방법으로, 함수형 인터페이스를 구현하는 객체를 생성하는 방법으로 사용됩니다. 예를 들어, 다음과 같이 람다표현식을 사용하여 두개의 숫자를 더하는 함수를 만들 수 있습니다.
    • (int a, int b) -> a + b
    • 스트림 API는 컬렉션 요소를 처리하는 함수형 방법을 제공합니다. 예를 들어, 다음과 같이 스트림 API를 사용하여 문자열 리스트에서 길이가 5이상은 문자열만을 필터링 할 수 있습니다.
    • List<String> list = Arrays.asList("apple", "banana", "grape", "orange"); List<String> filteredList = list.stream() .filter(str -> str.length() >= 5) .collect(Collectors.toList());
    • Java8 이후로는 람다 표현식과 스트림 API 외에도 Optional, 함수형 인터페이스, 메소드 참조 등의 기능이 추가되어 Java에서 함수형 프로그래밍이 적극적으로 지원됩니다.

4/5

  • 알고리즘에서 '시간복잡도'와 '공간복잡도'란 무엇인가? 그리고 이것들은 왜 중요한가?
    • 시간복잡도는 알고리즘을 실행하는 데 필요한 시간을 나타내는 것입니다. 즉, 입력 크기에 따라 알고리즘이 실행되는 데 걸리는 시간이 얼마나 증가하는지를 나타냅니다. 보통 시간복잡도는 입력 크기에 n에 대한 함수로 나타내며, 대개 최악의 경우를 나타내는 ‘최악 시간복잡도’를 사용합니다.

    • 시간복잡도와 공간복잡도는 알고리즘의 성능을 평가하는 데 중요합니다. 시간복잡도가 높을수록 알고리즘이 실행되는 데 걸리는 시간이 더많이 소요됩니다. 따라서 시간복잡도가 낮은 알고리즘은 더욱 효율적이며, 대량의 데이터를 처리해야 할 때 유용합니다. 또한 공간 복잡도가 낮은 알고리즘은 메모리 사용량이 적어지므로, 메모리 사용이 제한된 환경에서 실행될 때 유용합니다.
    • 대개 Big-O 표기법을 사용하여 나타냅니다. Big-O표기법은 입력크기 n에대한 함수 f(n)이 있을 때, O(f(n))으로 표기합니다.
    • 공간복잡도는 알고리즘이 실행하는 데 필요한 메모리 공간의 크기를 나타내는 것입니다. 즉, 알고리즘이 실행되는 동안 사용되는 메모리 공간의 양을 나타냅니다. 보통 공간복잡도는 입력 크기 n에 대한 함수로 나타내며, 대개 최악을 나타내는 ‘최악 공간복잡도’를 사용합니다.
    • 알고리즘의 성능을 평가하기 위해서는 ‘시간복잡도’와 ‘공간복잡도’를 고려해야합니다.

  • 오버로딩과 오버라이딩의 차이점
    • 오러라이딩은 상속관계에서 부모클래스에서 정의된 메소들르 자식클래스에서 같은 이름으로 다시 정의하는 것을 말합니다. 자식 클래스에서 오버라이딩한 메소든느 부모 클래스의 메소드 대신 사용됩니다. 이렇게 하면 자식 클래스에서 부모 클래스의 기능을 수정하거나 확장할 수 있습니다.
    • 오버로딩은 같은 이름의 메소드를 매개변수의 개수나 자료형이 다른 여러개의 메소드로 정의하는 것을 말합니다. 이렇게 하면 같은 이름으로 다양한 상황에서 메소드를 사용할 수 있습니다.
    • 예를 들어, print() 메소드는 매개변수의 자료형에 따라 문자열, 정수, 실수등 다양한 형태로 오버로딩 되어있습니다.예를들어, Animal 클래스에서 speak() 메소드가 정의되어 있고, Cat 클래스가 Animal 클래스를 상속한다고 가정해봅시다. 이때 Cat 클래스에서 speak() 메소드를 오버라이딩하면, Cat 객체가 speak()를 호출할 때 Animal 클래스의 speak()가 아닌 Cat 클래스에서 동물이 울부짖는 소리를 수정하거나 새로운 기능을 추가 할 수 있습니다.

4/6

  • RDB와 NoSQL은 무엇인가요? 차이점 또는 장단점 위주로 설명해주세요.
    • RDB (Realation DataBase)와 NoSQL (Not only SQL)은 모두 데이터를 저장하고 관리하는 시스템입니다.
    • RDB는 전통적인 관계형 데이터베이스 시스템으로, 데이터를 표 형식으로 저장하고 관리합니다. RDB는 SQL을 사용하여 데이터에 대한 질의를 수정하고, ACID 특성을 갖추어 데이터의 일관성과 안정성을 보장합니다. RDB의 대표적인 예시로는 Oracle, MySQL, PostgreSQL 등이 있습니다.
    • NoSQL은 RDB와 다른 형태의 데이터베이스 시스템으로, 비관계형 데이터 모델을 사용합니다. NoSQL은 분산 시스템에서 대용량 데이터를 처리하고, 빠른 응답 속도와 확장성을 보장합니다. 또한 NoSQL은 ACID성 대신 CAP (Consistency, Availability, Partition, tolerance) 이론에 기반한 특성을 갖추어, 데이터 일관성과 가용성, 분산 환경에서의 견고성을 보장합니다. NoSQL의 대표적인 MongoDB, Cassndra, Redis 등이 있습니다.
    • RDB와 NoSQL의 가장 큰 차이점은 데이터 모델의 차이입니다. RDB는 정형화된 데이터를 저장하는 데에 적합하며, NoSQL은 비정형화된 데이터를 저장하는데 적합합니다. 또한, RDB는 SQL을 사용하여 데이터를 조작하고, NoSQL은 일반적으로 JavaScript Object Notation(JSON)과 같은 문서 형식으로 데이터를 다룹니다.
    • RDB의 장점으로는 일관성과 안정성이 보장되며, ACID 특성에 따라 데이터의 무결성이 유지됩니다. 또한 SQL을 사용하여 복잡한 질의를 수행할 수 있습니다. 반면, RDB는 대규모 데이터 처리에는 적합하지 않으며, 수직적 확장만 가능합니다.
    • NoSQL의 장점으로는 대용량 데이터 처리와 분산 시스템에서의 확장성이 높으며, 데이터 모델이 유연하게 변경될 수 있다는 점이 있습니다. 또한 NoSQL은 비정형화된 데이터 처리에 적합하며, JSON과 같은 문서 형식으로 데이터를 저장하고 관리할 수 있습니다. 반면, NoSQL은 ACID 특성이 부족하여 데이터 일관성 보장이 어려울 수 있습니다. 또한 NoSQL은 질의 언어가 SQL이 아니기 때문에, 복잡한 질의에 대한 처리가 어려울 수 있습니다.
  • 병렬 프로그래밍에 대해 설명해주세요.
    • 병렬 프로그래밍은 하나의 컴퓨터에서 동시에 여러 개의 작업을 수행하는 프로그래밍 기법입니다. 이를 통해 작업의 처리 시간을 줄이거나 시스템의 처리 능력을 일 수 있습니다.
    • 기존의 순차적인 프로그래밍에서는 한 번에 한 가지 작업만 수행할 수 있습니다. 그러나 병렬 프로그래밍에서는 여러 개의 작업을 동시에 수행하므로, 처리 속도는 향상됩니다.
    • 이를 통해 여러 개의 프로세서 또는 코어가 있는 컴퓨터를 사용하거나, 네트워크 상의 여러 대의 컴퓨터를 연결하여 작업을 분산 처리하는 방식을 사용할 수 있습니다. 이를 통해 대용량 데이터의 처리나 복잡한 계산 등을 더 빠르고 효율적으로 수행할 수 있습니다.
    • 하지만 병렬 프로그래밍은 순차적인 프로그래밍보다 구현이 어렵고, 병렬화를 잘못 구현하면 성능이 떨어지거나 버그가 발생할 수 있습니다. 따라서 병렬 프로그래밍을 구현할 때는 동기화, 교착 상태, 경쟁 조건 등을 고려하여 구현해야 합니다.

4/7

  • VO와 DTO, BO, DAO란?
    • Value Object (VO)는 값을 갖는 객체로, 도메인 객체의 일부로 사용됩니다. 예를들어, 주문 객체에서는 주문 번호, 주문 일자, 주문 상태 등의 정보를 담고 있는 VO를 사용할 수 있습니다.
    • Data Teansfer Object (DTO)는 데이터 전송을 위한 객체입니다. 예를 들어, 클라이언트와 서버 사이에서 데이터를 주고 받을 때 DTO를 사용하여 데이터를 전송합니다. DTO는 주로 데이터베이스의 테이블과 1:1로 매핑됩니다.
    • Business Object (BO)는 비즈니스 로직을 담고 있는 객체입니다. 서비스 계층에서 사용되며, 데이터베이스나 클라이언트로부터 받은 데이터를 처리하여 결과를 반환합니다.
    • Data Access Object (DAO)는 데이터베이스와의 상호작용을 담당하는 객체입니다. DAO는 데이터베이스에 대한 CRUD (Create, Read, Update, Delete)작업을 수행하며, 비즈니스 로직에서 데이터를 조작하기 위해 사용됩니다.
    이러한 객체들은 소프트웨어 개발에서 일반적으로 사용되며, 각각의 역할과 책임이 분명히 정의되어 있습니다. 이를 잘 활용하면 개발자들은 더욱 효율적이고 구조적인 코드를 작성할 수 있습니다.
  • CORS 란?
    • CORS는 Cross-Origin Resource Sharing의 약자로, 웹브라우저의 보안 정책입니다.
    • 웹브라우저에서는 보안상의 이유로 스크립트에서 다른 도메인으로의 HTTP 요청이 제한됩니다. 즉, 동일한 출처의 리소스만 접근이 가능하며, 다른 출처의 리소스에 대해서는 접근이 차단됩니다. 하지만, 웹 애플리케이션 개발 시 다른 출처의 리소스에 접근해야 하는 경우가 있습니다. 이때, CORS를 사용하여 다른 출처의 리소스에 대한 요청을 허용할 수 있습니다.
    • CORS는 서버 측에서 응답 헤더를 추가하여 클라이언트가 보내는 요청의 출처를 검사하고, 허용된 출처로 부터의 요청에 대해서만 응답을 허용합니다. 이를 통해, 보안상의 문제를 해결하면서도 웹 애플리케이션 개발에 필요한 다른 출처의 리소스에 대한 요청을 허용 할 수 있습니다. 
      • Spring Boot CORS 설정
        @Configuration
        public class CorsConfig implements WebMvcConfigurer {
        	@Override
        	public void addCorsMappings(CorsRegistry registry) {
        		registry.addMapping("/**")
                        .allowedOrigins("*")
                        .allowedMethods("GET", "POST", "PUT", "DELETE")
                        .allowedHeaders("*");
        	}
        }
        인터페이스 CorsConfig를 구현하는 클래스를 정의해 보았습니다.addMapping 메서드는 CORS 구성이 적용될 경로 매핑을 정의합니다. 위 예에서는 “**” 구성을 모든 경로에 적용하는 데 사용합니다.allowedMethods 메서드는 요청에 대해 허용되는 HTTP 메서드를 지정합니다. 위 예에서는 GET, POST, PUT, DELETE를 허용합니다.이 구성을 사용하면 허용된 HTTP 메서드 및 헤더를 사용하는 한 모든 출처에서 Spring Boot 애플리케이션에 대한 모든 요청이 허용됩니다.
        @RestController
        public class MyController {
        	@CrossOrigin(origins = "<http://localhost:8080>")
        	@GetMapping("/my-endpoint")
        	public String getMyEndpoint() {
        		// ...
        	}
        }
        
        메서드에 대한 오리진 @CrossOrigin의 요청을 허용합니다. 주석의 다른 특성을 사용하여 특정 끝점에 대한 CORS 구성을 추가로 사용자 지정할 수도 있습니다.
      • @CrossOrigin 컨트롤러 또는 메서드 수준에서 주석을 사용하여 특정 끝점에 대해 CORS를 활성화 할 수도 있습니다.
      • allowedHeaders 메서드는 요청에 대해 허용되는 헤더를 지정합니다. 위 예에서는 “*” 모든 헤더를 허용합니다.
      • allowedOrigins 메서드는 요청에 대해 허용되는 츨처를 지정합니다. 위 예에서는 “*” 모든 오리진을 허용합니다.
      • WebMvcConfigurer.addCorsMappings CORS 설정을 구성하는 방법을 재정의 합니다.
      • Spring Boot 애플리케이션에서 CORS를 활성화 하려면 컨트롤러 또는 메서드 수준에서 주석을 사용하거나 WebMvcConfigurer 빈을 사용하여 전역적으로 구성할 수 있습니다.