mv : move의 줄임말로 파일이나 디렉토리를 이동 시킬때 사용하는 명령어

 

 

mv 사용법

 

mv [옵션] [이동 할 파일] [이동 될 위치]

현재 디렉토리에 있는 test.txt 파일을 디렉토리 내부의 new_folder 디렉토리로 이동

ex) mv test.txt new_folder


현재 디렉토리에 있는 test.txt 파일을 new_test.txt라는 파일로 이름 바꾸기

ex) mv test.txt new_test.txt


/user/orignal 경로의 test.txt 파일을 /user/unoriginal 디렉토리에 new.txt로 바꾸어 이동

ex) mv /user/original/test.txt /user/unoriginal/test.txt

 

1. mv 명령어의 옵션을 제외한 인자값은 생략이 불가능

2. 경로를 지정하지 않으면 현 위치를 defualt로 함

3. 이동 시킬 때 새로운 이름을 지정하여 이동 할 수 있음

4. 현재위치에 이름만 바꿔서 이동시켜 파일의 이름바꾸기로 응용할 수 있음

5. 다양한 옵션을 사용하여 기존의 파일이나 디렉토리를 보호하는 등의 행동을 취할 수 있음

 

 

자주사용하는 옵션

1. -b : 이동될 파일이 존재하면 백업파일을 만듦

2. -i : 이동될 파일이 이름이 이미 존재할 경우, 사용자에게 덮어 쓰기 여부를 물음

3. -f : 이동 될 파일이 이름이 이미 존재 할 경우, 강제로 덮어쓰기 함

4. -n : 이동 될 파일이 이름이 이미 존재 할 경우, 덮어쓰기를 하지 않음

5. -r : 하위 디렉토리 까지 모두 이동

6. -v : 이동 진행 상태를 출력

 

 

 

여러개를 한번에 이동 시키고 싶을 때

 

mv [이동 대상1] [이동 대상2] [이동 대상3] ..... [이동할 경로]

ex) mv test1.txt test2.txt test3.txt /user/unoriginal



현재 위치의 모든 파일이동
mv * [이동 할 경로]

ex) : mv -r * /user/unoriginal

 

 

 

 

 

'리눅스' 카테고리의 다른 글

History 명령어  (0) 2023.07.03
chmod / chown - 파일 권한 / 소유권 변경  (0) 2023.06.29
리눅스 명령어정리🔍  (0) 2023.06.26

history

매우 자주 사용되는 명령어 중 하나로  history를 입력하면 최근 사용했던 명령어들을 숫자와 함께

출력하여 줍니다.

> history
...
177 git status
178 git pull
179 cd ~/.ssh
180 ll
181 exit
182 history

📌history 옵션

 


1.  페이지 단위로 조회

첫 페이지 부터 보여주며 space를 누르면 한 페이지 단위로 이동합니다.

history | less

 

2. 마지막 10개의 명령어만 조회

최근 10개만 출력합니다.

hisotry | tail

 

3. 원하는 개수 만큼만 조회

아래는 각각 마지막 5, 15, 25개를 보여줍니다.

history 5
history 15
history 25

 

4. history를 grep과 함께 사용하기

이 명령어는 가장 유용하게 사용되는 명령어로 파이프라인과 grep <keyword> 방식으로 사용됩니다. 예를 들어 cd가 들어간 목록만 볼 경우 아래와 같이 입력할 수 있습니다.

history | grep cd

 

추가) 연속하여 파이프라인 사용하기

아래와 같이 파이프라인을 연속으로 사용할 수 있습니다. 만약 찾을 키워드와  tail을 동시에 사용하면 아래와 같습니다.

history | grep cd | tail

 

5. 원하는 라인을 다시실행하는 방법

history를 사용할 때 ! 기호를 사용하면 해당 명령어를 다시 실행할 수 있어 매우 편리합니다. 

ex)100번째 줄을 다시 실행하는 경우 아래처럼 사용합니다.

!100

 

6. 마지막 명령어를 보여주고 출력하기

가장 최근에 입력한 마지막 명령어를 다시 보여주면서 실행하는 방법입니다.

!!

 

7. 해당하는 명령어를 다시 보고 싶은 경우 출력하기

100번째 명령어를 출력하고자 하는 경우 p를 사용합니다.

!100:p

 


📌history 이력 삭제하기


1. 하나만 삭제할 경우 -d 옵션 사용하기

