반응형
반응형

프로그래밍을 처음 배울때 if문을 배우면서 숫자 비교 같은 것을 배우게 됩니다. 

그러다가 응용 단계로 가면 문자열 비교를 배우게 되죠.

아마 대부분 아래와 같이 쓰지 않았었나 생각됩니다.. (물론 저도 포함 ^^;;) 

 

String str = "abc";
String input = "abc";
 
if(str == input) {
   system.out,println("true");
} else {
   system.out,println("false");
}


 

결과는, 당연히 false가 찍히겠죠. false가 찍히는 원인은 문자열 변수마다 가지고 있는 hashCode가 다르기 때문입니다.

따라서, String 비교시에는 아래와 같이 equals를 사용하면 원하는 결과인 true를 얻을 수 있습니다.

 

if(str.equals(input) {
   system.out.println("true");
} else {
   system.out.println("false");
}


 

하지만, equalsIgnoreCase라는 것이 있습니다. equals같은 경우에는 대소문자 구분을 철저히 하지만,

equalsIgnoreCase 같은 경우 대소문자를 구분하지 않습니다. 클라이언트에서 입력받은 String을 비교할 때 유용하게 쓰이겠죠.

아래와 같이 말입니다.

 


 

결과는 true가 찍힙니다.

String str = "abc"
String input = "AbC";
 
if(str.equalsIgnoreCase(input)) {
   system.out.println("true");
} else {
   system.out.println("false");
}

 

보통은 대소문자 구분 처리할때 toLowerCase(모두 소문자 변환), toUpperCase(모두 대문자 변환) 등을 이용하여 사용하지만,

equalsIgnoreCase를 사용하면, 한방에 해결할 수 있어서 좋은 것 같습니다.

반응형
,
반응형

가끔 일을 하다보면 HTML내에서 또 HTML파일을 생성해달라고 하는 (HTML파일 제작툴?) 요청사항이 올 때가 있습니다. 

 

그런 경우에 zxml이라는 라이브러리를 이용해서 구현이 가능합니다.

 

다운로드 : http://www.nczonline.net/downloads/

 

압축파일로 되어 있고, 압축을 풀면, sample 소스 등이 나오는데,

실제로 우리가 필요한 건 zxml.js 파일 하나 뿐입니다.

 

DOM방식으로 구현을 해야되서, 소스가 지저분해질 수 밖에 없더군요.

(다른 좋은 방법이 있으면 소개좀.. ㅠㅠ)

 

간단하게 예제코드를 통해 작성법을 소개하도록 하겠습니다.

 

아래 html 코드를 zxml을 통해 만들어 보도록 하겠습니다.


<head>
<title>test</title>
<meta http-equiv="Cache-Control" content="no-cache" />
</head>
// document 생성
var oXmlDom   = zXmlDom.createDocument();
 
//  
var htmlContainer  = oXmlDom.createElement("html");
 
// <head> </head>
var headContainer  = oXmlDom.createElement("head");

// <title>test</title>  
 var titleContainer  = oXmlDom.createElement("title");
// 태그 사이에 값을 넣어주는 역할
 titleContainer.appendChild(oXmlDom.createTextNode("test"));
 
// <meta />
 var metaContainer  = oXmlDom.createElement("meta");
// <meta http-equiv= /> : 속성 추가
 var attHttpEquiv = oXmlDom.createAttribute("http-equiv");
// 추가된 속성에 값 추가 <meta http-equiv="Cache-Control" />
 attHttpEquiv.value = "Cache-Control";
// meta태그에 위 속성 적용
 metaContainer.attributes.setNamedItem(attHttpEquiv);
// <meta http-equiv="Cache-Control" content="no-cache" /> 위와 동일
 var attContent  = oXmlDom.createAttribute("content");
 attContent.value = "no-cache";
 metaContainer.attributes.setNamedItem(attContent);
 
// <head> 안에 title과 meta를 추가
headContainer.appendChild(titleContainer);
headContainer.appendChild(metaContainer);
 
//  안에 head 추가
htmlContainer.appendChild(headContainer);
 
// document에 html 추가
oXmlDom.appendChild(htmlContainer);
 
// 리턴
return oXmlDom.xml;
반응형

'개발 > Front-End' 카테고리의 다른 글

[Jquery] $.ajax 사용 시 success callback에서 this 객체 사용하기  (0) 2016.06.10
[CSS] 텍스트 말줄임  (0) 2016.06.10
[HTML] favicon 추가  (0) 2016.06.10
[JavaScript] byte formatter  (0) 2016.06.10
[Jquery] Ajax Fileupload Option  (0) 2016.06.10
,
반응형

primitive type (int, long, double, char 등..)을 사용하는 경우,

따로 객체 생성을 하지 않고 처리되기 때문에, 메모리 관리가 자동으로 이루어짐.

 

하지만 Reference Type (Integer, Long, Double, String 등)은 Object를 상속받는 객체이기 때문에,

null로 처리하거나, GC가 이루어진 경우에만 메모리 정리가 됨.

 

개인적으로 내린 결론은, Reference Type 사용 시에는 사용 후에 반드시 null처리를 해주도록 하는 것이다.

GC가 하는 일을 줄여보기 위한....

혹시나 코딩을 잘못했을 경우에, 사용하지도 않는게 메모리 영역에 살아있을 수도 있으니, 귀찮더라도 null로 세팅해주도록 하자.

GC에게 모든걸 맡기면 언젠가 OOM (out of memory)를 보는 상황이 올지도 모른다. 

 

물론 SoftReference나 WeakReference를 사용하는 것도 좋은 방법 중 하나이다. 

 

이건 참고한 글.

 

http://lemonfish.egloos.com/viewer/5380639  

반응형
,

[Gson] TypeAdapter

개발/Java 2016. 6. 10. 23:08
반응형

기존까지 Json Parser는 Jackson을 사용하고 있었는데,

어딘가에서 Gson이 가장 퍼포먼스가 좋다는 이야기를 듣고, 작년부터 Gson을 도입하여 사용하기로 하였다.

 

근데.. 엄청난 문제가 하나 있었다.

Number Type의 경우 toJson이나 fromJson메소드를 사용 시에, 무조건 double형태로 내부적으로 변환을 해서 주는 것이었다.

 

물론.. Integer라던지, Long이라던지 제대로 명시를 해서 변환을 요청하면 제대로 바꿔준다.  

하지만, Map<String, Object> 형태를 사용하여, 변환을 요청하는 경우 위와 같은 문제가 발생. 

 

성능을 높이기 위해 모든 Number Type을 double로 바꿔주는 것인가...  

자세한 이유는 만든사람만 알겠지;;

 

처음에는 일일히 double로 받아서, int로 변환해서 사용을 하였었는데..

찾아보니 역시나 간단하게 해결할 수 있는 방법이 있었다.

 

gson객체에 registerTypeAdapter라는 설정 관련 메소드가 있었고,

이것을 통해, Double로 들어오는 것들을 값의 범위를 계산하여 

Integer범위보다 크면 Long으로.. 아니면 Integer로 변경하도록 구현해보았다.

 

참고로, toJson과 fromJson을 사용 시 구현해야 하는 인터페이스가 다르다.

 

toJson : JsonDeserializer<T>

fromJson : JsonSerializer<T>

 

현재 클라이언트에서 받는 객체는 Pojo로 타입이 확실하게 명시되어 있고,

Response Data의 경우 Map으로 받고 있어서, toJson(obj, HashMap.class)을 할 때,  

무조건 .0이 붙어서 나오는 문제가 있으니 JsonDeserializer를 구현해서 쓰도록 결정하였다.

 

 

@Override
public HashMap<String, Object> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        Map<String, Object> map = Maps.newHashMap();
        JsonObject jsonObject = json.getAsJsonObject();
        for(Entry<String, JsonElement> entry : jsonObject.entrySet()) {
            JsonElement element = entry.getValue();
            if(element instanceof JsonPrimitive && element.getAsJsonPrimitive().isNumber()) {
                Number nValue = CommonUtils.getRemoveDot(element.getAsDouble());
                map.put(entry.getKey(), nValue);
                
            } else {
                map.put(entry.getKey(), context.deserialize(element, Object.class));
            }
        }
        return (HashMap<String, Object>) map;
}

