backend 119

[Effective Java] 19. 타입을 정의할 때만 인터페이스를 사용하자.

[Effective Java] 19. 타입을 정의할 때만 인터페이스를 사용하자. // Constant interface antipattern - do not use! public interface PhysicalConstants { // Avogadro's number (1/mol) static final double AVOGADROS_NUMBER = 6.02214199e23; // Boltzmann constant (J/K) static final double BOLTZMANN_CONSTANT = 1.3806503e-23; // Mass of the electron (kg) static final double ELECTRON_MASS = 9.10938188e-31; } 상수 인터페이스 패턴은 인터페이스..

backend/Java 2009.10.27

[Effective Java] 15. 가변성을 최소화하자.

[Effective Java] 15. 가변성을 최소화하자. 불변(immutable) 클래스는 자신의 인스턴스가 갖는 값을 변경할 수 없는 클래스이다. 각 인스턴스가 갖는 모든 정보는 그것이 생성될 때 제공되며 객체로 살아있는동안 변경되지 않는다. 자바의 불변 클래스는 String, 박스화 기본형(boxed primitive) 클래스, BigInteger, BigDecimal 등등이 있다. 불변 클래스는 가변 클래스에 비해 설계와 구현 및 사용이 더 쉽다. 또한 에러 발생이 적으며 보안이나 사용 측변에서 더 안전하다. 불변 클래스 만들때 다섯 가지 규칙 1) 객체의 상태를 변경하는 그 어떤 메소드(변경자라고 하는)도 제공하지 않는다. 2) 상속을 할 수 없도록 하자. 일반적으로는 클래스를 final로 지정..

backend/Java 2009.10.19

[Effective Java] 11. clone 메소드는 신중하게 오버라이드 하자.

