저번 시간에는 RDB와 NoSql을 비교해서 이해해 보았다면,

이번에는 NoSql의 종류를 좀 더 상세히 이해해 보고자 한다.

 


NoSQL이란?

대용량 웹 서비스를 위하여 만들어진 데이터 저장소로 관계형 데이터 모델이 아닌 분산된 데이터를 저장 및 조회,

스키마가 없거나 느슨한 스키마를 제공한다.

1. Key-Value DB

- 간단한 키-값 메소드를 사용하여 데이터를 저장하는 비관계형 데이터 베이스 유형

- 키를 고유한 식별자로 사용하는 키-값 쌍의 집함으로 저장

- 키-값DB는 파티셔닝이 가능하고, 다른유형의 DB로는 불가능한 범위까지 수평확장 가능

 

사용사례

- 세션 스토어 : 세션 관련데이터를 주 메모리또는 DB에 저장하는데, 속도가 빠른 키-값 저장소가 적합하다. 키-값DB는 RDB보다 페이지당 제공하는 오버헤드가 적다

- 장바구니: 키-값DB는 분산처리 및 저장을 통해 수백만명의 사용자에게 서비스 제공, 동시에 대량의 데이터 처리및 상태변경 가능 또한, DB 내에 내장형 중복기능이 있어 스토리지 노드 손실 방지 

-Redis

 

Key Value
K1 AAA, BBB, CCC
K2 AAA, BBB
K3  DDD, CCC
K4 AAA, 222, 3333
K5 ZZZZ, 3 , 5555

2. Document DB

- JSON 유사 형식의 문서로 데이터 저장 및 쿼리하도록 설꼐된 비관계형 데이터베이스

- 개발자들이 어플리케이션 코드에서 사용하는것과 동일한 문서 모델 형식을 사용하여 손쉽게 데이터 저장, 쿼리 가능

- 유연한 인덱싱, 강력한 임시 쿼리 , 문서 모음에 대한 분석 지원

 

사용사례

- 콘텐츠 관리 : 어플리케이션이 추적하는 각 엔터티를 단일 문서로 저장 가능 

- 카탈로그 : Doc DB는 효율적 , 효과적으로 저장 가능. 각 상품의 속성을 단일 문서로 기술하여 관리가 쉽고 , 읽기 속도도 빠르다.

- MongoDB, CouchDB

[ 
    { 
        "year" : 2013, 
        "title" : "Turn It Down, Or Else!", 
        "info" : { 
            "directors" : [ "Alice Smith", "Bob Jones"], 
            "release_date" : "2013-01-18T00:00:00Z", 
            "rating" : 6.2, 
            "genres" : ["Comedy", "Drama"], 
            "image_url" : "http://~~~.com", 
            "plot" : "A rock band plays their music at high volumes, annoying the neighbors.", 
            "actors" : ["David Matthewman", "Jonathan G. Neff"] 
        } 
    }, 
    { 
        "year": 2015, 
        "title": "The Big New Movie", 
        "info": { 
            "plot": "Nothing happens at all.", 
            "rating": 0 
        } 
    } 
]

 

3. Graph DB

- 데이터베이스는 노드를 사용하여 데이터 엔터티를 저장하고 엔지로는 엔터티간의 관계를 저장한다.

- 엣지는 항상 시작 노드, 끝노드, 유형과 방향을 가지며 상-하위 관계, 동작, 소유자등을 문서화 한다. 

 

사용사례

- 이상탐지 : 정교한 이상탐지와 예방기능이 있다. 관계를 사용하여 거의 실시간으로 금융이나 구매 트랜잭션 처리 가능

- 추천 엔진: 고객 관심 분야, 친구 , 구매이력과 같은 정보 카테고리들 사이의 그래프 관계 저장

- Neo4j, InfoGrid , Infinite Graph

4. In-Memory DB

- 모든 데이터를 주메모리에 저장하여 Disk에 접근하는 것을 제외해서 즉각적인 반응이 올 수 있는 DB

