RESTful API를 개발하다가 좀 멘붕에 오는 상황을 발견했다. postman으로 아무리 날려도 파라미터는 계속 false만 찍는 것이었다. 대략적으로 다음과 같았다.


1
2
3
4
private boolean isBusiness;     // 개인용 false / 법인용 true
private String userName;        // 개인용 - 사용자명 / 법인용 - 법인명
private String userSex;         // 개인용만 사용, 성별
private String userInfo;        // 개인용 - 사용자 태그 / 법인용 - 법인 태그
cs


로그는 다음과 같다.

2020-05-13 18:30:47.801  INFO 17740 --- [nio-9988-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms

[사용자정보] UserIssueVO: UserIssueVO(isBusiness=false, userName=TEST, userSex=M, userInfo=TEST_tag)


파라미터를 바꾸면 잘되고 해서 대체 뭐가 잘못인가. 대충 30분 정도 고민하다가 개발자들의 꿈과 희망, 스택오버플로우에서 검색하니 다음과 같은 링크가 뜬다.


JSON Post request for boolean field sends false by default

https://stackoverflow.com/questions/21913955/json-post-request-for-boolean-field-sends-false-by-default


그래서 찾아보니, lombok과 같은 어플리케이션으로 getter/setter를 생성할 때에는 boolean 필드이름에 'is'를 쓰지 않는 것이 맞다고 한다. jackson의 java bean 네이밍 규칙이라고.

어쩐지 이후 로직을 짤 때 세팅하는 쪽에서 isBusiness로만 찍히기에 조금 의아하긴 했다.


여튼 한가지 알아둘 점은 lombok 사용시 boolean 필드명은 is를 쓰지 않는다는 것. 이거 하나면 됐다.

블로그 이미지

김생선

세상의 모든것을 어장관리

,

alias를 설정하면 긴 명령어(수많은 디렉토리들..)를 단축하여 편하게 작업할 수 있다.

나만이 쓰는 서버라면 무엇을 정해도 상관없지만, 공용개발서버라면 개발자들간의 이해와 협의가 필요할듯.


현재 적용된 alias는 alias 라는 명령어로 확인 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost go]# alias
alias cdcc='cd /home/host/test/chaincode/test-cc/go'
alias cdh='cd /home/host'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
cs


현재 적용된 alias들

수정 명령어는 vi ~/.bashrc로 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost go]# vi ~/.bashrc
 
# .bashrc
 
# User specific aliases and functions
 
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias cdh='cd /home/host'
alias cdcc='cd /home/host/test/chaincode/test-cc/go'
 
# Source global definitions
if [ -/etc/bashrc ]; then
        . /etc/bashrc
fi
 
cs

alias를 적용하고, 저장 후 종료한 다음에는 꼭 source ~/.bashrc를 해줘야 현재 쉘에서 바로 사용이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost go]# source ~/.bashrc
[root@localhost go]# alias
alias cdcc='cd /home/host/test/chaincode/test-cc/go'
alias cdh='cd /home/host'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
cs


굳ㅋ

'어장 Develop' 카테고리의 다른 글

[http1.1] Expect: 100-continue  (0) 2021.03.18
[tomcat] p12 ssl 적용  (0) 2020.06.08
[Linux] make: g++: Command not found  (0) 2019.08.12
[JavaScript] timestamp convert to date type  (1) 2019.03.15
[Intellij] 인텔리제이 - lombok 설치  (0) 2018.09.06
블로그 이미지

김생선

세상의 모든것을 어장관리

,

별건 아니지만 왠지 정리해야 할 것 같은 느낌이다.

UUID는 Universally Unique IDentifier의 약자로, 범용 고유 식별자라는 뜻을 갖고 있다. 유니크한 ID를 만들거나 뭐 활용도가 무궁무진하다. 사용법은 JAVA에서 그냥 import 후 사용하면 된다.


1
2
3
4
5
6
7
8
9
10
public static String uuid() throws Exception {
    try {
        String uuid = UUID.randomUUID().toString();
        System.out.println(uuid);        
        return uuid;
    } catch (Exception e) {
        // TODO: handle exception
    }
    return null;
}
cs


대충 요런식. 그러면 뭐 유니크한 ID가 나오게 된다.

별거 없다.

블로그 이미지

김생선

세상의 모든것을 어장관리

,

오랜만에 아두이노를 만지고 있다. 만들고 싶은 물건이 있어서. 그러다보니 환경설정부터 해서, 모두 다 새로 하고 있는데 오래간만에 하니 요상시런 에러가 뜬다.

참조로 지금 사용하는 환경은 아두이노 나노에, 정품이 아닌 호환보드를 쓰고 있다. 처음에 개발할 때에도 뭔가 이것저것 설정값을 만지다가 겨우 성공했는데 어떻게 했는지 까먹어서, 이번엔 제대로 적어두고자 한다.



avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00


뭐 대충 이런 에러인데, 뭐 인터넷에서 대충 검색해보면 아두이노 포트라거나 드라이버를 제대로 설치하라고 한다. 거기에 DI포트라거나 뭐 이런 말들이 많은데, 사실 가장 먼저 확인할 일은 다음과 같다.


1. 드라이버 설치

드라이버 설치와 같은 경우에는 현재 사용중인 운영체제(Windows/MacOS) 등에서 아두이노 개발을 하기 위해 필수적인 과정이며, 아두이노에서 사용하는 프로세서의 드라이버가 필요하다. 호환 아두이노 나노는 CH340 프로세서를 사용하며, 이는 정품 아두이노 나노와는 다르게 드라이버를 직접 설치해줘야 한다.


2. 아두이노 포트 확인

아두이노 포트는 Windows10 기준, 장치관리자에서 다음과 같이 확인이 가능하다.


장치관리자의 포트(COM & LPT) 항목에서 USB-SERIAL CH340 (COM3)가 바로 현재 USB로 연결중인 아두이노 나노의 모델명과 포트이다.

포트는 COM3 포트로 연결되어있는 것을 확인할 수 있다. 여기까지 되었으면 3번으로 가자.


3. 현재 아두이노 IDE 환경의 보드와 프로세서 선택



먼저 툴 - 보드 항목에서 정상적으로 아두이노 나노로 선택되어있는지 확인하자. 물론, 포트 항목에서 장치관리자에서 확인한 것과 같은 포트로 선택되어있는지도 확인해야 한다.

나의 경우에는 아두이노 우노로 선택되어있었기에 문제가 생겼던 편이었다.




아두이노 나노로 선택하고나서는 프로세서를 선택하자. 호환 아두이노 나노의 경우에는 프로세스가 ATmega328P(Old Bootloader)로 선택되어야 정상적으로 동작한다.




블로그 이미지

김생선

세상의 모든것을 어장관리

,

이클립스에서 dll 라이브러리를 활용하여 빌드를 할 일이 있었다.

비단 이클립스 뿐만 아니라 인텔리제이도 마찬가지였고. dll 라이브러리를 추가하는 방법을 몰라 헤맸는데, 간단히 해결할 수 있었다.


관련 dll 파일들을 모두 C:\Windows\System32 디렉토리에 넣어주면 된다. 

일각에서는 dll 파일들의 path를 잡아주면 된다고는 하는데 방법을 잘 몰라서 이렇게 무식한 방법으로 해결함...

블로그 이미지

김생선

세상의 모든것을 어장관리

,

make: g++: Command not found

 

npm install을 할 때, 위와 같은 에러가 발생하곤 한다. g++ 인스톨이 필요하다.

해결방법은 yum -y install gcc-g++ 로 설치. root 권한이 필요할 수 있다.

'어장 Develop' 카테고리의 다른 글

[tomcat] p12 ssl 적용  (0) 2020.06.08
[Linux] Centos Alias 설정  (0) 2020.04.11
[JavaScript] timestamp convert to date type  (1) 2019.03.15
[Intellij] 인텔리제이 - lombok 설치  (0) 2018.09.06
ibatis selectkey 사용  (1) 2018.05.10
블로그 이미지

김생선

세상의 모든것을 어장관리

,

개발하다보면, 특정 컬럼의 네이밍을 조회하는 경우가 있다. 가령 A 라는 컬럼을 어떤 테이블에서 더 쓰는지. 뭐 이런 경우. Oracle은 all_tab_column인지 all_object를 쓰면 되긴 하는데 mysql은 처음이다. 하지만 간단하다.


1
SELECT * FROM information_schema.columns
cs



이렇게 해주면 된다. 개꿀.

블로그 이미지

김생선

세상의 모든것을 어장관리

,

개발하다보면 해당 페이지의 table의 데이터들을 새로고침 없이 데이터를 붙여쓰는 경우들이 있다. 이는 대부분 리스트로 구성된 페이지에서 확인이 가능한데, 가령 오픈마켓의 주문배송리스트라거나, 뭐 카드사용 내역과 같은 페이지에서 주를 이룬다.

div태그를 쓰던 table태그를 쓰던 아마 과정은 비슷할 것이고, javascript에서 데이터와 html태그들을 어떻게 만들어서 jsp에 붙여주는지에 대한 예제를 작성해보고자 한다.


