안녕하세요. 오랜만에 개발 관련 글로 돌아왔군요. 그 동안 대학교 졸업과 취업 문제로 블로그 포스팅에 많이 신경을 못 썼던 것 같아요. 취업한 이후에 조금 여유를 가지게 되면서 요즘은 python의 자동화 관련되어서 관심을 많이 가지게 되었어요. 이후 개인용 웹서버를 통해 자동화 기능을 가진 서버 하나가 있었으면 좋겠다는 생각이 들어 시놀로지로 웹서버를 구축하게 되었습니다. 시놀로지 nas 외부접속 설정 공유기 포트 포워딩 먼저 현재 사용하고 있는 공유기에 포트포워딩을 설정합니다. 해당 설정은 공유기에 들어오는 접속을 허용해주는 것으로 공유기에 연결된 시놀로지 nas로 접근해야 하기 때문에 접근할 포트를 허용해주어야 합니다. 내부 ip 같은 경우는 시놀로지 사설 ip를 작성하면 되고 허용할 외부 포트와 ..
BreakPoint란 완전하지 않은 코드들을 테스트하거나 수정할 때 이용할 수 있는 유용한 시스템이다. 보통 대부분의 편집기에서 제공하지만 Intellij는 break point를 더욱 사용하기 쉽게 만들어주는 것 같다. 이번 포스팅에서는 break point 사용 방법에 대해서 알아보겠다. Break Point 지정 위와같이 빨잔점으로 표시되는 것이 breakpoint인데 라인 옆에 마우스 우클릭을 하여 지정할 수 있다. 디버그 모드 실행 디버그 모드 실행시 break point에서 자동으로 멈춘다. 그리고 해당 라인까지의 정보를 파악할 수 있다. 위와 같이 중단점에서의 변수들 정보를 파악할 수 있는데 step over를 통해 한줄 씩 읽어 나갈 수 있고 옆에 초록색 중간 실행 버튼을 통해 다음 bre..
안녕하세요! 오늘도 열심히 달리고 있는 젤리킹입니다. 이번에 풀어볼 문제 유형은 그리디 알고리즘으로 처음에는 무엇으로 풀어야 하나 많은 고민을 하였습니다. 문제 문제 해결 아이디어 해당 문제는 제가 작성한 코드가 테스트 케이스에서 계속 실패하여 다른 사람의 코드를 참조하였습니다. k가 주어지면 적어도 k 인덱스 부분부터는 꼭 숫자를 선정해줘야 한다. 숫자를 선택하면 선택한 인덱스 j 부터 k+1까지 숫자를 뽑아줘야 한다. 숫자를 선택할 때 설정한 범위 내에서 최대값을 뽑아준다. 해당 범위에서 선정된 최대 숫자를 answer에 더해준다. 자바 코드 package com.company; import java.util.*; public class Main { public String solution(Strin..
안녕하세요! 오늘도 열심히 달리고 있는 젤리킹입니다. 최근 취업 코딩테스트로 알고리즘 문제들을 공부하고 있는데요. dfs, bfs는 어느정도 익숙해졌지만 그 외에 어려운 알고리즘은 아직도 해매는 경우가 많더라고요. 오늘부터 프로그래머스 1문제씩 꾸준히 풀려고 각오를 다지고 있습니다. 이번 포스팅에서는 디스크 컨트롤러 문제에 대해서 풀어보겠습니다. 문제 문제는 대략 이렇습니다. dfs, bfs 문제가 아닌 힙 알고리즘으로 문제 해결 아이디어 대기큐와 실행큐를 나눠 선언한다 대기큐는 requestTime의 오름차 순으로 정렬 기준을 잡고 실행큐는 workingTime의 오름차순 정렬 기준을 잡는다. 대기큐에 jobs를 모두 넣는다. 그리고 time을 증가시키며 현재 시간 이하의 요청 시간을 가지는 모든 작업..
안녕하세요! 오늘도 열심히 개발하고 있습니다. 어느정도 SSO 시스템이 마무리가 되어서 이제 본격적으로 오픈뱅킹 api 분석 및 테스를 진행하려고 합니다. 오픈뱅킹이 아무래도 금융과 관련있다 보니 인증과 관련해서 여러번의 통신을 주고 받아야 하는데요. 이번 포스팅부터 차근차근 시작해보겠습니다. 오픈뱅킹 인증 구조 오픈뱅킹 인증 구조는 다음과 같습니다. 먼저 오픈뱅킹 서비스를 테스트하려면 테스트 계좌를 연동하고 이에 대한 인증이 필요합니다. 이를 위해 PostMan 같은 도구를 사용하거나 오픈뱅킹 개발자 사이트에서 제공하는 도구를 이용하는 것이 좋습니다. 사용자 인증 오픈뱅킹 도구에서는 바로바로 rest api를 통해 response 코드를 받을 수 있는데요. 인증에서 [사용자 인증] 부분을 클릭하여 ge..
dfs/bfs 문제만 죽어라 풀 고 있다. 이번 문제는 쉽게 풀었던 것 같다. 이번 포스팅에서 풀이 과정에 대해서 간단히 알아보겠다. 문제 풀이 아이디어 문자열이 바뀌는 조건은 한개씩이기 때문에 다음과 같은 조건을 만족해야 한다. 문자열의 길이는 차이가 나지 않는다 ( 원래 대상과 변경하려는 대상의 길이가 같다) 문자열을 문자단위로 분해했을 때 한개의 차이만 있어야 한다. words에 있는 단어만이 변경하려는 대상이 될 수 있고 한번 대상이 된 words는 사용해서는 안된다. 위의 두 조건을 탐색하는 알고리즘으로 bsf를 선택하였다. 코드 public static Map visited = new HashMap(); public int solution(String begin, String target, S..
bfs, dfs 문제는 항상 날 어렵게 하는 문제이다. 해당 유형의 문제에 익숙해지기 위해서는 많은 연습이 필요하다. 꾸준히 열심히 해야겠다…. 문제 아이디어 네트워크의 개수는 연결의 시작점과 종점에 의해서 갈라진다. 즉 각 네트워크는 다른 그룹과 독립적이다. for문을 통해 순서대로 시작점을 지정한다. 그리고 dfs를 통해 연결점의 종단까지 이동하면서 방문한 노드를 visited 배열을 통해 체크한다. 다음 start 점을 선별할 때에는 방문한 노드를 제외하고 네트워크 하나의 dfs가 끝날때마다 네트워크 개수를 count한다. 코드 public static int solution(int n, int[][] computers) { int answer = 0; // 순서대로 탐험하는데 이 때 시작점으로 방..
안녕하세요! 오늘도 열심히 개발중입니다. 최근 keycloak에 푹 빠져서 이것저것 설정을 해보고 있습니다. 아무래도 한국 자료로는 적절한 레퍼런스가 없어 공식 문서를 뒤지거나 영어 사이트들을 찾아보면서 설정을 만지고 있는데요. 이번 포스팅에서는 keycloak에서 대표 로고를 변경하는 방법에 대해서 알아보겠습니다. Keycloak Realm 대표 로고 변경하기 [realm 페이지에서 설정한 대표 로고] keycloak에서는 어드민 페이지에서 설정한 대표 타이틀이 해당 태그 안에 들어갑니다. 대표 타이틀의 경우 default 값으로 realm의 이름이 설정되는데요. 따라서 설정하지 않는다면 로그인이나 회원가입 페이지에서 realm 이름이 나올 것입니다. 물론 로고를 바꾸는 방법 중 직접 각 로그인,회원가..
안녕하세요! 오늘도 열심히 프로젝트 개발을 진행하고 있습니다. 오늘은 keycloak에서 한국어 설정을 추가하는 방법에 대해서 알아보겠습니다. keycloak은 스프링 기반이다보니 message.properties를 통해 국제화 메시지를 지원하는데요. 유감스럽게도 한국어는 기본 등록 언어 파일로 되어있지 않습니다. 이번 포스팅에서는 한국어 설정을 추가하는 방법에 대해서 알아보겠습니다. Keycloak 메시지 파일 추가 theme에 있는 메시지 파일 아무거나 복사하여 message_ko.properties라고 이름을 지어줍시다. 아무거나 복사해도 상관 없지만 번역하기 쉽게 영어 메시지 파일을 복사하시는 것을 추천드립니다. ko 파일을 엽시다. 가장 위에 인코딩을 설정해주어야 합니다. 한국어는 대부분 utf..
HTML 폼 전송 방식 application/x-www-form-urlencoded 폼에 입력하여 전송할 항목들을 Http Body에 문자로 username=kim&age=20와 같이 & 형태로 구분하여 전송한다. multipart/form-data 파일의 경우 문가가 아닌 바이너리 형식으로 전송해야 한다. 또한 파일과 문자 둘다 전송해야 하는 상황 경우 사용하는 것이 multipart/form-data이다. Spring Filre Upload Controller @Controller @Slf4j @RequiredArgsConstructor public class ViewController { @Value("${test.file}") ///Users/jelly/Desktop/images/test/ pri..
자바 탄생 이유 다양한 OS에서 독립적으로 실행시키기 위해서, 이가 가능한 이유는 JVM(Java Virtual Machine) 덕분이다. JVM은 컴파일된 코드를 실행시켜주는 가상의 컴퓨터 역할을 한다. 자바 컴파일 과정 개발자가 자바 소스를 작성한다 (.java) 자바 컴파일러가 자바 소스파일을 컴파일한다. 이 때 나오는 파일은 자바 바이트 코드(.class)파일로 아직 컴퓨터가 이해할 수 없으며 자바 가상 머신이 이해할 수 있는 코드이다. 컴파일된 바이트코드를 JVM 클래스 로더에게 전달한다. 클래스 로더는 동적로딩을 통해 필요한 클래스들을 로딩 및 링크하고 런타임 데이터 영역, JVM의 메모리에 올린다. 실행엔진은 JVM 메모리에 올라온 바이트 코드들을 실행한다. 인터프리터 : 바이트 코드 명령어..
스프링 오류 종류 Error 시스템에 비정상적인 상황이 발생했을 경우에 사용한다. 주로 자바 VM에서 발생하는 것이다. OutOfMemoeryError나 ThreadDeath 같은 것들이 대표적인 예이다. Exception CheckedException RuntimeException class를 상속하지 않음 Transaction으로 Rollback이 진행 안됨 프로그램 상 의도한 예외가 아니기 때문에 반드시 예외를 처리하는 코드를 함께 작성해야한다. IOException이나 SQLException 등과 같은 예외가 있다. Uncehcked Exception RuntimeException class를 상속받음 Transaction으로 Rollback이 진행됨 반드시 예외를 체크하지 않아도 되는 경우에 사..
안녕하세요. 오늘도 열심히 개발중에 있습니다. 최근 SSO 구축에 큰 관심을 가지게 되어서 spring과 호환성이 좋은 keycloak을 열심히 연구중에 있습니다. 오늘은 회원 등록시 user 속성을 추가하는 방법과 이 값을 client 측에서 가져오는 방법에 대해서 알아보겠습니다. User Attribute 추가 프로젝트 폴더의 /themes/base 폴더를 복사해주어 custom 폴더 명으로 변경합니다. theme 폴더 안에 있는 하위 폴더들은 관리 페이지에서 지정할 수 있는 theme로 잡히기 때문에 바로 base나 keycloak 폴더에서 스타일 및 폼 형식 변경을 진행해도 되지만 복사해서 만드는 것이 이전으로 복구할 때 편합니다. /custom/login/register.ftl ${msg("ph..
기존 새로운 quarkus 기반 keycloak의 경우 custom 하는데 많은 문제를 겪어 이전의 wildfly 기반 keycloak을 사용하기로 마음먹었습니다. quarkus의 경우 conf 파일을 통해 손쉽게 외부 DB를 연결할 수 있었지만 그 외에는 새롭게 개척해서 공부해야 하는 부분때문에 힘든것은 어쩔 수 없네요. 이번 포스팅에서는 wildfly 버전 외부 DB 연동 방법에 대해서 알아보겠습니다. Managemene 사용자 생성 저도 외부 DB 연동하면서 알았는데 Management 계정을 따로 만들 수 있더라고요. 기존의 경우에는 일일히 소스코드를 고치며 외부 DB를 연동해야 했지만 현재는 손쉽게 management 사용자 계정을 통해 손쉽게 연동할 수 있습니다. /bin 파일로 이동후 다음 ..
안녕하세요. 오늘도 열심히 개발중입니다. Spring에서는 다양한 기능들이 내장되어 있습니다. 그 중 개인적으로 가장 편리하다고 느낀 기능은 유효성 검증입니다. 스프링에서는 간단히 어노테이션만 사용하여 유효성 검증을 할 수 있습니다. 이번 포스팅에서는 Validation을 활용하여 유효성 검증하는 방법에 대해서 알아보겠습니다. Spring 유효성 검증 (Validation) 유효성 메시지 국제화 ( messages/validation.properties ) required.user.userName=유저 이름은 필수값입니다. max.age.number=나이는 50까지 허용합니다. min.age.number=나이는 20이상이여야 합니다.. totalPriceMin=가격 * 수량의 합은 {0}원 이상이어야 합..
안녕하세요! 오늘도 열심히 개발 공부를 하고 있습니다. 최근 스프링의 다양한 기능들을 배우고 있습니다. 그 중에서 글로벌 서비스를 만들기 위한 다국어 처리를 스프링을 통해 손쉽게 해결할 수 있는 것을 알았는데요. 이번 포스팅에서는 스프링에서 메시지 국제화를 통해 다국어 처리를 하는 방법에 대해서 알아보겠습니다. 다국어 처리 파일 Spring Resources 폴더 밑에 messages.properties와 message_en.properties을 만들어줍니다. 해당 이름으로 해주는 이유는 다른 이름으로 해도 되지만 기본 default로 등록시키는 메시지 파일 이름이 "messages"이기 때문입니다. 다른 이름으로 설정시 application.poperties에 해당 메시지 국제화 설정을 등록해주면 됩니..
오랜 꿈이였던 SSO 시스템을 구축하기 위해 Spring과 호환성이 좋은 Keycloak을 이용하려 했다. 헌데 문제는 keycloak이 버전 16부터 대격변이 일어났는지 세팅하는 것이 많이 바뀌었다는 것이다. 아무래도 최신 버전을 사용하는 것이 좋아보이기에 17버전을 SSO 시스템에 사용하기로 마음먹었다. Keycloak 설치 및 실행 https://github.com/keycloak/keycloak/releases/download/17.0.1/keycloak-17.0.1.tar.gz 위 링크를 클릭하면 바로 keycloak 17 버전을 다운로드 받을 수 있다. 처음에는 keycloak에서 dev 환경에서 시작하는 것을 권장하고 있지만 언젠가 product 모드로 배포해야 하기 때문에 product 모..
Amazon Linux에서는 각종 lib를 쉽게 설치할 수 있다. 이번 포스팅에서는 AWS LINUX에서 손쉽게 mariadb를 설치하는 방법에 대해서 알아보겠다. Mariadb 설치 1. mariadb 설치 sudo yum install mariadb-server 2. mariadb 시작 sudo systemctl start mariadb sudo systemctl status mariadb Mariadb 접근 권한 설정 mysql -u root GRANT ALL PRIVILEGES ON *.* TO [이름]@localhost IDENTIFIED BY '[password]'; GRANT ALL PRIVILEGES ON *.* TO [이름]@'%' IDENTIFIED BY '[password]';
오늘도 열심히 프로젝트 개발중입니다. 기존에 모두 http로 올려놓은 것들을 이제 https로 바꾸려고 합니다. 이거 적용하는데 시간이 꽤 들은 것 같습니다. 아직 미숙한 부분이 많아 좀 더 노력을 해야할 것 같습니다. 이번 포스팅에서는 aws에서 https를 적용하는 방법에 대해서 알아보겠습니다. Certificate Manager 인증서 발급 AWS Certificate Manager에 들어가서 인증서를 발급받는다. 이 때 도메인 인증은 DNS 인증과 이메일 인증이 있는데 Route 53을 쓰는 경우 손쉽게 DNS 인증을 할 수 있다. 인증서가 생성되면 CNAME이름과 값이 발급되는데 위의 Route 53 레코드 생성에서 생성된 Route 53 도메인을 클릭하면 자동으로 CNAME이 등록된다. Tar..
최근 여러개의 프로젝트를 배포하면서 단순히 jar로 실행하는 것이 아닌 docker와 연동하여 띄우는 것이 효과적임을 알았다. 앞으로의 작업들은 아마 docker를 통해 배포 관리를 할 것 같다. docker는 간단히 말하면 배포 환경에 동일한 세팅을 공용으로 진행하기 위해 컨테이너라는 시스템을 도입한 것이다. 이번 포스팅에서는 연동 방법만 알아보고 다음에 Docker에 대한 개념을 자세히 알아 보겠다. Docker 설치 https://docs.docker.com/desktop/mac/install/ Install Docker Desktop on Mac docs.docker.com 위 사이트에 들어가서 Docker를 설치한다. 맥의 경우 Intel용과 m1용이 따로 있으니 잘 확인해준다. https://..
데이터베이스 KEY 슈퍼키 : 각 행을 유일하게 식별할 수 있는 하나 또는 그 이상의 속성들의 집합 후보키 : 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합 기본키 : 후보키들 중에서 하나를 선택한 키로 최소성과 유일성 만족 대체키 : 기본키로 지정하고 남은 후보키 외래키 : 테이블이 다른 테이블의 데이터를 참조하여 테이블간의 관계를 연결하는 것 DB 정규화 테이블 간 중복된 데이터를 허용하지 않는 것을 목적으로 함. tech-interview-for-developer/정규화(Normalization).md at master · gyoogle/tech-interview-for-developer 제 1정규화 테이블 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분리시키는 것이다. (문자열 반점으로..
하드웨어 중앙 처리 장치 : 명령어와 데이터를 읽어와 연산을 담당하는 ALU와 명령어 해석과 실행을 담당하는 제어장치, 속도가 빠른 기억장소인 레지스터로 구성되어 있다. 기억장치 주기억장치 : 실행중인 프로그램에 필요한 데이터를 일시적으로 저장 보조기억장치 : 주기억 장치에 비해 느리지만 자료를 영구적으로 보관 가능 입출력장치 시스템 버스 : 각 구성 요소가 다른 구성요소로 데이터를 보낼 수 있음 데이터 버스 : 데이터 전달 통로 (양방향) 주소 버스 : 주기억장치나 IO장치로 기억창지 주소를 전달하는 통로 (단방향) 제어 버스 : 데이터버스나 주소버스를 제어하기 위해 신혼들을 전송하는 통로 (양방향) 캐시 메모리 자주 사용하는 데이터를 캐시 메모리에 저장한 뒤에 다음에 이용할 때 주기억장치가 아닌 캐시..
안녕하세요! 오늘도 열심히 개발중에 있습니다. 오늘은 redirect시에 해당 redirect url 경로의 Controller에 데이터를 넘기는 방법에 대해서 알아보겠습니다. Redirect Controller @PostMapping("/container/create") public String createContainer(@ModelAttribute DummyContainerForm dummyContainerForm, @AuthenticationPrincipal PrincipalDetails principal, RedirectAttributes redirAttrs) { System.out.println("dummyContainer.toString() = " + dummyContainerForm.toS..
문자열 자주 사용하는 함수 대문자, 소문자 판별 for (char x : str.toCharArray()) { if(Character.isLowerCase(x)) answer += Character.toUpperCase(x); else if(Character.isUpperCase(x)) answer += Character.toLowerCase(x); } Character 타입 판별 // 알파벳 판별 if(Character.isAlphabetic(str)) rt--; // 숫자 판별 if(Character.isDigit(c)) answer += c; 특정 단어 인덱스 값, 인덱스 값에 위치한 단어 str.indexOf('W') str.charAt(i) String to Character Array char..
최근에 김영한 선생님의 인프런 강의를 정말 많이 돌려보는것 같다. 너무 이해가 잘 되게 설명해주셔서 김영한 선생님이 출시한 모든 강의를 구매하였다 (내 지갑은 텅텅 비어버렸지만...) 오늘은 spring mvc 의 기본 개념 구조를 정리해보았다. 웹 어플리케이션 이해 스프링에서도 Servlet을 만들 수 있다. @WebServlet 어노테이션을 통해 만들어주면된다. @WebServlet(name = "helloServlet", urlPatterns = "/hello") public class HelloServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse resp..
React 핵심 개념 React는 프레임워크가 아닌 라이브러리로 애플리케이션 공통적인 부분의 재사용에 최적화 되어있다. 재사용을 위해 리액트 문법을 통해 사용자 정의 태그를 만드는데 리액트에서는 이를 Component라고 한다. 가상 DOM을 사용하며 UI를 컴포넌트화 하여 UI의 수정 및 재사용이 간편하고 서버/클라이언트 사이드에서 재사용이 가능하다. react와 node,npx react는 node 설치 이후 npx create-react-app [폴더명] 명령어로 설치할 수 있는데 npx는 앱을 딱 한번 설치하고 지우는 명령어로 공간을 낭비하지 않게 해준다. npm은 node.js로 만들어진 여러 앱들을 명령어 환경에서 손쉽게 설치할 수 있도록 하는 것이다. 쉽게 말해 node.js의 플레이 스토어..
스프링 기초 어떤 프레임워크이든 간에 그 프레임워카의 진행 흐름이나 기초 구성을 아는 것이 중요하다. 스프링 또한 많은 기능들을 제공하지만 핵심적인 구조에 대해서 알 필요가 있다. 이번 기회에 스프링에 대해 제대로 파악하고자 인프런에서 김영한 님의 스프링 기초 수강을 들었다. 오늘은 그 내용을 정리한 포스팅을 연재하려고 한다. 객체 지향 설계와 스프링 객체 지향적 설계 SPR(Single Responsibility Principle) : 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. OCP(Open Closed Principle) : 개방 폐쇄 원칙 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다 LSP(Liskov Substitution Principle) : 리스코프 치환..
안녕하세요! 오늘도 열심히 개발중에 있습니다. 이번에 이미지를 보여주는 프론트엔드 작업을 하다가 사수 분으로부터 좋은 꿀팁을 선사받았습니다. 바로 이미지 비율을 설정하는 방법인데요. 오늘은 그 방법에 대해서 알아보겠습니다 이미지 비율 설정하기 이미지 주소 부분만 수정해서 넣어주시면 됩니다. rect 태그를 통해서 비율을 설정하는데요. width와 height 비율을 조정하기 그것을 감싸는 div 부분에 이미지를 배경으로 지정한 뒤 style에 viewBox 부분에서 다시 비율을 설정하시면 됩니다. 비율대로 잘 나오는 모습을 볼 수 있습니다 (위의 사진은 16:12 비율로 설정하였습니다
안녕하세요. 최근 오랜만에 윈도우에서 맥으로 갈아타서 개발을 하고 있는데요. 아무래도 갑자기 바뀐 시스템에 조금 적응의 시간이 필요한 것 같습니다. 불편한 점은 많았지만 그 중 최악이였던 것은 윈도우는 하단의 시계를 클릭하면 캘린더가 나와 날짜를 쉽게 확인할 수 있었는데 이와 비슷한 맥의 알림센터는 캘린더가 기본으로 나오지 않는다는 점이였습니다. 이번 포스팅에서는 맥에서 쉽게 캘린더를 사용하는 방법에 대해서 알아보겠습니다. 알림센터 편집 맥에서 시계를 클릭하면 기본 위젯들이 나오는데요 (현재 저는 편집한 상태입니다) 제일 하단에 보시면 위젯 전체 편집 버튼이 있습니다. 이 곳에서 캘린더 탭을 클릭하여 위젯을 추가하면 알림센터에 캘린더가 추가되어 쉽게 확인할 수 있습니다. 하지만 기본 캘린더의 경우 불편한..