1. $scope 함수로 정의 시 이를 호출하여 내부에서 스코프 변수값을 변경한 경우 바로 변경되나, 일반 함수(function)로 정의한 경우 값이 바로 변경되지 않는다. 2. 타 컨트롤러의 함수를 호출하거나 변수 값을 변경할 때는 다음과 같이 접근할 수 있다. 물론 타 컨트롤러의 스코프 함수/변수에 한해서 가능하다. const otherCtrl = $("[data-ng-controller=otherCtrl]").scope(); $scope.apply(function(scope) { scope.otherCtrlFunction(); scope.otherCtrlVar = ''; }) 3. Apply하는 방식은 아래 두 가지 방법 모두 가능하다. $scope.$apply(function() { $scope...
getServletContext().getRealPath() 컨트롤러로 전달되는 HttpServletRequest의 세션(혹은 HttpSession)으로부터 서블릿 컨텍스트를 받아 getRealPath() 메소드를 통해 실제 경로를 구할 수 있다. 이는 파일 다운로드 등에도 자주 사용된다. request.getSession().getServletContext().getRealPath(); 유의 개인 프로젝트 진행 시에, 분명 서블릿 컨텍스트는 "/"로 지정되어있는 상태에서 위와 같이 경로를 구하면 임시로 톰캣이 프로젝트를 실행시키는 위치를 받아왔다. 실제 프로젝트가 위치한 경로가 안나왔다... 회사 코드에서는 위의 코드로 프로젝트가 위치한 경로가 나왔는데 이 이유를 모르겠다..!
MyBatis에서는 #{변수}, ${변수}을 사용해 해당 변수를 넘겨준 파라미터 값으로 치환할 수 있다. 이 때, 둘은 쿼리가 실행될 때 차이점을 보인다. 아래의 두 쿼리문을 보자. SELECT * FROM MOVIES WHERE MOVIENAME=#{movieName} SELECT * FROM MOVIES WHERE MOVIENAME=${movieName} 위 쿼리문을 마이바티스를 통해 실행했을 경우 실제로는 아래와 같이 실행된다. SELECT * FROM MOVIES WHERE MOVIENAME='타이타닉'; SELECT * FROM MOVIES WHERE MOVIENAME=타이타닉; 이러한 차이 때문에 동적쿼리문을 작성할 때 테이블명 혹은 컬럼명이 입력해야 하는(따옴표가 없어야 하는) 부분에는 '#..
이미지 파일(BLOB 타입)을 데이터 베이스에서 가져와 실제 이미지화하여 이를 파일로 다운로드 하기 위해선 ImageIO 클래스의 read 함수를 통해 이미지를 받아와 이를 write 함으로써 가능하다. 참고로 아래 코드 중 'png'가 들어가는 부분에는 이미지의 확장자를 넣으면 된다. String image = itemVO.getImageData(); byte[] imageBlob = Base64.getDecoder().decode(imageDataStr.split(",")[1]); String fileName = "C:\Users\Admin\Downloads\new_image.png"; BufferedImage img = ImageIO.read(imageBlob); ImageIO.write(img, ..
1. 이미지 캡쳐할 영역 지정 첫 번째 인자로는 캡쳐할 영역의 element를, 두번째 인자로는 옵션을 전달할 수 있다. 아래와 같이 제이쿼리 선택자를 이용할 경우에는 '[0]'을 붙여주어야 한다. 또한, 캡쳐되는 영역에서 일부 요소들은 제외하고 싶다면 ignoreElements 옵션을 사용하여 특정 조건에 맞으면 return true(참이면 제외) 하여 제외시킬 수 있다. html2canvas($("#imgDiv")[0], { ignoreElements: (element) => { if (element.className === "ignoreElemId") { return true; } }, }).then(function (canvas) { var img = canvas.toDataURL("image/p..
1. Word 파일(.docx) 1) 바이너리 파일 작성 완료 후 바이트 배열로 만들기 InputFileStream is = new InputFileStream("/filePath"); XWPFDocument doc = new XWPFDocument(is); ... ByteArrayOutputStream os = new ByteArrayOutputStream(); doc.write(os); os.close(); doc.close(); byte[] xwpfBytes = os.toByteArray(); // xwpfBytes를 DB에 넣는 작업 수행 2) DB에서 바이트 배열 가져와서 파일로 다운로드 String fileName = "document.docx"; byte[] fileBytes = mapper..
1. 워드 파일 생성 File templateFile = new File(path, templateFileName); XWPFDocument doc = new XWPFDocument(new FileInputStream(templateFile)); 2. 테이블 생성(기존 템플릿 테이블 사용 시 POIWordUtil.copyTable() 사용 가능) XWPFTable tbl = doc.createTable(); POIWordUtil.copyTable(templateTable, tbl); XWPFTable tbl = doc.createTable(); XWPFTableRow row = tbl.createRow(); // 이미 존재하는 XWPFTableRow 삽입 시 addRow() 사용 가능 XWPFTableC..
회사의 SPA 어플리케이션 개선 작업을 하면서 스크립트로 서버와 통신하는 일이 잦다. 이전에 혼자 프로젝트를 진행하면서 크게 의식하지 않고 사용했던 부분을 회사 업무를 수행하면서 헷갈렸던 부분들에 대해 제대로 정리하게 됐다. ajax 를 사용해 서버로 데이터를 보낼 시 1. Object 형태로 전달 시에는 해당 변수명과 일치한다는 전제 하에 @RequestBody 사용 가능 1) JavaScript let obj = { name: '이름', company: '회사', department: '부서' } $.ajax({ url: "/example", type: "GET"/"POST", data: { dataName: obj }, success: function(result) { ... }, error: fu..
아래 예제에서는 obj2가 빈 객체와 obj를 합친 것으로, 실상은 obj 객체를 복사한 것으로 볼 수 있다. let obj = { name: "이름", age: 22, company: "회사명" } let obj2 = $.extend({}, obj);
배열을 리스트로 변환해 병합하려는 리스트들을 새로 생성한 리스트에 추가한다.(addAll) List list = new ArrayList(); List list2 = mapper.getList1(obj); List list3 = mapper.getList2(obj); list.addAll(list2); list.addAll(list3);