Yarn 이란?

  • Javascript 패키지 매니저 
  • 페이스북에서 만든 npm

장점

  • Yarn은 패키지를 순서대로 설치하는 npm과 달리 패키지를 병렬로 설치하므로 설치 속도가 빠르다.
  • Yarn은 캐싱을 이용하기 때문에 패키지 설치가 더 빠르다. Yarn은 설치한 패키지를 유저 디렉토리에 저장해서 캐싱한다

Yarn 주의사항

  • yarn 과 npm은 가급적이면 혼용하지 않는게 좋다.

Yarn 설치

  • macOS에서 설치
$ brew install yarn
  • npm으로 설치
$ npm install -g yarn

 

낙관적 락 (Optimisstic Lock)


낙관적 락 (Optimisstic Lock) 이란?

  • 락이 생길 경우가 없다고 낙관할때
  • 어플리케이션 레벨에서 제공하는 Lock 기능을 사용
  • JPA가 제공하는 엔티티의 버전 관리 기능을 사용
  • 트랜잭션 커밋 전에는 트랜잭션 충돌을 알 수 없음

JPA가 제공하는 낙관적 락 옵션(LockModeType)

  • NONE :  엔티티를 수정하는 시점에 버전이 증가함
    (엔티티에 @Version이 있으면 기본으로 적용되는 락 옵션)
  • OPTIMISTIC :  엔티티를 조회하는 시점에 버전이 증가함
    (Dierty Read 와 Non-Repeatable Read를 방지)
  • OPTIMISTIC_FORCE_INCREMENT : 논리적으로 변경되었을 경우도 버전이 증가함
    (자식 엔티티만 변경되도 부모 엔티티의 버젼이 강제 증가)

* Non-Repeatable Read 이란 한 트랜잭션내에서 같은 쿼리를 두 번 수행했을 때, 결과가 다르게 나타나는 현상을 의미함

 

낙관적 락 옵션(LockModeType)  적용 예제

@Repository
public interface UserMasterJpa extends JpaRepository<UserMasterEntity, String> {
    /**
     * JPA가 제공하는 낙관적 락 옵션(LockModeType)
     * LockModeType.NONE <-- Entity 에 @Version 있다면 Default 임
     * LockModeType.OPTIMISTIC
     * LockModeType.OPTIMISTIC_FORCE_INCREMENT
     */
    @Lock(LockModeType.OPTIMISTIC)
    Optional<UserMasterEntity> findByUserId(Long id);
}

 

버젼 명시 예제

public class UserMasterEntity {

    @Id
    @Column(name = "USER_ID", nullable = false, length = 5)
    private String userId;
    
    @Version
    @Column(name = "DATA_VERSION", nullable = true, precision = 0)
    private Integer dataVersion;

}

 

Lock 을 사용함에 따라 발생할 수 있는 예외

  • ObjectOptimisticLockingFailureException
    (트랜잭션 커밋 시점에 버전이 같지 않으면 발생하는 예외)

사용시 주의사항

  • DB-Lock 을 사용하지 않지만 Dead-Lock이 발생할 수 있음
    (x-Lock이 사용될 경우)
  • 롤백(Rolback) 이슈(어플리케이션 단에서 롤백을 수행해야 함)

* Update 쿼리에 사용되는 모든 레코드에 exclusive lock(x-Lock)을 설정한다고 한다

 

락이 생길 경우가 없다고 낙관할때 사용하는게 좋아보임
(충돌이 예상되거나 충돌이 발생했을 때 비용이 많이 들것이라고 판단되는 곳에서는 사용하지 않는 것이 좋음)

비관적 락 (Pessimistic Lock)


비관적 락 (Pessimistic Lock) 이란?

  • DB에서 제공하는 Lock 기능을 사용
  • 엔티티가 아닌 스칼라 타입을 조회할 때도 사용가능
  • Lock을 획득할 때까지 트랜잭션은 대기 - Lock Timeout 설정가능