- micro 초 반응, 많은 트래픽이 요하는 어플리케이션에 적합하다.

 

사용사례

- Real-time Bidding

- 게이밍 리더보즈 : realtime으로 정렬된 데이터를 빠르게 가져 올 수 있다.

- 캐시 : 보통 RAM에 저장해서 빠르게 접근 가능

 

 

5. Search-Engine DB

- 비슷한 주제로 분류한 인덱스를 사용하며, 길고 구조화 되지 않은 데이터를 다루는데 최적화 되어있다. 아주 길거나 복잡한 text를 다루는데 좋다.

 

사용사례

- Text Search : Search-Engine DB를 쓰면 RDB보다 full-text를 찾는게 더 빠르고 관련있는 결과들을 정렬 가능

- 로그와 분석 : 로그를 더 효율적으로 관리 가능, 여러 다른 어플리케이션의 로그들을 중앙에서 관리 가능

-ElasticSearch

 

 

6. Column Family Store

- Key-Value 모델이 발전한 형태이다.

- key는 여러 컬럼을 가리키며, 컬럼은 컬럼 패밀리(슈퍼 컬럼)에 따라 정렬된다.

- 여러 서버의 분산된 수많은 데이터를 저장, 처리하기 위해 만들어졌다.

- Join이 되지 않는다. 신규데이터가 추가 될때, 구조를 변경하지않고 Column Family 테이블에 입력하면 된다. 

- Cassnadra, HBase

테이블명 사원
CF : 공통사항

성명

주민번호

CF:최종학력

학교명

전공

졸업년월일

CF:전화번호

집 전화번호

모바일 전화번호

사무실 전화번호

 


참고사이트

https://aws.amazon.com/ko/nosql/

https://subokim.wordpress.com/2011/05/31/nosql-db-four-type/

https://12bme.tistory.com/323

'DEVELOP > DB' 카테고리의 다른 글

[MariaDB] general log 설정하기  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13
NewSql 이란? All in one DBMS  (0) 2019.12.16
DB(database)의 종류  (0) 2019.12.11
Liquibase 사용법 및 개념  (0) 2019.06.12

이번 시간엔 데이터베이스 종류에 대해 알아보겠다

일반적으론 관계형 데이터베이스(RDB)를 가장 많이 쓰는데 요새는 NoSql이라는 것도 많이 쓰인다.

 

학부 수업시간에는 RDB에 대해서만 배웠었는데

IT 직무에 있으면서 사실 데이터베이스를 모르면 전혀 업무를 할 수 없는 수준이라서 

반드시 알아야 하는 부분이다.

 

나는 RDB에서는 익숙하지만 NoSql에 대해서는 생소한 부분이 있기 때문에 두가지를 

비교해서 이해해보도록 하겠다.

 

 


1. 관계형 데이터베이스 (Relational Database)

- 가장 많이 사용

- 행(Column)과 열(Row)로 표현되는 테이블간의 관계를 나타냄

- 엄격한 스키마 (=structure)

- SQL 질의문을 통해 요청 처리

- Mysql , Oracle, PostgreSql

 

 

2. NoSQL ( Not Only SQL)

- 스키마, 관계없음

- RDB의 확장성 이슈 해결하기 위해 나옴

- MongoDB,hBase

- 보통 key-value 형태

 

가) Document 방식

- Json,XML 과같은 collection 데이터 모델 구조 사용

- MongoDB , CouchDB

 

나) Key-Value 방식

- key-value 의 데이터가 쌍으로 저장

- Redis , Memchached : im-memory DB

 

다) Big Table DB

- key-value 형태에서 발전, column family 데이터 모델 구조사용

- HBase, Cassandra, Hypertable, ScyllaDB

 

 

 

3. 비교

  RDB NoSql
특징

Scale-up

(성능을 높이려면 하드웨어를 고성능으로 교체)

 

중복 불가

Scale-out

