2017년 12월 8일 금요일

JSON 형식으로 DB 저장 후 다시 가져오는 법

JSON 컬럼이 지원되지 않는 경우 JSON형식으로 text를 만들어 DB에 넣어서 사용하면
동적인 데이터를 관리하고 보여주기 편하다.

ex)

var params = {
    var1: $('#var1').val(),    var2: $('#var2').val(),    var3: $('#var3').val(),    var4: $('#var4').val()
}
$('#varTotal').val(JSON.stringify(params));

varTotal를 console로 찍어보면 아래와 같이 

JSON.stringify 함수로 JavaScript params값을 JSON(JavaScript Object Notation) 문자열로 변환합니다.

{"var1":"aaaa","var2":"bbbbb","var3":"ccccc","var4":"ddd"}  

이 형태를 DB 저장 후 다시 JQUERY로 가져 올 경우

DB에서 데이터를 varVO 클래스에 담아 varTotal 컬럼으로 가져온다 가정할때 


model.addAttribute("varVO", varVO);

   var varVO= ${varVO.varTotal};
   console.log("varVO : %o",varVO);
   console.log("varVO : " +titleVO.var1);
   console.log("varVO : " +titleVO.var2);
   console.log("varVO : " +titleVO.var3);

이와 같이 사용하면된다

만약에 ajax를 사용해서 json type으로 데이터를 받아 왔을 경우나

위에서 데이터를 홑따옴표묶었을 경우 문자열로 인식을 하기 때문에 var varVO= '${varVO.varTotal}' 

JSON.parse(varVO.varTotal) 를 사용해서 JSON 문자열을 자바스크립트 객체로
변환해서 사용하면 된다


추가적으로 홑따옴표 관련 해서 확인 결과 아래와 같았다.

console.log("titleVO : %o",'${testVO.titleDetail}');
titleVO : "{"titleMedia1":"tvn","titleMedia2":"bbbbb","titleMedia3":"ccccc","titleMedia4":"MBC"}"

console.log("titleVO : " +'${testVO.titleDetail}');
titleVO : {"titleMedia1":"tvn","titleMedia2":"bbbbb","titleMedia3":"ccccc","titleMedia4":"MBC"}

문자열을 %O 로 보여줄 경우 기존 문자열를 쌍따옴표로 감싸면서 로그가 찍히며

또 자바스크립트는 

${testVO.titleDetail} 를 홑따옴표로 감쌌을 경우 문자열로 인식하고 감싸지 않을 경우 오브젝트로 인식한다

그러므로 JSON.parse를 사용 할때는 ${testVO.titleDetail} 를 꼭 홑따옴표로 감싸줘야한다 

이유는 JSON.parse 함수는 문자열을 자바스크립트 객체로 변경해 주는 것이기 때문이다.

결론적으로 

JSON 형식으로 저장된 DB TEXT를 스크립트로 가져와서 JSON과 같은 형태로 사용할 경우

var titleVO= ${testVO.titleDetail};  //자바스크립트 객체
var titleVO= JSON.parse('${testVO.titleDetail}'); //문자열을 자바스크립트 객체로 변환

홑따옴표를 안붙이고 model로 넘어온 자바 변수를 사용해도 되지만 명시적으로 보이기 해 JSON.parer('')를 사용하는 것을 추천한다


2017년 12월 7일 목요일

jquery child selector 꺽쇠

$("#menu li") 는 #menu 안에 있는 모든 li를 가리키고

$("#menu > li")는 #menu 바로 아래의 li만 가르킴

<ul id=menu><li>여긴사용가능</li></ul>

<div id=menu><ul><li>여긴사용불가능</li></ul></div>

참고 블러그
http://raisonde.tistory.com/entry/jQuery-Seletor%EC%97%90%EC%84%9C-%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4-%EC%99%80-%EA%BA%BD%EC%87%A0-%EC%9D%98-%EC%B0%A8%EC%9D%B4

2017년 12월 1일 금요일

한글깨짐 jsp->class


jsp게시판에서 검색시 class 로 넘어가면서 한글이 깨지는 문제 발생
-이클립스에선 정상작동되나 Intellij에서는 오류 발생