[Effective Java] 11. clone 메소드는 신중하게 오버라이드 하자. Cloneable 인터페이스는 복제를 허용하는 객체라는 것을 알리는 목적으로 사용하는 믹스인 인터페이스(mixin interface) 아무런 method도 없는 Cloneable 인터페이스는 어디에 쓰이는 것일까? 이 인터페이스는 Object 클래스의 protected 메소드인 clone의 행동 방식을 규정한다. 만약, clone 메소드가 호출된 객체가 Cloneable 타입이라면, Object.clone 메소드는 이 객체의 모든 필드를 그대로 복사한 복제본을 리턴한다. 하지만 Cloneable 타입이 아니라면 CloneNotSupportedException을 던진다. java.lang.Object.clone의 명세(Sp..

backend/Java 2009.10.15

[CouchDB] Apache CouchDB 0.10.0 이 나왔답니다.

Apache CouchDB가 0.9.1버젼에서 0.10.0 버젼으로 뛰었다. 11시간전에 DAMIEN KATZ 블로그에 올라왔다. 이번 버젼 개선사항은 Added modular configuration file directories. Miscellaneous improvements to build, system integration, and portability. 이렇다고 한다. 조금 더 편리하게 만들기 위해 노력한 것 같다. 그 외에도 Show와 List API에 변화가 생겼다. 자세한 건 좀 더 살펴봐야겠다.

backend/DataBase 2009.10.14

[CouchDB] HTTP view API

CouchDB wiki에 있는 내용을 보고 정리한 내용입니다. 제가 하고싶은걸 실습한 것이기 때문에 삭제된 내용도 있습니다. view(뷰)는 Couch document를 쿼리하거나 리포팅할때 사용되는 주요툴이다. 뷰는 자바스크립트 function으로 정의된다. function(doc) { emit(null, doc); } Creating Views permanent view를 만들기 위해 function은 특별한 design document에 먼저 저장되어 있어야 한다. design document의 id는 _design으로 시작하고 view attribute는 map과 optional하게 reduce를 갖는다. design document의 모든 view는 index되어 있다. design docume..

backend/DataBase 2009.09.29

[Effective Java] 9. equals 메소드를 오버라이드 할 땐 hashCode 메소드도 항상 오버라이드 하자.

9. equals 메소드를 오버라이드 할 땐 hashCode 메소드도 항상 오버라이드 하자. Java API Object.hashCode 메소드 spec에 명시 - 애플리케이션 실행 중에 같은 객체에 대해 한 번 이상 호출되더라도 hashCode 메소드는 같은 정수를 일관성있게 반환해야 한다. - equals(Object) 메소드 호출 결과 두 객체가 동일하다면, 두 객체 각각에 대해 hashCode 메소드를 호출했을 때 같은 정수 값이 나와야 한다. - equals(Object) 메소드 호출 결과 두 객체가 다르다고 해서 두 객체 각각에 대해 hashCode 메소드를 호출했을 때 반드시 다른 정수 값이 나올 필요는 없다. 그러나 같지 않은 객체들에 대해 hashCode 메소드에서 서로 다른 정수 값을 ..

backend/Java 2009.09.28

[Effective Java] 8. equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자.

8. equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자. equals메소드를 오버라이드 하지 않고 써야할때 - 클래스의 각 인스턴스가 본래부터 유일한 경우 - 두 인스턴스가 논리적으로 같은지 검사하지 않아도 되는 클래스의 경우 - 수퍼 클래스에서 equals를 이미 오버라이딩 했고, 그 메소드를 그대로 사용해도 좋은 경우 - private나 패키지 전용 클래스라서 이 클래스의 equals 메소드가 절대 호출되지 않아야 할 경우 그럼 언제 해야하나? 객체 참조만으로 인스턴스의 동일 여부를 판단하는 것이 아니라, 인스턴스가 갖는 값을 비교하여 논리적으로 같은지 판단할 필요가 있는 클래스로써, 자신의 수퍼클래스에서 equals 메소드를 오버라이드하지 않았을 때다. 일반적으로 값(value) 클래스..

backend/Java 2009.09.24

[Effective Java] 5. 불필요한 객체 생성을 피하자

5. 불필요한 객체 생성을 피하자 불변(immutable) 객체는 항상 재사용가능하다. String s = new String("buri"); 이렇게 쓰지 말고 String s = "buri"; 이렇게 쓰자는거 실행될 때마다 새로운 인스턴스를 생성하지 않고 하나의 String 인스턴스를 사용하며 같은 JVM에서 실행되는 어떤 코드에서도 동일한 문자열 리터럴(literal)을 갖도록 재사용될 것이다. 불변 클래스의 불필요한 객체 생성을 막으려면 생성자보다는 static 팩토리 메소드를 사용하는 것이 좋다. 생성자인 Boolean(String)보다는 static 팩토리 메소드인 Boolean.valueOf(String)을 사용하는 것이 더 좋다. 생성자는 호출될 때마다 새 객체를 만드는 반면, static ..

backend/Java 2009.09.23

[Effective Java] 4. private 생성자를 사용해서 인스턴스 생성을 못하게 하자

4. private 생성자를 사용해서 인스턴스 생성을 못하게 하자 static 메소드나 static 필드만을 모아 놓은 클래스를 만들필요가 있는 유틸리티성 클래스는 인스턴스 생성이 무의미하다. 그러나 그런 클래스라도 명시적으로 지정한 생성자가 없을때 컴파일러가 디폴트 생성자 (public 이며 매개변수가 없는)를 만들어주기 때문에 javadoc 프로그램으로 생성하는 API 문서에도 나타나기 때문에 인스턴스 생성이 가능한 클래스로 오인될 수 있다. 생성자 호출을 통한 인스턴스 생성을 방지하고 API 문서에도 나타나지 않도록 하려면? private 생성자를 정의하면 인스턴스 생성이 불가능한 클래스를 만들 수 있다. public class UtilityClass { //이 클래스는 인스턴스 생성이 불가능하다라..

backend/Java 2009.09.17

Eclipse Galileo에 어떤 프로젝트가 있을까?

Eclipse Galileo가 릴리즈 된지 좀 되었다. 릴리즈가 되어 업데이트 할 때마다 어떤 프로젝트가 들어있는지 관심있게 살펴보지 않았는데, 이렇게 다양한 프로젝트들이 있구나.. dW에 있는 아티클을 보고 한번 알고 가는게 좋을 듯 하다. Eclipse Galileo 살펴보기최신 버전의 오픈 소스 다목적 IDE 및 애플리케이션 플랫폼의 새로운 기능 표 1. Galileo 릴리스 트레인 프로젝트 프로젝트 개요 웹 사이트 ACTF(Accessibility Tools Framework) 장애가 있는 사용자를 위한 애플리케이션 및 컨텐츠 개발 http://www.eclipse.org/actf/ BIRT(Business Intelligence and Reporting Tools) 보고서 생성 http://ww..

backend/Java 2009.08.26

[Effective Java] 3. private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자.

3. private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자. 싱글톤(singleton)은 정확히 하나의 인스턴스만 생성되는 클래스. 싱글톤은 본질적으로 유일한 시스템 컴포넌트를 나타낸다. 예를 들면, 윈도우 매니저나 파일 시스템 등 자바 1.5 이후 싱글톤 구현하는 가장 좋은 방법 //열거형( Enum) 싱글톤 public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } } 복잡한 직렬화나 리플렉션 상황에서도 직렬화가 자동으로 지원되고, 인스턴스가 여러 개 생기지 않도록 확실하게 보장해준다.

backend/Java 2009.08.26

[Effective Java] 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자.

Static 팩토리 메소드와 생성자의 공통적인 제약은 선택 가능한 매개변수가 많아질 경우 신축성 있게 처리하지 못한다는 것인데, 흔히 나도 그러한데 텔리스코핑 생성자(telescoping constructor)패턴을 사용한다. 필수 매개변수들만 갖는 생성자, 필수 매개변수들과 선택 매개변수 하나를 갖는 생성자, 선택 매개변수 두개를 갖는 생성자 등등의 형태로 오버로딩을 통해 여러개의 생성자를 겹겹이 만드는 것이다. public class User{ private String id; private String pw; private String address; // .......15 more field public User(String id, String pw){ this(id, pw, null); } pu..

backend/Java 2009.07.31

[Jersey] WebApplicationException and Mapping Exception to Responses

이전에 블로깅했던 2009/06/05 - [나만의 작업] - Jersey의 Exception Handling 에 대해 조금 더 자세히 블로깅을 해봅니다. Jersey에서 Excpetion Handling하는 방법들 1) WebApplication을 상속한 새로운 클래스인 NotFoundException을 생성하여 던지기 NotFoundException을 throw하는 예 Example 1.25. Throwing Jersey specific exceptions to control response 1 @Path("items/{itemid}/") 2 public Item getItem(@PathParam("itemid") String itemid) { 3 Item i = getItems().get(itemid..

backend 2009.07.30

[Jersey] Building Responses

Jersey에선 Response를 다음과 같이 할 수 있다. POST 메소드인 경우의 예를 들면, Jersey에선 POST는 작업을 수행한 후 정상적으로 처리되면 201 상태코드를 리턴하고 Location Header에는 새롭게 생성된 리소스의 URI값을 리턴할 수 있다. 이렇게 자바의 내용이 이렇다면, @POST @Path("post") public Response post(String id) throws URISyntaxException{ URI createdUri = new URI("http://localhost:8080/user/" + id); create(id); return Response.created(createdUri).build(); } @POST @Path("postEntity") p..

backend 2009.07.21

[Jersey] Representation and Java Types

참고 : Jersey 1.0.3 User Guide중의 내용 전에 올린 2009/06/02 - [나만의 작업] - JAX-RS @Produces와 @Consumes 에서 많이 본 Java type은 "String"인데, 거기서 본 String은 JAX-RS 구현을 지원하기 위해 필요한 많은 Java type들 중의 하나일뿐이다. Java type은 byte[], java.io.InputStream, java.io.Reader, java.io.File등이 있다. 게다가 JAXB beans도 지원해준다. 참고로 JAXB의 beans들은 JAXBElement나 @XmlRootElement 나 @XmlType라고 annotation 붙여진 클래스이다. Example 1.17. Using File with a s..

backend 2009.07.16

[CouchDB] HTTP Document API

CouchDB wiki에 있는 내용을 보고 정리한 내용입니다. 제가 하고싶은걸 실습한 것이기 때문에 삭제된 내용도 있습니다. Naming/Addressing CouchDB에 저장된 Document들은 DocID를 가진다. DocID는 유니크한 아이디. 두개의 document는 같은 database안에 같은 identifier를 가질 수 없다. "test"라는 이름의 database안의 some_doc_id, another_doc_id, BA1F48C5418E4E68E5183D5BD1F06476 이름의 document가 있다. http://localhost:5984/test/some_doc_id http://localhost:5984/test/another_doc_id http://localhost:598..

backend/DataBase 2009.07.14

[CouchDB] Compaction

CouchDB의 Reference중 Compaction CouchDB 공식 wiki에 적혀있는 내용을 간략히 정리해서 쓴 글입니다. Compaction Compaction은 database파일을 다시 쓰는 것. outdated document revision을 제거하고 document를 삭제한다. curl을 이용하여 테스트해보자! ~]curl http://localhost:5984/buri ('buri'라는 이름의 DB의 간략한 정보를 볼 수 있다.) {"db_name":"buri","doc_count":2,"doc_del_count":2,"update_seq":6,"purge_seq":0,"compact_running":false, "disk_size":16361,"instance_start_time"..

backend/DataBase 2009.07.13

[CouchDB] HTTP database API

CouchDB의 Reference중 HTTP database API CouchDB wiki에 있는 내용을 보고 실행해 본 과정을 올립니다. 제 나름의 정리이기에 생략된 것도 있습니다. 실행은 curl을 통해서 주로 하였습니다. Naming and Addressing database 이름은 모두 소문자 a-z, 숫자 0-9, _$()+-/ 문자로 이뤄져야 하고 slash(/)로 끝나야한다. http://couchserver/databasename/ http://couchserver/another/databasename/ http://couchserver/another/database_name(1)/ 주의! 대문자는 database 이름에 포함되어서는 안된다. http://couchserver/DBNAME/..

backend/DataBase 2009.07.09

[CouchDB] 초간단 Mac에서 CouchDB 실행하기

one-click으로 가장 간단하게 Mac에서 실행하는 방법! 이보다 더 간단할 수 없다. 링크 : http://janl.github.com/couchdbx/ 2009년 7월 현재 0.9.0-R13B 버젼을 받을 수 있다. 이 버젼엔 Erlang R13B, Spidermonkey 1.7 and ICU 3.8 가 포함되어 있다. 앞으로 계속 업데이트 될테니 저 링크에서 다운로드 받으세요~~ 다운로드 후 더블클릭 하면 실행된다.! 끝!

backend/DataBase 2009.07.07

[CouchDB] 1. CouchDB가 뭐지?

CouchDB???가 뭐지 하고 찾아보니 CouchDB는 아파치 오픈소스 프로젝트이고, DB이지만 Non-Relational Database이고 document-oriented기반이라고 합니다. 뭔가..새로운 포스가 느껴지는데.. 뭔가 개성이 강한 느낌..으로 조금 더 살펴보면, Couch를 사전에서 찾아보면 이런 뜻을 가지고 있는데.. 1a 긴 의자, 소파 《기댈 수 있는 등받이와 팔걸이가 있는》 2 《문어·시어》 침상, 잠자리 3 《일반적으로》 휴식처 《풀밭 등》;(야생 동물의) 은신처, 굴(lair) 딱 이름만 듣고는 이런 DB를 만들고 싶지 않았을까란 생각은 들지만, Cluster Of Unreliable Commodity Hardware의 약자라고 하네요.. 특징은 * RESTful API * ..

backend/DataBase 2009.07.07

Jersey의 JSON Support

Jersey에서 JSON을 지원하는 방법은 두가지가 있다. * JAXB Based JSON support * Low-Level JSON support 일단, JAXB 기반의 JSON 지원하는 방법을 알아보면, JSON하고 XML data format을 쉽게 produce/consume하면 시간절약을 할 수 있다. 왜냐면 Java model, JAXB를 이용한 annotated된 POJO를 쓰기때문에 쉽게 핸들링할 수 있다. 자바 모델에 @XmlRootElement 어노테이션을 붙여주고 간단한 몇가지 작업을 해주면~ 큰 노력하지 않고 JSON을 지원할 수 있다. 단점은 매우 특별한 JSON format을 처리할 때 좀 어렵다는거.옵션을 줘야한다. 참고 : Jersey 1.0에서 RESTful 웹 서비스용 ..

backend 2009.06.08

Jersey의 Exception Handling

Jersey에서는 WebApplicationException 클래스를 이용하여 Exception Handling한다. WebApplicationException을 잡아야 하고, 예외를 Response로 매핑한다. 예외를 위한 response가 null이 아니면 응답을 생성, null이면 서버 오류 응답을 생성 런타임 예외나 미리감지되는 예외(checked exception) 기호에 따라 사용 미리 감지되지 않는 예외나 오류는 컨테이너 안쪽까지 전파가 되도록 예외를 다시 던져야(re-thrown) 한다. 미리 감지되는 예외나 throwable 은 직접 예외를 던지지 말고, 서블릿인 경우은 ServletException으로, JAX-WS Provider 기반인 경우는 WebServiceException으로 ..

backend 2009.06.05

Jersey의 Return Type

Jersey에서 사용할 수 있는 Return Type에는 void Response GenericEntity Java Type 네가지 타입이 있다. void : 204 status code (성공. message body가 empty) Response : null 리턴 값은 204 status code. GenericEntity / Other : 리턴값이 null이 아니면 200 status code를 사용하고 null이면 204 status code를 사용한다. Response의 instance에 어떤 metadata를 추가적으로 제공하고 싶으면 ResponseBuilder를 쓰면 된다. (ResponseBuilder는 빌더 패턴을 사용해 Response 인스턴스를 생성 한다.)

backend 2009.06.04

Jersey의 MessageBodyReader/Writer

JAX-RS는 MessageBodyReader와 MessageBodyWriter를 통해 HTTP 메세지 바디와 자바 타입간의 마샬링과 언마샬링을 해준다. MessageBodyReader의 생긴 모습을 보면, (이 인터페이스를 구현하여 원하는 모습의 자바타입 객체로 변신시킬 수 있다.) public interface MessageBodyReader { boolean isReadable(Class type, Type genericType, Annotation annotations[], MediaType mediaType); T readFrom(Class type, Type genericType, Annotation annotations[], MediaType mediaType, MultivaluedMap h..

backend 2009.06.03

JAX-RS @Produces와 @Consumes

* Content negotiation Representation을 서버에서 클라이언트로 받을 때 정보를 넘겨줄때 두가지 전략이 있다. (뷰를 판단하는 방법) 1. 하나는 다른 URI를 주는것. http://www.flyburi.com/user/buri.pdf http://www. flyburi.com/user/buri.xml 이렇게 다른 파일 확장자를 주는 방법 2. 다른 하나는 같은 URI를 주고 미디어타입의 리스트를 Accept HTTP request header에 주는 방법. http://www.flyburi.com/user/buri 라고 주고 Accept header에 application/pdf or text/xml이라고 주는 방법 이 방법을 content negotiation이라고 한다. A..

backend 2009.06.02

JAX-RS의 구성

1. Root Resource Classes * 웹 리소스을 구현하기 위해 JAX-RS 어노테이션을 사용하는 자바 클래스 적어도 하나의 메소드에 @Path을 사용한 POJO Root resource class들은 JAX-RS runtime에 인스턴스화된다. @Path 어노테이션이 달린 Resource 클래스 @Path("/hi") public class HiResource { @GET @Produces("text/plain") public String getAsText() { return "Hi! buri. Show Text."; } 2. Resource Methods @GET @POST @PUT @DELETE @HEAD * URI Templates @Path annotation의 값은 상대 경로 URI..

backend 2009.06.01

What is Jersey?

구글에서 "Jersey"를 치면 제일 처음으로 Map에서 저지섬이 나오고 두번째 링크로는 역시 위키피디아의 저지섬이 나온다. 세번째 링크가 되어서야 내가 원하는 jersey 공식 홈페이지가 나온다. Jersey는 SUN에서 개발하는 REST 방식의 웹 어플리케이션을 지원하는 JAX-RS의 구현체의 이름이다. Jersey is the open source (under dual CDDL+GPL license), production quality, JAX-RS (JSR 311) Reference Implementation for building RESTful Web services. But, it is also more than the Reference Implementation. Jersey provides..

backend 2009.06.01

What is JAX-RS?

JAX-RS(Java™ API for RESTful Web Services)는 자바 플랫폼에서 경량화된 REST 방식의 웹 애플리케이션 구현을 지원하는 자바 API이다. SOAP기반의 SOA 연동은 자바 애플리케이션을 무겁게 한다는 비판과 함께, 최근 웹 애플리케이션의 경향인 AJAX기반으로 JSON이나 RSS와 같이 간결한 프로토콜을 사용한 연동이 보편화되면서 쉽게 구현할 수 있도록 Java EE에 JAX-RS 라는 사양이 포함되고 있다. (출처 : http://ko.wikipedia.org/wiki/JAX-RS) 2008년 10월에 JSR 311 1.0 released 되었고 2009년 5월 현재는 JSR 311 1.1 draft 상태이다. Open source 구현체로는 Jersey Restlets..

backend 2009.05.29

What is REST?

REST는 2000년도에 Roy Fielding의 박사학위 논문에서 네트워크 시스템의 구조적 형식(architecture style)을 설명하기 위해 만들어진 용어이다. 최근도 아니고 이미 뜰만큼 뜬 REST에 대해 정리해보자. 정의 REST stands for "REpresentational State Transfer" REST is an architecture style not a standard : REST는 비표준 아키텍쳐 스타일 Data and Service are represented by unique URI : unique한 URI를 통해 Data와 Service를 표현한다. 특징 Addressable Resources Every "thing" should have a URI Stateles..

backend 2009.05.27