(분산컴퓨팅으로 DB성능 높일수 있다)

 

중복 허용

장점

명확하게 정의된 스키마

데이터 무결성 보장

스키마가 없어서 유연, 언제든지 데이터 저장 새 필드 추가 가능

데이터는 어플리케이션이 필요로 하는 형식으로 저장, 따라서 속도가 빠르다.

 

 

단점

유연X, 데이터스키마 항상 사전에 정의 되어야한다.

관계가 있으므로 JOIN문이 많은 복잡한 쿼리

수평적 확장(scale-out)어렵다.

유연성때문에 데이터구조 결정을 하지못한다.

데이터가 여러 컬렉션에 중복되어 있어서 수정을 해야할 경우 모든 컬렌션에서 수정해야한다.

 

 

언제 사용?

관계를 맺고있는 데이터가 수정이 자주 되는 경우 

스키마가 변경 가능성이 적을 때

정확한 데이터 구조를 알 수 없거나, 변경/확장이 될 수 있는 경우

 

Read는 자주하지만 update는 자주 하지 않는 경우

 

막대한 양의 데이터를 다루는 경우(scale-out이 필요한 경우)

 

4. 결론

다양한 경우가 있겠지만,

나라면 RDB와 NoSql을 적당히 섞어서 쓸거 같다.

 

우선 RDB를 사용하되,

특히 고정적인 스키마가 필요한 경우, update가 자주 일어나는 경우에는 RDB를 사용하고

 

빅데이터나, 데이터 구조가 일관적이지 않은 부분은 NoSql을 사용할거 같다

 

그러는 것이 수정할때도, 데이터를 가져올 때의 성능도 좋을 것으로 보인다.

 

 

 


참고 블로그

https://honeyteacs.tistory.com/19

https://siyoon210.tistory.com/130

https://toma0912.tistory.com/83

'DEVELOP > DB' 카테고리의 다른 글

[MariaDB] general log 설정하기  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13
NewSql 이란? All in one DBMS  (0) 2019.12.16
NoSql DB 종류  (0) 2019.12.13
Liquibase 사용법 및 개념  (0) 2019.06.12
 

Angular

React

Vue

출시

2010년에 Google에서

2013년에 Facebook에서

2014Google직원인 Evan You

 

TypeScript

X

X

DOM

Real DOM

Virtual DOM

Virtual DOM

바인딩

단방향 , 양방향 데이터바인딩

단방향 데이터 바인딩

단방향 , 양방향 데이터바인딩

Template

HTML파일에 마크업을 작성

JSX 기술

HTML파일에 마크업을 작성

Popularity

3.

1.

2.

Usercase

Google, The Guardian , Weather.com

Facebook, Twitter, Whatsapp, Instagram

9Gag, GitLab

develop

Angular CLI

Create React App

Vue CLI

 

저번주에는 개념적인것만 공부했다면 

이번주에는 각각 샘플 프로젝트를 해보며 직접 무엇이 다른지 경험해보았다.

 

 

 

1. Angular

 

다른언어랑 비교 했을때 가장 다른 점은

Typescript 를 사용한다는 점이고, 더 객체 지향적인 관점에서 개발되는거 같다

 

직접 해본 느낌은 자바 MVC 패턴으로 개발하는거랑 정말 크게 다르지 않은 느낌이다..

자바가 javascript로 바뀐정도 느낌이랄까

 

특히 service를 이용해서 구현한부분에서 그렇게 느꼈다.

 

 

 

 

2. React

 

JSX를 이용하여 자바스크립트에서 DOM 생성

state는 불변이라 data를 변경시에 setState()를 이용해서 변경한다.

React Native가 있어 Mobile 앱에서 강점이 있다.

 

다른언어는 html 파일에 마크업방식으로 template을 구성한다면

React는 html 태그에 js 문법도 같이 들어가있는 jsx을 이용한다는게 문법적으로 많이 다르다.

 

그리고 vue.js와 크게 다른건 