먼저 JSP에서는 다음과 같이 구성한다. 기본적으로 페이지가 로딩될 때, controller 단에서 modelAndView에서 데이터를 호출, List로 이루어진 객체들을 foreach 로 계속 붙여주는 구조로 되어있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!--결과 리스트-->
<div class="result-area">
  <h2 class="result-tit">거래결과 리스트</h2>
  <ul class="result-list" id="resultList">
      <c:forEach var="resultHistory" items="${resultHistory}" >
      <li class="result-item">
          <p class="result-day">${resultHistory.REG_DATE} <span>${resultHistory.ORDER_TYPE}</span></p>
          <dl class="result-detail">
              <dt>품명</dt>
              <dd>${resultHistory.PRODUCT_TYPE}</dd>
              <dt>금액</dt>
              <dd>${resultHistory.AMOUNT}</dd>
          </dl>
      </li>
      </c:forEach>
  </ul>
</div>
<div class="more-btn-wrap">
  <button type="button" id="btnResultMore">더보기</button>
</div>
cs


modelAndView 에서는 resultHistory라는 네이밍의 List 객체에 데이터들을 담아준다. 그리고 해당 jsp페이지가 호출되면, foreach로 객체들을 돌리면서(?) 각 항목들을 구성하게 된다. 이 때, btnResultMore를 클릭한다고 하자. 그럴 때 해당 페이지를 새로고침 없이, 리스트의 하단에 추가적으로 데이터가 붙는 방식이면 훨씬 보기가 좋을 것이다. 새로고침을 하게 되면 현재 입력되어있는 값들도 저장하지 않는 이상 사라질 것이고, 무엇보다 좀 더 자연스러운 화면을 뿌려줄 수 있을 것이다.


btnResultMore 버튼에 매핑되어있는 javaScript의 펑션을 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var pageNo = 0;
 
//결과 더보기
$("#btnResultMore").on("click"function () {
  $.ajax({
    type:'GET',
    url : '/resultMore.json',
    global : false,
    async : true,
    data : {
      pageNo: pageNo
    },
    success : function(json) {
      $('#resultList').empty();
 
      var html = '';
      pageNo = pageNo+1;
      json.resultList.forEach(function(item, index){
        html = $('<li class="result-item">' +
          '<p class="result-day">'+item.REG_DATE+' <span>'+item.ORDER_TYPE+'</span></p>' +
          '<dl class="result-detail">' +
          '<dt>품명</dt>' +
          '<dd>'+item.PRODUCT_TYPE+'</dd>' +
          '<dt>금액</dt>' +
          '<dd>'+item.AMOUNT+'</dd>');
        $('#resultList').append(html);
      });
    },error:function(json){
 
    }
  });
});
cs


자바스크립트에서는 ajax 호출을 통해, 데이터를 더 가져오기 위한 controller 와 매핑을 시켰다.

정상적으로 쿼리가 이루어지는 경우에는 success flag를 탈 것이고, 이 때부터 로직이 시작된다.


기본적으로 들어있는 row를 날리기 위해, 14번 라인에서는 resultList의 자식들을 모두 비워준다.

그리고 18번 라인에서 가져온 데이터를 기반으로 forEach를 돌리면서, HTML tag를 새로 만들어주는 방식으로 이루어져있다.

위의 jsp와 마찬가지로 같은 구성으로 html과 데이터를 매핑해준 후에, 26번 라인에서 append를 시켜주면 끝.


추가적으로 btnResultMore를 누르게 되면 5개씩 항목을 더 붙여주는 기능을 포함한 것인데, pageNo 변수를 추가하여 이를 쿼리에 응용했다.

기본값은 0으로 처리가 되어서 쿼리에서는 기본 5개, 1일 경우에는 10개를 가져오는 방향으로.


javascript 에서 append와 appendTo의 쓰임새가 확연히 다르다.

$('#a').append(b); 의 경우에는 a에 b를 넣는 것이고, $('#a').appendTo(b);는 b를 a에 넣는것이다.

블로그 이미지

김생선

세상의 모든것을 어장관리

,

개발하다보면 DB의 날짜타입을 timestamp로 저장하는 경우가 있다. 개인적으로 이거 날짜 컨버팅 하고 뭐하고 하는것이 아주 귀찮아서 제일 끔찍하게 싫어하는 데이터 타입인데, 심지어 데이터가 저장되는것도 unix타임이야. 이거 한눈에 들어오겠냐고 제일 싫다.

