부트캠프에서 힘든점이 있었다면 극복한 경험을 설명해 주세요.
@SpringBootTest와 @WebMvcTest의 차이점을 설명해주세요.
@SpringBootTest는 프로젝트의 전체 컨텍스트를 로드하여 빈을 주입하기 때문에 속도가 느리고, 통합 테스트를 할 때 많이 사용합니다.
반면, @WebMvcTest는 MVC 부분 슬라이스 테스트로, 보통 컨트롤러 하나만 테스트하고 싶을 때 사용합니다. @WebmvcTest()의 프로퍼티로 테스트를 원하는 컨트롤러 클래스를 넣어줍니다.
@SpringBootTest는 수많은 스프링 빈을 등록하여 테스트에 필요한 의존성을 추가하기 때문에, 필요한 빈만을 등록하여 테스트를 진행하고자 한다면 슬라이드 테스트 어노테이션인 @WebMvcTest를 사용하는것이 더 효율적입니다
데드락(Deadlock)이란 무엇이고, 어떻게 방지할 수 있나요?
데드락(교착 상태)란 프로세스나 스레드가 결코 일어날 수 없는 특정 이벤트를 기다리는 상태입니다.
교착 상태가 일어날려면 네 가지 필요조건이 있습니다.
첫번째로 여러 프로세스가 동시에 한 자원에 접근하지 못하게 막는 상호 배재 조건입니다.
이런 프로세스가 적용되었기 때문에 한번에 한 프로세스에서 밖에 자원을 가지지 못합니다.
두 번째로 한프로세스가 자원을 점유한 상태로 다른 프로세스의 자원을 점유하기 위해 대기할 수 있는 점유와 대기 조건이 있습니다.
세번째로는 프로세스에서 일단 할당을 받으면 할당을 완료받을 때 까지 시스템에서 프로세스의 제어를 뺏을 수 없게 되는 비선점 조건이 있습니다.
마지막으로 점유화 되기로 한 형태로 순환 사이클에 같혀 빠져 나갈 수 없는 형태가 되는 순환 대기 조건이 있습니다.
이 네 가지 상태를 모두 만족시킬 경우 데드락이 발생하고 이중 하나라도 이루어지지 않게 한다면 데드락은 발생하지 않습니다.
대표적으로 교착 상태 탐지를 하여 순환 대기 존재 여부에 초점을 맞춰 방지하는 방법이 있습니다.
탐지 알고리즘을 통해 교착 상태 존재 여부 및 교착 상태에 연관된 프로세스의 자원을 알아내는 방법입니다.
예상 꼬리 질문
- 자원 할당 그래프가 무엇인지 설명해주실 수 있으신가요?
- 교착 상태가 발생했을 때 왜 일어난것인지 조건을 파악할 수 있는 그래프 입니다.
어떤 프로세스가 어떤 자원을 할당 받아 사용 중인지 확인이 가능하고
어떤 프로세스가 어떤 자원을 기다리고 있는지 확인이 가능합니다.
JVM의 스택과 힙메모리 영역에 아는 만큼 설명해주세요.
JVM이란?
옛날에 c/c++는 컴파일 플랫폼과 타겟 플랫폼이 다를 경우, 프로그램이 동작하지 않는 문제가 있었습니다. 즉 쉽게 말해 옛날에는 리눅스에서 작성한 코드는 윈도우나 ios에서는 돌아가지 않았었습니다.
C나 C++은 이를 해결하기 위해 타켓 플랫폼에 맞춰컴파일을 하는 크로스 컴파일이 등장했습니다.
하지만 JAVA에서는 이를 더 근본적으로 해결하기 위해 JVM을 사용했습니다.
JVM은 자바 바이트코드는 타켓 플랫폼에 상관 없이 JVM 위에서 동작하게 합니다.
이렇게JVM 위에서 동작하는 바이트코드는 플랫폼에 상관없이 전부 컴파일됩니다.
Stack 영역은 원시타입인 데이터가 값과 저장되고
Heap 영역에 생성된 Object 타입의 데이터의 참조값이 저장됩니다.
여기서 원시타입과 Object타입의 차이점은 원시 타입의 데이터 값은 참조값이 아닌 실제 값을 저장합니다.
그리고 함수가 호출될 때 사용하는 메모리이고, 기능 수행이 끝나면 자동으로 반환되는 메모리입니다.
Heap 영역은 Object 타입의 데이터가 저장됩니다.
애플리케이션의 모든 메모리 중 stack 영역을 제외한 부분입니다.
힙같은 영역은 자동으로 관리되지 않고 Cpu가 염격하게 관리하지 않는 메모리 영역입니다.
따라서 메모리 누수가 발생할 수 있는데 이를 가비지 컬랙션을 이용해서 해결합니다.
클래스와 인스턴스의 차이에 대해 설명해주세요.
클래스는 객체를 만들기 위한 설계도이며 인스턴스는 그런 클래스, 즉 설계도에 의해 만들어진 제품에 해당됩니다.
클래스는 변수와 함수들을 포함하는 특정 기능들의 집합이고, 해당 클래스로 인해 선언된 것을 객체라고 하고, 객체가 메모리에 떠 있는 것을 인스턴스라고 합니다.
즉시로딩과 지연로딩은 각각 언제 사용하면 좋은지 설명해주실 수 있으실까요?
이분탐색이 무엇이고 시간 복잡도는 어떻게 되며 그 이유는 무엇인가요?
이분 탐색이란 n개의 수가 크기 순서대로 배열되어 있을 때
특정한 수 k가 몇 번째 위치에 있는지 빠르게 찾는 방법입니다.
예를들어 이상이하 게임을 생각하면 좋습니다. 모든값을 중앙값보다 큰곳에 있는지 작을곳에 있는지를 묻고 이를 반복하여 특정 k값을 찾아냅니다.
한 번에 배열이 절반씩 줄어들기 때문에, 시간 복잡도는 O(log(2)N)입니다.
N이 100만일 때, log(2)N은 약 20이므로 20개 정도의 수만 보면 충분합니다.
N+1 문제의 발생 이유와 해결 방법에 대해 설명해주실 수 있을까요? 해결 방법은 3가지 이상 말씀해주시면 좋습니다.
JPA에서의 N+1 문제란 요청이 1개의 쿼리로 처리되길 기대했는데 N개의 추가 쿼리가 발생하는 형상을 망합니다.
제가 프로젝트에서 N+1 문제가 발생했던 경험을 말씀드리자면
일대다(@OneToMany) 관계에서 지연(Lazy) 로딩일 때N+1 문제가 발생했었습니다.
특정 사용자의 게시글을 조회할 때 lazy로 설정되어 있어 그냥 조회만 할 때에는 프록시 객체로 설정되어 있어 1번의 쿼리만 발생했었습니다.
하지만 사용자당 몇개의 게시글을 작성했는지 확인하는 반복문을 도는 도중 프록시 객체라 1차 캐시에서 해당 사용자의 게시글 데이터가 없어서 해당 사용자의 게시글 목록을 조회하는 쿼리가 추가적으로 발생한 적이 있었습니다.
첫 번째 해결 방법으로는 Fetch Join이 있습니다.
fetch Join은 연관된 엔티티나 컬렉션을 한 번에 같이 조회하는 기능입니다.
이를 사용하게되면 프록시 객체가 아닌 진짜 객체를 가져오게 되므로 DB를 거치지 않고 데이터를 꺼내서 반환해서 해결했던 기억이있습니다.
두 번째 해결 방법으로는 EntityGraph 어노테이션을 사용해서 fetch 조인을 하는 것 입니다.
마지막으로는 Batch Size로 N+1문제가 발생하더라고 100번 일어날 N+1 문제를 한번만 더 조회하는 방식으로 성능을 최적화하는 방식입니다.
'🥸 CS 면접 스터디' 카테고리의 다른 글
웹 애플리케이션이란 무엇일까? (0) | 2023.04.24 |
---|---|
UNIX란? (0) | 2023.04.24 |
CS 면접 스터디 정리 3회차 (0) | 2023.03.10 |
CS 면접 스터디 2회차 (1) | 2023.03.10 |
CS 면접 스터디 정리 1회차 (0) | 2023.03.10 |