Sparta/What I Learned

23.3.28

코딩하는 또롱이 2023. 3. 28. 12:53

 

알고리즘 스터디 풀이

** 알아볼 것

병합정렬

스트링 빌더 : 멀티 스레드에서 사용하는 Builder

스트링 버퍼

import java.util.Scanner;

class Solution {
	public ctatic void main[String[] args]{
    
    	Scanner sc = new Scanner(System.in);
        StringBuffer sb = new StringBuffe();
        
        int col = sc.nextInt();
        int row = sc.nextInt();
        
        for (int i = 0; i < row; i++) {
        	for (int j = 0; j < col; j++) {
            	sb.append("*");
            }
            sb.append("\n");
        }
        System.out.println(sb);
    }
}

 


 

기술 면접 스터디

 

 

DI에 대한 설명과 해당 기술의 장점에 대해 설명해주세요.

 

1) DI(Dependency Injection)란?

 

한국 말로는 의존성 주입, 의존관계 주입 라고 한다. 

어려운 말로는 아래 꺽쇠와 같다.

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

 

 

그럼 의존성(Dependency)은 뭐지?? 라고 생각할 수 있다.

✅ 의존 대상 B가 변하면, 그것이 A에 영향을 미친다.

- 이일민, 토비의 스프링 3.1, 에이콘(2012), p113

 

이렇게 의존성을 이용하여 두 객체 관계 맺어주는 것을 의존성 주입이라고 하며 생성자 주입, 필드 주입, 수정자 주입 등 다양한 주입 방법이 있다. 

 

✅ 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스만 의존하고 있어야 한다.
✅ 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
✅ 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

- 이일민, 토비의 스프링 3.1, 에이콘(2012), p114

 

 

2) 장점

 

  • 두 객체 간의 관계라는 관심사의 분리
  • 두 객체 간의 결합도를 낮춤
  • 객체의 유연성을 높임
  • 테스트 작성을 용이하게 함

 

🐈‍⬛ 내가 추가로 찾아 보고 정리하는 부분

더보기

👀 그럼 왜 DI를 써야만 하지?

public class Store {

    private Pencil pencil;

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

}

위와 같이 Store 에서 pencil을 판다고 했을 때 이 둘의 관계를 강하게 결합되어 있다고 한다. 이로 인해 객체들 간의 관계가 아니라 클래스 간의 관계가 맺어지게 된다.

 

👀 강하게 결합되어 있으면 안 되나??

근데 가게니까 연필이 아니라 지우개도 팔수도 있고, 다이소처럼 온갖 것을 다 파는 가게라고 가정을 한다면 이 코드들은 유연성이 떨어진다.

각각의 다른 상품들을 판매하기 위해 생성자만 다르고 나머지는 중복되는 Store 클래스들이 파생되는 것은 좋지 못하다. 이에 대한 해결책으로 상속을 떠올릴 수 있지만, 상속은 제약이 많고 확장성이 떨어지므로 피하는 것이 좋다.

 

👀 그럼 클래스 간의 관계가 맺어지면 왜 안 좋아?

올바른 객체지향적 설계라면 객체들 간에 관계가 맺어져야 한다. 

 

객체들 간에 관계가 맺어졌다면 다른 객체의 구체 클래스(연필인지 지우개인지 등)를 전혀 알지 못하더라도,

(해당 클래스가 인터페이스를 구현했다면) 인터페이스의 타입(Product)으로 사용할 수 있다.

public interface Product {

}

public class Pencil implements Product {

}

 

 

이제 우리는 Store와 Pencil이 강하게 결합되어 있는 부분을 제거해주어야 한다. 이를 제거하기 위해서는 다음과 같이 외부에서 상품을 주입(Injection)받아야 한다. 그래야 Store에서 구체 클래스에 의존하지 않게 된다.

public class Store {

    private Product product;

    public Store(Product product) {
        this.product = product;
    }

}

이러한 이유로 우리는 Spring이라는 DI 컨테이너를 필요로 하는 것이다. Store에서 Product 객체를 주입하기 위해서는 애플리케이션 실행 시점에 필요한 객체(Bean)를 생성해야 하며, 의존성이 있는 두 객체를 연결하기 위해 한 객체를 다른 객체로 주입시켜야 한다. 