여튼, 이걸 또 그냥 보면 15뭐시기로 시작하니까 사람이 제대로 읽을 수나 있겠냐, 이거지. 결국에는 사람이 읽고 쓸 수 있는 날짜타입(YYYY-MM-DD HH-MM-SS)으로 변환시켜줘야 하는데 일일히 찾아다가 만드는것도 귀찮고 펑션으로 하나 만들어놨으니까 앞으로 두고두고 좀 써먹어야겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//TimeStamp -> Date formatter
function unixToDateFormatter(date) {
  // yyyy-mm-dd hh:mm:ss.s
  var dateFormatt = new Date ( date );
  var year = dateFormatt.getFullYear();
  var month = 0;
  if ( dateFormatt.getUTCMonth() < 9 ){
    month = '0'+ ( dateFormatt.getUTCMonth() + 1 ).toString();
  } else {
    month = dateFormatt.getUTCMonth()+ 1;
  }
  var day = dateFormatt.getUTCDate();
 
  var hour = 0;
  if ( dateFormatt.getHours() < 10 ){
    hour = '0' + (dateFormatt.getHours()).toString();
  } else {
    hour = dateFormatt.getHours();
  }
 
  var minute = 0;
  if ( dateFormatt.getMinutes() < 10 ){
    minute = '0' + ( dateFormatt.getMinutes()).toString();
  } else {
    minute = dateFormatt.getMinutes();
  }
 
  var seconds = 0;
  if ( dateFormatt.getSeconds() < 10 ){
    seconds = '0' + (dateFormatt.getSeconds()).toString();
  } else {
    seconds = dateFormatt.getSeconds();
  }
 
  var milliseconds = dateFormatt.getMilliseconds();
  var fullDateFormatt;
  fullDateFormatt = year +'-'+month+'-'+day+' '+hour+':'+minute+':'+seconds+'.'+milliseconds;
  console.log ("DateFormatt : " + fullDateFormatt);
  return fullDateFormatt;
}
cs


일단 대강 만들긴 했는데, 몇가지 짚고 넘어갈 점이 있다.

getUTCMonth의 경우에는 0~11의 값으로 리턴해준다. 숫자는 뭐다? 0부터 센다. 0은 곧 1월이고, 이말은 리턴되는 값에 + 1을 해줘야 한다는 의미이다. 두번째로는 모든 자릿수를 맞춰줘야 한다는 것이다. 0~11로 리턴해주기 때문에 0은 +1을 해서 1월인데, 우리가 쓰는 데이트 포맷은 YYYY-MM-DD의 값으로 "월"의 자릿수가 맞지 않게 된다. 그런 고로 10월, 즉 리턴되는 값이 9보다 작은 경우에는 앞에 자릿수 '0'을 붙여주게 된다.

자릿수가 안맞는 부분은 month 뿐만 아니라 getUTCDate , getHours, getMinutes , getSeconds의 경우도 마찬가지가 된다. 그래서 각각의 경우에도 10보다 작은 경우에는 앞자리에 0을 붙이는 식으로 구성했다.


이거 하나 만들어놓으면 자바스크립트에서 두고두고 써먹을거고, 자바의 경우에는 simpledateformatter가 있으니까 그냥 이거 갖다 쓰면 된다.

'어장 Develop' 카테고리의 다른 글

[Linux] Centos Alias 설정  (0) 2020.04.11
[Linux] make: g++: Command not found  (0) 2019.08.12
[Intellij] 인텔리제이 - lombok 설치  (0) 2018.09.06
ibatis selectkey 사용  (1) 2018.05.10
리눅스 prerouting 설정방법  (1) 2018.03.15
블로그 이미지

김생선

세상의 모든것을 어장관리

,

DB 또는 시스템 작업을 하다보면 여러건에 대해 한번에 업데이트를 하는 경우가 많다. 뭐 그렇다치고 이번에는 MySQL 에서 서브쿼리를 이용하는 방법을 알아보자.


이번에 할 작업은 A_Table의 a_column의 데이터와 문자열을 합친 후, A_Table의 b_column에 업데이트를 해줄 일이 생겼다. 오라클과 다르게 한차례 더 가공을 해야 해서 손이 가는 편이지만 크게 어렵지는 않았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
UPDATE 
    'A_Table' AS AliasA 
SET 
    AliasA.b_column = 
    (
    SELECT
        AliasC.a_column_text
    FROM
        (
        SELECT
            AliasB.a_column 
            , CONCAT('TEST_' , AliasB.a_column ) AS a_column_text //MySQL에서 문자열 합치기는 concat을 이용함
        FROM
            'A_Table' AS AliasB 
        ) AS AliasC
    WHERE 
        AliasC.a_column = AliasA.a_column 
    )  
WHERE 
    AliasA.b_column IS NULL;
cs


오라클 같은 경우에는 SET 구문에서 서브쿼리를 바로 날리면 되지만, MySQL의 경우에는 SELECT 구문에 서브쿼리를 한 번 더 감싸줘야 한다.

이로써 A_Table의 b_column에 'TEST_'문자열이 합쳐진 a_column값이 update 되게 된다.

블로그 이미지

김생선

세상의 모든것을 어장관리

,