서비스에도 적용되어 있는 상태인데, 특별한 문제는 없었다.

반응형
,
반응형

데이터베이스를 Scale Out으로 구성하는 경우, auto increment sequence값에 대해 고민을 하게 된다.

 

다음과 같은 시도를 해보았다.

 

1. Unique idx 발급용 Redis를 별도로 두어, increment 명령어만 호출하여 사용한다.

  - 개발환경에서는 잘 사용하고 있었지만, SPOF 이슈가 있고, 별도 머신 세팅을 해야하므로 관리 이슈가 따름. (fail) 

 

2. java 내부에서 제공하는 UUID를 이용하여 randomString을 추출해낸다.

  - 겹칠 확률이 없다고 봐도 되고, 로직에서 처리하는 것이기 때문에 1번보다는 성능이 좋지만, 보통 DB에서 사용하는 unique idx는 long타입인데, 얘는 String타입으로 리턴해준다. 물론, long형태로 리턴해주는 메소드도 있어서 사용해봤고, 어느정보 겹칠 확률도 없었지만.. 좀 껄끄러워서 패스 (fail) 

 

3. 구글링을 하던 중 누군가 Github에 snowflake에서 unique idx발급 시 사용하는 알고리즘을 올려두었다. (트위터에서 올린건지는 모름;;)  

  - 전체적인 로직을 보진 않았지만, timestamp값을 가지고 or연산 등을 이용하여 생성해내는 방식인 것 같다. 이것도 unique idx를 generate하는 메소드는 string형태로 리턴이 되는 구조였지만, 내부적으로 Long으로 만든 후에 toString하는 방식이어서 toString만 없애고, 어느정도 맞게 수정해서 사용. 트위터에서 사용하고 있는 알고리즘이므로 믿고 사용하기로 결정.