->해결방법 tomcat/conf/server.xml 파일에서 UTF-8추가

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
    URIEncoding="UTF-8"
   />

2017년 11월 21일 화요일

jquery 특정 ID나 input 으로 시작하는 문자열(like) 찾는법

http://api.jquery.com/attribute-starts-with-selector/
https://stackoverflow.com/questions/5616826/jquery-find-all-ids-starting-with-a-string

id가 pdfChk로 시작하는건 전부 보여준다
$('[id^="pdfChk"]').show();

2017년 11월 20일 월요일

json ajax 호출 후 java->success(data) 한글깨짐

1 ajax 파라미터->java 
 contentType: 'application/x-www-form-urlencoded; charset=UTF-8'

2. java->ajax 결과 값

@RequestMapping(value = "/Completed.do"  , method = {RequestMethod.GET, RequestMethod.POST},produces="text/plain;charset=UTF-8")

produces를 설정하면 javascript 받는쪽에서 한글이 안깨진다

2017년 11월 15일 수요일

HASH 해시란

http://blog.naver.com/PostView.nhn?blogId=korbitinc&logNo=220859113675

2017년 11월 1일 수요일

정규식 관련 정보

정리 잘 된 사이트
http://www.nextree.co.kr/p4327/
http://nkdk.tistory.com/entry/%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D-%EC%A0%95%EB%A6%AC

정규식 테스트 사이트
https://regexr.com/

/s 공백관련
http://emflant.tistory.com/198

정규식 숫자 금액 콤마 설정
function numberWithCommas(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

2017년 10월 30일 월요일

jquery input 박스 속성 가져오기

2개다결과는 같다
체크 : true
체크안함: false

$('input:checkbox[id='testId']').is(":checked"));

$('#testId').prop("checked");

http://api.jquery.com/is/
.is() : 속성이 존재하면 true or false
Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.

2017년 10월 22일 일요일

jquery Label 속성 접근 및 변경


JQUERY LABEL 관련 내용

<td scope="row"><label for="info">정보</label></td>


label for 은 document id 처럼 사용할 수 가 있다.


텍스트 변경을 원할 경우


$("label[for = 'info' ].text("정보변경");


이런식으로 접근하면 됨


ex https://stackoverflow.com/questions/9803399/jquery-change-text-from-label

2017년 10월 1일 일요일

JSON CONTAINS COLON

{
  "photo": {
    "reg": {
      "id": 50
    },
    "thumb": {
      "id": 51
    },
    ":original": {
      "id": 53"
    }
  }
}
json에 : 이 포함된경우 아래와 같이하면됨
photo[':original'].id

2017년 9월 29일 금요일

jquery id, name, class 로 접근방법

jQuery로 id 접근시 $(“#id”),

ex) $(“#header_area”)


class로 접근시 $(“.class”),

ex) $(“.section_nav”)


name으로 접근시 $(tag_name[name=name]),

ex) $(“input[name=search_value]“)

2017년 9월 14일 목요일

JSONP 및 Script console.log Tip


console.log 찍을 시 Object 상세 찍는법
console.log("object: %O", data); 

JSNOP  : http://kingbbode.tistory.com/26 여기에 제일 잘 정리되어있음
            크로스도메인 해결하는데 Spring security에서 막혀 있어 filter + jsonp 로 해결함
            http://www.codejs.co.kr/jquery-jsonp/
            http://dev.epiloum.net/1311



JSONP is a method for sending JSON data without worrying about cross-domain issues.
JSONP does not use the XMLHttpRequest object.

JSONP uses the <script> tag instead.

실행시 주의사항
1. web.xml 에 filter 설정해서 해당 url 크로스도메인 허용해줌
2. java 값 리턴시 callback 함수로 감싸주어야함
3. script에서 호출하고 받을때 callback 함수 이름이 동일해야함