JPA가 제공하는 비관적 락 옵션(LockModeType)

  • PESSIMISTIC_WRITE :  베타락, 쓰기/읽기 Lock (Non-Repeatable Read를 방지)
  • PESSIMISTIC_READ :  공유락, 읽기 Lock 
  • PESSIMISTIC_FORCE_INCREMENT : 베타락, 쓰기/읽기 Lock, 낙관적락처럼 버저닝따라서 버전에 대한 컬럼이 필요
    (하이버네이트의 경우 nowait 를 지원하는 데이터베이스에 대해서 FOR UPDATE NOWAIT 옵션을 적용하고, 그렇지 않다면 FOR UPDATE 를 적용한다)

비관적 락 옵션(LockModeType)  적용 예제

@Repository
public interface UserMasterJpa extends JpaRepository<UserMasterEntity, String> {
    /**
     * JPA가 제공하는 비관적 락 옵션(LockModeType)
     * LockModeType.PESSIMISTIC_READ
     * LockModeType.PESSIMISTIC_WRITE
     * LockModeType.PESSIMISTIC_FORCE_INCREMENT
     */
    @Lock(LockModeType.PESSIMISTIC_READ)
    Optional<UserMasterEntity> findByUserId(Long id);
}

 

Lock Timeout 적용 예제 - DBMS에서 제공안할 수 도 있음

@Repository
public interface UserMasterJpa extends JpaRepository<UserMasterEntity, String> {
    /**
     * Lock Timeout은 락을 잡고 있는 최대 시간을 설정
     */
    @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="10000")})
    @Lock(LockModeType.PESSIMISTIC_READ)
    Optional<UserMasterEntity> findByUserId(Long id);
}

 

Lock Scope 적용 예제 - DBMS에서 제공안할 수 도 있음

@Repository
public interface UserMasterJpa extends JpaRepository<UserMasterEntity, String> {
    /**
     * 락 범위(Lock Scope)를 지정
     * NORMAL : 엔터티 자체를 잠급니다. 결합된 상속과 함께 사용하면 조상도 잠김
     * EXTENDED : NORMAL 과 동일한 기능을 포함하며 조인 테이블에서 관련 엔터티를 차단할 수 있습니다.
     */
    @QueryHints({@QueryHint(name = "javax.persistence.lock.scope", value = "EXTENDED")})
    @Lock(LockModeType.PESSIMISTIC_READ)
    Optional<UserMasterEntity> findByUserId(Long id);
}

 

Lock 을 사용함에 따라 발생할 수 있는 예외

  • PessimisticLockException
    (한 번에 하나의 Lock만 얻을 수 있으며, Lock을 가져오는데 실패하면 발생하는 예외)
  • LockTimeoutException
    (락을 기다리다가 설정해놓은 wait time을 지났을 경우 발생하는 예외)
  • PersistanceException
    (영속성 문제가 발생했을 때 발생하는 예외)

사용시 주의사항

  • @Lock 어노테이션이 붙은 메서드 호출은 @Transaction 내부에서 동작함
  • 만약 @Transaction 어노테이션의 영역(Scope) 밖에서 @Lock 어노테이션이 붙은 메서드를 호출한다면 아래와 같은 에러발생
    (javax.persistence.TransactionRequiredException: no transaction is in progress)

 

build.xml 실행시에 Specified VM install not found: type Standard VM, name jre6 라고 에러가 발생하는 경우의 해결법

#{이클립스워크스페이스}/.metadata/.plugins/org.eclipse.debug.core/.launches/프로젝트이름 build.xml.launch file”

위 파일을 지우고 다시 해보면 된다..

'Tools > Eclipse' 카테고리의 다른 글

이클립스 프로젝트 옆에 SVN Label 표시설정 하기  (0) 2020.07.08

ls -li 라는 옵션을 사용해서 파일목록을 가져옵니다.

 

목록에서 젤 앞부분에 위치한 프로세스넘버를 이용하여 지웁니다.

 

find . -inum 7607153 -exec rm -f {} \;

 

조건문과 함께 반복문은 프로그래밍에서 매우 중요하면서 가장 많이 사용하는 문법입니다.