링크 : https://github.com/Predictor/javasnowflake  

※ long id generate하는 부분 중에, hardWareAddress 가져오는 코드가 있는데, 이거 centOS에서 잘 안가져와 지는 것 같다. windows에서는 잘되는데, 왜 안되지 찾다가 보니 null을 반환했었다는.... 이럴 경우 getHardWareAddress()를 사용하면 안되고, Iterable한 형태로 리턴해주는 method를 이용하면 해결이 된다. (본인은 귀찮아서, null일 경우 로컬에서 한번 받아온 hardWareAddress를 세팅하도록 변경해서 사용중;; 어차피 중복 확률이 0%니깐 상관없을거 같아서..) 

 

nosql을 주 Storage로 사용하는 경우 2번의 방법도 괜찮다고 한다. 

반응형
,
반응형

https://github.com/guari/eclipse-ui-theme

 

검정 Base의 테마.

가독성도 나쁘지않고 맘에든다. 

반응형
,
반응형

windows - preferences - Install/Update - Available Sofrware에 가서,

The Eclipse Project Updates에 있는 url 가장 뒤에 / 를 붙여주고,

 

이클립스 p2 폴더에 있는 cache를 날려주고, 이클립스 재시작 후에 다시 시도하면 해결된다. 

반응형

'개발 > Java' 카테고리의 다른 글