history -d 100
// 100번째 history만 삭제됨

 

2. 모두 삭제할 경우 -c 옵션 사용하기

모든 history의 내용을 삭제하려면 아래와 같습니다.

history -c
// 모든 history 내용을 삭제

 

Read, Write Excute 권한

 

폴더인지 파일인지 확인하기

 - ls -l 명령어를 사용한다. -l은 파일에 대한 권한 정보를 보기 위해서 필요한 옵션이다.

  아래와 같은 구조의 리스트를 확인할 수 있다.

 

chmod : 파일권한 변경


1.알파벳 표현

[file path]의 파일에 대한 소유 수준이 [owner]인 유저에게[permission level] 수준의 권한을 추가 또는 제거([action])한다.

 

chmod [option] [owner][action][permission level] [file path]
  • option  

   - R : 하위 모든 파일에 적용 (recursive)

  • 소유수준 owner

   파일에 대한 소유 수준은 3가지 문자로 표현된다.

   명령어에는 소유 수준이 1개 이상 연속해서 올 수 있다. 즉, 명령어에 ug라고 쓸 경우 파일을 소유한  user 와  group에게

   같은 권한을 부여한다.

소유 수준 표현 문자 설명
u 파일을 소유한 유저
g 파일을 소유한 그룹
o 파일을 소유한 유저와 그
  • action

   + 일 경우, 권한을 추가

    일 경우, 권한을 제거

    일 경우, +,- 는 명령어로 지정한 권한을 추가 또는 제거하고 기존 권한들은 그대로 둔다.

   반면에 =는 명령어로 지정한 권한을 추가(+)하되, 지정하지 않은 권한들은 모두 제거한다.

 

  • permission level

  파일에 대한 권한 수준은 3가지 문자로 표현된다.

  명령어에는 권한 수준이 1개 이상 연속해서 올 수 있다. 즉, 명령어에 rw라고 쓸 경우 읽기쓰기 2개 권한을 부여한다.

권한 수준 표현 문자 설명
r 읽기 권한
w 쓰기 권한
x 실행 권한
  • ex) ./file/path.csv 파일에 대한 파일 소유 유저와 그룹에게 읽기와 쓰기 권한 부여
chmod ug+rw ./file/path.csv

 

2.숫자 표현

[file path]의 파일에 대해 [permission level]을 이용하여 소유 수준 별로 권한 수준을 설정한다.

chmod [option] [permission level] [file path]
  • option

   -R : 하위 모든 파일에 적용 (recursive)

  • permission level

   3개 숫자로 소유 수준과 권한 수준을 모두 표현 할 수 있다.

   - 숫자 자리수로 소유 수준 표현

숫자 자리수 설명
첫째 자리 파일을 소유한 유저
둘째 자리 파일을 소유한 그룹 
셋째 자리 파일을 소유한 유저와 그룹이 아닌 유저

  - 숫자 크기로 권한 수준 표현

    2개 이상의 권한을 부여하려면 아래 숫자의 합으로 나타낸다. 즉,읽기(4)와 쓰기(2) 권한을 모두 부여하려면 4+2=6으로 

    설정한다.

숫자 크기 설명
4 읽기 권한
2 쓰기 권한
1 실행 권한
  • ex) ./file/path.csv 파일에 대해 유저에게 읽기, 쓰기, 실행 권한을 모두 부여, 그룹에게 읽기, 실행 권한을 부여, 소유한 유저와 그룹이 아닌 유저에게 실행 권한만 부여
chmod 751 ./file/path.csv

 

chown : 소유권 변경


파일의 소유자를 변경한다.

특정 소유 수준에 속하는 유저는 파일에 대해 그 소유수준에 설정된 수준 만큼의 권한을 행사 할 수 있다.

이때 소유 수준 별 권한 수준은 위 섹션 chmod 명령어로 설정할 수 있다.

chown [option] [owner]:[group] [file path]
  • option

   - R : 하위 모든 파일레 적용 (recursive)

  • owner

   파일의 소유자를 [owner]로 변경

  • group

   파일의 소유 그룹을 [group]으로 변경

   :[group] 이라고 쓰면 owner 변경 없이 group만 변경 할 수 있다.

  • file path

   소유권 변경 대상 파일 경로 (상대 경로 가능)

  • ex) ./file/path.parquet 파일에 대한 소유자를 deep으로 소유 그룹을 machinelearn으로 변경한다.