예를 들어 다음과 같이 Pencil 이라는 객체를 만들고, 그 객체를 Store로 주입시켜주는 역할을 위해 DI 컨테이너가 필요한 것이다.

public class BeanFactory {

    public void store() {
        // Bean의 생성
        Product pencil = new Pencil();
    
        // 의존성 주입
        Store store = new Store(pencil);
    }
    
}

이러한 부분은 스프링 프레임워크가 완벽하게 지원을 해준다. 스프링은 특정 위치부터 클래스를 탐색하고, 객체를 만들며 객체들의 관계까지 설정해준다. 이러한 이유로 스프링은 DI 컨테이너라고도 불린다.

그리고 이러한 개념은 제어의 역전(Inversion of Control, IoC)라고 불리기도 한다. 어떠한 객체를 사용할지에 대한 책임은 프레임워크에게 넘어갔고, 자신은 수동적으로 주입받는 객체를 사용하기 때문이다.

 

이 글은 인용 블로그 를 토대로 작성했슴니다!

 

👀 DI 컨테이너??

https://velog.io/@re-deok/%EC%8A%A4%ED%94%84%EB%A7%81-IoC-DI-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88

 

[스프링] IoC / DI 컨테이너

Spring IoC / DI Container

velog.io

https://pamyferret.tistory.com/33

 

DI(Dependency Injection)이란? + DI 컨테이너, IoC, 어노테이션

개발을 하다보면, 개발 공부를 하다보면 DI라는 용어를 많이 접하게 된다. 거기에 덧붙여 DI 컨테이너, IoC이라는 용어도 많이 접하게 되는데 처음에 이러한 용어들을 접하고 가지 않으면 이게 뭐

pamyferret.tistory.com

 

 

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

1) Index란?

데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조

특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다. 인덱스 생성 시 데이터를 오름차순으로 정렬하기 때문에 정렬된 주소체계라고 표현할 수 있다.

 

인덱스의 가장 큰 특징은 데이터들이 정렬이 되어있다는 점이다.

① 조건 검색 WHERE 절의 효율성

② 정렬 ORDER BY 절의 효율성

③ MIN, MAX의 효율적인 처리

 

 

인덱스의 가장 큰 문제점은 정렬된 상태를 계속 유지시켜줘야 한다는 점이다.

① 인덱스는 DML에 취약

② 무조건 인덱스 스캔이 좋은 것은 아니다.

③ 속도 향상을 위해 인덱스를 많이 만드는 것은 좋지 않다.

 

 

인덱스를 사용하는 이유

테이블의 데이터는 순서 없이 쌓이게 되므로 특정 조건의 데이터를 찾으려면 테이블의 모든 데이터에 접근하여 비교하는 과정이 필요하다(full table scan). 하지만 인덱스가 있는 경우 search-key가 정렬되어 있기 때문에 조건 검색 시 속도가 빠르다.

 

인덱스는 where 절에서 ‘자주 조회’하고 ‘수정 빈도’가 낮으며 ‘데이터 중복’이 적은 컬럼을 선택하는 것이 좋다.

join 조건으로 자주 사용되는 컬럼도 인덱스로 사용하면 좋다.

데이터의 양이 많을수록 인덱스 성능 향상이 커진다.

대량의 데이터를 가지고 있고 select ~ where 같은 특정 조건의 데이터를 찾을 때, 인덱스를 활용하여 빠르게 데이터를 가져올 수 있다.

 

하지만!!

 

데이터의 양이 많지 않다면 굳이 인덱스를 사용할 이유가 없다.

한 테이블에 인덱스가 너무 많으면 데이터 수정 시 소요시간이 커진다. 

또한 성별처럼 데이터 중복이 높은 값은 인덱스를 생성하지 않는 것이 크게 의미가 없다.

왜냐하면 인덱스의 이점보다 추가 저장공간이나 데이터 수정에 대한 성능 저하가 더 크기 때문이다.

 

 


 

알고리즘 스터디 문제 풀기

 

'Sparta > What I Learned' 카테고리의 다른 글

23.4.3  (0) 2023.04.04
23.3.31  (0) 2023.04.04
23.3.27  (0) 2023.03.27
23.2.16  (0) 2023.02.16
23.2.15  (1) 2023.02.16