[기술면접 스터디] DI, 인덱스

rara_kim·2023년 2월 22일
0

기술면접

목록 보기
2/9

DI란 무엇인가?

Spring 프레임워크가 제공하는 의존 관계 주입 기능이다.
외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다.

클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해주기 때문에 개발자들은 제어할 필요없이 빈 설정 파일에 의존관계가 필요하다는 정보만 추가해주면 된다.

두 객체 간의 관계(의존성)를 맺어주는 것을 의존성 주입이라고 하며 생성자 주입, 필드 주입, 수정자 주입 등 다양한 주입 방법이 있는데, Spring 개발팀에서는 생성자 주입을 권장하고 있다.

DI가 필요한 이유는 무엇인가?

public class Store {
	private Pencil pencil;
    
    public Store() {
    	this.pencil = new Pencil();
    }
}

위와 같은 예시 클래스는 아래와 같은 문제점을 가진다.

  • 두 클래스가 강하게 결합되어 있다.
    • 만약 Store에서 Pencil이 아닌 Food와 같은 다른 상품을 판매하고자 한다면 Store 클래스의 생성자를 변경해야 한다.
  • 객체들 간의 관계가 아니라 클래스 간의 관계가 맺어진다.
    • 객체들 간에 관계가 맺어졌다면 다른 객체의 구현 클래스(Pencil 혹은 Food 등)을 알지 못하더라도 해당 클래스가 인터페이스를 구현했다면 인터페이스의 타입(Product)으로 사용할 수 있다.

이러한 문제가 발생하는 이유는 관심이 분리되지 않았기 때문이다.
Spring 에서는 DI를 적용하여 이러한 문제를 해결하고자 하였다.

DI의 장점은 무엇인가?

  • 클래스를 재사용 할 가능성을 높이고, 다른 클래스와 독립적으로 클래스를 테스트 할 수 있다.
  • 비즈니스 로직의 특정 구현이 아닌 클래스를 생성하는데 매우 효과적이다.



DB에서 인덱스를 잘 사용하면 어떤 장점이 있을까요?

인덱스란?

인덱스란 인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조 이다.
데이터베이스에서도 테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에 데이터와 데이터의 위치를 포함한 자료구조를 생성하여 빠르게 조회할 수 있도록 돕고 있다.

인덱스를 활용하면 데이터를 조회하는 SELECT외에도 UPDATE나 DELETE의 성능이 함께 향상된다.
해당 연산을 수행하려면 대상을 먼저 조회해야 작업을 할 수 있기 때문에, SELECT 성능이 향상됨에 따라 함께 성능이 향상된다.

인덱스를 사용하는 이유는 무엇인가?

인덱스의 가장 큰 특징은 데이터들이 정렬되어 있다는 것이다. 이 특징으로 인해 조건 검색에서 강점을 가진다.

데이터가 쌓여 순서없이 뒤죽박죽으로 저장되면 Where 조건 검색, Order by 정렬을 수행할 시 Full Table Scan을 하게 속도도 느려지고 부하가 걸릴 수도 있다.
그런데 적절히 인덱스를 사용하게 되면 이미 정렬이 되어 있기 때문에 빠르게, 전반적인 자원의 소모없이 해당 작업을 수행할 수 있다.

인덱스의 장점
 - 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.
 - 전반적인 시스템의 부하를 줄일 수 있다.

그러나 인덱스를 관리하기 위해 DB의 약10%에 해당하는 저장공간이 필요하며, 추가적인 작업을 해야한다.
또, 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 일어날 수 있다.

그러면 인덱스는 언제 사용하면 좋을까?

  • 중복된 데이터가 적은 컬럼
  • INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
  • JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
  • 규모가 작지 않은 테이블

profile
느리더라도 꾸준하게

0개의 댓글