chown deep:machinelearn ./file/path.parquet

'리눅스' 카테고리의 다른 글

mv 명령어 사용법 (파일 이동, 이름 바꾸기)  (1) 2023.10.26
History 명령어  (0) 2023.07.03
리눅스 명령어정리🔍  (0) 2023.06.26

1. cd

cd (Change directory) : 디렉터리 이동

cd[디렉터리 경로] 이동하려는 디렉터리로 이동
cd ~ 홈 디렉터리로 이동
cd / 최상위 디렉터리로 이동
cd . 현재 디렉터리
cd .. 상위 디렉터리로 이동
cd - 이전 경로로 이동

 

2.  ls

ls(List segments) : 현재 위치의 파일 목록 조회

ls -l 파일의 상세정보
ls -a 숨김 파일 표시
ls -t 파일들을 생성시간순(제일 최신 것부터)으로 표시
ls -rt 파일들을 생성시간순(제일 오래된 것부터)으로 표시
ls -F 파일 표시 시 마지막 유형에 나타내는 파일명을 끝에 표시
('/':디렉터리, '*':실행파일, '@' : 링크 등..)

 

3. pwd

pwd(print working directory) : 현재 위치한 디렉터리의 절대경로를 표시

 

4. mkdir {디렉토리명}

mkdir(make directory) : 디렉토리를 생성

ex)  mkdir myfolder

 

5. vi { 생성할 또는 열어볼 파일명}

vi 에디터 실행. 해당 파일명의 파일이 있으면 열고 없으면 새로생성(:wq로 저장해야 만들어짐)

: q 종료
: q! 저장하지 않고 강제로 종료
: w 저장
: wq 저장 후 종료
ZZ 저장 후 종료(: wq 와 동일)
: wq  파일 이름  저장 후 파일 이름 지정

 

6. cp {복사할 대상} {붙여넣을 경로 또는 새 파일명}

cp(copy) : 파일을 복사합니다. 디렉토리를 복사할 시에는 cp  뒤에 -r을 붙여야 함

ex1) cp original.txt copied.txt

ex2) cp original.txt ../anotherfolder/

 

7. mv {옮길 대상} {대상 디렉토리 또는 새 파일명}

mv(move) : 파일이나 디렉토리를 옮기거나 이름을 변경할 때 사용

ex1) mv original.txt ../anotherfolder/

ex2) original.txt renamed.txt

 

8. rm {삭제할 대상}

rm(remove) :  파일이나 디렉토리를 삭제합니다. 디렉토리를 삭제할때는  rm  뒤에 -r을 붙여야 함

ex1) rm fileTodelete.txt

ex2) rm -r folderToDelete

 

9. sudo {명령어}

최고관리자 권한이 있어야 실행할 수 있는 명령들 앞에 붙인다. 실행시 비밀번호를 요구하기도 함

어떤명령어 입력시  Permission 관련 오류가 뜬다면  sudo 명령어 필요

ex1) sudo apt update

ex2) sudo rm -r importantFolder

 

10.du [옵션] <대상파일 및 디렉터리 경로>

du(Disk Usage) : 파일이나 디렉터리 크기(용량)을 확인할 때 사용하는 명령어

ex) du -sh 

 

옵션

-a 모든파일 및 디렉터리들의 정보를 출력합니다. 초기값은 디렉터리 정보만 출력
-b 출력 단위를 byte 단위로 표시
-c 모든 파일의 사용 정보를 출력 후 합계를 출력 (기본값)
-l 하드 링크되어 있는 파일은 그대로 계산
-s 지정된 디렉터리 내에 존재하는 모든 파일 및 서브 디렉터리들의 용량을 합쳐서 표시
-k 1kb 단위로 표시
-h 표시되는 용량 단위를 사용자가 읽기 쉬운 형태로 표현
용량에 따라 자동으로 byte, kb, mb, gb 등으로 표시

 

11.df [옵션] 

df(Disk Free) : 파티션의 전체 용량, 사용한 용량, 마운트 정보 등의 디스크 관련 정보들을 보여줌

ex) df- h

 

옵션

