dev(27)
-
Apache Tomcat 모니터링 - Manager 사용방법
JVM 의 메모리, 스레드 등의 정보 모니터링이 필요하다면. 간단하게 톰캣에서 기본적으로 제공해주는 Manager를 통해 모니터링할수있다. ## 테스트환경 - mac OS- Apache Tomcat v9.0.95 ## 방법1. Tomcat Manager App 활성화하기 {TOMCAT_HOME}/conf/tomcat-users.xml 수정 2. Tomcat 재시작 {TOMCAT_HOME}/bin ./catalina.sh stop./catalina.sh start 3. 매니저 화면접속 http://localhost:8080/manager 이후, 위에서 설정한 username과 password 로 접속한다.
2024.09.18 -
[React] 상태를 관리하는 또다른방법, useReducer
리액트 공식문서의 Learn 파트를 읽고 개인적으로 정리하는글 ✍️ https://ko.react.dev/learn/extracting-state-logic-into-a-reducerINDEX. 1. reducer를 사용해야하는 이유 2. useState를 useReducer로 리팩토링하는 방법 3. reducer를 잘 작성하는 방법 4. 내 프로젝트 코드에 적용시켜보기 1. reducer를 사용해야하는 이유reducer가 필요해지는 순간은 다음과같은 상황들이다. 예를들어, 하나의 state를 3가지의 상황에서 업데이트하는 코드가 있다. 아래의 App 컴포넌트에서는 세가지 핸들러에서 각각 state를 업데이트하고있는데, 이런게 점점 많아지면 상태를 업데이트하는 경우들을 한눈에 파악하기 어려워질수가 있다...
2024.07.01 -
프론트엔드 개발에서 Typescript 도입하는 이유와 장점
결론부터 말하자면, TS를 도입하는건 개발 효율성과 프로젝트의 품질향상을 위해서다.개발자가 더 명확하고 정확한 코드를 작성할수 있게 도와주기 때문. 따라서 대규모 프로젝트일수록 타입스크립트 도입은 필수적이다. 타입스크립트의 기본개념과 특징에 대해 알아보고, 프론트엔드 세계에 도입했을시 장점을 세세하게 살펴보자! 1. 타입스크립트 기본 개념과 특징- 타입스크립트는 마이크로소프트가 개발한 자바스크립트에 타입 시스템만 추가한 오픈소스 언어이다. - 정적 타입 지정: 컴파일 시점에 타입 오류를 잡아낼 수 있어 코드의 안정성을 높여준다. 이는 런타임 오류를 줄이고, 개발자가 더 안정적인 코드를 작성할 수 있게 돕는다. 2. 타입스크립트 도입 시 얻는 장점- 향상된 코드품질: 정적 타입 검사를 통해 잠재적인 오류..
2024.06.24 -
[React] Suspense, 비동기 작업의 새로운 접근법
리액트 Suspense 는 비동기작업이 완료될때까지의 대기상태를 관리하는 컴포넌트이다.거기다가 fallback 속성에 지정된 로딩 UI를 넣어주면 간편하게 로딩상태를 보여줄수가 있다! 이걸 몰랐을땐 조건부 렌더링을 통해서 로딩 스피너를 보여주곤 했었는데 Suspense를 사용하면 훨씬 깔끔하게 처리할수있다. 서스펜스에 대해 알아보자!! 1. 배경React Suspense는 React 16.6에서 실험적기능으로 처음 소개되었고, 18부터 정식 출시된 기능이다. 기존에는 로딩상태를 관리하기 위해서 state를 등록하고, 로딩상태냐 아니냐에 따라 조건부 렌더링을 통해 로딩스피너를 보여주는 방식이 일반적이였다. 이 방법은 복잡한 UI일수록 코드가 길어지고, 유지보수가 어려워질수 있다. Suspense는 이런..
2024.06.17 -
javascript 스프레드 연산자 알아보기
ES6 신문법, spread operator 알아보기 1. 스프레드 연산자란? spread operator는 반복 가능한(iterable) 객체에 적용할 수 있는 문법으로, 배열이나 문자열 등을 개별 요소로 분리시킬 수 있다. const arr1 = [1, 2, 3];const arr2 = [...arr1, 4, 5]; 기본 형태는 세개의 점(...) 으로 이루어져있고, 이를 통해 복사, 병합, 추가 등의 작업을 좀더 간단히 수행할수 있다. 2. 사용하는 이유?원본배열 또는 객체를 변경하지 않고 새로운 복사본을 만들기 위해서다. 자바스크립트에서 배열과 객체는 참조에 의해 전달되기 때문에 그냥 대입하면 참조 주소만 복사되어 두 변수가 같은 객체를 가리키게 됨. 스프레드 문법 사용할때 vs 사용안할때 차..
2024.01.29 -
[JS 알고리즘] 프로그래머스 K번째 수
https://programmers.co.kr/learn/courses/30/lessons/42748?language=javascript 코딩테스트 연습 - K번째수[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]programmers.co.kr 📍 문제 📍 풀이사용한 메소드는 다음과 같다. slice(start, end): start 인덱스부터 end 인덱스 이전까지 슬라이싱한 배열 반환sort: 정렬메소드 push: 배열 오른쪽으로 원소 추가됨 코드 작성은 어렵지않은데, sort() 정렬부분에서 주의할점이 있다. 만약 다음과같이 sort()만 해주면 오류가 날것이다. 왜냐하면 자바스크립트는 기본적으로 유니코드 문자열을 비교해서 ..
2021.09.16 -
[프로그래머스] 비밀지도 Python (카카오 기출)
https://programmers.co.kr/learn/courses/30/lessons/17681?language=python3 코딩테스트 연습 - [1차] 비밀지도비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다programmers.co.kr풀이과정 요약비트연산자 or을 사용한 연산결과를 이진수로 표현해서 저장한다. 이진수 결과를 하나씩 탐색하면서 1은 #으로, 0은 공백으로 문자열 치환을 해주었다. 전체 코드def solution(n, arr1, arr2): answer = [] dec_arr = list(zip(arr1, arr2)) ..
2021.09.09 -
Python 딕셔너리를 튜플 리스트로 변환
딕셔너리 자료형을 리스트로 변환해야할때 다음과 같이 튜플 리스트로 변환시킬 수 있다. dict = {'a': 4, 'b': 6, 'c': 1}# key, value 값 각각 뽑아내기print(dict.keys()) # dict_keys(['a', 'b', 'c'])print(dict.values()) # dict_values([4, 6, 1])# 딕셔너리를 튜플 리스트로 변환result = list(zip(dict.keys(), dict.values()))print(result) # [('a', 4), ('b', 6), ('c', 1)]# value 기준으로 정렬하기# 오름차순 정렬print(sorted(result, key=lambda x: x[1])) # [('c', 1), ('a', 4), ..
2021.09.07 -
[프로그래머스] 튜플 Python (카카오 기출)
https://programmers.co.kr/learn/courses/30/lessons/64065 코딩테스트 연습 - 튜플"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]programmers.co.kr 풀이과정 중복되는 원소가 없는 튜플을 집합기호로 표현된 입력이 주어진다. 예를들어 튜플이 (2, 1, 3, 4)인 경우{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}{{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}{{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, ..
2021.09.07 -
JS기초 | Ajax, JSON 개념정리 및 활용방법
Ajax란?Ajax는 자바스크립트를 사용해 브라우저가 서버에게 비동기 방식으로 데이터를 요청하고, 서버가 응답한 데이터를 수신하여 웹페이지를 동적으로 갱신하는 프로그래밍 방식이다. Ajax는 XMLHttpRequest 객체를 기반으로 동작하며, http 비동기 통신을 위한 메서드와 프로퍼티를 제공한다. 전통적인 웹페이지의 생명주기 예전의 웹페이지는 완전한 html 태그로 감싸진 html 파일을 서버로부터 전송받아 웹페이지 전체를 처음부터 다시 랜더링 하는 방식으로 동작했다. 따라서 클라이언트가 화면전환을 요청하면, 서버로부터 새로운 html을 전송받아 웹페이지 전체를 다시 새로고침 해야했다. 위와 같이 동작하면 어떤 단점이 있을까?1. 변경될 필요가 없는 부분까지 매번 서버로부터 재전송 받기때문에 불..
2021.08.24 -
Python 딕셔너리 자료형
1. 딕셔너리 쌍 추가, 삭제딕셔너리에 key와 value를 추가하려면 딕셔너리[key] = value 와 같이 입력하면 된다.dict = {1: 'a'}dict[2] = 'b'print(dict) # {1: 'a', 2: 'b'} 요소를 삭제하려면 del을 사용한다. dict = {1: 'a', 2: 'b'}del dict[1]print(dict) # {2: 'b'} 2. key를 사용해 value 얻기 딕셔너리[key]를 사용해 해당 value를 얻을 수 있다. key는 고유한 값이라는 특성이 있어, 겹치지 않게 데이터를 저장하고 얻을 수 있다는 점에서 유용하다.dict = {1: 'a', 2: 'b'}print(dict[1]) # a 만약, 중복된 key값이 있는 경우, 하나의 key를 제외한..
2021.08.18 -
[프로그래머스] 오픈채팅방 (Python)
⭐Level 2 https://programmers.co.kr/learn/courses/30/lessons/42888 코딩테스트 연습 - 오픈채팅방오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오programmers.co.kr 코드 (Python)def solution(record): answer = [] dic = {} for i in record: temp = i.split() if temp[0] == "Enter" or temp[0] == "Change": dic[temp[1]] = temp[2] ..
2021.08.13 -
[프로그래머스] 나머지 한 점 (Python)
최근 코딩테스트 데모 예제로 나왔던 문제이다.https://programmers.co.kr/learn/courses/18/lessons/1878 세개의 좌표가 입력으로 들어오고, 직사각형을 만들기 위해서 나머지 한개의 좌표를 찾는 문제이다. 직사각형의 각 변이 x, y축과 평행하고, 세 점을 그려보면 x와 y에서 한번씩만 나온 값의 좌표가 결과값을 갖게된다. 정답 코드def solution(v): # x, y좌표가 들어갈 리스트 x = [] y = [] answer = [] # 이중배열 순회 for i in v: if i[0] not in x: x.append(i[0]) else: x.remove(i[0]) if i[1] not in y: y.append(..
2021.06.24 -
VS Code 단축키 모음
줄, 블럭 이동하는 단축키멀티라인 삭제: ctrl + shift + K라인 위, 아래로 이동: alt + 방향키 커서 관련다중선택 커서: ctrl + alt(또는 shift + alt + 마우스 드래그) 주석 관련한줄씩 주석처리: ctrl + /멀티라인 주석처리: shift + alt + A 탭 관련탭 이동하기: tab반대 방향으로 탭 이동: shift + tab현재 탭 닫기: ctrl + W 기타 단축키 자동 줄바꿈: alt + Z선택 라인으로 이동하기: ctrl + G폰트 사이즈 조절: ctrl + +/-설정화면 열기: ctrl + ,터미널 열기: ctrl + `(백틱)
2021.06.05 -
백준 9095: 1,2,3 더하기 (DP)
https://www.acmicpc.net/problem/9095 9095번: 1, 2, 3 더하기각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.www.acmicpc.net특정 숫자를 주어진 정수들의 합으로 나타낼 수 있는 경우의수를 구하는 문제. 다이나믹 프로그래밍 기본문제이다. 정수 4를 1,2,3의 합으로 나타내는 모든 방식은 다음과 같다. 정수 n은 양수이며 11보다 작다고 주어졌으므로 1부터 구해본다면,1을 나타내기 위해서는 1만 필요하기때문에 => 1가지 2를 나타내기 위해서는 (1+1), (2) => 2가지3을 나타내려면 (1+1+1), (1+2), (2+1), (3) => 4가지 예제에서 주어진 4를 나타내기 위해서는 위의 1~3까지의 가지수를 모두 ..
2021.05.31 -
백준 10826: 피보나치 수 4 (DP)
10826번: 피보나치 수 4피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가www.acmicpc.net일반적인 피보나치 수열문제. 아래처럼 재귀로 풀었더니 시간초과가 났다. n = int(input())def fibo(x): if x==0: return 0 elif x==1: return 1 else: return fibo(x-1) + fibo(x-2)print("%d" % fibo(n))재귀로 풀면 정수 x가 커질수록 연산시간이 그만큼 늘어나므로 시간초과가 발생한다다이나믹 프로그래밍으로 풀이하고, 처음에 0..
2021.05.31 -
[자료구조] 데크(Deque)이해하기
1. Deque의 개념과 구조Deque(데크)는 double-ended-queue의 줄임말로, 양방향에서 데이터를 처리할 수 있는 queue형 자료구조이다.아래 그림과 같이, 양방향에서 엘리먼트를 추가, 삭제할 수 있는 양방향 큐라고 생각하면 된다. 2. Deque에 존재하는 메서드 종류 Python에서 deque는 collections라는 모듈안에 deque클래스로 내장되어있다. 가장 기본적인 append() 메서드를 수행하면 다음과 같다. from collections import dequedeq = deque(['a', 'b', 'c'])deq.append('d')print(deq) # deque(['a', 'b', 'c', 'd'])기본 append()를 해주면 위의 예제와 같이 가장 오른..
2021.05.20 -
JS | 디스트럭처링 할당 (Destructuring)
'모던 자바스크립트 Deep Dive' (36장)을 읽고 정리한 글입니다 객체를 1개 이상의 변수에 개별적으로 할당하고 싶을때, 객체 리터럴에서 필요한 값만 추출하여 변수에 할당시키는 방식을 Destructuring Assignment, 디스트럭처링 할당이라고 한다. 자바스크립트에서 배열과 객체를 각각 분할해서 변수에 할당시키는 방식을 알아보자. 1. 배열 디스트럭처링 (ES6 기준)const arr = [1, 2, 3];// ES6 배열 디스트럭처링 할당 const [one, two, three] = arr;console.log(one, two, three); // 1 2 3 위의 코드를 보면 변수 one, two, three를 선언하고 배열 arr를 비구조화(디스트럭처링) 하여 변수에 할당시켜 준..
2021.05.12 -
node.js 라이브러리 nodemon
nodemon: js 파일에 변경이 있을때마다 자동으로 서버를 실행시켜주는 라이브러리npm을 이용해서 바로 설치할 수 있다 (-g 옵션을 추가해 글로벌로 설치해준다) npm install -g nodemon 다음과 같이 js파일을 수정하고 저장하면 자동으로 서버가 재실행된다
2021.05.07 -
웹 크롤링 간단예제 | Beautiful Soup 사용법
웹에서 데이터를 크롤링할때, Python 라이브러리인 Beautiful Soup을 통해 원하는 데이터를 가져올 수 있다. 1. 설치환경Python 3.6 2. BeautifulSoup 라이브러리 설치pip install beautifulsoup4 3. 뉴스기사 크롤링IT조선 뉴스 메인페이지를 보면, 기사들이 모두 링크로 걸려있다. 기사의 URL을 수집하기 위해 a태그에서 href를 가져오면 된다. 4. 파이썬 코드 from urllib.request import urlopenfrom bs4 import BeautifulSouphtml = urlopen("http://it.chosun.com/")bsObject = BeautifulSoup(html, "html.parser")for link in bsOb..
2021.04.18 -
Web 기본 지식
URL 입력 후, 일어나는 일들 클라이언트가 브라우저 주소창에 URL을 입력하고 일어나는 일들은?1. URL 해석먼저, 브라우저가 URL을 해석한다. 이때 URL 문법에 맞지 않는다면, 기본 검색엔진으로 검색을 진행하고, 문법에 맞는 경우 URL의 호스트 부분을 인코딩한다. 이때, HSTS(HTTP Strict Transport Security) 목록을 조회하는데, HSTS는 http를 허용하지 않고 https만 허용하는 기능이다. HSTS 목록에 해당 URL이 존재한다면 명시적으로 http를 통해 요청을 해도 브라우저가 이를 https로 요청한다. URL 문법 표현방법protocol: [//[user:password@]host[:port]][/]path[?query][#fragment] 만약 검색창에 ..
2021.04.15 -
Python 공백없이 입력받아 list만들기: strip(), rstrip(), lstrip() 사용법
공백이 포함된 정수형 리스트를 입력받을 때는 split()으로 구분하면 되었는데, 공백없이 연속으로 입력받는 경우에 단순히 split()을 사용하지 않았더니 오류가 났다. 문제 예시예제) 정수 N을 입력받아 거꾸로 출력하는 프로그램을 작성하시오입력 예시) 123456출력 예시) 654321import sysdata = list(map(int,sys.stdin.readline()))for _ in range(len(data)): print(data.pop(), end='')readline()은 한줄씩(라인단위로) 읽어오는 함수이기 때문에 끝에 개행문자 \n이 포함되어 있다따라서 list에 원하지 않는 개행문자가 들어가서 에러가 난것이다. 수정한 코드는 다음과 같다.import sysdata = list..
2021.04.09 -
티스토리 코드블럭 커스터마이징, 폰트 변경방법
1. 코드블럭을 커스터마이징하는 HTML 코드원하는 코드블럭 테마 highlightjs.org/에서 가져오고, 아래 코드를 HTML의 사이에 붙여넣는다. (폰트 커스터마이징, 스크롤 생성, 라인넘버 기능 포함)테마 변경시에는 아래 표시된 부분에 해당 테마명을 붙여넣으면된다이때, 대문자는 소문자로, 띄어쓰기는 '-'를 반드시 넣어줘야한다 2. 코드블럭을 커스터마이징하는 CSS코드기존에는 모든 테이블에 영향을 받아서 UI상에서 표형태로 나타나게 된다.따라서 아래 코드처럼 자식인 테이블이라 지정하고, 그 경우에만 속성을 사용하도록 바꿔준다. .entry-content > table { width:100%; margin-bottom: 22px; border: 1px solid #e6e6e6; ..
2021.02.24 -
Local 프로젝트 GitHub에 올릴때 명령어 정리
git 초기화작업 (.git파일 생성)git init현재 git저장소의 상태 보기git status파일 추가 git add. git add --all git add 파일 삭제 git rm -rf {삭제하고 싶은 폴더나 파일}커밋git commit -m "first commit"깃허브 레퍼지토리에 연결이부분은 처음 레퍼지토리 만들고 복사해오면 된다 git remote add origin {원격 서버주소}잘 연결되었는지 확인 git remote -vpushgit push -u origin master
2021.01.23 -
[Spring] MyBatis 연동 및 설정방법
MyBatis 프레임워크 특징간단한 자바코드만으로 DB 연동을 처리한다SQL 명령어를 자바 코드에서 분리하여 XML 파일에 따로 관리할 수 있다위의 두가지 특징이 MyBatis의 가장 중요한 특징이며, 기존에 사용하던 JDBC 기반의 DB연동 방법보다 훨씬 간편하다. 프로젝트 생성Mybatis를 사용해 간단한 SQL쿼리문을 테스트해보자. 개발환경DBMS: Oracle Database 11g Express Edition Release 11.2.0.2.0WEB Server: apache-tomcat-8.5.61 8Language: Java EE 8Framework: Spring 5.2.12.Release 1. MyBatis관련 라이브러리 설치 다음은 pom.xml에 필요한 라이브러리들을 추가하기위해 작성한..
2021.01.21 -
[Spring] 스프링 MVC모델 예제 - Controller와 View연결
DispatcherServlet 클래스의 역할Spring MVC 모델을 검색하면 위와 같은 이미지를 볼 수 있는데, 그림에서 파란색 부분이 스프링에서 제공해주는 것들이고 개발자가 나머지 부분만 구현해주면 된다.스프링 MVC 모델은 MVC 모델2에 해당하며 DispatcherServlet라는 서블릿 하나가 클라이언트로부터 들어오는 모든 요청을 받는다. DispatcherServlet가 있기 전에는 사용자가 호출하는 url을 일일이 해당하는 모든 서블릿과 매핑시키는 작업이 필요했지만, DispatcherServlet을 사용하면 해당 요청을 Handler Adapter를 통해 알맞은 컨트롤러로 위임하고, 컨트롤러들은 클라이언트에게 보낼 뷰를 선택해서 최종 결과를 생성하는 작업을 하게된다. Spring MVC..
2021.01.20 -
[Spring] MVC 모델 개념정리
1. Spring MVC 구조 이해하기Spring의 MVC모델은 무엇인지, 주요 클래스들은 어떤 역할을 하는지 정리해보자 먼저, 위의 그림에서 주요 클래스들의 역할을 간단히 정리한 것이다.클래스기능DispatcherServlet유일한 서블릿 클래스로서 모든 클라이언트의 요청을 가장 먼저 처리하는 FrontController HandlerMapping클라이언트의 요청을 처리할 Controller 매핑Controller실질적인 클라이언트의 요청 처리ViewResolverController가 리턴한 View 이름으로 실행될 JSP경로 완성그림에 나와있는 번호 순서대로 정리해보면, 1. DispatcherServlet이 클라이언트(web 브라우저)로부터 들어오는 모든 요청을 받는다.2. DispatcherSe..
2021.01.20