XML 부분 
web.xml
<filter>
   <filter-name>cors</filter-name>
   <filter-class>com.test.api.common.util.CORSFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>cors</filter-name>
   <url-pattern>/test/*</url-pattern>

</filter-mapping>

Filter java 부분
public class CORSFilter implements Filter{

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {

        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        
        response.setHeader("Access-Control-Allow-Origin", "*");
        chain.doFilter(req, response);
}
}

JAVA 부분
@RequestMapping(value="/test.do", method = {RequestMethod.GET, RequestMethod.POST})
public void testApi(HttpServletRequest request, HttpServletResponse response) throws Exception{

try {
response.setContentType("text/html;charset=UTF-8"); //PrintWriter 한글깨짐해결

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
TestDetail testDetail = (TestDetail ) authentication.getPrincipal();
String userId    = testDetail .getMember().getId();
String userName  = testDetail .getMember().getUserName();

String callBack = request.getParameter("callback");  //jsonp callback 함수명

JSONObject obj=new JSONObject();

obj.put("userId", userId);
obj.put("userName", userName);

PrintWriter out = response.getWriter();
out.write(callBack + "("+obj.toString()+")");
out.flush();
out.close();
}
catch (Exception e){
logger.error("Exception : " + e.getMessage(), e);
}

}
Script 부분 

function apiCheck(){
 var aPI = "http://test/testApi.do?callback=?";  //callback 이게 컬백함수 이름임
 $.getJSON( testAPI, 
function( data ) {
console.log("data : " + data);
console.log("object: %O", data)
 });
}

2017년 9월 12일 화요일

반복자 JAVA iterator

이터레이터(Iterator) 인터페이스
- 모든 컬렉션(Collection)으로 부터 정보를 얻을 수 있는 인터페이스 입니다.
- 즉, 자신이 컬렉션(List, Set 등)이라면 이터레이터 인터페이스를 사용할 수 있습니다.
도서관에 비유
- 우리가 책을 보관하는 책장(컬렉션)이 있고, 그 곳에는 책(컬렉션 안에 들어갈 객체)이 있습니다.
- 이 책장은 도서관 사서(이터레이터)가 관리하게 됩니다.
- 사서는 단순 무지한 녀석이라 책장 처음부터 끝까지 한번에 하나씩 밖에 못 가져옵니다.
이터레이터가 가지고 있는 메서드
- boolean hasNext() : 다음 값이 있는지 없는지 확인, 있으면 true를 리턴하고 없으면 false를 리턴 --> if나 while문에서 쓰면 되겠죠?
- E next() : 다음 값을 리턴합니다. 어떤 형태인지 모르기 때문에 리턴 유형을 E로 하겠습니다.
- void remove() : 삭제 하는 메서드


 Set<String> movie = new HashSet<String>();

    movie.add("대부");
    movie.add("반지의 제왕");
    movie.add("겨울왕국");
    movie.add("다크 나이트");
    movie.add("해리포터");
    movie.add("공공의 적");

    Iterator<String> itr = movie.iterator();
    // 이터레이터 객체 itr에 HashSet객체인 movie안에 있는 값들을 가져온다
    // 모든 컬렉션 안에는 iterator()메서드가 있기 때문에 점찍고 사용하면 movie안에 있는 값들을 가져올 수 있다
    while (itr.hasNext()) { // 값이 나올때까지 while문을 돈다
      String s = itr.next()// 문자열 변수 s에 다음값을 넣는다
      System.out.println(s);
    }

출처: http://bitnori.tistory.com/entry/JAVA-JAVA-ITERATOR-자바-이터레이터 [Bitnori's Blog]


출처: http://bitnori.tistory.com/entry/JAVA-JAVA-ITERATOR-자바-이터레이터 [Bitnori's Blog]

2017년 9월 1일 금요일

유효성 검사 jquery required

api 참조: https://jqueryvalidation.org/valid/

form 내부에
<input  required="required" data-title="테스트">

required 의미는 값이 꼭 있어야한다를 뜻한다
참조 블로그 : https://mytory.net/archives/195

이런식으로 적은 후 저장 버튼 함수에
유효성 검사를 넣어두면 jquery 에 의해서 자동적으로 체크가 되며
그 대상의 data-title 값 + 지정해둔 message로 alert창이 뜬다
data-title 값이 없으면 id 값을 알려준다

즉 jquery valid 함수 하나로 required 설정된 곳은 다 검사 할 수 가 있다

$('#btnSave').on('click', function() {
if(!$('#frm').valid()) {
return;
}
}


jquery 설정 파일은 jquery.utils.js 내에서
1
jrx.define('validate.init', function() {
  required : messages.해당값
  }
2 $.validator.setDefaults({
여기를 보면 잘 설정되어있다

2017년 8월 25일 금요일

Srping AOP와 proxy 관련 내용

Aop : aspect oriented programming
-비니지스 로직은 아니지만 반드시 해야하는 작업(로그,트랜잭션처리)
-개발의 핵심적인 비지니스 로직에만 집중하고 나머지 부가기능은 설정을 통해서 조정해라

 Aspect: 공통관심사(로깅, 보안, 트랜잭션)
 Advice: 실제로 기능을 구현한 객체
 Join points: 공통관심사를 적용할 대상. Spring AOP에서는 각 객체의 메소드가 이에 해당
                  (작성된 Advice가 들어갈 수 있는 메소드)
 Pointcuts : 여러 메소드 중 실제 Advice가 적용될 대상 메소드
                 (이것을 통해 Advice가 적용된 형태로 동작)
 target : 대상 메소드를 가지는 객체

 Aop에서의 proxy : Advice가 적용되었을때 만들어지는 객체]
 Introduction: target에는 없는 새로운 메소드나 인스턴스 변수를 추가하는 기능
 Weaving : advice와 target이 결합되어서 프록시 객체를 만드는 과정

proxy: 대리인, 바깥쪽 객체, 웹 클라이언트의 요청 URL를 해당 서버가 아닌 프록시 서버로 요청
- se.naver.com에 request 를 하면 내 IP를 가지고 그 웹서버에 바로 접속되는 것이 아니라
  '프록시 서버'로 요청을 전송하고 서버는 대리인을 데리고 웹서버에 가서 데이터를 주고 받고
  다시 '프록시 서버'를 통해 내 브라우져로 데이터를 가져옴

   clinet < - > proxy server < - > naver.com

Linux Unix 차이점

Linux
-Unix를 개인 컴퓨터에서 사용할 수 있도록 한것이 리눅스임
- ex) Cent OS

Unix
 - 안전성으로 포털이나 대기업같은 사이트에서 서버로 사용
 - ex) AIX

window
 - 낮은 보안성
 - 대량의 네트워크를 담당하지 못함
 - 비싼 가격

shell
 - 사용자와 OS 간의 중계 역할을 하는 명령어 해석기

2017년 8월 24일 목요일

linux ls, permission, group, rm

1. 리눅스 ls -altr
-a : --all숨겨진 파일까지 보여줌
-l  : --formant=long, 파일에 대한 자세한 정보를 보여줌
-t  : --수정된 날짜순으로 보여줌
-r  : --역순으로 보여줌

2. 리눅스 permission
 d          rwx        r-x          r-x            2    
파일타입 소유자    소유그룹  공개          링크수(바로가기 수)
root      root      4096      Apr 22 16:59    conory
소유자  소유그룹 용량      생성날짜          파일 이름

 파일타입: 맨앞글자 d->디렉토리, l ->링크파일, - -> 일반파일
 permission: r(읽기,4) w(쓰기,2) x(실행,1)
                 rwx -> 4+2+1=7
                 r-x -> 4+1 =5
                 r-x -> 4+1 =5
                 permission 파일변경 -> chmod 755 conory.txt 
                                디렉토리변경->chmod -R 777 conory (conory디렉토리 하위모두변경)

 3. 리눅스 그룹 확인
   -그룹확인  tail -f /etc/group 
                  cat /etc/group | grep 그룹명(그룹번호)
   -id <user_name> 
     uid=203(weblo), gid=202(was) groups=1(staff)
     uid: 고유한 아이디(학번)
     gid: 속한 그룹 아이디 학과   

 4. 리눅스 그룹 삭제
    -삭제
         rm 파일명
         rm -r 디렉토리명(디렉토리가 비어있지 않으면 -r 명령어 필수)
          
 delete file, directory
    

네트워크 용어

게이트웨이: 출입구, 랜카드마다 고유번호가 적혀있다

허브: 같은 IP 대역의 호스트를 하나의 네트워크로 연결

백본: 네트워크 장비의 척추. 허브들이 백본장비와 연결되어 데이터가 모아진다. 이 데이터가 라우터를 통해 나간다.

라우터: IP주소를 찾아 최단 경로로 보낸다

프락시서버: 웹페이지의 정보를 열어둘지 말지를 정하며 열어본 페이지를 캐쉬에 저장하며 다시 접근하면 보여줌

방화벽: 외부망과 내부방을 나눈다

로딩바 간단히 추가하기

간단하게 로딩바 이미지 넣는법
1. css 추가
#loading {
 width: 100%;  
 height: 100%;  
 top: 0px;
 left: 0px;
 position: fixed;  
 display: block;  
 opacity: 0.7;  
 background-color: #fff;  
 z-index: 99;  
 text-align: center; } 
  
#loading-image {  
 position: absolute;  
 top: 50%;  
 left: 50%; 

 z-index: 100; }

2. jsp에 추가
<div id="loading" style="display:none;" ><img id="loading-image" src="/asset/images/loadingbar/ajax-loader.gif" alt="Loading..." /></div>

2017년 8월 20일 일요일

ksh(aix) 명령어 관련

참조 블로그: http://egloos.zum.com/kunlaboranto/v/466836

command line 자동완성 기능

보통 bash 을 많이 사용하는 이유는 <TAB> 으로 수행하는 명령어나 대상 directory, file 들을 자동 완성해 주는
기능이 막강해서죠.
bash 은 아시다시피 <TAB> 으로 합니다.
csh 은 set filec 를 세팅하면 <ESC><ESC> 로 사용 가능합니다.
ksh 은 좀 일반화 되지 않은 듯 하여..
1.       set o vi 로 command line을 vi 모드로 변경.
2.       ls a <ESC> + = 를 하면
a1
a2
같은 선택의 범위가 보이고..
3.       ls a <ESC> + \ 를 하면 해당되는 곳까지 자동 완성합니다.

기존명령어 반복
esc키 누르고 k 키를 누르면 된다. 그 다음 이전 명령을 사용하려면 다시 반복하면 된다.


2017년 8월 18일 금요일

javascript onclick 이벤트에서 referenceError 발생한 경우

page_html += "<a href='#' onclick='javascript:load_page("+first_page+","+keyword_data+")'>";
이부분을
page_html += "<a href='#' onclick='javascript:load_page(#{first_page},#{keyword_data})'>";
page_html = page_html.replace(/#{first_page}/gi, '"' + first_page + '"').replace(/#{keyword_data}/gi, '"' + key
이렇게 정규식을 사용해서 치환해야지 정상 호출된다 하지만 스크립트 버그로 함수 변수에 공백이 들어가는 경우도 있어서 잘 확인해야함

2017년 7월 19일 수요일

JAVA ObjectMapper 클래스 json<->String

1.1 Convert Java object to JSON, writeValue(...)
ObjectMapper mapper = new ObjectMapper();
Staff obj = new Staff();

//Object to JSON in file
mapper.writeValue(new File("c:\\file.json"), obj);

//Object to JSON in String
String jsonInString = mapper.writeValueAsString(obj);
1.2 Convert JSON to Java object, readValue(...)
ObjectMapper mapper = new ObjectMapper();
String jsonInString = "{'name' : 'mkyong'}";

//JSON from file to Object
Staff obj = mapper.readValue(new File("c:\\file.json"), Staff.class);

//JSON from URL to Object
Staff obj = mapper.readValue(new URL("http://mkyong.com/api/staff.json"), Staff.class);

//JSON from String to Object
Staff obj = mapper.readValue(jsonInString, Staff.class);
실제사용예시
List<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>();
resultList = testDAO.selectListDAO(SearchVO);
ObjectMapper om = new ObjectMapper();
String jsonStr = om.writeValueAsString(resultList);

   ->[{"value1":8.4, "value2":5.4}, {"value1":8.4, "value2":5.4} ]
      이와 같은 형태로 [ ] 안에 json {} 으로 묶이게 된다
      다시 꺼내서 사용할 때는 [] 로 묶여있기 때문에 list로 빼내야함
      var resultCondition = JSON.parse(results[i].resultCondition)[0];

      만약에 []로 묶인것이 아니라 {"value1":8.4, "value2":5.4} 로 묶였다면 아래와 같이만 하면된다
      var resultCondition = JSON.parse(results[i].resultCondition);