뒤에서 얘기하겠지만..

vue.js 는 data를 직접 변경이 가능하지만 React는 불가능하고 setState()라는 function을 이용한다.

 

 

기존에 Vue.js는 해봤어서 

React를 해보니 느낀건 문법적인거 말고는 크게 다른게 없는데..??

부모 자식 컴포넌트 간에 props, emit하는것도 비슷하고 

다 비슷한데??

 

그런데 JSX하는게 가장크게 다르고 

그거에 따라 건드려 줄수 있는게 더 많다고 한다 ㅎㅎ;; 더 해봐야 알겠지만..

 

그리고 Vue.js에 있는 개념과 비슷하게

 shouldComponentUpdate() 이런 function이 있는데 이부분은 더 공부 해봐야겠다..

 

 

3. Vue.js

 

한 컴포넌트에 template, script, style 이 모두 들어가 있다.

그리고 앞에서 얘기한거처럼 data를 직접 변경 가능하고

랜더링이 빠르다.

 

확실히 Vue가 더 가볍고 쉬운건 확실히 맞는거 같다

 

Vue를 먼저 배워서 그런지 그이후 파생되는 React도 조그만 보면 알 수 있을거 같다

Angular는 내 느낌상 자바 객체지향 개념이 있다보니

또 이것 또한 아는 부분이라

금방 할 수 있을거 같긴한데 

 

 

결론

개발자의 숙련도에 따라 결정한다.

 

초급 개발자 위주이면 Vue.js

중급 개발자 이상이 대다수이면 React

- ThirdParty Library를 잘 조합할 수 있다면 React 그런것이 번거롭다면 Angular

Angular : 프로젝트 규모가 크고 타입스크립트를 선호

-유지보수가 좋다. MVC패턴

-

React : 거대한 생태계와 유연성을 선호 , Native 앱에서 사용가능

-Popularity

Vue.js : 쉽고 가벼운 프레임워크

 

Front end Framework 3개중 고민하는 사람이 많을 것으로 생각한다.

예전에는 Angular가 대세였지만 요새는 React와 Vue 중에서 고민을 하는거같다

 

그래서 세개를 다양한 관점에서 비교해 봤다.

해당 사이트를 요약해서 표로 만들어 봤다 

