728x90
반응형

ACID란?




데이터베이스 영역에서 ACID란 Atomicity(원자성), Consistency(일관성), Isolation(고립성) 그리고 Durabiliy(지속성)의 약어로 데이터베이스 트랜젝션의 가장 중요한 특성들을 나타내는 말로 데이터베이스 시스템에서 기본적으로 제공해야할 가장 중요한 특성들입니다.
각각의 특성들에 대한 설명은 아래와 같습니다. 
  • Atomicity (원자성): 하나의 데이터베이스 트랜젝션에 여러 개의 데이터를 변환 (수정/삭제/입력 등과 같은)하는 도중에 문제가 발생했을 때 문제가 발생한 시점과 상관없이 그 트랜젝션에 포함된 모든 데이터의 변환이 이루어지지 않도록 보장하는 것이 원자성의 중요한 특징입니다. 쉽게 이야기하면 데이터를 변환할 때 문제가 발생하면 트랜젝션에 포함된 내용의 어떠한 데이터의 변환이 이루어지지 않으며 많약 아무 문제가 없을 때는 트랜젝션에 포함된 내용의 모든 데이터의 변환이 이루어 지는 것을 의미합니다. (All or nothing)
  • Consistency (일관성): 일관성은 어떠한 트랜젝션 전후에도 데이터베이스가 valid 상태를 유지함을 보장하는 특성으로 쉽게 이야기해서 트랜젝션 동안 데이트베이스에서 지정된 Rule에 부합된 데이터들만 데이터베이스에 유지가 되어서 트렌젝션이 끝난 후에도 데이터베이스가 사용가능한 상태를 유지할 수 있도록 보장하는 특성입니다.
  • Isolation (독립성): 독립성이란 만약 한 데이터베이스 시스템에 여러 개의 트랜젝션이 발생했을 때 각각의 트랜젝션이 서로 독립적으로 (또는 서로 영향을 끼치지 않게) 데이터를 변환할 수 있게 보장하는 특성을 이야기합니다. 만약 독립성이 지원 않는 데이터베이스에서 동시에 두 개의 트랜잭션에서 같은 데이터를 변환한다면 그 값이 어떻게 변환될 지 (어떤 트랜젝션이 먼저 실행되는지에 따라) 예측 불가능하기 때문에 많은 문제들을 발생 시킬 수 있습니다.
  • Durability (지속성): 한 번 데이터베이스에 저장된 데이터는 그 데이터의 변환에 대한 다른 트랜젝션 요청이 없을 때까지 항상 같은 값을 유지함을 보장하는 특성을 데이터베이스에서의 지속성이라고하며 갑작스럽게 전원이 꺼졌을 때나 시스템 오류 같은 문제가 발생했을 때 자동으로 데이터베이스에 저장된 데이터의 복구도 이 특성에 포함됩니다.

References
  • https://en.wikipedia.org/wiki/ACID
  • http://terms.naver.com/entry.nhn?docId=860356&cid=42346&categoryId=42346
  • http://www.service-architecture.com/articles/database/acid_properties.html
  • http://searchsqlserver.techtarget.com/definition/ACID
  • https://vladmihalcea.com/2014/01/05/a-beginners-guide-to-acid-and-database-transactions/


728x90
반응형

'Web Programming > database' 카테고리의 다른 글

ORA-ROWSCN  (0) 2018.09.13
오라클 GRANT SYNONYM 권한주기  (0) 2018.09.06
org.apache.ibatis.exceptions.PersistenceException  (0) 2018.09.04
mybatis if else choose  (0) 2018.08.30
queryForObject 와 queryForList  (0) 2014.04.15
728x90
반응형

Cache vs Cookies: 웹브라우저 캐시와 쿠키의 차이 점

Cache와 Cookies는 특정 웹사이트의 접속 속도 개선을 위해 클라이언트의 컴퓨터에 임시로 저장되어 있는 데이터란 개념은 같지만 아래와 같은 다른 점들이 있습니다.

