### 문제발생

vagrant box add "lucid32" http://files.vagrantup.com/lucid32.box

명령으로 lucid32.box를 내려받고 실행할려고 하는 순간 아래의 메시지가 보여지며 실행되지 않는다.

The box 'base' could not be found.

'base' box를 찾을 수 없단다. 내가 추가한 box는 'lucid32'인데?


### 해결책

box를 내려받은 위치에보면 

Vagrantfile

라는 파일이 있다. 이 파일을 열어보자.

파일의 내용 중 

config.vm.box = "base"

로 되어 있는 항목이 보일 것이다.

config.vm.box = "lucid32"

로 변경하자.


box 'base' not fond 문제 처리 후 실행화면


### 설명

vagrant box를 내려받으면서 "lucid32"라는 이름을 부여했는데, vagrant 설정파일Vagrantfile에 기본설정에는 "base"로 되어 있어서 발생한 문제다.


참고사이트  : http://wiki.nginx.org/Install

sudo -s
nginx=stable # use nginx=development for latest development version
add-apt-repository ppa:nginx/$nginx
apt-get update 
apt-get install nginx


회사에서 변경이력관리시스템(VCS, Version Control System)으로 SVN에서 Git으로 변경하려는 시도를 하고 있다.

이 시도는 앞으로도 꾸준하게 진행예정이다. 현재는 BitBucket을 원격저장소Remote Repository로 사용하고 있는데, 사설 저장소private Repository를 위해서 사용하고 있지만, 몇가지 불편한 사항들이 있어서 Github으로 변경하고 유료서비스를 이용하려고 한다.


그런데, SVN에서 Git으로 넘어가려는 과정에서 다른 개발자와의 충돌이 발생하고 있다. 반대하는 의견으로 내놓는 의견 중에 하나가 

'Git은 개발자가 서로 멀리 떨어져 있는 분산된 개발환경에 적합하다'

라는 의견이다. Git은 지역저장소Local Repository를 기반으로 하는 변경이력관리시스템이다. 여기에 원격저장소를 연결하면 그때 분산 변경이력관리시스템(DVCS, Distributed Version Control System)으로서의 진가를 발휘하게 된다.


SVN은 중앙집중형 변경이력관리시스템이다. 개발서버에 SVN Server를 설치하고 이 SVN에 연결체Connector를 이용하여 연결하여 관리한다. SVN은 변경이력이 추가될 때마다 해당하는 변경이력의 데이터를 모두 함께 저장하기 때문에, 변경이력을 관리하는 데이터와 변경이력이 증가할수록 시스템이 무거워지는 단점이 있다. Git은 지역Local을 기반으로 파일시스템으로 처리되기 때문에 원격지에서 데이터를 주고받아야 하는 SVN과는 속도의 차이가 확연하게 난다. 지역에서 작업한 내용들의 변경이력을 쉬이 관리하고, 필요에 따라서 원격지에 밀어넣을 수 있다(푸쉬, push).

Git의 변경이력관리 중심활동지는 로컬이다. 그러나 원격저장소를 지정하고 함께 작업을 진행하게 되면 SVN과 동일한 기능을 모두 사용할 수 있다.

SVN을 사용하기 위해서는 서버를 개발자가 관리해야하는 부담이 있다. 설치 이후에 서버의 용량이나 상태를 꾸준하게 주시(모니터링Monitoring) 해야하는 귀찮음이 발생한다는 것이다. 이런 것을 해결하려는 용도로 Github에서 유료로 사설저장소를 사용하는 것을 요청하고 있다. 이 서비스를 이용하면 서버에 대한 관리를 개발자가 신경쓰지 않아도 된다는 이득을 얻을 수 있다(사용하면서 서비스가 중단된 경험은 1년에 1, 2번 정도였다).  이럴 경우에는 서비스가 정상화될 때까지 로컬에서 작업(커밋Commit)해두고 서비스가 정상화되었을 때 밀어넣으면 된다. 


깃이 분산변경이력관리시스템DVCS라는 타이틀을 가지고 있다고 해서, 반드시 분산된 개발환경에서 사용해야만 하는 것은 아니다.

SVN 사용을 지속하려는 개발자들을 어떻게 하면 Git으로 이동시킬 수 있을까?


요즘 한켠에서 가지고 있는 고민...

### 개발환경

* Hibernate 4.2.0.Final


### 문제발생 원인

* @Entity 선언 객체를 정렬하려는 영도로 interface Compare<T>를 구현한 후

 int compareTo(Object o) 에서 사용하려는 비교값 필드로 order 을 정의했다.

@Entity

@Table(name="SAMPLE")

public class Sample implements Serialize, Compare<Sample> {

@Id

@GeneratedValue(strategy=GenerationType.AUTO)

private Long id;


     @Getter

private Long order;


@Override

public int compareTo(Sample o) {

return getOrder().compareTo(o.getOrder());

}

}


  이렇게 정의된 엔티티 객체의 테이블이 생성되지 않는 문제가 발생해서, 이를 해결하기 위해서 여러가지를 시도해봤다.  복사해서 새로운 엔티티 객체를 만들어보고, 객체의 참조관계를 변경해보고, 클래스명을 바꿔보고 하이버네이트 버전을 변경해봤지만 증상은 동일했다.

  이를 확인하기 위해서 구현하는 과정을 한단계한단계 되짚어보았다. ㅠㅅ-) 그러다가 발견했다.

  새로 만들어서 id 값을 넣었을 떄까지는 이상없이 생성이 되다가,

private Long order;

이 필드를 넣는 순간부터 구현되지 않는 것을 발견했다.


### 해결방법

* order -> seq 로 변경

필드명을 seq로 변경하고 나니... 정상적으로 테이블이 생성되는 것을 확인했다.

### 보충 설명

다른 분이 알려주신 것을 보고 생각했다.

'아, order가 hibernate와 관련된 예약어가 아니라 database와 관련된 예약어...였어.'

Entity 객체의 필드명을 지정할 때 Database의 예약어를 사용하지 않도록 하자. 반드시 도메인의 필드명으로 사용해야 한다면, @Column(name="")을 이용하여 테이블의 컬럼명을 다른 것으로 변경하자.



var form = {

  field : data

};


$(document).ready(function() {

  $.ajax({

    url : "http://localhost:8080/rest_api",

    type : "method",

    dataType : "json",

    contentType : "application/json",

    data : JSON.stringify(form),

    success : function(data) {

    console.log(data);

    }

  });

});

빈 index.jsp 에 jquery.js 임포트문 하나 추가해놓고 테스트하는 게으른 개발자 허니몬.
서버에서는 @RequestBody로 Form오브젝트를 만들어서 받아쓰고 있다.
JSON data를 Deserializer할 때, 스프링에서 EntityObject 로 매핑해주질 못해서 꼼수를 쓰고 있는 불편한 상황을 어찌 해결해야할까 고민중.

+ Recent posts