Spring, JSTL: div 태그로 이루어진 이중 반복문 사용하기 (특정 개수별 구분)

예를 들어 15개마다 줄바꿈이 되는 이런 모양의 웹 페이지를 만들고 싶은데, 사용 태그가 div라면 HTML 페이지는 이런 형태가 될 것입니다. <!DOCTYPE html> <html lang=”ko”> <head> <meta charset=”UTF-8″> <title>Document</title> </head> <style> .list { display: inline-block } .list>div { margin: 10px; background-color: antiquewhite } </style> <body> <div class=”list”> <!– max 15 –> 더보기…

Spring Boot: 시큐리티(Security) – 3 – 로그인 및 권한 정보를 DB에서 가져오기

  깃허브에서 전체 코드 보기 – https://github.com/ayaysir/spring-boot-security-example-1 이전 글에서는 기초를 익히기 위해 사용자 및 권한 정보를 inMemoryAuthentication이라 해서 메모리에 하드코딩 했었는데요, 이것을 데이터베이스에 옮겨서 가져오도록 하겠습니다. 데이터베이스는 mariadb 기준입니다. macOS에서 mariadb 설치하기 Spring Boot: mariadb 연결하기 (JDBC-Maven 기준)   먼저 데이터베이스에 임의의 테이블을 만들고 사용자 정보를 입력합니다. 지금은 회원가입 절차가 없으므로 DB에 더보기…

Spring Boot: 시큐리티(Security) – 2 – 커스텀 로그인 페이지 만들기

  1. SecurityConfig 클래스의 configure(http) 에 다음 내용을 추가합니다. .formLogin().loginPage(“/login”).failureUrl(“/login?error”).permitAll() // .logout().logoutRequestMatcher(new AntPathRequestMatcher(“/logout”)) .addLogoutHandler(new TaskImplementingLogoutHandler()).permitAll().logoutSuccessUrl(“/”); loginPage는 로그인할 페이지의 주소이며 로그인이 필요한 상황에서 localhost:xxx/login 을 통해 로그인 화면으로 접속합니다. failureUrl은 로그인 실패했을 때 나타나는 뷰 페이지의 주소입니다. permitAll()이 없으면 권한 문제가 있는 경우 로그인 화면에 들어갈 수 없으므로 반드시 넣어줘야 합니다. 더보기…

자바스크립트: AJAX로 blob 타입의 리스폰스 가져오기(파일 다운로드)

https://stackoverflow.com/questions/16086162/handle-file-download-from-ajax-post 스프링을 통해 바이너리 파일을 다운로드하는 기능을 AJAX로 구현하려 했는데 서버에서는 용량이 1.5MB인 파일이 다운로드 될 때는 3MB로 부풀려져서 다운로드 되는 문제가 있었습니다. 파일이 깨진것이며 복구 불가능한 상태였습니다. 결론부터 말하면 XMLHttpRequest의 responseType 을 blob으로 설정해야 하며 JQuery AJAX 기능은 오류가 지속적으로 발생하므로 자바스크립트 기본 XMLHttpRequest를 사용하는 것을 추천합니다. var xhr 더보기…

자바스크립트: setInterval(반복 함수) 정지하는 방법 (clearInterval 사용)

자바스크립트에서 setInterval(function, millisecond)는 일정 시간(ms) 마다 함수를 실행하는 기능입니다. 예를 들어 millisecond를 1000으로 정하면 1초마다 함수를 반복 실행합니다. 참고로 0초(최초 setInterval이 실행되는 시점)에서는 실행되게 하려면 millisecond를 0으로 지정해야 합니다. 만약 1000로 설정했다면, 0초에는 아무 액션도 취하지 않고 있다가 1초 이후부터 실행 부분을 반복하게 됩니다. 실행되고 있는 인터벌 함수를 중지시키려면 clearInterval([인터벌 더보기…

axios: AJAX 데이터 받기 (Promise 기반) + 예제 (JSON 가져오기)

axios 홈페이지: https://github.com/axios/axios 사용법 axios는 Promise 기반의 AJAX 라이브러리입니다. 기본 형태는 다음과 같습니다. axios.get(‘/user’, { params: { ID: ‘anyvalue’ } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }) .finally(function () { // always executed }); axios.get 뿐만 아니라 post, delete, put, patch 등 리퀘스트 종류에 따라 사용할 수 있습니다. 더보기…

자바스크립트: 캔버스를 이미지 파일로 다운로드

<a> 요소를 만들어서 클릭 이벤트를 트리거시켜 다운로드 하는 방식입니다. var canvas = document.getElementById(“somewhere”) canvas.toBlob(function(blob) { var a = document.createElement(“a”) document.body.appendChild(a) a.style = “display: none” blob.type = “octet-stream” var url = URL.createObjectURL(blob) a.href = url a.download = “filename” a.click() window.URL.revokeObjectURL(url) }

Spring: AJAX로 백엔드 컨트롤러에 이미지 전송

컨트롤러 (일부) @RequestMapping(value = “/url”, method = RequestMethod.POST) public String insert(MultipartHttpServletRequest request, HttpSession session, ModelMap model) throws Exception { String rootPath = session.getServletContext().getRealPath(“/”); System.out.println(“imageFile ” + request + ” ” + request.getParameter(“imgFile”) + ” ” + rootPath + ” “); Iterator<String> itr = request.getFileNames(); if(itr.hasNext()){ List<MultipartFile> mpf = request.getFiles(itr.next().toString()); for(int 더보기…

Node.js: Webpack + Babel과 Babel/polyfill을 이용하여 ES6으로 작성된 코드를 ES5 이하에서도 호환되게 하기

Node.js: 설치, 코드 실행 (Windows 기준) Node.js: Webpack 설치하기 (Webpack 4 버전 기준) Node.js: Webpack 4 추가 설정 (CSS, HTML, dev-server)   require(‘./static/css/main.css’) // CSS 로딩 방법 console.log(“WELCOME”) // 기본 Babel만으로 동작 const funcEx = () => { alert(‘arrow’) } funcEx() // Promise 등은 Pollyfill을 필요로 한다. function msgAfterTimeout (msg, 더보기…

JQuery: $.parseXML 과 IE의 WrongDocumentError 에러

$.parseXML(string)은 스트링 형식으로 된 xml을 자바스크립트 객체로 파싱하는 역할을 한다. 이게 중요한게 아니고 크롬을 비롯한 기타 브라우저에서는 저걸 그냥 사용해도 이상이 없는데 인터넷 익스플로러에서만 발생하는 오류가 있다. <script> function xmlDocGenerator(tagName){ var xml = document.implementation.createDocument(“”, “”, null); var topNode = xml.createElement(tagName) xml.appendChild(topNode) return xml.cloneNode(true); } var xmlHeader = xmlDocGenerator(“elm:customTag”) xmlHeader = 더보기…