Cookies란?
Cookies란 넷스케이프의 Netscape Navigator란 자사의 웹브라이저를 통해 소개된 기술로 특정 웹페이지에 대한 유저의 행동 패턴을 주로 저장하는 작은 사이즈의 텍스트 파일입니다. 주로 저장되는 정보로는 특정 웹사이트나 웹페이지에 얼마나 자주 또는 몇 번 방문했는지 그리고 특정 배너를 클릭을 했는지 했으면 얼마나 자주 했는지 검색 시 어떤 키워드를 사용했는지 등의 정보들입니다. 또한 웹서버 쪽에서 유저를 식별하기 위한 Session Tracking의 방법으로 사용되기도 합니다. Cookies 정보는 오직 그 Cookies를 작성한 웹서버만이 Access 가능하며 대부분의 Cookies는 Expiration Date (사용기한)이 정해져 있어서 기한이 만료되면 자동으로 삭제됩니다. 

Cache란?

Cache란 웹페이지 Resource 파일들 (오디오, 비디오, 이미지 등)의 임시 저장소로 다음에 같은 웹페이지 (또는 웹사이트) 접속 시 페이지 로딩 속도를 개선해주는 역할을 합니다. 

차이점
1. 유저의 컴퓨터에 임시로 저장되어 있는 점은 같지만 사용 목적은 위에 이야기한 것 처럼 다릅니다.
2. Cache는 오직 웹페이지 로딩 속도 개선을 위해서만 사용되지만 Cookies는 유저 관련된 여러가지 다른 목적으로 사용 가능합니다.
3. Cache는 오디오, 비디오, 이미지 등의 Resource 파일등을 주로 저장하는 반면에 Cookies는 User preference (유저가 웹사이트 접속 시 하는 행동 패턴 또는 관련 정보) 위주의 정보를 저장합니다.
4. 보통 Cache는 유저가 삭제할 때까지 유저의 컴퓨터에 저장되지만 Cookies는 서버 쪽에서 설정한 기간이 지나면 자동으로 삭제됩니다.
5. Cookies는 웹서버의 Access가  가능한 반면에 Cache는 Access가 불가능합니다. (사실 Access를 해야할 이유도 없지만요)

References
1. http://www.differencebetween.com/difference-between-cache-and-vs-cookies/
2. http://www.techcuriosity.com/resources/difference_between/difference_between_cache_and_cookies.php
3. http://www.guidingtech.com/8925/what-are-browser-cache-cookies-does-clearing-them-help/
4. https://answers.yahoo.com/question/index?qid=20081201160300AAa1kh8
5. http://www.ehow.com/info_8304895_difference-between-cookie-cache.html


728x90
반응형

'Web Programming' 카테고리의 다른 글

tracert와 traceroute의 차이점  (0) 2018.08.30
프레임워크와 라이브러리의 차이  (0) 2018.08.29
WebSocket이란?  (0) 2018.08.29
SonarQube란?  (0) 2018.08.29
Jenkins 서버란?  (0) 2018.08.29
728x90
반응형

앵귤러JS (AngularJS) 란?


앵귤러JS란
앵귤러JS (짧게 앵귤러라고도 합니다)는 MIT License로 무료로 배포되고 구글이 지원하고 있는 오픈 소스 웹 어플리케이션 프레임워크입니다. 앵귤러JS는 자바스크립트로 제작되었으며 기본적으로 MVC (Model-View-Controller) 모델 지원과 같은 다른 웹 어플리케이션 프레임워크에서도 지원하는 기능을 제공할 뿐만 아니라 Two-way data binding이나 directive 같은 새로운 개념의 기술도 지원하여 웹 개발자들이 해야할 많은 일들의 단축 및 좀더 파워풀하고 테스트가 용이한 웹 어플리케이션 제작에 도움이 되는 기능을 제공하고 있습니다.
아직 나온지 5년 정도 밖에 안된 프레임워크지만 구글의 전폭적인 지원 속에 다른 경쟁 프레임워크들이 비해 가장 빨리 커뮤니티가 성장하고 있는 프레임워크가 아닐까 생각합니다. 

