'전체 글'에 해당되는 글 384건
- 2023.04.04 HttpSession
- 2023.04.04 [Spring] PostConstruct
- 2023.03.31 PUTTY
- 2023.03.29 JWT(JSON Web Token)
- 2023.03.29 개발 환경 구성
- 2023.03.29 MSA 학습
- 2023.03.14 radio 값 가져오기
- 2023.02.27 DNS
- 2023.01.27 cherry-pick 1
- 2023.01.10 reduce()
// 생성
HttpSession session = request.getSession(); // 기존 session이 있으면 기존 session object를, 없으면 새로 생성 후 반환
HttpSession session = request.getSession(false); // 기존 session이 있으면 기존 session object를, 없으면 null 반환
// 값 저장
session.setAttribute(String name, Object value);
// 값 얻기
Object obj = session.getAttribute(String name);
session.getId(); // JSESSIONID 반환
session.getMaxInactiveInterval(); // session timeout 값 반환
// 값 제거
session.removeAttribute(String name);// 특정 이름의 속성 제거
session.invalidate(); // 세션종료 (binding 되어 있는 모든 속성 제거)
Session
- javax.Servlet.Http 패키지의 interface인 HttpSession
- client 정보를 저장하는 방법을 제공하는 Java의 public interface
- 방문자가 웹 서버에 접속해 있는 상태
- WAS의 메모리에 Object의 형태로 저장
- 메모리가 허용하는 용량까지 제한없이 저장가능
- session은 server에 저장되는 정보이고 vs. cookie는 client에 저장되는 정보이다.
동작순서
- 클라이언트가 페이지 요청
- 접근한 클라이언트의 쿠키를 확인하여 해당 session-id를 보냈는지 확인
- session-id를 생성해 클라이언트에게 돌려줌
- 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장 (쿠키이름: JSESSIONID)
- 클라이언트 재 접속시, 이 쿠키를 이용하여 session-id값을 서버에 전달.
세션종료시기
- 타임아웃
- session 객체의 invalidate() 호출
- application 또는 server 종료
특징
- 웹 서버에 상태를 유지하기위한 정보를 저장
- 웹 서버에 저장되는 쿠키(세션쿠키)
- 서버에서 세션을 삭제 했을때만 삭제가 되므로, 쿠키보다 비교적 보안이 좋다.
- 각 클라이언트 고유 sesison id를 부여
- server resource를 사용하므로 server에 부담을 줄수 있다.
- 로드 밸런싱 시스템에서 session 처리가 쉽지 않다.
'Java' 카테고리의 다른 글
jar, war 파일 관련 (0) | 2023.08.01 |
---|---|
Servlet & Servlet Container (0) | 2023.06.13 |
Server 1대에 Multi version 의 JDK 사용 (0) | 2022.12.06 |
DAO, DTO, VO (0) | 2022.03.21 |
좌석 예약 시스템 (0) | 2019.08.01 |
@Component
public class SampleClass {
// 생성자
public SampleService () {
}
@PostConstruct
private void init() {
}
...
}
PostConstuct 란?
- 의존성 주입이 완료된 후 실행되어야 하는 메서드에 사용
- 어플리케이션이 실행될때 한번만 실행되므로 bean이 여러번 초기화되는 걸 방지함
- 다른 리소스에서 호출되지 않아도 수행
- 생성자 보다 늦게 호출됨
호출순서
- 생성자 호출
- 의존성 주입 완료
- PostConstruct
'Framework' 카테고리의 다른 글
[Spring] Tomcat + Spring Framework 구동 흐름 정리 (1) | 2023.06.13 |
---|---|
[Spring] 스프링의 4가지 concept 정리 (0) | 2023.06.02 |
개발표준 (0) | 2023.04.27 |
Front-End Framework 정리 (0) | 2021.06.13 |
스프링(Spring) AOP : AspectJ Pointcut 표현식 (Feat. 프로젝트에서 꼭 활용할 내용들) (0) | 2020.03.31 |
<< 개념 >>
- 서버를 원격으로 접속할 수 있도록 도와주는 가상 단말기 프로그램
- ssh type ( 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사 할 수 있도록 해주는 응용 프로그램 또는 그 프로토콜을 가리킨다. 기존의 rsh, rlogin, 텔넷 등을 대체하기 위해 설계되었으며, 강력한 인증 방법 및 안전하지 못한 네트워크에서 안전하게 통신을 할 수 있는 기능을 제공한다. 기본적으로는 22번 포트를 사용한다. SSH는 암호화 기법을 사용하기 때문에, 통신이 노출된다고 하더라도 이해할 수 없는 암호화된 문자로 보인다.)
<< 명령어 >>
su - // root 계정으로 전환
ctrl + L // 화면 clear 명령어 1줄 남기고 모두 지움
1. 압축하기 : tar cvfz [경로]000.tar.gz
2. 압축풀기 : tar xvfz [경로]000.tar.gz
3. ls : 현재 디렉토리의 파일 리스트를 보여줌.
ls -al : 파일의 속성(크기, 퍼미션, 히든 파일)을 보여줌.
ls -at : 파일이 생성된 시간까지 보여줌.
4. cd : 지정된 경로로 디렉토리를 이동할 수 있다.
ex) cd /; cd /bin/src; cd ; /* cd는 현재 디렉토리를 보여주고, 해당경로를 지정하였을 때 이동한다.*/
cd .. // 상위 폴더로 이동
5. chmod : 파일이나 디렉토리의 퍼미션을 변경해줌.
ex) chmod 755 test01.java // 755 는 디렉토리에 이상적인 (-rwxr-xr-x)
ex) chmod 644 test01.java // 644는 파일에 이상적인 (-rw-r--r--)
----> 참고 : https://choseongho93.tistory.com/311
https://hack-cracker.tistory.com/32
6. mkdir : 디렉토리를 생성
ex) mkdir test01
7. rmdir : 디렉토리를 제거
ex) rmdir : testdir
8. rm : 디렉토리 및 파일을 제거(지움)
rm -r : 해당 경로에 포함된 디렉토리까지 지움
rm -f : 지움 명령을 다시 한번 확인하지 않고 바로 지움.
rm -rf : 디렉토리를 강제로 지움. 디렉토리가 비워져 있지 않아도 강제로 지움.
ex) rm -rf testdir
9. cp : 디렉토리 및 파일을 복사.
cp -r : 해당 경로에 포함된 디렉토리까지 복사
ex) cp test01.java test02.java /* test01.java를 test02.java로 같은 디렉토리 내에 복사*/
ex) cp -r testdir /workspace/test/testdir /* 현재 디렉토리 내에 있는 testdir 디렉토리를 /wokrspace/test/testdir로 복사 */
10. mv : 디렉토리 및 파일을 이동시키거나 이름을 변경
ex) mv test01.java test02.java /* test01.java를 test02.java로 이름 변경*/
ex) mv test01.java ../test /* test01.java를 현재 디렉토리 내에 있는 test디렉토리로 이동*/
ex) mv testdir testdir01 /* testdir을 testdir01로 이름 변경*/
11. du : 디스크 사용에 관한 정보를 알려줌
ex) du / (리눅스의 총용량)
12. 기타 명령어
Telnet의 명령어는 대부분 유닉스/리눅스 명령어와 부합되어 있다.
각 장비 및 시스템에 포팅되어 있는 버전에 따라 각 명령어가 조금씩 다르니 확인 후 사용해야 함.
adduser : 유저를 만들 때 사용하는 명령
chown : 파일이나 디렉토리의 ownership을 바군다
ex) chown lp /dev/lp
diskinfo : 시스템에 설치되어 있는 디스크의 정보를 보여준다.
ex) diskinfo /dev/rdisk/c0t6d0
date : 현재 시각 표시
echo : 표준 출력에 문자열을 출력
exit : 로그아웃하고 프로그램 종료
file : 파일 내용의 성격을 보여준다(파일의 종류를 알아볼 때)
finger : 현재 로그인 되어 있는 사용자의 인적사항을 출력한다.
find : 파일 시스템에서 파일이나 디렉토리를 찾을 때 사용
ex) find /-name core -print
grep : 파일 내에서 특정 패턴을 찾는다
ex) grep 0- l ifconfig /sbin/init.d/*
gzip : 압축명령
gunzip : 압축해제명령
jobs : 백그라운드에서 실행되고 있는 작업들의 작업번호, 작업 상태등을 보여줌.
kill : 실행 중인 프로세서를 강제종료할 때.
ex) kill -9 924
last : 최근 접속한 사용자의 이름과 장소, 시간 등을 알려줌
lp : 시스템의 기본 프론터에 파일을 프린트 함.
lpstate -t : 모든 프린터 스풀러에 관련된 정보를 보여줌
mail : 다른 사용자에게 편지 보내기
more : 텍스트 파일 내용을 페이지 단위로 봄(더 보려면 spacebar 누름, 한줄 보기는 enter)
ps -ef : 시스템에서 수행되고 있는 모든 프로세스를 보여줌
passwd : 암호 변경
shutdown : 시스템 끔
top : 주기적으로 변하는 프로세스의 정보를 보여줌
useradd : 사용자 추가
userdel : 사용자 삭제
usermod : 사용자 권한 주기
what : 파일의 버전 정보를 보여줌
who : 로그인 된 사용자 목록을 보여줌
who am i : 현 사용자의 로그인 명, tty 및 로그인한 날짜/시간을 보여줌
who -r : 현재의 run state를 보여줌
sort : 파일정렬
sleep : 지정한 시간만큼 쉰다.
shutdown -h now : 당장 종료
shutdown -r now : 시스템 리부팅
userdel pr 디렉토리명 : 사용자의 홈디렉토리까지 삭제
<<파일 실행 방법>>
chmod + x test.sh // 실행 권한 부여
./test.sh
sh test.sh
13. vi : Linux의 vi edit 기능을 수행함.
vi edit는 크게 입력모드와 명령모드로 구분된다.
>>입력모드 : 입력모드로 전환하기 위해서 다음과 같이 i,a,o,O를 타입핑해야 한다.
i 커서가 놓여 있는 위치의 문자 앞에 삽입
a 커서가 놓여 있는 위치의 문자 뒤에 삽입
o 현재행의 아래행을 밀어내고 입력모드로 전환
O(대소문자 구분) 현재행을 한줄 아래로 밀어내고 입력모드로 전환
입력모드를 벗어나려면 ESC 키를 누르면 명령모드로 돌아온다.
>> 전체선택, 복사, 삭제
vi 파일명 // 해당파일 편집모드 들어감
gg // 맨 윗 첫줄로 이동
shift + v+ g // 전체선택
d // 전체 삭제
y // 전체 복사
>>명령모드
:q 저장하지 않고 종료
:q! 강제 종료
:w 저장
:w! 강제로 저장
:wq 저장하고 종료(=:x)
:wq! 강제로 저장하고 종료
:w file_name 새이름으로 저장
-> 커서이동 :명령모드에서 이동할 수 있다(리눅스에서는 일반 방향키로도 이동이 가능)
h(왼쪽), (아래쪽)j, k(위쪽), l(오른쪽),
w(오른쪽), b(왼쪽), 0(행의 처음으로 이동), $(행의 마지막으로 이동)
-> 텍스트교체
R(커서가 있는 자리부터 여러문자를 교체)
r (커서가 있는 자리부터 한글자만 교체)
-> 삭제명령
dw 한 단어 삭제
dd 한 줄 삭제
D 커서 위치부터 행 끝까지 삭제
x 한 글자 삭제
-> 자르기와 붙여넣기
y(텍스트를 복사), yy(한줄을 복사)
->범위지정
:행번호(문서의 지정 번 행으로 이동)
:$(행의 마지막으로 이동), :$=(현재 편집중인 텍스트 내용이 총 몇 줄인지 확인)
:시작행,마지막행d (시작행부터 마지막행까지 지움)
:시작행,마지막행y (시작행부터 마지막행까지 임시버퍼에 저장)
'IT Infra' 카테고리의 다른 글
리눅스(Linux), 커널(Kernel), 우분투(Ubuntu) (0) | 2023.06.15 |
---|---|
[Docker] 기초 정리 (1) | 2023.06.14 |
JWT(JSON Web Token) (0) | 2023.03.29 |
개발 환경 구성 (0) | 2023.03.29 |
MSA 학습 (0) | 2023.03.29 |
유저를 인증하고 식별하기 위한 토큰 기반 인증
서버에 저장되는 세션(Session)과 달리 클라이언트에 저장
- 세션방식이 보안에서는 상대적으로 강하다.
- 서버의 자원이 많이 필요
- 매번 요청 시, 세션 저장소를 조회해야함.
토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함(self-contained)
RESTful과 같은 무상태(stateless)인 환경에서 사용자 데이터를 주고 받을 수 있음.
xxx.yyy.zzz의 형태를 띠는 JWT
// header
{
"alg": "서명 시 사용하는 알고리즘",
"kid": "서명 시 사용하는 키를 식별하는 값",
"typ": "타입"
}
// payload
{
"sub": "hyeonsu.jung",
"exp": 1623235123,
"iat": 1532341234
}
// signature
위의 헤더(header)와 페이로드(Paylaod)를 합친 문자열을 서명한 값
공개 키 암호 방식(PKC, Public Key Cryptograpyh)를 사용
JWT의 크기가 커질수록 거의 모든 요청에 대해 전송되므로 데이터 트래픽 크기에 영향
1. 개발 환경 구성
- [완] naver cloud vpn
- [완] perl 설치
- [불필요] mysql 설치 : local db 테넌트 생성 테스트 위해 필요
- GRANT ALL PRIVILEGES ON *.* TO 'orgn'@'%' WITH GRANT OPTION;
- [완] putty 설치 : 운영 접속 위해 필요
2.
msa개념, 도커, 가상화(VM 버추얼 머신 개념)
개발서버: 도커O / 쿠베X
운영서버: 둘다있음
https://www.youtube.com/watch?v=fDcqL6xlOPk&list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb
https://www.youtube.com/watch?v=Sj9Z6-w1VUE&list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&index=2
https://www.youtube.com/watch?v=Ia8IfowgU7s
// name을 같은 값으로 한 범위 안에서 단일 선택가능
<form method="get" action="example">
<input type="radio" value="1" name="score"> 1
<input type="radio" value="2" name="score"> 2
<input type="radio" value="3" name="score" checked> 3 // checked가 기본값
<input type="radio" value="4" name="score"> 4
<input type="radio" value="5" name="score"> 5
</form>
// jquery로 선택된 radio 값 가져오기
$('input[name="score"]:checked').val()
'HTML & CSS' 카테고리의 다른 글
뷰포트 viewport (0) | 2022.04.29 |
---|---|
캐싱(caching) (0) | 2022.02.23 |
getBoundingClientRect (0) | 2022.02.09 |
min-content/max-content/fit-content와 auto (0) | 2022.02.08 |
반응형 웹을 위한 단위 정리 vh, vw, calc, em, rem (0) | 2022.02.08 |
DNS Server의 IP주소 확인하기
'etc' 카테고리의 다른 글
Web Achitectures 입문 (0) | 2023.06.30 |
---|---|
성장하려면 (0) | 2023.06.30 |
전보, 복수직급직렬 (0) | 2022.12.28 |
GitHub - Milestone (0) | 2022.12.06 |
바인딩(Binding) (0) | 2022.07.26 |
1. 반영을 해야할(반영이 필요한) branch로 checkout
git checkout tobe-published
2. 반영할 커밋이력 hash값 확인
ex) 1acfe0cc4e0f6a670cf541663b3f47a1c9de95eb
3. 명령어 입력
git cherry-pick 1acfe0cc4e0f6a670cf541663b3f47a1c9de95eb
SourceTree
'Git' 카테고리의 다른 글
Gitlab 소스 내려받기 (0) | 2023.07.26 |
---|---|
풀-리퀘스트(Pull-request) 를 활용한 협업 (0) | 2022.05.26 |
Git 서버 - SSH 공개키 만들기 ~ SourceTree 연결 (0) | 2021.09.28 |
Git Bash 사용법(2) (0) | 2021.08.30 |
Git 사용법 (0) | 2019.10.02 |
- 배열 각 요소에 대하여 reducer 함수(사용자 정의)를 실행하고, 하나의 결과값을 반환
- array의 모든 요소들에 대해 체크하고 누적된 값을 출력하고 싶을 때 용이
- for문이나 count를 위한 별도의 변수를 선언하지 않고도 바로 결과가 출력됨
arr.reduce(callback[, initialValue])
callback function
1. 다음 4가지의 인수를 가집니다.
accumulator - accumulator는 callback함수의 반환값을 누적
currentValue - 배열의 현재 요소
index(Optional) - 배열의 현재 요소의 인덱스
array(Optional) - 호출한 배열
2. callback함수의 반환 값은 accumulator에 할당되고 순회중 계속 누적되어 최종적으로 하나의 값을 반환
// initialValue(Optional)
- 최초 callback함수 실행 시 accumulator 인수에 제공되는 값
- 초기값을 제공하지 않을경우 배열의 첫 번째 요소를 사용하고, 빈 배열에서 초기값이 없을 경우 에러가 발생
// 예시코드
const number = [1, 2, 3, 4, 5];
function reducer(accumulator, currentValue, currentIndex) {
const result = accumulator + currentValue;
console.log('accumulator = ', accumulator, ', currentValue = ', currentValue, ', currentIndex = ', currentIndex, ', result = ', result);
return result;
}
// initialValue가 없을 경우
number.reduce(reducer);
// 동작
// accumulator = 1, currentValue = 2, currentIndex = 1, result = 3
// accumulator = 3, currentValue = 3, currentIndex = 2, result = 6
// accumulator = 6, currentValue = 4, currentIndex = 3, result = 10
// accumulator = 10, currentValue = 5, currentIndex = 4, result = 15
// initialValue가 있을 경우
number.reduce(reducer, 0);
// 동작
// accumulator = 0, currentValue = 1, currentIndex = 0, result = 1
// accumulator = 1, currentValue = 2, currentIndex = 1, result = 3
// accumulator = 3, currentValue = 3, currentIndex = 2, result = 6
// accumulator = 6, currentValue = 4, currentIndex = 3, result = 10
// accumulator = 10, currentValue = 5, currentIndex = 4, result = 15
const empDataColumns = [
'seq',
'empId',
'empNm',
'nickNm',
'executiveYn',
'orgId',
'posCd',
'posNm',
'photo'
];
const orgDataColumns = [
'seq',
'companySeq',
'orgId',
'orgNm',
'orgNmEn',
'orgNmZh',
'sortOrder',
'upOrgId',
'orgTypeCd'
];
export const basicData = {
EMP_LIST: [],
ORG_LIST: []
};
const limit = {
orgData: 14,
empData: 3
};
const orgIdMap = ['F00001', 'MA0001', 'MA0002', 'F00002', 'MB0001', 'MB0002', 'F00003', 'MC0001', 'MC0002', 'F00004', 'MD0001', 'MD0002', 'F00005', 'ME0001', 'ME0002'];
const orgNm = ['마케팅', '상품', '디자인', '상품 관리', '품질', '가격', '컨텐츠', '컨텐츠 개발', '법률', '서포트', '세일즈 마케팅', '방송', '사람과 문화', '고객 가치 발굴', '조직 의사 소통'];
const sortOrder = [1, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2];
const upOrgId = ['CA000', 'F00001', 'F00001', 'CA000', 'F00002', 'F00002', 'CB000', 'F00003', 'F00003', 'CB000', 'F00004', 'F00004', 'CC000', 'F00005', 'F00005'];
const orgTypeCd = [1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2];
const firstName = ['김', '이', '박', '최', '윤'];
const secondName = ['성', '선', '우', '지', '태'];
const thirdName = ['미', '준', '규', '호', '영'];
const nickFirstName = ['A', 'D', 'B', 'Z', 'P'];
const nickSecondName = ['e', 'a', 'i', 'o', 'u'];
const nickThirdName = ['w', 'r', 'm', 'w', 'q'];
const executiveYn = ['Y', 'N', 'N', 'Y', 'Y'];
const posMap = {
posCd1: '사원',
posCd2: '대리',
posCd3: '과장'
}
let k = 0;
for (let i = 0; i <= limit.orgData; i++) {
let orgData = {};
orgDataColumns.reduce((acc, curr) => {
if (curr.toUpperCase() === 'SEQ') {
acc[curr] = `${i}`;
} else if (curr === 'orgId') {
acc[curr] = orgIdMap[i];
} else if (curr === 'orgNm') {
acc[curr] = orgNm[i];
} else if (curr === 'sortOrder') {
acc[curr] = sortOrder[i];
} else if (curr === 'upOrgId') {
acc[curr] = upOrgId[i];
} else if (curr === 'orgTypeCd') {
acc[curr] = orgTypeCd[i];
} else {
acc[curr] = `${curr}${i}`;
}
return acc;
}, orgData);
for (let j = 1; j <= limit.empData; j++) {
if (orgData.orgId.indexOf('F') > -1) {
continue;
};
let empData = {};
empDataColumns.reduce((acc, curr) => {
if (curr === 'orgId') {
acc[curr] = orgData.orgId;
} else {
if (curr.toUpperCase() === 'SEQ') {
} else if (curr.toUpperCase() === 'COMPANYSEQ') {
acc[curr] = `1`;
} else if (curr === 'empId') {
acc[curr] = `E0000${k}`;
} else if (curr === 'empNm') {
acc[curr] = firstName[Math.floor(Math.random() * firstName.length)] + secondName[Math.floor(Math.random() * secondName.length)] + thirdName[Math.floor(Math.random() * thirdName.length)]
} else if (curr === 'nickNm') {
acc[curr] = nickFirstName[Math.floor(Math.random() * nickFirstName.length)] + nickSecondName[Math.floor(Math.random() * nickSecondName.length)] + nickThirdName[Math.floor(Math.random() * nickThirdName.length)]
} else if (curr === 'executiveYn') {
acc[curr] = executiveYn[j]
} else if (curr === 'posNm') {
acc[curr] = posMap['posCd' + j]
} else {
acc[curr] = `${curr}${j}`;
}
}
k++;
return acc;
}, empData);
basicData.EMP_LIST.push(empData);
}
basicData.ORG_LIST.push(orgData);
}
// 배열 관련 reduce 예제
var sample = [];
res.SSP_EMP_SIMUL_DATA_BIND_CD.reduce(function (acc, cur) {
// if(cur.code === 'ddd') // 특정 조건에 따른 비즈니스 로직
acc.push(cur);
return acc; // 누적된 배열을 return
}, sample); // 초기 배열은 빈값
console.log(sample); // 결과 배열
'JavaScript' 카테고리의 다른 글
팝업호출 + 이미지 + 클릭 이벤트 (0) | 2023.12.04 |
---|---|
Reflow (0) | 2023.01.02 |
디바운스(Debounce), 스로틀(Throttle), 레이아웃 스레싱(Layout Thrashing) (0) | 2023.01.02 |
x,y 두 좌표의 직선거리 구하기 (0) | 2022.12.16 |
dotenv, express, axios (0) | 2021.12.31 |