[Gson] TypeAdapter  (0) 2016.06.10
[UUID] 분산 데이터베이스 환경에서의 UUID 발급  (0) 2016.06.10
[Eclipse] MoonRise Theme  (0) 2016.06.10
[Lambda] collect 함수 사용 시 주의점  (0) 2016.06.10
[Guava] EvictingQueue  (0) 2016.06.10
,
반응형

filter로 필터링 후에 collect로 새로운 Collection을 만들고, foreach를 돌리는 경우

필터링을 하고 새로운 Collection을 만들었기 때문에, 필터에서 걸러진 것들은 최종 결과물에서 안나올 거라고 생각을 했다.


그런데.. 필터링 되었던 항목이 그대로 포함이 되어 있었다.


이럴 경우에는 collect함수를 사용하면서 기존의 list에 덮어씌우는 작업 후에,

forEach를 돌리면.. 원하던대로 동작한다.



정리하면 아래 코드는 서로 다르게 동작한다는 거다.

체인 메소드 특성상, 내부적으로만 새로운 스트림을 만들기 때문인 것 같다.


list.stream().filter().collect(Collectors.toList()).forEach();


list.stream().filter().collect(Collectors.toList());
list.forEach();
반응형
,

[Guava] EvictingQueue

개발/Java 2016. 6. 10. 23:05
반응형

동접 그래프를 만들일이 있어서, 차트 라이브러리를 찾던 도중에 어떤 자료구조를 사용할지에 대해 고민을 하게 되었다.


사용될 자료구조의 요구조건은 다음과 같다.


1. 사이즈가 fix되어 있어야 함.


2. 데이터가 순차적으로 들어가야 함.


3. fix된 사이즈가 초과되면, 저장되어 있던 데이터들을 하나씩 뒤로 밀고 새로운 것을 앞에다가 넣어주어야 함.


java에서 제공하는 Collection만 보았을 때는 2번의 경우 LinkedList를 사용하면 되고, 3번의 경우 Queue를 사용하면 되는데..

1번이 문제였다. 결국 만들어야 하는 상황이 왔는데, 귀찮아서 이리저리 검색을 해보니.. Google Guava Library에서 EvictingQueue라는 훌륭한 자료구조를 제공해주고 있었다.


아래와 같이 사용하면, 위 1~3번의 조건을 모두 만족하는 자료구조가 만들어진다.

EvictingQueue<T> queue = EvictingQueue.create(size);


뭐 굳이 만드는걸 좋아하는 분들은 만드는 것도 나쁘진 않겠지만..

내가 만드는거보단 google code에 올라가 있는 library가 더 안정적이겠지하고 이걸 가져다 쓰기로 했음.


앞으로 자주 사용하게 될 것 같다.

반응형
,
반응형

spring에는 많은 어노테이션들이 있죠.

 

그 중에서 편하게 사용할 수 있는 ModelAttribute에 대해 알아보도록 합시다.

 

파라미터를 넘길 때 보통은 아래와 같이 사용하는게 일반적이죠.

 

@RequestMapping("/test/abc")
@ResponseBody
public Object test(@RequestParam(value="a") String a,
                     @RequestParam(value="b") int b) {
   return "";
}


 

하지만 저것을 Model을 이용하여 한번에 넘길 수 있는 방법이 있답니다.

 

바로 ModelAttribute!!

 

일단 Model을 하나 만들어봅시다.

 

public Class testClass {
    String a;
    int b;
}


 

모델을 만들었으면 아래와 같이 사용합니다.

 

@RequestMapping("/test/abc")
@ResponseBody
public Object test(@ModelAttribute testClass test) {
   return "";
}


 

testClass에 멤버로 String a, int b가 있기 때문에,

파라미터로 a, b에 값을 담아서 보내면, test라는 클래스변수에 자동으로 값이 세팅되는 편리한 기능입니다.

 

게시판 같은 경우 Model단위로 파라미터를 넘기고 받는 경우가 많기 때문에, 유용할 것입니다.

반응형
,
반응형