왜 사용하나요?
  • 체계적인 코드작성 지원: 개인적인 경험으로 JavaScript는 다른 프로그래밍 언어에 비해서 체계적으로 프로그래밍하기 어려운 언어인 것 같습니다. 그래서 프로젝트 사이즈가 커지면 금방 이해하기 힘들어지고 Debug가 어려워지는 Spaghetti Code가 되기 쉽습니다. 그렇지만 앵귤러같은 프레임워크를 사용하게 되면 이런 부분을 일정 부분 해소해줍니다. 
  • 앵귤러는 다른 프레임워크에 비교했을 때 아래와 같은 장점들을 가지고 있습니다. 
    • 구글의 지원 속에 개발자 커뮤니티가 가장 빠르게 성장하고 있고 앞으로도 성장 가능성이 큽니다. 
    • Two Way Data-Binding: 앵귤러가 제공하는 여러가지 기능 중 가장 유용한 기능이 이 Two Way Data-Binding 일 것입니다. 이 기능에 대해서 간단하게 이야기하면 Model과 View에서 사용되고 있는 데이터를 연결해줘서 어느 한쪽에서 이 데이터 값이 변화하면 다른 쪽에도 바로 업데이트가 되도록 해주는 기능입니다. 보통 이 기능 구현을 위한 코드가 전체 프로젝트의 80% 정도를 차지한다고 하는데 앵귤러는 기본적으로 이 기능을 제공하기 때문에 많은 코드의 반복을 피할 수 있습니다.
    • Dependency Injection 기능을 기본적으로 지원하기 때문에 컴포넌트들 간의 서비스 사용 및 Dependency 관리가 용이하며 각각의 컴포넌트들이 Decoupling (코드상에서 밀접하게 연관되어 있지 않음)되어 있기 때문에 테스트 하기가 쉽습니다. Dependency Injection에 대한 좀더 자세한 사항은 저의 다른 블로그 글인 'Dependency Injection이란'을 참고하시기 바랍니다. 
    • Directives: 앵귤러는 Directives를 제공함으로써 개발자가 자신의 용도에 맞게 HTML tag를 제작하여 사용할 수 있게 하였으며 DOM attributes도 수정 가능하게 하였습니다.


출처:
위키피디아: http://en.wikipedia.org/wiki/AngularJS
사이트포인트: http://www.sitepoint.com/10-reasons-use-angularjs/


728x90
반응형

'Web Programming > Angular - TypeScript' 카테고리의 다른 글

Angular 강좌 및 참고사이트  (0) 2018.08.28
Angular Component LifeCycle  (0) 2018.08.28
Angular Pipe  (0) 2018.08.28
Angular Directive  (0) 2018.08.28
Angular Material Table Event  (0) 2018.08.28
728x90
반응형

Dependency Injection (의존성 주입)이란?

Dependency Injection이란?
Dependency Injection이란 객체 또는 구성 요소간의 종속관계를 소스코드로 설정하지 않고 외부의 설정파일을 통해서 주입하도록 하는 디자인 패턴으로 주로 알려져 있는데요 쉽게 이야기하면 한 객체 안에 다른 객체가 사용되면 두 객체 간에 종속관계가 생기는 것이고 다른 객체를 포함한 객체를 생성하려면 포함된 객체가 미리 생성이 되어 있거나 그렇지 않을 경우 자동으로 생성을 해줘야 하는데 이 부분을 따로 코딩하지 않고 외부의 설정 파일을 통해서 설정해둬서 Dependency Injection 기능을 제공하는 프레임워크 (예를 들어 Spring 같은)에서 자동으로 생성하게 하는 기술입니다.

왜 사용하나요?
Dependency Injection을 사용하는 가장 큰 이유는 아래와 같습니다.
1. Loosely coupled: Dependency Injection는 보통 서비스 또는 인터페이스 개념과 같이 사용이 되는데요 한 객체를 다른 객체에 포함할 때 클래스 형태로 포함시키는게 아니라 인터페이스 형식으로 포함을 시키기 때문에 외부 설정파일이나 스프링 프레임워크 같은 경우에는 어노테이션 값의 변화를 통해 다양한 서비스를 사용할 수 있습니다. 위의 설명한 내용에 대해서 아래에 예를 참조하세요.

예1 - 클래스 형태로 포함시키는 경우 (Java)
public class Foo {
    .....
}

public class Poo {
   private Foo foo  = new Foo();
}

예2 - 인터페이스 형태로 포함시키는 경우 (Java)
public Interface FooService {
   .....
}

public class FooServiceImpl implements FooService {
   .....
}

public class Poo {
  private FooService fooServ; 
}

2. Testability: Dependency Injection을 사용하게 되면 위에 설명한 것처럼 객체 간의 관계가 느슨해지기 때문에 유닛 테스트와 같은 테스트를 작성하기가 수월해집니다. 위의 두번 째 예처럼 다른 객체에 포함된 인터페이스 형태의 서비스 같은 경우에 Mock를 하여 유닛테스트를 작성하게 되면 그 서비스와 상관없이 작동가능한 테스트를 만들 수 있습니다.

