Transaction

|

Transaction

ACID

  • A ( Atomicity ) 원자성
    • 트랜젝션 내의 작업은 모두 성공, 또는 실패해야만 한다.
  • C ( Consistency ) 일관성
    • 무결성 제약 조건을 만족 (pk, fk, not null 등) 하고, 일관성 있는 상태를 유지.
  • I ( Isolation ) 격리성
    • 여러 트랜젝션이 동시에 일어나더라도, 서로에게 영향을 끼치지 않게 격리.
  • D ( Durability ) 지속성
    • 문제가 발생하였을 때, 성공한 트랜젝션들을 복구 가능해야 한다. ( 로그를 읽어서 재처리 등 )

격리 수준

  • READ UNCOMMITED
    • 커밋하지 않은 데이타를 읽을 수 있다.
  • READ COMMITED
    • 커밋한 데이타만 읽을 수 있다. 반복 조회 시에 데이타가 변경될 수 있다.
  • REPEATABLE READ
    • 반복 조회 시에 읽었던 데이타는 달라지지 않지만, 결과 집합의 갯수가 달라질 수 있다. ( Phantom-Read )
  • SERIALIZABLE
    • Phantom-Read 가 발생하지 않는다.

JPA

|

JPA

정의

자바 진영의 ORM 표준 기술이며, 하이버네이트를 기반으로 만들어졌다.

  • 장점
    • 디비 벤더에 종속적이지 않다.
    • 테이블 생성, 변경, 테스트 등이 쉽다.
    • 객체 지향적으로 개발이 가능.
  • 단점
    • 성능상 문제가 발생할 가능성이 있다. ( N +1 문제 )
    • 복잡한 쿼리는 직접 쿼리를 작성하는 게 낫다.
    • 학습 곡선이 높다.

특징

CASCADE TYPE

어떤 조작을 몇 번을 반복하더라도 결과가 동일한 것.

  • ALL : 모두 적용
  • PERSIST : 영속
  • MERGE : 병합 ( 준영속 상태를 영속 상태로 변환 )
  • REMOVE : 삭제
  • REFRESH : 엔티티를 최신 상태로 다시 캐쉬한다.
  • DETACH : 준영속 상태로 변환

OrphanRemoval

자식 엔티티의 참조만 제거하면, 자식 엔티티 또한 자동으로 삭제되게 하는 옵션.

영속성 콘텍스트

어플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB 역할을 하며, 1차 캐쉬, 쓰기 지연, 변경 감지, 지연 로딩 등의 기능을 담당 한다. spring-data-jpa 에서는 transaction 과 생명 주기를 같이 한다. ( OSIV 설정이 켜져 있다면, 트랜젝션이 종료되더라도 영속성 콘텐스트는 요청 처리가 끝날 때까지 살아남게 된다. )

Rest-API

|

Rest-API

정의

Representational State Transfer ( 웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍쳐 )

  • 장점 : URI 와 Http Method 만으로도 쉽게 의미를 파악할 수 있다. HTTP 의 장점을 그대로 사용 가능 ( 기존 인프라 사용, 캐쉬 등 )

  • 단점 : 정확한 표준이 없다. 레거시 DB 구조에는 대응하기 어렵다.

관련 용어

TCP / IP 4 계층

  • 애플리케이션 : HTTP, NTP, SSH, SMTP
  • 트랜스포트 : UDP / TCP, 데이터의 무결성 보장
  • 인터넷 : IP, 네트워크에서 실제로 패킷을 주고 받음
  • 네트워크 인터페이스 : 이더넷, 물리적인 케이블, 네트워크 어댑터

HTTP 2.0

  • 기존 버전(1.1) 의 속도 개선, 헤더 압축, 단일 TCP 커넥션에서 병렬 페이지 로딩 구현, 서버 PUSH 기능 등.

특징

주요 특성

  • 유니폼 인터페이스
    • 특정 언어나 기술에 종속되지 않는다.
  • 스테이트리스
  • 캐쉬 가능
    • 콘텐츠에 변화가 없다면 304 응답으로 HTTP 캐쉬 사용 가능.
  • 자체 표현 구조
    • 직관적으로 이해 가능한 구조.
  • 클라이언트 - 서버 구조
  • 계층형 구조

멱등성

어떤 조작을 몇 번을 반복하더라도 결과가 동일한 것.

  • GET, HEAD : 멱등이고 안전하다.
  • PUT, DELETE : 멱등이지만, 안전하지 않다.
  • POST : 멱등이지 않고, 안전하지도 않다.