-i 또는  --inodes 파티션별 블록 사용정보 대신 inode 정보를 표시합니다.
파일명, 소유주, 권한, 시간정보 등
-a 또는  --all 모든 파일 시스템을 대상으로 정보를 보여줍니다. 더미 파일 시스템으로 크기가 0인경우에도 포함. ignore  또는  auto 형태의 파일 시스템이 초기 값인 경우 사용
-P 또는 --portability POSIX에서 사용되는 형태로 정보를 표시
-t <타입> 또는 --type=<타입> -text4 또는 --type=ext4 옵션을 사용하는 경우  ext4 파일시스템을 사용하는 파티션 정보만 표시
-x 또는 --exclude-type=<타입> -t 옵션과 반대로 특정 파일시스템을 제외하고 파티션 정보를 출력
-k 또는 --kilobytes 표시되는 용량 단위를 512바이트 블럭 단위 대신 1kb 단위로 표시
-h 또는  --human 표시되는 용량 단위를 사용자가 읽기 쉬운 형태로 표현
용량에 따라 자동으로 byte,kb,mb,gb  등으로 표시

 

12. tail -f 

실시간으로파일을 모니터링하면서 새로운 로그나 이벤트 등을 확인

 ex) tail -f filename

 여기서 filename은 모니터링하고자 하는 파일의 이름

 

'tail -f' 명령어를 사용 중일 때는 일반적으로 Ctrl+C를 눌러 명령어 실행을 종료할 수 있다

 

13.ln 

ln(link) : 링크파일을 만들 때 사용

링크는 하드링크와 심볼릭링크가 있다.

하드링크는 원본의 복사본을 사용하기 때문에 원본이 삭제되어도 사용가능하고, 심볼릭링크는 원본이 삭제되면 링크는

사용할 수 없으며 바로가기 기능과 유사하다.

 

하드링크 

ex) ln TARGET(원본) LINK_NAME(링크이름)

 

심볼릭링크

ex) ln -s TARGET(원본) LINK_NAME(링크이름)

 

심볼릭 링크 확인 명령어

ex) ls -al

'리눅스' 카테고리의 다른 글

mv 명령어 사용법 (파일 이동, 이름 바꾸기)  (1) 2023.10.26
History 명령어  (0) 2023.07.03
chmod / chown - 파일 권한 / 소유권 변경  (0) 2023.06.29

래퍼 클래스(Wrapper Class)

 

프로그램에 따라 기본 타입의 데이터를 객체로 취급해야 하는 경우가 있습니다.

예를 들어, 메소드의 인수로 객체 타입만이 요구되면, 기본 타입의 데이터를 그대로 사용할 수는 없습니다.

이때에는 기본 타입의 데이터를 먼저 객체로 변환한 후 작업을 수행해야 합니다.

 

이렇게 8개의 기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 래퍼 클래스(Wrapper class)라고 합니다.

래퍼 클래스는 각각의 타입에 해당하는 데이터를 인수로 전달받아, 해당 값을 가지는 객체로 만들어 줍니다.

이러한 래퍼 클래스는 모두 java.lang 패키지에 포함되어 제공됩니다.

 

자바의 기본 타입에 대응하여 제공하고 있는 래퍼 클래스는 다음과 같습니다.

기본 타입 래퍼 클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

📌Integer 클래스와 Character 클래스만 자신의 기본 타입과 이름이 다름!

 

 

📌PageContext

현재 JSP 페이지의 모든 정보(나머지 기본객체 참조)를 가진 객체

하나의 JSP 페이지에 대해 1대 1관계로 생성되는 객체이며, 서블릿 환경에서 JSP 컨텍스트에 대한 

정보를 제공해주는 객체이다

 

주요기능

- 나머지 기본객체 구하기

- 페이지 흐름 제어

- 각 영역에서 관리되는 속성 처리하기

 

 

영역(Scope)의 종류 및 특성

영역(Scope) 접근객체 설명
Page Scope pageContext 하나의 jsp 인스턴스 내에서만 유지되는 객체들의 영역,
주로 커스텀 태그에서 새로운 속성을 추가할 때 사용됨
Request Scope request 하나의 요청 정보가 유지되는 도안 공유될 객체들의 영역,
주로 dispatch 방식으로 이동하는 동안 유지할 요청에 관한 
상태정보를 관리하는 영역
Session Scope session 클라이언트이 상태 정보가 유지되는 세션동안 공유될 객체들의 영역, 대표적으로 사용자의 로그인 상태를 유지하기 위한 정보들 혹은 로그인 상태 동안 공유해야 하는 정보들의 영역
Application Scope application 특정 웹 어플리케이션 내에서 공유될 객체들의 영역,
주로 웹 어플리케이션 자체의 설정 정보들이 공유되는 영역

 