for / in문과 for / of문 등을 설명할것이기에 5장 부터는 ES6++ 으로 작성할 것 입니다.

 

 

1. for문

for (시작; 조건; ) { 내용 } 이렇게 구성 되어 있습니다.

for (let i = 0; i < 3; i++) {
	console.log(`${i}번째 입니다`);
}
// 0번째 입니다
// 1번째 입니다
// 2번째 입니다

 

 

2. for / in 문

Object 와 Array를 학습해야합니다.

 

특정 객체의 열거 가능한 모드 프로퍼티(enumerable properties)를 루프 처리 합니다.


for (변수 in 객체식) {
    // 문장
}

 

객체와 for in 문

let obj = {name:"king", age:20}; 
for (let key in obj){ 
    console.log(`key : ${key} , value : ${obj[key]}`);
}
// key : name , value : king
// key : age , value : 20

배열과 for in 문

let arr = [1, 3, 5];
for (let num in arr){ 
    console.log(`idx : ${num}, value : ${arr[num]}`);
}
// idx : 0, value : 1
// idx : 1, value : 3
// idx : 2, value : 5

 

3. for / of 문

Symbol을 학습해야 합니다.

 

해당 문법은 ES6부터 추가 되었습니다.

 

let set = new Set([1, 1, 2, 2]);
for (let val of set){ 
    console.log(`set value : ${val}`);
}
// set value : 1
// set value : 2

let map = new Map();
map.set("name", "queen");
console.log(`map has : ${map.has("name")}`);
console.log(`map get : ${map.get("name")}`);

for (let [key, value] of map){     
    console.log(`map key : ${key} , value : ${value}`);
}
// map has : true
// map get : queen
// map key : name , value : queen

let arr = [2, 4, 6];
for (let val of arr){ 
    console.log(`arr value : ${val}`);
}
// arr value : 2
// arr value : 4
// arr value : 6

 

 

 

 

 

4. while, do / while문

let i = 3;

while ( i > 0 ) {
	console.log(`while: ${i}`);
    i--;
}

// while: 3
// while: 2
// while: 1 
// 이렇게 출력됩니다.

do {
	console.log(`while: ${i}`);
    i--;
} while ( i > 0 );

// while: 0

 

 

5. break과 continue

while문 안에 break 가 있으면 중단할 수 있습니다.

while문 안에 continue가 있으면 그 아랫부분은 실행하지 않고 다음 반복문으로 넘어갑니다

let i = 3;

while ( i > 0 ) {
	if(i === 1){
    	break;
	}
    if(i === 2){
    	continue;
	}
	console.log(`while: ${i}`);
    i--;
}
// while: 3

'JS > Javascript' 카테고리의 다른 글

4. JavaScript 조건문  (0) 2020.10.03
3. JavaScript 연산자  (0) 2020.10.03
2. JavaScript 데이터타입(변수)  (0) 2020.10.02
1. JavaScript 소개  (0) 2020.09.16

조건문이란 특정한 조건 아래서만 코드가 실행되게 하는 구문

if문 / switch문 / 삼항연산자

 

 

1. if문

 

조건식이 만족하면 if문 안에 내용을 실행, 조건문이 만족하지 않으면 else문 안에 내용을 실행

if(조건식) {
// 조건식이 true인 경우
} else {
// 조건식이 false인 경우
}
var a = 7;

if (a > 10) { // false
  console.log('10보다 큼');
} else if (a > 5) { // true
  console.log('5보다 큼'); // 실행
} else {
  console.log('5보다 작거나 같음');
}

다음은 자바스크립트에서 false로 인식하는 값들이다

  • 0

  • "", '' (빈값)

  • NaN

  • undefined

  • null

위 값들을 제외한 모든 값들은 모두 true로 인식한다

 

 

2. switch문

보통 else if가 많아졌을때 사용합니다.

var b = 1;

