AOP가 무엇인가요?
먼저 oop를 간단하게나마 설명드리자면 oop는 클래스입니다.
코드에는 변수나 함수 등이 작성되는데 이것을은 클래스라는 묶음 안에 들어가게 됩니다.
이러한 묶음을 oop, 즉 객체라고 하고, 이러한 객체들로 이루어져있는 코드를 객체지향적 코드라고 합니다.
oop를 먼저 설명드린이유는 aop는 이런 oop를 기반으로 작성된 코드를 지키면서 아주 살짝만 변형되기 때문입니다.
예를들어 결제, 로그인, 게시글 3가지의 클래스를 작성했다고 생각해봅시다.
이 3가지에는 로그인이 되었는가? 인가에 대한 코드가 들어갈 수 있고, 제대로 실행이 되었는지 확인하는 로깅 관련 코드도 들어갈 수 있습니다.
하지만 이러한 코드들은 무조건 필요하지만 서비스 로직의 명확성에 일치하지 않고, 중복된 코드가 여럿히 작성되게 됩니다.
이런 여럿이 중복되고 명확성에 일치하지 않는 코드를 cross cuting concern 이라는 작업을 진행합니다.
해당 코드들을 분리하여 서비스 로직에 감싸주는 곳에 위치하게 하는
객체지향적 코드로만은 부족하여 이것을 보완하는 기술을 바로 AOP라고 합니다.
JPA의 더티체킹이란 무엇인가요?
더티체킹이란 상태 변경 검사입니다.
JPA에서는 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 데이터베이스에 반영합니다.
그렇기 때문에 값을 변경한 뒤, save하지 않더라도 DB에 반영되는 것입니다.
이러한 상태 변경 검사의 대상은 영속성 컨택스트가 관리하는 엔티티에만 적용됩니다.
추가적으로 더티체킹의 원리에 대해 설명하자면,
영속성 컨텍스트란 서버와 DB 사이에 존재합니다.
JPA는 엔티티를 영속성 컨텍스트에 보관한 때, 최초 상태를 복사에서 저장해 둡니다.
트랜잭션이 끝나고 flush를 할 때 스냅샷과 현재 엔티티를 비교해 변경된 엔티티를 찾아냅니다.
JPA는 변경된 엔티티를 DB단에 반영하여 한번에 쿼리문을 날려줍니다.
모놀리식 아키텍처와 MSA 아키텍처에 대해서 설명해주세요.
모놀리식 아키텍처는 MSA 아키텍처를 사용되기 전에 사용하던 옛날 스타일의 아키텍처입니다.
하나의 서비스 또는 애플리케이션이 하나의 거대한 아키텍처를 가질 때 모놀리식이라고 표현합니다.
모놀리식 아키텍처는 달인 애플리케이션에 기능이 추가될 때 마다 붙이는 형식의 개발형식인데
이러한 경우 신규 개발과 유지보수가 힘들어지는 결말에 직면하게 됩니다.
하지만 모놀리식에도 분명히 장점은 존재하는데
개발 속도가 빠르고, 테스트가 쉽고, 배포하기가 쉬우며 기능 개선이 쉽습니다. 이러한 장점 덕분에 주로 스타트업에서 많이 사용되고 있습니다.
마이크로 서비스 아키텍처는 API를 통해 통신하는 작고 독립적인 서비스의 모임입니다.
하나로 뭉처진 모놀리식의 아키텍처를 적절히 쪼개서 독립적으로 개발하는 방식입니다.
이렇게 분리된 마이크로 서비스 아키텍처는 API로 서비스가 나뉘어져있어 기존 모놀로식에 비해 애플리케이션의 모듈성을 유지하기가 쉽습니다.
그리고 서비스를 독립적으로 배포하며 서비스 간 통신은 API로 하기 떄문에 새로운 기술 스택 도입에 유리합니다.
서비스에 장애가 발생한다면 적어도 장애가 난 서비스만 죽고 연결된 다른 서비스는 죽지 않습니다.
서비스 그 자체가 작기 때문에 개발자가 코드를 알아보기 쉽고, 배포도 빠르고, 유지보수가 편리해집니다.
이러한 많은 장점속에 MSA의 단점은
도입의 어려움과 복잡한 운영, 트랜잭션 유지의 어려움과 높은 난이도의 디버깅에 있습니다.
서비스간에 잘 분리를 해야하는데 잘못 분리할 경우 모두가 모여 에러를 해결하는 불상사가 일어날 수 있습니다.
다른 쪽의 서비스가 죽었는지 살았는지 회사에서 알수있는 방법이 존재해야 합니다.
여러곳에 많은 DB가 분산되어 있다보니 한 서비스에서 만의 트랜잭션으로 완벽한 처리가 안될 경우가 있습니다.
또한 마찬가지로 여러곳에 에러가 나면 어느 서비스에서 에러가 났는지 파악을 할 수 있어야 하는데 여러 시스템에 걸친 작업을 추적해야하므로 디버깅이 매우 힘들어집니다.
인덱스란 무엇이고 일반적인 원리는 어떠한지 설명해주실 수 있을까요?
데이터베이스에서 특정 값을 찾고싶은 경우가 있다고 예를 들어보겠습니다.
저희는 age의 데이터에서 20세의 데이터를 찾고싶습니다.
하지만 회원가입된 유저의 수가 너무나도 많아 1억명의 데이터를 하나하나 확인하며 이 사람이 20살인지 확인해야 하는 경우가 생겼습니다.
이런 경우 저희는 1억명의 데이터를 나이가 작은순으로 나열하여 절반씩 묻게 합니다.
그럼 1억명의 데이터에서 몇번의 쿼리만으로 20살을 전부 찾을 수 있게 됩니다.
이 예시에서 정렬해놓은 컬럼의 사본을 인덱스라고 알고있습니다.
인덱스는 DB의 컬럼을 복사해서 놓으면 되는데 인덱스는 흔히 사용되는 배열이나 연결 리스트에 저장되지 않습니다.
인덱스는 트리에 저장되는데, 아무렇게나 되어있는 데이터들을 나뭇가지 치듯 연결해 놓습니다.
이런식으로 배치가 되어 있어도 절반씩 소거하며 찾기가 가능하기 때문입니다.
이를 바이너리 서치 트리(Binaty Search Tree)라고 부릅니다.
이를 강화한 B-Tree라는 나열 방식도 있는데 한 노드에 2가지 데이터를 담는 기법입니다.
이것보다 더 강화된 가장 밑에 데이터를 담아두고 가장 아래 데이터들 끼리 연결을 해 두고 그 위에는 가이드만 담아놓은 B+tree라는 기법도 존재합니다.
그래서 요즘은 B+tree를 많이 사용합니다.
Annotation이란 무엇이고 구체적으로 어떤 것이 있는지 예시를 들어 설명해주실 수 있을까요?
어노테이션이란 클래스나 메소드 위에 붙여 소스코드에 메타코드(추가 정보)를 주는 것입니다.
어노테이션은 자바에서 기본적으로 제공하는 것들도 많지만 사용자가 정의해서 사용도 가능합니다.
이를 커스텀 어노테이션이라고 합니다.
어노테이션의 예로 @Transactional이 있는데 트렌젝션이란 만약 코드에서 DB와 데이터를 주고받고 있을 때 만약 예상치 못한 에러로 인해 내가 원하는 값이 들어가지 않았거나하는 에러가 발생했을 경우 DB를 코드 실행전의 상태로 되돌려주는 것입니다.
이 트랜젝션은 어노테이션의 도움없이 코드로 작성할려면 많은 양의 코드를 작성해야하는데 보통 이렇게 반복적이고 많이 사용되는 코드를 쉽게 작성할수 있게 도와주는 어노테이션이 많은것 같습니다.
시간복잡도와 공간복잡도가 무엇인지 설명해주실 수 있을까요?
보통 알고리즘의 성능을 분석하는데 시간복잡도와 공간복잡도가 사용됩니다.
만약 걸리는 시간, 사용되는 메모리만을 통해 알고리즘의 성능을 분석하게 된다면
하드웨어의 성능, 사용된 언어, input size에 따라 변동이 일어나기 때문입니다.
시간 복잡도란 문제를 푸는데 걸리는 시간을 분석하는 것이고
공간 복잡도란 문제를 푸는데 사용되는 메모리를 분석하는 것입니다.
이러한 시간 복잡도와 공간 복잡도를 간단하게 표현하기 위해서 점근적 표기법이라는 것을 사용하기도 합니다.
Big-O, Big-Omega, Big-Theta가 있습니다
Big-O의 경우 상한, 최악의 경우를 표기해주고
Big-Omega의 경우 하한, 최선의 경우를 표기하여 주고,
Big-Theta의 경우 상한과 하한의 교집합, 평균을 표기하여 줍니다.
이 3가지 중에서는 Big-O가 가장 많이 사용되는데 최악의 경우를 표기하여 주는게 가장 이상적이고 빠르기도 해서 가장 많이 사용한다고 알고 있습니다.
시간복잡도를 계산하는 방법은 연산의 실행 횟수를 계산하면 됩니다
공간 복잡도를 계산하는 방법은 프로그램을 실행하는데 필요한 저장공간을 계산하면 됩니다.
시간 복잡도와 공간 복잡도는 서로 반비례하는 경향이 있습니다.
지연로딩(LAZY)에 대해서 설명해주세요. LAZY로 설정했을 때 연관된 객체가 어떻게 처리되는지 설명해주시면 좋을 것 같습니다.
@ManyToOne 매핑 방식을 사용하게 되면 기본적으로 Eager 방식을 사용하게 됩니다.
Eager 방식은 간단하게 말해서 즉시 모든것을 fecth해옵니다.
하지만 이러한 경우 많고 원하지 않은 부분까지 전부 join이 되기 때문에 성능상 부하가 될 수 밖에 없습니다.
그래서 fetch는 항상 lazy로딩을 사용하게 됩니다.
lazy는 Eager방식과 달리 가능하면 필요하지 않은 데이터를 가져오지 않도록 해줍니다.
데이터를 가져오는 것을 미뤄놓고 누군가가 찾는 데이터가 있다면 그때가서 찾아주는 방법이 바로 lazy 방법입니다.
lazy로 설정했을 경우 함수가 실행되자마자 select문이 실행되는게 아니라 내가 필요한 순간까지 db 접근을 막고있다가
코드에서 get와 같은 db에 연관된 객체와 상호작용을 할 경우에 select문이 실행됩니다.
꼬리 질문
- 프록시 연관관계에 대해 설명해주세요.
- 디폴트값이 Eager가 아닌 다른 것도 있는데 이 차이점은 왜 있는것일까요?
'🥸 CS 면접 스터디' 카테고리의 다른 글
웹 애플리케이션이란 무엇일까? (0) | 2023.04.24 |
---|---|
UNIX란? (0) | 2023.04.24 |
CS 스터디 4회차 정리 (1) | 2023.03.15 |
CS 면접 스터디 2회차 (1) | 2023.03.10 |
CS 면접 스터디 정리 1회차 (0) | 2023.03.10 |