(https://hackernoon.com/angular-vs-react-vs-vue-which-is-the-best-choice-for-2019-16ce0deb3847)

 

 

  Angular React Vue
Popularity 3. 1. 2.
Introduction to the background Released in 2010
by Google
Released in 2013
by Facebook
Released in 2014 by Evan you who is an ex-engineer
of Google
Performance Uses real DOM Uses virtual DOM Uses virtual DOM
Use Cases Google, The Guardian , Weather.com Facebook, Twitter, Whatsapp, Instagram 9Gag, GitLab
Framework size Heavyweight application Suitable for light-weight application The lightest
Learning curve 3. need to learn typescript 1?? 2??
Flexibility Offers you need
but not much flexible
The most flexible Not much opinionated
or flexible
Component based Yes Yes Yes

 

 

결론은,

Vue and React offers better performance and flexibility than Angular.

Vue and react are more suited for light-weight applications and angular is the best for large UI applications.

Angular is highly opinionated and unlike Vue and React, it offers everything
from routing, templates to testing utilities in its package.

Vue is the most popular, loved and growing framework of Javascript.

 

 

개인적인 의견을 붙여보자면,

저는 vue만 해봤는데 ..

해당 사이트에서는 react가 learning curve가 제일 낮다고 했지만 내 생각엔 vue가 제일 낮은거 같다

react를 안해봤지만 vue를 상당히 쉽게 배웠기 때문이다

 

react를 해보고 다시 리뷰해보자 ㅎㅎ '-'

react는 React Native가 있어 모바일앱을 구현하기 좋아서 모바일을 커버하고 싶다면 

react를 선택하는것도 좋을거 같다

 

 

그럼이만

 

 

테스트에서 @Transactionl어노테이션을 쓰면 테스트 내에서 진행하는 모든 트랜잭션 관련 작업을 하나로 묶어 줄 수 있다.

 

@Transactionl은 애플리케이션의 클래스에 적용할 때와 디폴트 속성은 동일하다.

 

1. @Transactional

중요한 차이점은,

테스트용 트랜잭션은 테스트가 끝나면 자동으로 롤백된다는 것이다.

테스트에 적용된 @Transactional은 기본적으로 트랜잭션을 강제 롤백시키도록 설정~

롤백 테스트 가능 ㅎㅎ 굳


2. @Rollback

그런데,,, 트랜잭션을 커밋시켜서 테스트에서 진행작업을 DB 반영하고 싶다면?!

@Rollback 어노테이션 사용!

 

@Rollback의 기본값은 true라서 

트랜잭션은 적용되지만 롤백을 원치 않는다면 @Rollback(false) 라고 해주면 된닷!

 

 


3. @TransactionConfiguration

테스트 클래스의 모든 메소드에 트랜잭션을 적용하면서 모든 트랜잭션이 롤백되지 않고 커밋되게 하려면?!

일일히 메소드에 @Rollback(false)하지말고,

 

클래스레벨에 부여할 수 있는 @TransactionConfiguration 사용

 

@Transactional

@TransactionaConfiguraion(defaultRollback=false)

public class Test{

    ... ...

}

토비의 스프링을 진짜 오랜만에 펼쳐봤다,,

앞에만 보고 덮었었는데 

뒤에 알아야되는 내용이 그득 했다,, 

앞으로도 사전처럼 두고 봐야지 ㅎ_ㅎ

 


 

이번 포스팅은 @Transactional 속성에 대해서 알아보려고한당 (feat. 토비의 스프링~)

 

트랜잭션이란? 더 이상 쪼갤 수 없는 최소 단위의 작업

 

트랜잭션 매니저에서 트랜잭션을 가져올때 사용한 오브젝트는 DefaultTransactionDefinition이다.

 

Transaction status = this.transactionManager.getTransaction( new DefaultTransactionDefinition());

DefaultTransactionDefinition이 구현하고 있는 TrasactionDefinition  인터페이스는 트랜잭션 동작방식에 영향을 줄 수 있는 네가지 속성을 정의하고있다.

 


1. 트랜잭션 전파 ( Transaction propagation)

: 트랜잭션 경계에서 이미 진행중인 트랜잭션이 있을 떄 또는 없을 떄 어떻게 동작할 것인가를 결정하는 방식

 

 

  • PROPAGATION_REQUIRED

:진행 중인 트랜잭션이 없으면 새로 시작하고, 이미 시작된 트랜잭션이 있으면 이에 참여한다

 

DefaultTransactionDefinition의 트랜잭션 전파 속성

 

  • PROPAGATION_REQUIRES_NEW

: 항상 새로운 트랜잭션을 시작한다

독립적인 트랜잭션이 보장돼야 하는 코드에 적용

 

 

  • PROPAGATION_NOT_SUPPORTED

: 트랜잭션 없이 동작하도록, 진행중인 트랜잭션이 있어도 무시한다.

 

 

=> 트랜잭션 매니저를 통해 트랜잭션을 시작할때, getTransaction()을 사용하는 이유는 바로 이 트랜잭션 전파 속성이 있기 때문이다. 

 

  • PROPAGATION_SUPPORT : 부모 트랜잭션 내에서 실행, 부모 트랜잭션이 없을 경우, notransactionally로 실행
  • PROPAGATION_MANDATORY : 부모 트랜잭션 내에서 실행되며, 부모 트랜잭션이 없을 경우 예외 발생
  • PROPAGATION_NEVER : notransactionally로 실행되며 부모 트랜잭션이 존재한다면 예외 발생

2. 격리 수준

: 모든 DB 트랜잭션은 격리수준 (isolation levlel)을 가지고 있어야 한다. 

 

성능을 위해서 적절하게 격리수준을 조정해서 가능한 한 많으 트랜잭션을 동시에 진행시키면서도 문제가 발생하지 않게 하는 제어가 필요하다. 

 

격리수준은 기본적으로 DB에 설정, JDBC드라이버나 DataSource 등에서 재설정, 필요하다면 트랜잭션 단위로 조정!

 

 

DefaultTransactionDefinition에 설정된 격리수준은 ISOLATION_DEFAULT이다. 이는 DataSource설정되어 있는 디폴트 격리수준을 따른다.

 

블로그에서 더찾아볼때 더있는데,, 모르겠당 @_@

 


3. 제한시간

: 트랜잭션의 수행하는 제한시간을 설정할 수 있다. 

DefaultTransactionDefinition의 기본설정은 제한시간 음슴..

 

 

 


4. 읽기 전용

: 읽기전용(read only)로 설정하면 트랜잭션내 데이터 조작시도를 막을 수 있다. 성능이 향상 될수도 있다. 

 


 

스프링이 제공하는 TransactonInterceptor에는 예외처리 두가지 방법이 있다.

 

1. 런타임 예외 발생 -> 트랜잭션 롤백

2. 체크예외 -> 예외상황으로 해석하지 않는다. 의미가 있는 리턴방식의 한가지로 인식해서 트랜잭션을 커밋한다.

 

 

 


@Transactional 어노테이션은 인터페이스, 클래스, 메소드에 쓸 수 있다. 

 

해당 구현한 클래스에서도 모두 @Transactionl 어노테이션을 쓰고 싶으면 인터페이스에,

클래스에서만 쓰고 싶으면 클래스에

메소드별로 따로 가지고 가고싶으면 메소드에 쓰면된다

 

나같음 클래스나,,, 메소드 정도로만 쓸듯,,하다

 

 

 


 

ㅎㅎ 토비의 스프링을 보니깐 이해가 그래도 잘되는거 같당~

계속 읽어봐야짓 ㅎㅅㅎ 

 

 

 

 

스프링에서 Filter, Interceptor, AOP는 모두 어떤 동작 이전/이후에 추가적으로 처리해주어야 할때 사용한다.

기능적으로는 비슷한데 내부 구현적으로는 차이가 있다.

 

Filter, Interceptor : Sevlet 단위에서 실행

AOP : 메소드 앞에 proxy 패턴의 형태로 실행

 

그래서 실행 순서도 차이가 있다 ???

 

Filter -> Interceptor -> AOP -> Interceptor -> Filter 순이다

이미지 참조 : blog.naver.com/platinasnow/220035316135

 

Request -> Servlet Filter -> Dispatcher Servlet -> HandlerInterceptor -> Controller

 

1. 서버를 기동시켜 서블릿이 올라오는 동안 init 실행 되고 FilterdoFilter 실행

2. 컨트롤러 이전에 InterceptorpreHandler실행

3. 컨트롤러 빠져나온다음 InterceptorpostHandler, afterCompletion 실행

4. FilterdoFilter 진행

5. 서블릿 종료시 destroy 실행

 

AOP는 주로 비지니스 로직단에서 로깅,트랜잭션, 공통예외처리 에서사용한다.

 

 

참고

hayunstudy.tistory.com/53

 

# Filter , Interceptor , AOP 사용목적 정리

Filter,Interceptor,AOP 모두 요청 중간에 가로채서 사전처리,사후처리를 하는 의미는 비슷하다. 로깅처리 또한 셋다 가능. 차이점이라고 하면 , 1. 셋의 시점이 다르다는것 : Filter -> Interceptor -> AOP 2. 적

hayunstudy.tistory.com

junshock5.tistory.com/142

 

Filter, Intercepter, AOP 차이점

[ 배경 ] 자바 웹 개발을 하다 보면, 공통적으로 처리해야 할 업무가 생깁니다. 예를 들어 로그인 관련 세션 처리, 사용자 권한 체크, XSS(Cross Site Script) 방어 로직, PC Mobile 플랫폼 분기 처리, 로그

junshock5.tistory.com

 

Git을 오래 사용하였지만 

commit.. pull.. merge..push...

이외에는 잘 사용하지 않았던거 같다..

(사실 지금도 그렇당 ㅎㅎ)

 

쓰다보니 다른기능도 

알아두면 좋을거같은데..

매번 내가 헷갈려서 쓰는 포스팅,, ㅎ1ㅎ1

 

 

 

1. amend : commit 수정

$ git add sample.txt
$ git commit --amend

이걸 쓰는건 못봤지만.. Git 홈페이지에 있길래 

쓸진 모르겠당

 

2. revert : commit 취소

$ git revert HEAD

제일 많이 쓰는것중 하나,,! intelliJ에서는 undo도 가능하다.

둘다 써보니 revert는 취소하는 comiit을 하나 더 치는거고 undo는 아예 없애는것이 다른점이다.

 

3. reset : master 브랜치 앞의 commit을 삭제

$ git reset --hard HEAD~~

실수로 reset을 잘못 했을 경우 , 'ORIG_HEAD'로 reset전 상태로 되돌릴 수 있다.

$ git reset --hard ORIG_HEAD

 

4. cherry-pick : 특정 commit을 선택해서 반영하기 

체리나무에 달려 있는 체리를 하나씩 골라 따듯이,, 커밋들을 골라서 반영하는것이 체리픽!

이건 잘 쓸거 같당

 

$ git checkout master
Switched to branch 'master'
$ git cherry-pick 99daed2

 

5. rebase : 여러개의 commit을 반영하기 

$ git rebase {branch name}

브랜치에 여러 커밋을 하나로 합쳐준다.

 

rebase -i 옵션을 붙여서 commit 순서를 바꾸거나 첨삭 할 수 있다. 

$git rebase -i HEAD~3

 

6. merge : 두개의 branch를 하나로 합치기

개발하다보니 더 추가할사항이 있어서 추가해보겠당~!

 

1. Liquibase 란?

데이터베이스 변경관리를 체계적으로 자동화 해주는 오픈소스 (스키마 버전 관리)

 

개발하다보면 DB가 어쩔수 없이 변경되는 경우가 있을 수 있다. 이경우 갑자기 DB를 변경할 경우

각 개발자 로컬에서 수많은 버그들이 발생할것이다.. 그리고 관리도 어렵고

그래서 관리를 하기위해서 git처럼 형상관리로 하는거다 project 안에 파일이 있으니까 더 수월히 된다 

 

2. 사용법

1. maven 에 liquibase를 pom.xml에 추가해준다.

 

<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>

 

2. liquibase.xml 파일을 생성해준다.

부모가 되는 xml 파일이다. 다른 각각 테이블 별로 된 xml 파일을 여기서 include 해준다.

 

<include file="~~~.xml" relativeToChangelogFile="true" />

 

3. 각 테이블마다 xml을 만들어 주면된다. 

 

https://www.liquibase.org/documentation/xml_format.html

 

Liquibase | Database Refactoring | XML Format

XML Format Liquibase supports XML as a format for storing your changelog files. XSD Support XSD schema definitions are available for each Liquibase version. Since there are no changelog format changes in patch versions, there are only xsd files that corres

www.liquibase.org

 

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd"> <preConditions> <runningAs username="liquibase"/> </preConditions> <changeSet id="1" author="nvoxland"> <createTable tableName="person"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="firstname" type="varchar(50)"/> <column name="lastname" type="varchar(50)"> <constraints nullable="false"/> </column> <column name="state" type="char(2)"/> </createTable> </changeSet> <changeSet id="2" author="nvoxland"> <addColumn tableName="person"> <column name="username" type="varchar(8)"/> </addColumn> </changeSet> <changeSet id="3" author="nvoxland"> <addLookupTable existingTableName="person" existingColumnName="state" newTableName="state" newColumnName="id" newColumnDataType="char(2)"/> </changeSet> </databaseChangeLog>

 

 

 

4. spring에 databaseConfig 파일d에 liquibase관련 내용을 Bean으로 만들어준다.

 

SpringLiquibase liq = new SpringLiquibase();

 

liq에 필요한 내용을 set해준다( datasource등..)

 

 

 

5. 그이후 서버를 기동하면 다음과 같은 테이블이 생성함을 확인 할 수 있다.

databasechangelog

databasechangeloglock

databasechangelog는 한번 돌았던 xml파일을 다시 반영하지 않기 위해 어떤파일을 database에 반영했는지

기록하는 테이블이고

 

 

databasechangeloglock은 기동하면서 xml파일이 반영될때 lock을 잡고 있을때 테이블에 데이터가 들어갔다가

lock이 해제되면 빠진다

 

 

 

 

 

'DEVELOP > DB' 카테고리의 다른 글

[MariaDB] general log 설정하기  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13
NewSql 이란? All in one DBMS  (0) 2019.12.16
NoSql DB 종류  (0) 2019.12.13
DB(database)의 종류  (0) 2019.12.11

1. RestTemplate이란?

Spring 3.0부터 지원하며 스프링에서 http 통신에 유용하게 쓸수 있도록 제공해주는 템플릿이다.

즉, API 통신해서 가져 올수 있도록 도와준다.

 

2. 예시코드

@GetMapping("/test")
    public ResponseEntity<List> testList(testVo testVo) {
        String url = "http://testurl.com"; // api url
      

  //get parameter 담아주기
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
                .queryParam("test1", testVo.getUserId())
                .queryParam("test2", testVo.getValue());
       HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setConnectTimeout(30000); // 연결시간 초과
        //Rest template setting
        RestTemplate restTpl = new RestTemplate(httpRequestFactory);
        HttpHeaders headers  = new HttpHeaders(); // 담아줄 header
        HttpEntity entity = new HttpEntity<>(headers); // http entity에 header 담아줌

        ResponseEntity<JSONArray>  responseEntity = restTpl.exchange(url, HttpMethod.GET, entity, JSONArray.class);
        L.info("responseEntity.getBody()" + responseEntity.getBody());
        List result = (List) responseEntity.getBody();

        return ResponseEntity.ok(result);
    }

 

3. 설명

HttpComponentsClientHttpRequestFactory :  RestTemplate 는 ClientHttpRequestFactory 로 부터 ClientHttpRequest 를 가져와서 요청을 보낸다.

 

RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
이렇게 써도 가능하나 다양한 설정을 추가하지 못한다.

 

POST 방법으로 하고 싶으면 HttpEntity를 선언할때 body부 를 넣어주면된다.

String body =~~; // 보통 map형식

HttpEntity entity = new HttpEntity(body,headers);

 

그리고 여기서는 return을 List로 받고싶어서 JSONArray를 썼는데, 

List<Object> 형태가 아닌 다양한 JSon 형태라면 JSONObject로 리턴받아 해당 값을 get해도 된다.

ResponseEntity<JSONObject>  responseEntity = restTpl.exchange(url, HttpMethod.GET, entity, JSONObject.class); 

responseEntity.getBody().get("example");

4. 참조 문서

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

 

RestTemplate (Spring Framework 5.1.7.RELEASE API)

Synchronous client to perform HTTP requests, exposing a simple, template method API over underlying HTTP client libraries such as the JDK HttpURLConnection, Apache HttpComponents, and others. The RestTemplate offers templates for common scenarios by HTTP m

docs.spring.io

해당 페이지에 Get, Post등 다양한 방법이 나와있다. 

나는 여기서 exchange 방법을 썼는데 HTTPMETHOD.GET / POST로 바꿔서 쓰면된다.

+ Recent posts