마지막으로...
Dependency Injection은 단순히 그 의미나 사용 방법을 이해하려고 하기 보다는 왜 사용이 되는지를 파악해야 이해하기가 쉽습니다. 또한 같이 사용되고 있는 서비스의 개념과 왜 서비스의 형태로 사용되어야 하는지 등을 이해해야 좀더 이해하기가 쉬운 기술입니다. 


728x90
반응형

'Web Programming > spring' 카테고리의 다른 글

BeanCreationException  (0) 2018.09.04
스프링 프레임워크 (Spring Framework)란?  (0) 2018.08.29
Spring MVC 프로세스  (0) 2018.08.29
Spring AOP with Annotation  (0) 2018.08.29
Spring AOP with XML  (0) 2018.08.29
728x90
반응형

WebSocket이란?

WebSocket이란?

WebSocket이란 Transport protocol의 일종으로 쉽게 이야기하면 웹버전의 TCP 또는 Socket (소켓)이라고 이해하시면 됩니다.  WebSocket은 서버와 클라이언트 간에 socket connection을 유지해서 언제든 양방향 통신 또는 데이터 전송이 가능하도록 하는 기술이며 2008년에 HTML5에 포함이 되어서 여러 번의 토론을 통해 프로토콜이 제정되었고 2009년 구글 크롬을 시작으로 여러 웹브라우저에서 이 기술을 적용하여서 현재 Real-time web application 구현을 위해 널리 사용되어지고 있습니다. 참고로 Real-time web application이란 서버 쪽 또는 클라이언트 쪽 데이터가 실시간으로 업데이트 되는 웹 어플리케이션을 의미합니다. 

왜 사용하는가요?

WebSocket을 사용하는 이유 또는 사용시 얻을 수 있는 장점에 대해서 이해를 하려면 WebSocket 이전에 사용되었던 기술과 어떤 차별성이 있는지를  이해하는게 중요합니다. 우선 웹어플리케이션에서 기존의 서버와 클라이언트 간의 통신은 대부분 HTTP를 통해 이루어 졌으며 HTTP는 Request/Response 기반의
Stateless protocol입니다. 무슨 말이냐 하면 서버와 클라이언트 간의 Socket connection 같은 영구적인 연결이 되어 있지 않고 클라이언트 쪽에서 (예를 들어 웹브라우저 쪽에서)  필요할 때 Request를 할 때만 서버가 Response를 하는 방식으로 통신이 진행되는 프로토콜이란 뜻입니다. (짧게 이야기하면 클라이언트 쪽에서만 대화를 시작할 수 있는 한 방향 통신입니다.) 그래서 어떤 문제가 생기냐면 서버 쪽 데이터가 업데이트 되더라도  클라이언트 쪽 (예를 들어 웹페이지)에는 화면을 Refresh 하지 않는 한 바뀐 데이터가 업데이트가 되지 않는 문제가 발생합니다. 그렇지만 이런 문제는 일반적은 웹 어플리케이션에서는 기존에 있던 임시 방편인 Long polling 이라던가 Ajax를 사용해도 어느 정도 해결이 가능하지만 데이터의 빠른 업데이트가 아주 중요한 요소 중에 하나인 어플리케이션 (예를 들어 주식 관련 사이트라던가 비디오 채팅 어플리케이션)에서는 실시간 업데이트가 아주 중요하기 때문에 (그리고 기존의 Long Polling 같은 기술은 서버에 많은 부담을 주는 부작용이 있기 때문에) WebSocket이 아주 유용하고 중요한 기술로 사용되고 있습니다.
또한 WebSocket은 Stateful protocol이기 때문에 클라이언트와 한 번 연결이 되면 계속 같은 라인을 사용해서 통신을 하기 때문에 HTTP 사용 시 필요없이 발생되는 HTTP와 TCP 연결 트래픽을 피할 수 있습니다.  마지막으로 WebSocket은 HTTP와 같은 포트 (80)을 사용하기 때문에 (Secure한 채널 같은 경우에는 HTTPS와 같은 443을 이용) 기업용 어플리케이션에 적용할 때 방화벽을 재설정하지 않아도 되는 장점도 있습니다. (대부분의 기업 방화벽은 외부에서의 접속은 HTTP나 HTTPS만을 기본으로 
허용하고 있으며 만약 이외의 포트를 허용해야 할 경우에는 방화벽의 설정을 수정해야 하는데 큰 회사일 수록 방화벽 설정 수정 절차가 복잡하기 때문에 HTTP와 같은 포트를 사용한다는 점이 꽤 큰 장점이 될 수도 있습니다.)