switch(b) {
  case 10 : 
	console.log("10입니다");
  	break;
  case 5 : 
  	console.log("5입니다");
  	break;
  case 1 : //조건값과 일치
  	console.log("1입니다"); // 실행
  	break;
  default: // 모든 조건값과 일치하지 않은 경우 실행할 명령
  	console.log("그 외 입니다");
}

 

 

3. 삼항연산자(조건연산자)

조건이 간단하고 명령어도 하나인 경우에 사용합니다.

 

(조건식) ? 조건식이 true인 경우 : 조건식이 false인 경우

var a = 20;
var b = a > 10 ? 15 : 6 // b = 15

여기서 a > 10 == true면 b 변수는 15가 되고, false면 6이 됩니다.

 

'JS > Javascript' 카테고리의 다른 글

5. JavaScript 반복문  (0) 2020.10.03
3. JavaScript 연산자  (0) 2020.10.03
2. JavaScript 데이터타입(변수)  (0) 2020.10.02
1. JavaScript 소개  (0) 2020.09.16

1. 산술연산자

덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나머지(%), 거듭제곱(**) 입니다.

 

연산자: x + y

 

var a = 1 + 2; //3

연산자: x - y

var b = 5 - 3; // 2

연산자: x / y

var c = 6 / 4; // 1.5
var d = 6 / 0; // Infinity

연산자: x * y

var e = 2 * 4; // 8

연산자: var1 % var2

var f = 8 % 3; // 2

연산자: var1 ** var2

var g = 2 ** 3; // 8

 

2. 문자열연산자

문자열과 문자열을 연결할때 사용합니다.

문자열과 숫자를 더하면 숫자가 문자열로 변경되어 문자열이 연결되는 형태로 계산됩니다.

 

연산자: val1 + var2

var str1 = 'hello ' + 'world'; // 'hello world'
var str2 = 'hello ' + 'world' + 123; // 'hello world123'

 

 

3. 증감연산자

++, -- 가 있습니다. 변수에 1을 더하거나 1을 빼줍니다. 

  • 피연산자 뒤에 붙여(예: x++) 접미사로 사용한 경우 증가하기 전의 값을 반환합니다.

  • 피연산자 앞에 붙여(예: ++x) 접두사로 사용한 경우 증가한 후의 값을 반환합니다.

연산자: x++ or ++x

var a = 1;
var x = ++a;
console.log("x = "+x, "a = "+a);
// x = 2 a = 2

var b = 1;
var y = b++;
console.log("y = "+y, "b = "+b);
// y = 1 b = 2

 

  • 피연산자 뒤에 붙여(예: x--) 접미사로 사용한 경우 감소하기 전의 값을 반환합니다.
  • 피연산자 앞에 붙여(예: --x) 접두사로 사용한 경우 감소한 후의 값을 반환합니다.

연산자: x-- or --x

var a = 1;
var x = --a;
console.log("x = "+x, "a = "+a);
// x = 0 a = 0
var b = 1;
var y = b--;
console.log("y = "+y, "b = "+b);
// y = 1 a = 0

 

4.논리연산자

&& = and(그리고),

|| = or(또는),

! = not(아닌)

var a = 10;
var b = 20;
(a < b) && (a * 2 == b); // true
(a > b) || (a * 2 <= 20); // true
!(a < b); // false

 

5. 비교연산자

== (같음),

!= (같지 않음),

>(큼),

<(작음),

>=(크거나같음),

<=(작거나같음),

=== (자료형까지 같음)

100 == 10 * 10; // true
6 != 2 * 2; // true
2 * 5 > 3 * 3; // true
6 * 3 <= 2 * 9; // true
3 === '3' // false
3 === 1+2 // true
console.log(0 == false); //true
console.log(0 === false); //false
console.log('' == false); //true
console.log('' === false); //false
console.log(null == undefined); //true
console.log(null === undefined); //false

'JS > Javascript' 카테고리의 다른 글

5. JavaScript 반복문  (0) 2020.10.03
4. JavaScript 조건문  (0) 2020.10.03
2. JavaScript 데이터타입(변수)  (0) 2020.10.02
1. JavaScript 소개  (0) 2020.09.16

+ Recent posts