가상화폐? 암호화폐?

최근 인기를 끌고 있는 블록체인(blockchain)기술과 그 기술을 활용한 가상화폐에 대해서 알아 봅시다.

블록체인은 사토시 나카모토가 2009년 처음 블록체인 기반 암호화폐 비트코인이 처음 등장하면서 세상에 나오게 되었습니다.

블록체인이란 거래내역을 블록이라는 단위로 묶고 다음에 발생한 블록을 끝에 붙이는 Linked List방식으로 연결 하는걸 체인이라고 하여 블록체인 이라고 합니다.

이 기술이 나온 2009년부터 현재 2017년 동안 거래내역이 변조 없이 잘 보존되어있다는걸로 증명 되어 보안에도 강하다는 강점이 나타나면서 획기적인 기술로 인정 받게 되었습니다.

그 후 비탈릭 부테린이 만든 이더리움이라는 가상화폐가 나오게 되었는데 기존 블록체인을 가상화폐 교환에서만 사용한걸 스마트 컨트렉트 라는 기능을 추가 함으로써 탈중앙화 앱(decentralized application = DAPP)을 제작할수 있는 환경을 제공 하게 되었습니다. 그 후 이더리움 스마트컨트렉트를 활용한 크립토키티스 라는 게임이 나오게 되었으며 이더리움의 가능성과 한계성을 알게 되었습니다.

윈도우 에서 도커(Docker)와 Kitematic 설치

저같이 도커를 잘모르는 사람에게 쉽게 접근할수있게 제공해주는 GUI툴 Kitematic이 있습니다. 클릭 몇번으로 이미지를 다운로드 받아서 컨테이너 생성까지 정말 간편하게 사용하고 로그도 출력되며 웹포트가 열려있으면 웹도 쉽게 띄울수있습니다. 도커를 처음 입문 하시는 분들을 위해 설치법을 공유 합니다.

윈도우에서 도커를 깔기 위해 메인페이지의 다운로드를 사용하여 설치하였습니다.


오브젝트 매핑과 슈퍼 타입 토큰

자바 프로젝트를 진행 하면서 외부 데이터를 가지고 VO클래스에 매핑하고 여러가지 연산작업을들 합니다. 그중에서도 VO클래스의 정보를 가져와 매핑하는 방법에 대해서 궁금하게 되었고 자바에서 제공하는 리플렉션API와 간단한 예제들을 통해서 오브젝트 매핑에 대해 알아 보겠습니다.

클래스 정보 가져오기

자바는 java.lang.reflect패키지의 API를 가지고 클래스의 정보와 필드 어노테이션 정보까지 모두 가져 올수 있는 리플렉션을 제공 합니다.

그래서 이렇게 구할수 있는 정보를 가지고 외부에서 가져오는 json 데이터나 sql문을 가져올시 매핑을 하여서 해당 오브젝트로 값을 삽입해 넘겨줄수 있습니다.

QueryDSL

JPA

1 QueryDSL 소개

  • JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API
  • JPA 크리테리아에 비해서 편리하고 실용적임
  • 쿼리를 문자가 아닌 코드로 작성해도, 쉽고 간결하며 그 모양도 쿼리와 비슷하게 개발 할 수 있는 프로젝트가 바로 QueryDSL 이다.
  • 오픈소스

객체지향 쿼리 언어

JPA

1 JPQL 소개

JPQL(Java Persistence Query Language) : 엔티티 객체를 조회하는 객체지향 쿼리.

  • JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않는다.
  • JPQL은 객체지향 쿼리 언어다. 테이블X 엔티티O
  • JPQL은 결국 SQL로 변환된다.

값 타입

JPA
  • 기본값 타입basic value type
    • 자바 기본 타입(예: int, double)
    • 래퍼 클래스(예: Integer)
    • String
  • 임베디드 타입embedded type(복합 값 타입)
  • 컬렉션 값 타입collection value type

복합 값 타입

복합값 정의 : @Embeddable 어노테이션으로 정의

프록시와 연관관계 관리

JPA
  • 프록시 : 연관된 객체를 실제 사용하는 시점에 데이터베이스에서 조회 하는 기술
  • 지연로딩: 연관된 객체를 실제 사용하는 시점에 불러 오는것
  • 즉시로딩 : 연관된 객체를 조인을 통하여 함께 불러오는것
  • 영속성 전이 : 연관된 객체를 함께 저장하거나 삭제
  • 고아 객체 : 부모객체가 삭제시 홀로 남겨지는 객체

8.1 프록시

엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아니다.

JPA는 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데 이것을 지연 로딩이라 한다.

지연 로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라 한다.

고급 매핑

JPA
  • 상속 관계 매핑: 객체의 상속 관계를 데이터베이스에 어떻게 매핑하는지 다룬다.
  • @MappedSuperclass: 등록일, 수정일 같이 여러 엔티티에서 공통으로 사용하는 매핑 정보만 상속받고 싶으면 이 기능을 사용하면 된다.
  • 복합 키와 식별 관계 매핑: 데이터베이스의 식별자가 하나 이상일 때 매핑하는 방법을 다룬다. 그리고 데이터베이스 설계에서 이야기하는 식별 관계와 비식별 관계에 대해서도 다룬다.
  • 조인 테이블: 테이블은 외래 키 하나로 연관관계를 맺을 수 있지만 연관관계를 관리하는 연결 테이블을 두는 방법도 있다. 여기서는 이 연결 테이블을 매핑하는 방법을 다룬다.
  • 엔티티 하나에 여러 테이블 매핑하기: 보통 엔티티 하나에 테이블 하나를 매핑하지만 엔티티 하나에 여러 테이블을 매핑하는 방법도 있다. 여기서는 이 매핑 방법을 다룬다.

엔티티의 연관관계 매핑시 고려할거 정리

JPA

고려할건 크게 3가지다.

  • 다중성
  • 단방향, 양방향
  • 연관관계의 주인

다중성 : 두 엔티티의 연관관계를 나타냄 (예: 일대다,다대일,일대일,다대다) 다중성을 판단하기 힘들땐 반대방향을 생각하면 됨 (일대다의 반대는 다대일)

  • 다대일(@ManyToOne)
  • 일대다(@OneToMany)
  • 일대일(@OneToOne)
  • 다대다(@ManyToMany)