'웹기반 애플리케이션' 카테고리의 다른 글

Wrapper 클래스  (0) 2023.04.04
JSP의 기본객체(2)(ServletContext)  (0) 2023.03.16
JSP의 기본객체, cookie와 session  (0) 2023.03.15
예외 (Error, Exception)  (0) 2023.03.15
Http Response Packaging(2)  (0) 2023.03.10

📌 ServletContext

서블릿이 운영되는 컨텍스트와 서버(컨테이너)에 대한 정보를 가진 싱글턴 객체

  1. context parameter 확보 : 

<%=application.getInitParameter("imageFolder") %> <!-- application: 싱글톤 -->


  2. context 정보 확보 : 

<%=application.getContextPath() %>, <%=request.getContextPath() %>
<%=request.getServletContext().getContextPath() %>, <%=session.getServletContext().getContextPath() %>


  3. 서버의 정보 확보 

<%=application.getServerInfo() %> 
<%=application.getMajorVersion() %>.<%=application.getMinorVersion() %>


  4. 로그 기록

<%
 	application.log(
    String.format("%s - %s, %s",request.getRemoteAddr(),request.getMethod(), request.getRequestURI())
    );
 %>

 

5. 현재 컨텍스트의 웹리소스 확보에 활용(***)

<%
 		String imageURL = "/resources/images/cat1.jpg";
 		String realPath = application.getRealPath(imageURL);
 		out.println(realPath); // 이클립스상에서 이미지가 들어있는 경로 
 		//D:\A_TeachingMaterial\06_JSP_Spring\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\WebStudy01\resources\images\cat1.jpg
 		File imageFile = new File(realPath); // 1.
			
 		// 고양이 그림 복사하기!!
 			
 		String folderURL = "/11";
 		String folderPath  = application.getRealPath(folderURL);
 		out.println(folderPath);
 		//D:\A_TeachingMaterial\06_JSP_Spring\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\WebStudy01\11
 		File destFile = new File(folderPath, imageFile.getName());
 		out.println(destFile); // 파일이 복사될 경로
 		//D:\A_TeachingMaterial\06_JSP_Spring\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\WebStudy01\11\cat1.jpg
 			
 		Files.copy(imageFile.toPath(), destFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
					
 			
			 		
 %>

 

'웹기반 애플리케이션' 카테고리의 다른 글

Wrapper 클래스  (0) 2023.04.04
JSP 기본객체(3) PageContext, Scope  (0) 2023.03.26
JSP의 기본객체, cookie와 session  (0) 2023.03.15
예외 (Error, Exception)  (0) 2023.03.15
Http Response Packaging(2)  (0) 2023.03.10
수업 포인트
  • JSP의 기본객체가 뭐가 있는지
  • 각각의 기본객체의 패스
  • 각각의 기본객체가 관리하고 있는 저장소

 

📌 JSP 스펙에서 제공되는 기본객체

기본객체 설명
request 클라이언트의 요청 정보를 저장한다
response 응답 정보를 저장한다
pageContext JSP 페이지에 대한 정보를 저장한다
session HTTP 세션 정보를 저장한다
application 웹 어플리케이션에 대한 정보를 저장한다
out JSP페이지가 생성하는 결과를 출력할 때 
사용되는 출력 스트림이다
config JSP 페이지에 대한 설정 정보를 저장한다
page JSP 페이지를 구현한 자바 클래스 인스턴스이다
exception 예외 객체. 에러 페이지에서만 사용된다

request(HttpServletRequest)
response(HttpServletResponse)
out(JspWriter) : <a href="bufferDesc.jsp">bufferDesc.jsp참고</a>
session(HttpSession) : <a href="sessionDesc.jsp">sessionDesc.jsp 참고</a>
application(ServletContext) 톰캣과 현재 어플리케이션이 가지고있음 <a href="applicationDesc.jsp">applicationDesc.jsp참고</a>

page(Object) == this : 커스텀 태그 개발에 활용.
                커스텀 태그 사용 형태 : <!-- <prefix:tagname attributes.. > 백엔드 방식(자바코드) -->/ 현재 동작하고 있는 객체의 정보가 필요할때 
config(ServletConfig) : 등록된 서블릿의 메타데이터를 가진 객체

exception(Throwable) : 예외 처리 목적으로 활용. isErrorPage = "true"/ error exception 상위객체  

CAC(Context Aware Computing)
**** pageContext(PageContext) : 현재 JSP 페이지에 대한 모든 정보를 가진 객체,
                                가장 먼저 생성되고, 나머지 모든 기본 객체의 참조를 소유함.

 


JspWriter를 이용한 버퍼 관리

 

1. 응답 데이터를 버퍼에 기록, append, write, print...
2. 버퍼의 상태 확인
           

buffer size : <%=out.getBufferSize() %>, 잔여 버퍼 사이즈 : <%=out.getRemaining() %>


3. 버퍼의 내용을 방출 : 한 번 flush 된 이후에는 예외나 에러페이지로 전환이 불가능함

  <%--
              out.flush(); 
                if(1==1){
                                   throw new RuntimeException("강제 발생 예외"); // unchecked exception
                 }
 --%>

4. 버퍼의 내용을 삭제

 

 <%--
             out.clearBuffer(); // 버퍼를 지우고 내용을 다시 채우는게 가능
  --%>
<%
          for(int count=1; count<=100; count++){
                  out.println(String.format("%d 번째 반복문 기록", count));
                  if(count==90) out.flush();
                  if(count==99){
                         throw new RuntimeException("강제 발생 예외"); // unchecked exception
            }
       }
%>

 

HttpSession

 

세션 타이머 :  <span id="timerArea" data-timeout="<%=session.getMaxInactiveInterval() %>"></span>

 

세션 : 시간과 통로의 개념을 가진다
             시간의 개념(Web) : 사용자가 어플리케이션을 사용하기 시작하는 순간부터 사용종료 까지의 시간.(= web에서의 개념)

                                                  세션트래킹모드: 언제 시작되고 종료되는지 알려줌
             통로의 개념(DB) : 클라이언트와 서버 사이의 수립된 유일한 연결(connection)
  
세션의 생명주기
             시작 : 해당 사용자로부터 최초의 요청이 발생했을 때 -> 세션 아이디 부여 -> 응답 데이터로 사용자에게 전송
                         사용자는 timeout 이내에 새로운 요청을 발생(저장되어있던 세션아이디를 첨부)
             종료 : 
                         명시적인 로그아웃, 
                          timeout(만료 시간)의 개념을 도입
                         -> timeout 이내에 새로운 요청이 발생하지 않을때
                         -> 브라우저를 종료하는 등의 쿠키 트래킹 모드 데이터(ex)쿠키)가 삭제되는 경우
                         -> 쿠키와 같은 트래킹 모드 데이터를 직접 삭제한 경우

