'전체 글'에 해당되는 글 384건

  1. 2023.04.04 HttpSession
  2. 2023.04.04 [Spring] PostConstruct
  3. 2023.03.31 PUTTY
  4. 2023.03.29 JWT(JSON Web Token)
  5. 2023.03.29 개발 환경 구성
  6. 2023.03.29 MSA 학습
  7. 2023.03.14 radio 값 가져오기
  8. 2023.02.27 DNS
  9. 2023.01.27 cherry-pick 1
  10. 2023.01.10 reduce()

HttpSession

|
// 생성
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
And

[Spring] PostConstruct

|
@Component
public class SampleClass {

   	// 생성자
    public SampleService () {
    
    }

	@PostConstruct
	private void init() {

	}	
        
   ...
}

PostConstuct 란?

- 의존성 주입이 완료된 후 실행되어야 하는 메서드에 사용

- 어플리케이션이 실행될때 한번만 실행되므로 bean이 여러번 초기화되는 걸 방지함

- 다른 리소스에서 호출되지 않아도 수행

- 생성자 보다 늦게 호출됨

 

호출순서

- 생성자 호출

- 의존성 주입 완료

- PostConstruct

 

And

PUTTY

|

<< 개념 >>

- 서버를 원격으로 접속할 수 있도록 도와주는 가상 단말기 프로그램

- 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
And

JWT(JSON Web Token)

|

유저를 인증하고 식별하기 위한 토큰 기반 인증

 

서버에 저장되는 세션(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의 크기가 커질수록 거의 모든 요청에 대해 전송되므로 데이터 트래픽 크기에 영향

 

세션방식
JWT 방식

 

'IT Infra' 카테고리의 다른 글

[Docker] 기초 정리  (1) 2023.06.14
PUTTY  (0) 2023.03.31
개발 환경 구성  (0) 2023.03.29
MSA 학습  (0) 2023.03.29
인터넷  (0) 2020.10.23
And

개발 환경 구성

|

1. 개발 환경 구성
- [완] naver cloud vpn
- [완] perl 설치
- [불필요] mysql 설치 : local db 테넌트 생성 테스트 위해 필요
         - GRANT ALL PRIVILEGES ON *.* TO 'orgn'@'%' WITH GRANT OPTION;

- [완] putty 설치 : 운영 접속 위해 필요

2. 




'IT Infra' 카테고리의 다른 글

PUTTY  (0) 2023.03.31
JWT(JSON Web Token)  (0) 2023.03.29
MSA 학습  (0) 2023.03.29
인터넷  (0) 2020.10.23
AWS 배포방법  (0) 2019.12.23
And

MSA 학습

|

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

'IT Infra' 카테고리의 다른 글

PUTTY  (0) 2023.03.31
JWT(JSON Web Token)  (0) 2023.03.29
개발 환경 구성  (0) 2023.03.29
인터넷  (0) 2020.10.23
AWS 배포방법  (0) 2019.12.23
And

radio 값 가져오기

|
// 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
And

DNS

|

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
And

cherry-pick

|
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
And

reduce()

|

- 배열 각 요소에 대하여 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); // 결과 배열
And
prev | 1 | ··· | 5 | 6 | 7 | 8 | 9 | 10 | 11 | ··· | 39 | next