작동 원리 및 그 외의 정보

우선 서버와 클라이언트 간의 WebSocket 연결은 HTTP 프로토콜을 통해 이루어집니다. 만약 연결이 정상적으로 이루어진다면 서버와 클라이언트 간에 WebSocket 연결 (TCP/IP 기반으로 하는)이 이루어지고 일정 시간이 지나면 HTTP 연결은 자동으로 끊어집니다. 
기본적으로 WebSocket API는 아주 간단한 기능들만을 제공하기 때문에 대부분의 경우 SockJS나 Socket.IO 같은 오픈 소스 라이브러리를 많이 사용하고 있으며 메세지 포멧 또한 STOMP 같은 프로토콜을 같이 이용합니다. 마지막으로 스프링 프레임워크도 WebSocket을 간단한 메세지 브로커랑 SockJS 그리고 STOMP와 같이 지원하고 있습니다. 

WebSocket 사용의 어려운 점

WebSocket은 사용시 위에 서술한 것과 같은 장점들을 주지만 그에 못지 않는 비용을 지불해야 합니다. 아래는 WebSocket 사용 시 발생할 수 있는 어려운 점 또는 문제점들입니다. 
1. 프로그램 구현에 보다 많은 복잡성 초래: WebSocket은 HTTP와 달리 Stateful protocol이기 때문에 서버와 클라이언트 간의 연결을 항상 유지해야 하며 만약 바정상적으로 연결이 끊어졌을 때 적절하게 대응해야 합니다. 이는 기존의 HTTP 사용 시와 비교했을 때 코딩의 복잡성을 가중시키는 요인이 될 수 있습니다. 
2. 서버와 클라이언트 간의 Socket 연결을 유지한다는 것 자체가 비용이 드는 일입니다. 특히나 트래픽양이 많은 서버 같은 경우에는 CPU에 큰 부담이 될 수 있습니다. 
3. 오래된 버전의 웹 브라우저에서는 지원하지 않습니다. (물론 SockJS 라이브러리 같은 경우에는 Fallback option을 제공하고 있습니다.) 참고로 인터넷 익스플로어 같은 경우에는 10 버전부터 지원합니다. 
4. 이건 제 개인적인 경험인데 서버와 클라이언트 간의 연결이 끊어졌을 때 생성되는 에러 메세지가 구체적이지 않아서 (예를 들어 여러가지 다른 이유로 연결이 끊어졌는데 에러 메세지가 같은 경우) 디버깅을 하는데 어려움이 많았습니다. 

아무리 좋은 기술이라 할지라도 모든 경우에 유용할 수는 없는 법이기 때문에 프로그램에 꼭 필요한 기술인지 잘 체크하고 수용 여부를 결정하는 것이 바람직합니다. 

대표적인 사용예

1. 페이스북 같은 SNS 어플리케이션
2. LOL 같은 멀티플레이어 게임들
3. 구글 Doc 같이 여러 명이 동시 접속해서 수정할 수 있는 Tool
4. 클릭 동향 분석 데이터 어플 (특정 시간동안 어느 사이트에 주로 접속했는지 등의 정보를 파악하는 어플)
5. 증권 거래 정보 사이트 및 어플
6. 스포츠 업데이트 정보 사이트 및 어플
7. 화상 채팅 어플
8. 위치 기반 어플
9. 온라인 교육 사이트 및 어플

References

https://www.websocket.org/aboutwebsocket.html
http://www.javaworld.com/article/2071232/java-app-dev/9-killer-uses-for-websockets.html
https://en.wikipedia.org/wiki/WebSocket
https://samsaffron.com/archive/2015/12/29/websockets-caution-required
https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API


728x90
반응형

'Web Programming' 카테고리의 다른 글

프레임워크와 라이브러리의 차이  (0) 2018.08.29
캐시와 쿠키의 차이  (0) 2018.08.29
SonarQube란?  (0) 2018.08.29
Jenkins 서버란?  (0) 2018.08.29
Apache Kafka (아파치 카프카)란?  (0) 2018.08.29

+ Recent posts