세션의 식별 속성
           

세션 아이디  : <%=session.getId() %>


세션의 기타 속성
           

            세션 생성 시점 :<%=new Date(session.getCreationTime()) %>
            마지막 요청 시점 : <%=new Date(session.getLastAccessedTime()) %>

           timeout : <%=session.getMaxInactiveInterval()%>s <button>연장</button>



세션 트래킹 모드
         1. COOKIE : JSESSIONID 와 같은 쿠키의 형태로 C/S 사이의 세션아이디 전송.
         2. URL : <a href="sessionDesc.jsp;jsessionid=<%=session.getId()%>">세션 유지</a>
         3. SSL : C/S 사이에 전송되는 세션 아이디를 암호화


 

cookie 와 session을 사용하는 이유?

HTTP 프로토콜의 statless를 보완하는 저장개념

 

 * HTTP 프로토콜의 특징

1.Connectionless 프로토콜( 비연결지향)

 클라이언트가 서버에 요청(Request)을 했을 때, 그 요청에 맞는 응답(Response)을 보낸 후 연결을 끊는 처리 방식

 

2. Stateless 프로토콜

  커넥션을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이 있다

 

서버와 클라이언트가 통신을 할 때 통신이 연속적으로 이어지지 않고 한 번 통신이 되면 끊어진다.

따라서 서버는 클라이언트가 누구인지 계속 인증을 해줘야 한다. 하지만 그것은 매우 귀찮고 번거로운 일이다.

그런 번거로움을 해결하는 방법이 바로 쿠키와 세션이다.

 

쿠키(Cookie)

HTTP의 일종으로 사용자가 어떠한 웹 사이트를 방문할 경우,

그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하는 작은 기록 정보 파일이다.

HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장하였다가 필요시 정보를 참조하거나 재사용할 수 있다.

 

  • 쿠키의 동작 순서
    1. 클라이언트가 페이지를 요청한다. (사용자가 웹사이트에 접근)
    2. 웹 서버는 쿠키를 생성한다.
    3. 생성한 쿠키에 정보를 담아 HTTP 화면을 돌려줄 때, 같이 클라이언트에게 돌려준다.
    4. 넘겨받은 쿠키는 클라이언트가 가지고 있다가(로컬 PC에 저장) 다시 서버에 요청할 때 요청과 함께 쿠키를 전송한다.
    5. 동일 사이트 재방문 시 클라이언트의 PC에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키를 전송한다.

세션(Session)

일정 시간 동안 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 유지시키는 기술이다.

여기서 일정 시간은 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점부터 웹 브라우저를 종료하여 연결을 끝내는 시점을 말한다.

즉, 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 한다.

 

  • 세션 특징
    1. 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장한다.
    2. 웹 서버의 저장되는 쿠키(=세션 쿠키)
    3. 브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제가 되므로, 쿠키보다 비교적 보안이 좋다.
    4. 저장 데이터에 제한이 없다. (서버 용량이 허용하는 한에서)
    5. 각 클라이언트에 고유 Session ID를 부여한다. Session ID로 클라이언트를 구분해 각 요구에 맞는 서비스를 제공
  • 세션의 동작 순서
    1. 클라이언트가 페이지에 요청한다. (사용자가 웹사이트에 접근)
    2. 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인하여, 클라이언트가 해당 session-id를 보냈는지 확인한다.
    3. session-id가 존재하지 않는다면 서버는 session-id를 생성해 클라이언트에게 돌려준다.
    4. 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장한다.
    5. 클라이언트는 재접속 시, 이 쿠키를 이용해 session-id 값을 서버에 전달

 * 쿠기와 세션의 차이

 

  쿠키는 '클라이언트(=로컬 PC)'에 저장하고, 세션은 '서버'에 저장한다

  쿠키는 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니핑 당할 우려가 있어서 보안에 취약하지만

  세션은 쿠키를 이용해서 session-id만 저장하고 그것으로 구분하여 서버에서 처리하기 때문에 비교적 보안성이 높다.

 

참고: https://dev-coco.tistory.com/61

 

<수업 필기>
HCLC : 응집력은 높이고 결합력은 낮춤



퍼시스턴스 계층(Persistence Layer)이란?

쉽게 말해서 DB와 연결하는 부분을 말한다.<퍼시스턴스(Persistence)라는 단어 뜻 그대로 '영속성'을 가지는
DB와 연결을 하는 지점을 의미한다.>

MyBatis, Hibernate 등을 퍼시스턴스 프레임워크라고 부르는데 DB랑 연동을 시키는 기능을 하기 때문이다.
MVC 패턴 내부에서 Model 계층은 비즈니스 계층과 퍼시스턴스 계층으로 구성된다고 할 수 있다.(Model Layer = Business Layer + Persistence Layer)

사실 비즈니스 계층에서 DB랑 연결을 하는 작업을 전부 처리해도 상관이 없지만 굳이 퍼시스턴스 계층을 따로 두는 이유는 개발자가 편하기 위해서다.

퍼시스턴스 프레임워크를 사용하면 PreparedStatement니 rs.next() 등과 같은 귀찮은(?) 코딩을 해주지 않아도 MyBatis가 전부 알아서 SQL Mapping을 해준다.
​비즈니스 계층에서는 그냥 MyBatis를 호출(API를 사용해서)하기만 하면 된다.(MyBatis가 대신 일을 해주기 때문!)

Model 계층에서 이뤄지는 작업의 90% 이상은 JDBC 연동이라고 할 수 있는데, 퍼시스턴스 프레임워크를 사용함으로써 생산성을 획기적으로 향상시킬 수 있다!


 

clean 하는방법

'웹기반 애플리케이션' 카테고리의 다른 글

JSP 기본객체(3) PageContext, Scope  (0) 2023.03.26
JSP의 기본객체(2)(ServletContext)  (0) 2023.03.16
예외 (Error, Exception)  (0) 2023.03.15
Http Response Packaging(2)  (0) 2023.03.10
JSP, Servlet컨테이너의 역할  (0) 2023.03.09

+ Recent posts