New World

[JAVA #8] Maven vs Gradle & myBatis & ORM & Database에서 Index란? & 디자인 패턴(Design Pattern) 본문

Self-Study/Study

[JAVA #8] Maven vs Gradle & myBatis & ORM & Database에서 Index란? & 디자인 패턴(Design Pattern)

hyeovi 2022. 10. 9. 00:41
728x90
반응형

Maven vs Gradle

Maven Gradle
Apache사에서 만든 빌드툴(build tool)
pom.xml파일을 통해 정형화된 빌드 시스템으로 프로젝트의 전체적인 라이프 사이클을 관리
그루비(Groovy)를 기반으로 한 빌드 도구
Ant와Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 오픈소스로 공개된 빌드 도구
- XML 기반으로 작성
- 생명주기(Lifecycle)와 프로젝트 객체 모델(POM, Project Object Model)이란 개념이 도입
- Ant의 장황한 빌드 스크립트를 개선
- pom.xml에 필요한 라이브러리를 선언하면 자동으로 해당 프로젝트로 불러와 편리
- 상대적으로 학습 장벽이 높다.
- 라이브러리가 서로 의존하는 경우 복잡해질 수 있다.
- 매우 유연한 범용 빌드 도구
- Maven과 같은 구조화 된 build프레임워크
- Maven, Ivy등의 기존 저장소 인프라 또는 pom.xml 파일과 ivy.xml 파일에 대한 migration 편이성 제공
-멀티 프로젝트 빌드 지원
- 의존성 관리의 다양한 방법 제공
-Build Script를 xml이 아닌 Groovy 기반의 DSL(Domain Specific Language)을 사용
-기존 Build를 구성하기 위한 풍부한 도메인 모델 제공- Gradle 설치 없이 Gradle Wrapper를 이용하여 빌드 지원

 

myBatis

JDBC를 좀더 편하게 사용할 수 있도록 객체를 SQL이나 저장 프로시저와 매핑 해주는 프레임워크로 SQL구문을 Java 메소드와 매핑

 

- 복잡한 쿼리나 다이나믹한 쿼리에 강하다.
- 프로그램 코드와 SQL 쿼리의 분리로 코드의 간결성 및 유지보수성 향상 
- resultType, resultClass등 Vo를 사용하지 않고 조회결과를 사용자 정의 DTO, MAP 등으로 맵핑하여 사용
- 빠른 개발이 가능하여 생산성이 향상

 

ORM

Object-Relational Mapping, 객체와 관계형 데이터베이스의 데이터를 자동으로 연결
객체 간의 관계를 바탕으로 자동으로 SQL을 생성해준다

 

Database에서 Index란?

22. Database에서 Index란?
인덱스는 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조를 일컫는다.
인덱스는 테이블 내의 1개의 컬럼, 혹은 여러 개의 컬럼을 이용하여 생성될 수 있다.
고속의 검색 동작뿐만 아니라 레코드 접근과 관련 효율적인 순서 매김 동작에 대한 기초를 제공한다.
인덱스를 저장하는 데 필요한 디스크 공간은 보통 테이블을 저장하는 데 필요한 디스크 공간보다 작다.



데이터베이스에서 테이블과 클러스터에 연관되어 독립적인 저장 공간을 보유하고 있는 객체(object)이다. 
사용자는 데이터베이스에 저장된 자료를 더욱 빠르게 조회하기 위하여 인덱스를 생성하고 사용한다. 


DB에서 자료를 검색하는 두 가지 방법
FTS(Full Table Scan) : 테이블을 처음 부터 끝까지 검색하는 방법
Index Scan : 인덱스를 검색하여 해당 자료의 테이블을 액세스 하는 방법.

 

Index

DBMS도 데이터베이스 테이블의 모든 데이터를 검색해서 원하는 결과를 가져오려면 시간이 오래 걸린다. 그래서 칼럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만들어 둔다. 항상 정렬된 상태를 유지하는 데이터의 저장 성능을 희생하는 대신 데이터의 읽기 속도를 높이는 기능으로 원하는 값을 탐색하는데는 빠르지만 새로운 값을 추가하거나 삭제, 수정하는 경우에는 쿼리문 실행 속도가 느려진다.

 

Index 자료구조

B+-Tree 인덱스 알고리즘

일반적으로 사용되는 인덱스 알고리즘, 칼럼의 값을 변형하지 않고(사실 값의 앞부분만 잘라서 관리한다.), 원래의 값을 이용해 인덱싱하는 알고리즘

 

Hash 인덱스 알고리즘

 주로 메모리 기반의 데이터베이스에서 사용, 칼럼의 값으로 해시 값을 계산해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원하지만 값을 변형해서 인덱싱하므로, 특정 문자로 시작하는 값으로 검색을 하는 전방 일치와 같이 값의 일부만으로 검색하고자 할 때는 해시 인덱스를 사용할 수 없다.

 

* 왜 index 를 생성하는데 b-tree 를 사용하는가?

데이터에 접근하는 시간복잡도가 O(1)인 hash table 이 더 효율적으로 보이지만 hash table 을 사용하게 된다면 등호(=) 연산이 아닌 부등호 연산의 경우에 문제가 발생한다. SELECT 질의의 조건에는 부등호(<>) 연산도 포함이 되어 동등 연산(=)에 특화된 hashtable은 데이터베이스의 자료구조로 적합하지 않다.

 

Primary Index vs Secondary Index

FK 값이 비슷한 레코드끼리 묶어서 저장하는 것을 클러스터드 인덱스라고 표현한다. 클러스터드 인덱스에서는 FK 키 값에 의해 레코드의 저장 위치가 결정되며 FK 키 값이 변경되면 그 레코드의 물리적인 저장 위치 또한 변경되어야 하여 FK 키를 신중하게 결정하고 클러스터드 인덱스를 사용해야 한다. FK 키로 사용하기에 테이블 당 한 개만 생성할 수 있다. non 클러스터드 인덱스는 테이블 당 여러 개를 생성할 수 있다.

 

디자인 패턴(Design Pattern)

"소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 또 발생했을 때 재사용할 할 수 있는 훌륭한 해결책"

싱글톤 패턴(Singleton Pattern)
- 객체를 하나만 생성하며, 어디서든 이미 생성된 객체만을 참조하도록 하는 패턴

 

new 를 실행할 수 없도록 생성자에 private 접근 제어자를 지정하고, 유일한 단일 객체를 반환할 수 있도록 정적 메소드를 지원해야하며 유일한 단일 객체를 참조할 정적 참조변수가 필요하다. 동시에 접근하다가 하나만 생성되어야 하는 인스턴스가 두 개 생성되지 않도록 getSingletonObject() 메소드를 동기화시켜야 한다. synchronized 키워드를 사용하게 되면 성능상에 문제점이 존재한다.  DCL(Double Checking Locking)을 써서 getInstance()에서 동기화 되는 영역을 줄일 수 있다. 초기에 객체를 생성하지 않으면서도 동기화하는 부분을 작게 만들었다. 그러나 이 코드는 멀티코어 환경에서 동작할 때, 하나의 CPU 를 제외하고는 다른 CPU 가 lock 이 걸리게 된다. 그렇기 때문에 다른 방법이 필요하다. 클래스가 로딩되는 시점에 미리 객체를 생성해두고 그 객체를 반환한다.

 

목적 : 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등의 경우, 인스턴스를 여러 개 만들게 되면 자원을 낭비하게 되거나 버그를 발생시킬 수 있으므로 오직 하나만 생성하고 그 인스턴스를 사용하도록 하는 것

 

문제점

  • 의존 관계상 클라이언트가 구체 클래스에 의존
  • private 생성자 때문에 테스트가 어렵습니다.
  • 객체 인스턴스를 하나만 생성해서 공유하는 방식 때문에 싱글톤 객체를 stateful하게 설계 했을 경우 큰 장애 발생요인

 

해결하기 위해 무상태(stateless)로 설계

  • 특정 클라이언트에 의존적인 필드와 값을 변경할 수 있는 필드가 있으면 안된다.
  • 가급적 읽기 전용으로 만들고, 필드 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용한다.

 

팩토리 패턴(Factory Pattern)
- 객체간 의존성을 줄이기 위해 객체의 생성과 데이터 주입만 담당하는 Factory 클래스를 정의하고,
  개발 코드 부분에서는 생성된 객체를 가져다 사용함으로서 의존성을 줄이는 방식

옵저버 패턴(Observer Pattern)
- 어떤 객체의 상태가 변경될 때, 그와 연관된 모든 객체들에게 상태변경을 알리는 디자인 패턴

 

? 싱글톤 패턴에 대해서 설명해주세요.

전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴

하나의 인스턴스만을 생성하며 getInstance메서드로 모든 클라이언트에게 동일한 인스턴스를 반환한다. private 생성자를 가지는 특징을 가지며, 생성된 싱글톤 오브젝트는 저장할 수 있는 자신과 같은 타입의 스태틱 필드를 정의한다.

 

? 가교 패턴(브릿지 패턴)에 대해서 설명해주세요.

추상부와 구현부를 분리하는 디자인 패턴으로 해당 패턴에서 기능은 인터페이스를 통해 정의 및 이용되고 해당 인터페이스를 따르는 클래스를 통해 구현된다. 해당 패턴을 통해서 사용자는 추상부와 구현부를 독립적으로 수정 및 확장할 수 있다. 가교 패턴은 객체지향 설계의 SOLID 원칙 중 단일 책임 원칙(SRP)과 개방 폐쇄 원칙(OCP)에 부합한 패턴이다.

 

? 전략 패턴에 대해서 설명해주세요.

알고리즘을 객체 단위로 캡슐화하는 디자인 패턴으로 해당 패턴에서 알고리즘은 인터페이스를 통해 정의 및 이용되고 해당 인터페이스를 따르는 클래스를 통해 구현된다. 해당 패턴을 통해서 사용자는 알고리즘을 필요에 따라 바꿔서 사용할 수 있게 된다. 전략 패턴은 객체지향 설계의 SOLID 원칙 중 개방 폐쇄 원칙(OCP)에 부합한 패턴이다.

 

? 빌더 패턴에 대해서 설명해주세요.

 

? 팩토리 메서드 패턴에 대해서 설명해주세요.

 

? 퍼사드 패턴에 대한 예를 들어주세요.

바운디드 컨텍스트로 구분된 각각의 독립적인 애플리케이션을 UI 서버를 통해 파사드 역할을 담당하도록 두고 각 바운디드 컨텍스트에서 UI 서버와 통신하기 위해 HTTP, Protobuf, Thrift와 같은 방식을 이용할 수 있다.

반응형
Comments