안녕하세요! 오늘도 열심히 개발중에 있습니다. 최근 매 프로젝트마다 로그인 시스템을 만드는게 귀찮고 운용하는데에도 문제가 있을 것 같아서 개인적인 프로젝트에 사용할 통합 인증 시스템을 구현하려고 합니다. 이에 많은 프레임워크를 찾았지만 스프링과 호환성이 좋으면서 레퍼런스도 어느정도 있고 쉽게 구현할 수 있는 KeyCloak 프레임워크에 대해서 알아보았습니다. Keycloak 설치 keycloak 공식 홈페이지에 들어가면 바로 다운로드 버튼이 보이실텐데요. (keycloak은 오픈소스로 무료입니다) 들어가면 최신 버전이 나와있는데 개인적으로 16버전이상부터 폴더 구조가 많이 변경되어 레퍼런스를 찾기 어려우니 15버전 이하를 사용하시는 것을 권장드립니다. (문서 또한 최신 버전은 불친절하다가 느껴졌습니다.)..
안녕하세요 오늘도 열심히 프로젝트를 개발 중에 있습니다. 최근 매번 개인 프로젝트를 개발할 때마다 인증구현을 해줘야함에 번거로움을 느껴 통합인증(SSO) 시스템을 만드려고 합니다. 이에 먼저 Spring Security를 공부하고자 하는 마음으로 해당 내용을 정리해보았습니다. 스프링 시큐리티 개념 Filter단 실행 Spring Security는 Filter단에서 실행되며 DelegatingFilterProxy단에서 일어나 Spring 프레임워크에서 해당 인증 구현을 할 수 있게 한다. (FilterChain) Tomcat 인증 session id JSESSIONID를 톰캣에서 발급해주는데 Spring Security에서 로그인 성공시 이 JSESSONID에 로그인 정보를 담게 된다. Spring Sec..
안녕하세요! 오늘도 열심히 개발중에 있습니다. 웹개발을 하면서 가장 많이 사용하는 브라우저는 크롬일 것입니다. 크롬에서는 개발자에게 유용한 기능들이 많은데 그 중 필수적으로 사용하는 것이 크롬 개발자 도구입니다. 이곳에서 소스코드 및 여러가지 테스트를 할 수 있고 네트워크 정보 등 유용한 정보를 분석할 수 있습니다. 크롬 개발자 도구 열기 크롬 개발자 도구는 윈도우에서는 f12 맥에서는 cmd+option+i로 열 수 있습니다. 왼쪽 탭에는 해당 페이지의 소스코드(html)이 보이고 오른쪽에는 선택한 요소의 css 속성을 알 수 있습니다. 위쪽에 동그라미 친 녀석들이 많이 사용하는 기능들인데요. 왼쪽 마우스 표시 아이콘은 실제 view 화면의 요소를 클릭하여 해당 요소의 소스코드를 바로 볼 수 있는 기능..
김태원 선생님의 문자열 4번 알고리즘 문제이다. 문제 코드 package com.company.Main; import java.util.Scanner; public class Main { public String[] solution(String[] str) { String[] answer=new String[str.length]; for (int i = 0; i < str.length; i++) { StringBuffer sb = new StringBuffer(str[i]); String reverse = sb.reverse().toString(); answer[i] = reverse; } return answer; } public static void main(String[] args) { Main T..
안녕하세요 오늘도 열심히 개발중입니다. 오늘은 디자인적인 부분에서 개발자에게 많은 도움을 주는 ColorSlurp라는 프로그램을 소개해볼까합니다. 저 또한 이 프로그램을 모르고 있다가 최근에 맥으로 개발하면서 사수 분에게 해당 프로그램을 추천받았는데요. 직접 사용해본 결과 너무 좋아서 포스팅으로 소개합니다. ColorSlurp ColorSlurp는 맥 app store에서 다운받아 사용할 수 있는 무료 프로그램으로 온라인 색 코드를 추출해주는 기능을 가지고 있습니다. 흔히 포토샵에서 스포이드 역할을 해주는 프로그램으로 어느 프로그램에서나 가져오고 싶은 색상에 단축키로 팬을 활성화 한 후에 해당 색상에 가져다 대면 색 코드가 자동으로 보이면서 복사까지 됩니다. 해당 맥과 연동되어 간단히 단축키로 이용할 수..
안녕하세요. 오늘도 열심히 개발중입니다! 최근 프로젝트가 어느정도 완성되어서 실제 AWS EC2 서버로 배포하였는데요. EC2에서 고정 IP와 연결하여 실제 웹 브라우저에서 ip와 스프링 기본 시작 포트 8080을 통해 접속할 수 있게 되었지만 사이트가 실제 서비스하려면 도메인과 연결하여 접속할 수 있게 해야겠죠. 오늘은 그 방법에 대해서 알아보겠습니다. 가비아 도메인 구매 아마 가장 많이 도메인을 구매하는 사이트는 가비아일 것입니다. 가비아에서 원하는 사이트 주소를 검색하여 구매하면 위와 같이 도메인 관리에서 사이트가 목록으로 나옵니다. AWS Route 53 설정 AWS에서는 도메인과 연결을 쉽게 할 수 있도록 Route 53 서비스를 운영하고 있습니다. 이는 EC2와 별개의 서비스로 Route53 ..
divrange는 기본적으로 input 제공으로는 하나의 값에 대한 범위만을 지원한다. 하지만 구현하다보면 min,max 두 값을 지정하여 범위를 설정해야 하거나 혹은 더 많은 값에 대한 범위를 설정해야 하는 경우가 있다 오늘은 이런 구현에 정말 많은 도움이 되는 NoUiSlider라는 라이브러리에 대해서 알아보겠다. NoUiSlider https://refreshless.com/nouislider/ noUiSlider - JavaScript Range Slider | Refreshless.com noUiSlider: lightweight JavaScript range slider with full touch support Accessible with ARIA and keyboard support Mul..
인프런 김태원 선생님의 문자열 3번문제 문제와 코드 해결방법 정리입니다. 문제 코드 import java.util.Scanner; // Integer.MIN_VALUE 개념, max min 개념 public class Main { public String solution(String str) { String answer=""; int m = Integer.MIN_VALUE; String[] s = str.split(" "); for (String x: s) { if (m < x.length()){ m = x.length(); answer = x; } } return answer; } public static void main(String[] args) { Main T = new Main(); Scanne..
Description 요즘 스프링 프로젝트를 개발하면서 기본적인 부분에 대해서 부족함을 많이 느꼈다. 그래서 다시 스프링 기본 이론부터 동작 방식 등을 공부하고 있는데 정말 방대하게 모르는 지식들이 나왔다. 이번 기회에 제대로 정리하고자 하는 마음으로 공부한 내용을 정리하고 포스팅하려고 한다. WAS와 Web Server 무엇이 다를까? 이 둘은 비슷하면서도 다른 면모를 보이고 있다. Web Server은 주된 기능으로 Http 프로토콜을 기반으로 정적인 컨텐츠를 제공하는 기능을 하고 있다. 이에 반해 Was는 애초에 목적인 동적 컨텐츠를 제공 하기 위해 만들어졌는데 Web Application Server라고도 불리며 Web Server은 정적인 컨텐츠를 제공할때는 Was를 거치지 않지만 동적 컨텐츠가..
김태원 선생님의 자바 알고리즘 2번째 문제입니다. 해당 문제에서는 UpperCase(대문자), LowerCase(소문자)를 자바에서 다루는 방법에 대해 소개하고 있습니다. 문제 코드 import com.company.Main; import java.util.Scanner; // foreach lowerCase, uppserCase 이론 public class Main { public String solution(String str) { String answer=""; for (char x : str.toCharArray()) { if(Character.isLowerCase(x)) answer += Character.toUpperCase(x); else if(Character.isUpperCase(x)) ..
최근 자바 알고리즘을 공부하기 시작했다. 물론 파이썬으로 알고리즘 푸는 것이 다른 언어보다 훨씬 빠른 감이 있지만 내 전용 언어를 자바로 선택한 만큼 자바에 대한 문법도 재점검 할 생각이다. 인프런에 김태원 선생님의 인강을 신청하였고 해당 사이트의 알고리즘 문제를 차근차근 풀어보려고 한다. 문제 코드 import java.util.Locale; import java.util.Scanner; public class Main { public int solution(String str, char t) { int answer=0; str = str.toUpperCase(); t = Character.toUpperCase(t); for (int i = 0; i < str.length(); i++) { if (s..
안녕하세요! 오늘도 열심히 프로젝트를 개발중입니다. 드디어 Spring으로 만든 이력서 제작 사이트가 어느저도 완성되었습니다. 처음에 배포 환경에 대해서 정말 많이 고민하였습니다. 서버같은 경우는 EC2를 사용하기로 결정하였지만 db의 경우 임시로 h2를 연결하여 사용하고 있다가 aws rds를 사용할지 mariadb를 서버에 설치하여 사용할지 고민하다가 mariadb를 사용하기로 마음 먹어놨죠. db의 경우 미리 연동해놔서 이제 jar파일로 배포만 하면 되는상황입니다. 오늘은 spring boot 빌드 및 ec2 배포에 대해서 알아보겠습니다. spring boot gradle gradle 설정 jar { manifest { attributes 'Main-Class': 'com.jelly_develop...
스프링으로 프로젝트를 개발하던 중 해당 오류가 나왔다. 해당 오류는 JAVA에 Json 타입 변환 과정 중 일어난 오류이다. 이는 테이블과 테이블이 연관 관계에 있으며 이를 mode.addAttribute 메소드를 통해 데이터를 Front로 보낼때 Json으로 변환 과정중에 무한으로 참조가 순환되어 일어나는 오류로 간단히 해결할 수 있다. 문제 @Entity @Getter @Setter public class ProfileBlockTemplate { ...... @JsonIgnore @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "MEMBER_ID") Member member; @JsonIgnore @OneToMany(mappedBy = "profile..
최근 개발 생산성을 높이기 위한 Dummy Create Module을 개발하고 있다. 항상 DB와 Spring을 연동할 때는 JPA를 써왔지만 아무래도 Dummy Create의 호환성을 위해 JDBC로 개발하기로 마음먹었다. 오늘부터 해당 JDBC 부분에 대한 기능 및 DB 접근 방법에 대해 포스팅할 생각이다. 오늘은 Table이 존재하는지 확인하는 Method를 소개할 까 한다. JDBC로 DB 연결 implementation 'org.springframework.boot:spring-boot-starter-jdbc' gradle에 다음과 같이 의존성을 추가해주어야 한다. Connection con = null; try { // db 연결 설정 Class.forName("org.h2.Driver"); ..
Description 현재 우리나라는 스프링을 웹 백엔드 프레임워크로 많이 사용하고 있다. 처음 스프링을 접했을 때 너무 잘 구조된 시스템 구조에 놀란 기억이 있다. 스프링을 다루는 사람이라면 한번쯤은 들어본 서블릿은 스프링의 핵심 구조중 하나이다. 오늘은 서블릿에 대해 자세히 알아보려고 한다. Servlet Servlet(서블릿)이란 자바 기반의 웹 프로그래밍에서 클라이언트 요청을 처리하고 해당 결과를 응답하여 클라이언트에 전송되는 기술로서 웹 통신의 표준 규약인 CGI를 따른 자바 버전이라고 생각하면 된다. 웹 프로세스와 Servlet 특징 웹 페이지는 크게 정적 페이지와 동적 페이지가 있다. 정적 페이지는 클라이언트로 한번 페이지 정보를 전송하고 나면 이후 양방향 통신이 필요 없이 해당 페이지에서 ..
Description JDBC를 공부하다가 문득 JDBC 가 2계층과 3계층 모두를 지원한다는 이야기를 들었다. 문득 2계층과 3계층에 대해 정리가 덜 된 상태라 이번 기회에 제대로 공부하기로 했다. 개념 자체는 쉽기 떄문에 그림으로만으로도 이해가 충분하다. 개념 계층을 나눈다는 것은 최종적으로 사용자에게 보이끼까지 몇단계를 둘것인가를 설정하는 것이다. 최근 대부분의 웹개발은 3계층으로 구성되어 있다. 정말 간단한 웹개발이라면 2계층도 고려하지만 기본적으로 3계층으로 구성하는 것을 추천한다. 2-tier (2계층) 클라이언트가 직접 DB 서버에 접근하여 데이터를 가져온다. 2 tier 단점 거의 모든 비지니스 로직을 클라이언트에서 처리한다 (속도 문제) 비지니스 로직 변경시 클라이언트로 프로그램을 다시 ..
Description 드래그 이벤트가 발생하면 기본적인 이벤트로 발생한 요소에 대해 마우스 포인터 쪽에 드래그 이미지가 표시된다. 이 때 event 객체 하위에 setDragImage를 통해 마우스 포인터에 잡히는 드래그 이미지를 표시할 수 있다. 이런메서드들을 보면 웹개발의 역사가 길다보니 왠만한 이벤트 처리에 대한 것들은 모두 구현되어 있는 것 같다. Diagram 만약 순수 js 로만 구현한다면 drag시 발생하는 모든 이벤트에 대해 setDragImage를 설정해야 해당 이미지가 잘 적용되는 것 같았다 (이 부분은 정확하지는 않다) 존재하는 drag event는 다음과 같다 (MDN 참조) var dragged; /* 드래그 가능한 대상에서 이벤트 발생 */ document.addEventList..
안녕하세요. 오늘도 열심히 프로젝트를 개발중에 있습니다. 프로젝트 개발 중 최종적인 db로 aws ec2에 mariadb를 설치하여 이용하기로 마음먹었습니다. 일단 ec2에는 amazon linux를 설치하였고 mariadb를 설치하는데 당연하게도 최신 버전이 설치합니다. 하지만 mariadb 최신 버전에는 한가지 문제가 있더군요. 바로 인코딩 문제입니다. 이번 포스팅에서는 인코딩 오류를 해결하는 방법에 대해 포스팅하려고 합니다. mariadb 최신 버전 인코딩 오류 먼저 이 글에 작성된 mariadb 버전은 5.5? 이상 버전인것으로 기억합니다. 포스팅 시점이 해결한 시점 2일뒤라서 두서없이 해결 방법을 알려드리겠습니다. /etc/my.cnf 를 vim 으로 열고 해당과 같이 작성되있으면 됩니다. 아마..
안녕하세요. 오늘도 열심히 개발중입니다. 지금 개발하고 있는 프로젝트는 chrome extension인데요. 현재 사용 방식이 insert html한 bar에서 이용하다 보니 최대한 lib 간 충돌을 없애기 위해 순수 js로만 개발을 하는 중입니다. 지금까지 lib로 편하게 여러 이벤트를 등록하다가 js로만 이벤트를 등록시키려니 아무래도 노가다 부분이 많습니다. 이번 포스팅에서는 마우스 우클릭 이벤트 등록하는 방법에 대해 알아보겠습니다. 마우스 우클릭 이벤트 is_right_click = (event.which == 3) || (event.button == 2) 우선 js로만 등록하게 되면 필수적으로 다루는 객체가 event 객체인데요. 해당 event 객체에는 event가 발생하는 지점, event 정..
안녕하세요. 오늘도 열심히 개인 프로젝트를 개발하고 있습니다. spring이 확실히 was로서 많은 기능을 포함하고 있어 사용하기에는 편리하지만 gradle로 종속성을 추가할 때 버전 문제로 골치를 아프게 하는 경우가 많은 것 같습니다. 오늘도 같은 문제인데요. h2 에서는 naming이 대문자로 자동으로 변환되어 sql 작성시 문제가 없었는데 mariadb (aws ec2 서버에 설치하였습니다) 연동시에 이런 네이밍 떄문에 전체 쿼리 날리는데 문제가 있는 것 같습니다. 문제의 시작 및 첫 해결방법 시도 package com.jelly_develop.passprofile.domain.template; import com.jelly_develop.passprofile.domain.member.Member;..
안녕하세요! 오늘도 열심히 개발중입니다. 제가 백엔드 분야이기는 하지만 아무래도 혼자 프로젝트를 진행하려면 프론트엔드 영역도 많이 알아야 된다는 것을 느꼈습니다. 이번 포스팅에서는 많은 서비스에서 애용중인 롱클릭 숏클릭 이벤트에 대해서 알아보겠습니다. 롱클릭과 숏클릭이 유행하게 된 원인은 모바일 기기에서 터치로 버튼을 클릭하기 때문인데요. 이 때문에 롱클릭은 손가락으로 꾹 누르면 실행되는 구조입니다. JS 롱클릭과 숏클릭 구현 const app_click = async () => { console.log("taskApp click 이벤트"); let pcLong = 0; const LONG_CLICK = 700; const mouse_start = (event) => { console.log("mouse..
안녕하세요. 오늘도 열심히 개발 공부를 하는 중입니다. 개발을 하다보면 모달이나 팝업을 사용할 때가 많은데요. 이번 포스팅에서는 순수 js만으로 창의 사이즈를 조절하는 방법에 대해서 알아보겠습니다. 창 사이즈 조절 기본 개념 보통 어떤 os던가 창을 조절하는 방법은 마우스 커서를 양 대각선 끝쪽에 위치하면 커서 모양이 변하고 이를 원하는 방향으로 드래그하여 옮기면 사이즈가 조절되는 방식입니다. 따라서 기본 개념은 (1) 마우스를 대각선 끝쪽에 위치하면 커서 모양이 변한다. (2) 그 상태에서 드래그를 하면 창의 사이즈가 조절된다. 입니다. (1)번의 경우는 css 이벤트를 주면 되겠고 (2)번의 경우는 event를 등록하여 드래그 하는 동안 실시간으로 창의 사이즈를 변하게 하면 되겠죠. 이번 개발은 혼자..
요즘 서버 및 데이터베이스를 사용하는데 있어 클라우드 서비스를 많이 활용하는데요. 그 중에서 단연코 유명한 클라우드 서비스라면 aws가 있습니다. 아마 전세계적으로 가장 많이 사용되는 클라우드 서비스가 아닐까 싶습니다. 이번 프로젝트를 진행하는데 있어 aws로 서버를 구축하기로 마음먹었는데요. 오늘은 ec2를 ssh로 접속하는 방법에 대해서 알아보겠습니다. aws 에서 보안키(pem file) 가져오기 처음 인스턴스를 만들기 시작할 때 주의해서 선택할 점이 ssh는 기본적으로 포트 22번을 사용하기 때문에 22번 포트를 열어줘야 하며 어느 컴퓨터에서건 ssh로 접속하기 위해 0.0.0.0/0을 보안그룹으로 지정해주어야 합니다. 그리고 인스턴스 만들기가 진행되면 기존의 pem 보안키 파일과 연결하라던가 새..
안녕하세요. 회사에서 python을 이용하여 웹개발을 진행하는데 기존 사용했던 spring 체계, 즉 java에 없었던 정말 좋은 문법들이 많더군요. 오늘은 python 에서 여러줄 문자열을 작성하는 방법에 대해서 간단히 알아보려고 합니다. python 여러줄 문자열 code = """ hello world this is the world """ print(code) ''' 출력 결과 helloworld thisistheworld ''' 이런식으로 쌍따음표 3개를 입력하여 안에 내용을 삽입하면 문자열을 손쉽게 여러줄 입력이 가능합니다. 이런 방식이 편한 이유는 동적 문자열 문법과 합쳐져 쉘스크립트 형식이나 html 작성, 함수 자체를 작성할 수 있다는 점입니다. 예를 들어 동적 함수를 web front ..
안녕하세요. 요즘 spring으로 이력서 제작 웹사이트를 개발중에 있는데요. 그 중에서 jpa를 이용한 drag event 를 활용할 필요가 있었습니다. 해당 부분을 개발하는데 많은 고민을 해야 했던것 같습니다. 아무래도 첫 프로젝트다 보니 그렇겠죠? 이번 포스팅에서는 제가 어떻게 jpa를 활용하여 drag 이벤트를 구현했는지 알아보려고 합니다. Front 부분 mine 1 mine 2 mine 3 mine 4 mine 5 먼저 Jquery-ui 를 cdn으로 가져와야 합니다. 당연히 그 이전에 Jquery에 대한 부분도 가져와야 하고요. (해당 jquery를 가져오는 부분은 위쪽에 생략되어 있습니다.) $("#sortable").sortable({ placehold..
프론트 개발을 하다보면 가끔 iframe을 사용할 때가 있다. iframe의 사용 목적이 그저 해당 주소의 창을 보여주는 것이라면 상관 없지만 가끔씩은 iframe 창과 부모 창간의 통신이 필요할 때가 있다. 예를들어 메인 화면이 있고 이들을 보면서 실시간으로 화면 수정을 하고 싶을 때 iframe과 부모간의 통신을 사용한다. 이번 포스팅에서는 Iframe에서 부모 함수를 호출하는 방법에 대해서 알아보려고 한다. 기본 구성 현재 진행중인 프로젝트는 프로필(이력서) 작성 사이트인데 여기에 메인 페이지가 있습니다. 근데 따로 edit 페이지를 줘서 url이 edit일 경우 수정 버튼들을 활성화 시켜 edit과 메인 페이지간 통신을 구현하려고 합니다. 오른쪽은 edit의 html element이고 왼쪽은 if..
웹 서버를 만들기 위해 필수적인 몇가지 요소가 있는데 그 중 필자가 가장 중요하게 생각하는 부분은 database이다. 정적인 사이트면 데이터베이스를 사용할 필요가 없겠지만 왠만한 웹들은 db를 다 사용할 것이다. 개발할 시에도 db의 세팅이 필요한데 이번 포스팅에서는 spring에 h2 database를 연결하는 방법에 대해서 알아보겠다. h2 설치 https://www.h2database.com/html/download-archive.html Archive Downloads www.h2database.com 위에 h2 공식 사이트이다. 다만 홈에 있는 가장 최신 h2 db 대신 1.4.200 버전을 사용하는 것을 추천한다. 물론 윈도우라면 최신버전으로 쉽게 실행할 수 있지만 유독 맥 쉘에서 ./h2...
자바의 기본 문법인 Collection은 언뜻 보면 스크립트형 언어에서 사용하는 json, 혹으니 dictionary 형태와 비슷하다. 하지만 자바에서는 이들의 자료형을 좀 더 세분화 시켜서 사용한다. 가장 위에 있는 Map을 상속받아 사용 목적에 따라 구현체 class로 나누는데 이번 포스팅에서는 간략히 Collection이 무엇이 있는지에 대해서 알아보겠다. Map public interface Map { Map은 일반 클래스가 아닌 인터페이스이다. 즉 대부분의 Collection 자료형은 Map을 상속받으며 이들을 담는 그릇 형태로 사용한다. 실제 자바 Map에 들어가면 구현체에 대한 설명을 주석으로 잘 작성해두었다. 가서 확인해보자 HashMap Map hashtableMap= new HashMa..
안녕하세요. 최근 스프링에 푹 빠져사는 개발자입니다. 스프링을 개발하다가 자바를 많이 사용해봤지만 이번 기회에 제대로 문법 정리를 하려고 합니다. 오늘은 가장 기본이 되는 자바의 문자열 함수들을 간단하게 정리하려고 합니다. 문자열 비교 함수 String a = "the snow glows white on the mountain to night test"; String b = a; String c = "test"; String d = "Hello, this is wonderful world"; String e = "test"; String f = new String("tefdnosafnodsanfo"); String g = "heytest"; 먼저 간단하게 테스트 문자열 변수들을 선언 및 초기화 시켜두었습..
요즘 많이 사용하고 있는 편집기는 intellij 이다. intellij 는 기본적인 편집기가 제공하는 대부분의 기능을 제공하고 있는데 좋은 점은 커스텀 설정을 할 수 있는 부분이 많다는 것이다. 오늘은 주석 위치에 대해서 설정하는 방법에 대해서 알아보려고 한다. intellij 주석 위치 설정(java) intellij 주석을 치다가 집 맥북같은 경우에는 아래 작성된 코드 라인에 따라서 주석이 자동으로 주입되었는데 회사에서 주석을 작성하다 보니 저렇게 첫 라인에 주석이 삽입되어 있어 매우 보기가 싫었다. 예전에 설정한 것 같은데 잊어버려서 포스팅으로 확실히 기억하려고 한다. 설정에 들어가서 code style로 치면 아래로 많은 언어와 db들이 나오는데 그 중 java를 선택한다. 메뉴 탭들 중에서 c..