글쓴이 보관물: YOUNGMIN JUN

YOUNGMIN JUN에 대하여

컴퓨터 : 맥북프로 레티나 13인치, 아이맥 27인치, 소니 TT16, 서피스2 RT, 서피스2 프로, 후지찌 P1610

Spring Transactional

PROPAGATION Behavior

Propagation Behavior(전달 행위)는 Transaction 전파 규칙을 정의 하기 위해 사용된다.

Attribute Name Description
PROPAGATION_MADATORY 반드시 Transaction 내에서 메소드가 실행되어야 하고, Transaction이 없는 경우에는 예외를 발생시킨다.
PROPAGATION_NESTED Transaction에 있는 경우, 기존 Transaction 내의 nested transaction 형태로 메소드를 실행하고, nested transaction 자체적으로 commit, rollback이 가능하다.
Transaction이 없는 경우, PROPAGATION_REQUIRED 속성으로 행동한다.
PROPAGATION_NEVER Transaction 컨텍스트 없이 실행되어야 하며 Transaction이 있으면 예외를 발생시킨다.
PROPAGATION_NOT_SUPPORTED Transaction 없이 메소드를 실행하며, 기존의 Transaction이 있는 경우에는 이 Transaction을 호출된 메소드가 끝날 때까지 잠시 보류한다.
PROPAGATION_REQUIRED Transaction 컨텍스트 내에서 메소드가 실행되어야 한다.
기존 Transaction이 있는 경우에는 기존 Transaction 내에서 실행하고, 기존 Transaction이 없는 경우에는 새로운 Transaction을 생성한다.
PROPAGATION_REQUIRED_NEW 호출되는 메소드는 자신 만의 Transaction을 가지고 실행하고, 기존의 Transaction들은 보류된다.
PROPAGATION_SUPPORTS 새로운 Transaction을 필요로 하지는 않지만, 기존의 Transaction이 있는 경우에는 Transaction 내에서 메소드를 실행한다.

ISOLATION Level

Isolation Level(격리수준)은 각 Transaction의 상태에 따른 데이타 접속에 대한 수준을 지정해준다.
예를 들어, 한 사용자가 어떠한 데이터를 수정하고 있는 경우 다른 사용자들이 그 데이터에 접근하는 것을 차단함으로써 완전한 데이터만을 사용자들에게 제공한게 된다.
또한, 많은 사용자들의 수정 작업으로 인하여 통계 자료를 작성할 수 없는 사용자를 위하여 읽기 작업을 수행할 수 있도록 Isolation Level을 변경할 수 있다.

Attribute Name Description
ISOLATION_DEFAULT 개별적인 PlatformTransactionManager를 위한 디폴트 격리 레벨
ISOLATION_READ_COMMITED 이 격리수준을 사용하는 메소드는 commit 되지 않은 데이터를 읽을 수 없다. 쓰기 락은 다른 Transaction에 의해 이미 변경된 데이터는 얻을 수 없다.
따라서 조회 중인 commit 되지 않은 데이터는 불가능하다. 대개의 데이터베이스에서의 디폴트로 지원하는 격리수준이다.
ISOLATION_READ_UNCOMMITED 가장 낮은 Transaction 수준이다. 이 격리수준을 사용하는 메소드는 commit 되지 않은 데이터를 읽을 수 있다. 그러나 이 격리수준은 새로운 레코드가 추가되었는지 알 수 없다.
ISOLATION_REPEATABLE_READ ISOLATION_READ_COMMITED 보다는 다소 조금 더 엄격한 격리 수준이다. 이 격리 수준은 다른 Transaction이 새로운 데이터를 입력했다면, 새롭게 입력된 데이터를 조회할 수 있다는 것을 의미한다.
ISOLATION_SERIALIZABLE 가장 높은 격리수준이다. 모든 Transaction(조회를 포함하여)은 각 라인이 실행될 때마다 기다려야 하기 때문에 매우 느리다.
이 격리수준을 사용하는 메소드는 데이터 상에 베타적 쓰기를 락을 얻음으로써 Transaction이 종료될 때까지 조회, 수정, 입력 데이터로부터 다른 Transaction의 처리를 막는다. 가장 많은 비용이 들지만 신뢰할만한 격리 수준을 제공하는 것이 가능하다.

Git에서 CRLF 개행 문자 차이 해결법

Windows에서는 Line Breaking으로 CR(Carriage-Return, \r)LF(Line Feed, \n)을 사용하고 UnixMac OS에서는 LF만 사용한다.
이로 인해서 실제 코드는 변경된게 없는데 소스의 CR/LF 때문에 변경으로 인식하여 Commit을 하게되는 문제가 발생된다. 이런 문제를 해결하기 위해서 OS가 달라도 문제가 없도록 CRLF에 대한 설정을 해줘야 한다.

core.eol

git에서 Line Breaking을 어떻게 처리할지에 대한 항목

  • native
  • 기본설정. 시스템에서 Line Breaking을 처리하는 방법에 따른다. Windows에서는 CRLF를 사용하고 Linux, OS XLF만 사용
  • crlf
  • CRLFLine Breaking으로 사용
  • lf
  • LFLine Breaking으로 사용

설정방법

## 설정
git config --global core.eol native

## 설정 확인
git config --global --list | grep core.eol

core.autocrlf

git은 저장소 메타 데이타 디렉터리인 .git 폴더에 모든 이력 데이타를 갖고 있다. 이력 데이타는 key/value 형식의 데이타베이스이며 core.autocrlftext filegit object databasecheckin, checkout 할때 어떻게 처리할지를 설정하는 변수

  • false
  • 기본 설정. 파일에 CRLF를 썼든 LF를 썼든 git은 상관하지 않고 파일 그래도 checkin, checkout한다. 이 설정은 Line Breaking이 다른 OS에서는 text file이 변경되었다고 나오므로 위에서 언급한 여러 가지 문제가 발생할 수 있다.
  • true
  • text fileobject database에 넣기전에 CRLF를 LF로 변경
  • input
  • LFLine Breaking으로 사용

해결방법1 – autocrlf 설정 사용

OS별 CRLF 차이로 인한 문제를 막기 위해 OS별로 다음과 같이 설정을 한다.

Windows

Windows에서는 CRLF를 사용하므로 저장소에서 가져올 때 LF를 CRLF로 변경하고 저장소로 보낼 때는 CRLFLF로 변경하도록 true로 설정

git config --global core.autocrlf true

LINUX, MAC OS

리눅스, 맥, 유닉스는 LF만 사용하므로 input으로 설정

git config --global core.autocrlf input

해결방법2 – .gitattributes 사용

git은 텍스트 파일의 속성을 .gitattributes 파일을 통해 설정할 수 있으며 여기에는 CRLF 처리도 지정할 수 있다. .gitattributes 를 저장소에 커밋하면 다른 클라이언트는 별도의 설정이 필요없다.

# Auto detect text files and perform LF normalization
*        text=auto

*.cs     text diff=csharp
*.java   text diff=java
*.html   text diff=html
*.css    text
*.js     text
*.sql    text

*.csproj text merge=union
*.sln    text merge=union eol=crlf

*.docx   diff=astextplain
*.DOCX   diff=astextplain

# absolute paths are ok, as are globs
/**/postinst* text eol-lf

# paths that don't start with / are treated relative to the .gitattributes folder
relative/path/*.txt text eol-lf

* 만약 git clientegit을 사용하면 .gitattributes 를 읽지 못해 제대로 동작을 안 하므로 방법1의 autocrlf를 사용하는 것이 좋다.

참고주소

  • https://www.lesstif.com/pages/viewpage.action?pageId=20776404