REST 에서 POST 와 PUT 의 차이

POST 는 클라이언트에서 URI 를 결정할 수 없고, PUT 은 결정 가능하다.

  • 트위터 글쓰기 ( POST ), wiki 글쓰기 ( PUT )

인증

  • BASIC : 이름:패스워드를 Authorization 헤더에 넣어 전송.
  • DIGEST : 이름:패스워드에 서버에서 전달받은 해쉬 값을 이용하여 sha-1 등으로 암호화해서 전송.
  • 제 3 자 서비스 인증
    • OpenId
    • OAuth : 서비스간의 권한 위임. 데이타 전달과정을 동의 받아 수행.
  • JWT

트랜젝션 보장 방법

  • /transactions 등의 리소스를 만들어 트랜젝션으로 묶을 API 를 추가하고, 리소스 요청을 통해 커밋 메시지를 보내는 방법.
  • 단일 API 내에서의 일괄 처리, 상위 리소스에서 조작.

베타 제어

  • 비관적 잠금 ( Pessimistic Lock )
    • 경합이 발생하지 않도록, 처음에 LOCK 을 걸고 시작.
  • 낙관적 잠금 ( Optimistic Lock )
    • 갱신 요청을 최종적으로 날릴 때, 변경 여부를 확인.

HATEOS

response 에 다음 액션이나, 관계된 리소스에 대한 HTTP 링크를 포함.

CORS

스크립트 동작을 허용할 서버를 지정 ( Access-Control-Allow-Origin : * )

보안


인증 방법

  • API 키 방식 : 특정 사용자만 알수 있는 Key 를 사용.
  • API 토큰 방식 : 기간이 유효한 토큰을 발급
    • HTTP BASIC AUTH
    • Digest Access Authentication
      • 서버로 부터 받은 nonce 난수 값을 받고, 해쉬화하여 서버로 전송. 주로 SHA 사용
    • 클라이언트 인증 추가
    • 제 3자 인증 방식 ( OAuth )
      • 파트너 서비스에서 자사 서비스 사용자의 인증을 거쳐서 권한 전달.
    • IP 화이트 리스트 터널링
    • Bi-directional Certification
      • 클라이언트에서도 인증서를 가지고 양방향으로 SSL 제공.
    • JWT

JWT

토큰 자체가 정보를 가짐으로서, 구현이 단순해진다.

  • 장점 : 사용이 쉽고, 개발 부담이 적다. 서비스를 무상태로 유지 가능.
  • 단점 : 토큰의 길이가 길어진다. 한번 토큰을 발급하면 중도 폐기가 불가능.
  • 변조 방지를 위해 HMAC 방식의 알고리즘 사용
    • HEADER.PAYLOAD.SIGNATURE

AOP

|

AOP 의 특징

  • 정의 공통 관심사를 개별 모듈로 분리하고 여러 영역에 적용 가능하게 함.

  • 장점 예외처리, 로깅 처리, 트랜젝션 처리 등을 프로젝트 후반에 결정 가능하고, 그에 따른 변경에 자유롭다.

  • 단점 의도치 않은 무분별한 적용으로 인해 전체 성능이 저하될 수 있다.

  • 예시 spring @transactional

용어 정리

  • 조인 포인트 aop 를 사용하여 추가 로직을 삽입할 수 있는 특정 지점.

  • 어드바이스 특정 조인 포인트에서 실행되는 코드 ( 비포 / 애프터 어드바이스 등)

  • 포인트 컷 언제 어드바이스를 실행할 지 정의할 대 사용하는 조인포인트의 모음.

  • 애스펙트 어드바이스와 포인트 컷의 조합

  • 위빙 코드 내에 애스펙트를 실제로 삽입하는 과정

  • 타겟 실행 흐름이 AOP 에 의해 수정된 객체

  • 인트로덕션 추가 메소드나 필드를 도입해 객체의 구조를 수정

  • 정적 AOP 빌드 시에 바이트 코드를 직접 수정, 성능이 좋으나 재컴파일 필요. 예) AspectJ 컴파일 시점 위빙.

  • 동적 AOP 위빙 절차가 런타임 시점에 동적으로 수행됨, 정적 AOP 에 비해 성능은 떨어지나 재컴파일 필요 없음. 예) Spring AOP

  • CGLIB 동적으로 바이트 코드 생성. 인터페이스 없어도 사용 가능.

  • JDK 동적 프록시 인터페이스를 가지는 객체의 프록시만 지원함.

Github pages 를 이용한 블로그 시작!

|