본문 바로가기
레거시

2022.1.6의 기록

by GroovyArea 2022. 1. 7.

- 하루 정리 - 

  • Servlet 복습 및 정리 (쿠키, 파일 업로드)
  • 세미프로젝트 회의(디스코드)

- 질문 사항 -

 

> ServletContext : 클라이언트가 요청한 컨텍스트 정보를 저장한 인스턴스 / ServletConfig : 컨텍스트 관련 환경정보를 저장한 인스턴스의 차이?

=> 단어 뜻 그대로 이해하면 됨, WAS가 만들어주고 get메소드로 컨텍스트 인스턴스를 가져와서 사용함.

 

> 팀프로젝트에서 HTML파일이 깨지는 경우가 많은데 어떡할지?

=> 웹페이지 자체 크롤링 막아놓음. 웹 페이지에서 소스보기로 가져오는 방법.

 

> (SVN) 여러명이 같은 페이지를 코딩했는데 커밋하고 다른 사람 update로 이어 받아서 또 
커밋했고 3번째인 나는 두번 이상 리버전 넘버가 거쳐진 상태에서 커밋했는데 에러 발생? (Override Commit도 안됨)

=> 백업 후 체크아웃이 속 편함.  두번 이상은 꼬인다! (Oh's official)

 

> 서버 웹 디렉토리에 저장된 컨텍스트는 사라지지 않는가?

=> 내가 수동으로 지우면 되지만 굳이? 웹 자원 자체가 차지하는 메모리는 생각보다 적다. 클라이언트가 서버 요청 시 자원을 제공하여 사용하기 때문에 그때부터 메모리가 사용됨. (대형 서버 접속 시 클라이언트 접속 분산 개념의 이유 설명) 서버는 자원 자체를 제공하기만 할뿐 클라이언트는 자원을 제공받아 사용. 메모리 사용량보다 접속량이 많아질 때가 근본적인 문제임.


- 오늘 공부 내용 - 

 

Servlet

  • 입력 스트림 중요
  • HTML에서 서블릿 src로 요청 가능
  • 서블릿은 WAS에 의해 프로젝트들을 웹 자원으로 만든다
  • 검색량은 2kb 약 2천자로 제한
  • 입력값에 대한 검증은 브라우저에서 하지만 서버에서도 해야된다는게 법 (보안상 권장)
  • 비정상적인 접근은 에러페이지 출력이나 location 객체 이용
  • 파일을 얻어오는것은 순수한 원시데이타로 얻어오기 때문에 문자열로 얻어오는건 불가능.
  • 파일을 입력받아 서버에 저장 - upload
  • 파일을 받아 클라이언트가 갖고 감 - download
  • 입력페이지에서 전달된 멀티파트 폼데이타를 처리하기 위한 클래스를 사용하여 서블릿 작성 // => Apache 그룹에서 배포한 commons-fileupload 라이브러리의 클래스 사용 - 선택적 파일 업로드 (어렵다 고급자용) // => Oreilly 그룹에서 배포한 cos 라이브러리의 클래스 사용 - 무조건 파일 업로드 (검증 자체가 불가능함)
  • 폴더 : 윈도우의 논리적인 공간
  • 디렉토리 : 유닉스.맥의 물리적인 공간 (파일 개념)
  • 인터페이스 객체 생성 불가 ⇒ 상속받는 클래스로 객체를 생성하는 방법
  • 서버 리로드 후 웹 디렉토리 파일 삭제되는 걸 방지하려면 차라리 워크스페이스 파일을 저장해라

Cookie

  • 클라이언트와 서버의 연결의 지속성을 유지하기 위해

> 전달 되는 값이 여러개인 경우?

		//HttpServletRequest.getParameterValues(String name) : 같은 이름으로 전달되는 모든 값들을
		//얻어와 문자열 배열로 반환하는 메소드
		// => 다중 선택 기능의 입력태그(checkbox, select 등)로 전달된 값을 반환받을 때 사용
		String[] hobby=request.getParameterValues("hobby");

> 파일 업로드 형식은 multipart/form-data 형식을 이용하라!

<!-- 사용자로부터 파일을 입력받아 웹프로그램을 요청하여 전달하기 위해서는 반드시 method 
 속성값을 [POST]로 설정하고 enctype 속성값을 [multipart/form-data]로 설정 -->
<!-- enctype 속성 : [application/x-www-form-urlencoded] 또는 [multipart/form-data] 중 하나를 속성값으로 설정 -->
<!-- => [application/x-www-form-urlencoded] : 입력값을 인코딩 처리된 문자값으로 전달(기본) - 파일 전달 불가능 -->
<!-- => [multipart/form-data] : 모든 입력값을 원시데이타(멀티파트 폼데이타)로 전달 - 파일 전달 가능 -->
<form action="view.itwill" method="post" enctype="multipart/form-data">

> 파일을 반환받아 전달하는 서블릿 출력시 전달된 값에 대하여 캐릭터 셋을 변경해줘야함!

//POST 방식으로 요청하여 전달된 값에 대한 캐릭터셋 변경
		request.setCharacterEncoding("utf-8");

> 멀티파트 폼데이타는 request 메시지의 입력스트림을 사용하여 반환받아 사용!

InputStreamReader in=new InputStreamReader(request.getInputStream(), "utf-8");

멀티파트 폼데이타를 이용하여 파일을 온전히 가져오고 싶을 땐 cos jar 파일을 임포트 시켜주면 Dynamic Project 인 경우는 자동으로 웹 라이브러리에 임포트된다.

 

> 비정상적인 요청에 대한 처리

if(request.getMethod().equals("GET")) {
			response.sendRedirect("file_upload.html");
			return;
		}

=> 겟 방식 요청 시 파일업로드 페이지로 되돌려 보냄

 

>  전달된 파일을 저장하기 위한 서버 디렉토리의 시스템 경로를 반환받아 저장
 => 작업 디렉토리(WorkSpace)가 아닌 웹디렉토리(WebApps)의 시스템 경로 반환
> 주의)WAS 프로그램 시작시 작업 디렉토리의 프로젝트가 웹디렉토리에 동기화 처리되어 컨텍스트로 변환
 => 작업 디렉토리에는 업로드 파일이 없으므로 동기화 처리될 때 웹디렉토리의 업로드 파일이 삭제 

		String saveDirectory=request.getServletContext().getRealPath("/upload");

MultipartRequest 클래스로 인스턴스 생성
 => MultipartRequest : 멀티파트 폼데이타를 처리하기 위한 기능을 제공하는 인스턴스
 => MultipartRequest 인스턴스를 생성하면 모든 입력파일을 전달받아 서버 디렉토리에 저장
MultipartRequest(HttpServletRequest request, String saveDirectory, int maxPostSize
 , String encoding, FileRenamePolicy policy)
 => request : 요청정보를 저장한 HttpServletRequest 인스턴스 전달
 => saveDirectory : 전달 파일을 저장하기 위한 서버 디렉토리의 시스템 경로 전달
 => maxPostSize : 처리 가능한 멀티파트 폼데이타의 크기 단위 - 단위 : Byte
 => encoding : 멀티파트 폼데이타에 저장된 전달값의 캐릭터셋 전달
 => policy : FileRenamePolicy 인스턴스 전달
FileRenamePolicy : 파일 업로드 처리시 입력파일과 같은 이름이 파일이 업로드 되는
서버 디렉토리에 이미 존재할 경우 전달파일의 이름을 자동으로 변경하는 인스턴스
 => FileRenamePolicy 인스턴스를 매개변수에 전달하지 않으면 기존 파일을 전달파일로 덮어씌우기(OverWrite)

//서버 디렉토리에 저장된 파일명과 동일한 파일명의 입력파일을 전달할 경우 파일명을 변경하여
		//저장하기 위해 FileRenamePolicy 인터페이스를 상속받은 자식클래스로 FileRenamePolicy 
		//인스턴스를 생성하여 MultipartRequest 생성자의 매개변수에 전달
		//DefaultFileRenamePolicy : FileRenamePolicy 인터페이스를 상속받은 자식클래스
		// => 입력파일명 뒤에 숫자를 붙여 자동으로 변경하는 기능을 제공
		MultipartRequest mr=new MultipartRequest(request, saveDirectory
				, 20*1024*1024, "utf-8", new DefaultFileRenamePolicy());

 

> 입력 파일명과 실제 서버 디렉토리에 저장된 파일명을 가져오는 메소드

//입력파일명을 반환받아 저장
		//MultipartRequest.getOriginalFileName(String name) : 멀티파트 폼데이타에 저장된 전달파일명을 반환하는 메소드
		//String fileone=mr.getOriginalFileName("fileone");
		//String filetwo=mr.getOriginalFileName("filetwo");
		
		//MultipartRequest.getFilesystemName(String name) : 서버 디렉토리에 저장된 업로드 파일명을 반환하는 메소드
		String fileone=mr.getFilesystemName("fileone");
		String filetwo=mr.getFilesystemName("filetwo");

 

>  쿠키(Cookie) : 서버(웹프로그램)와 클라이언트와의 연결 지속성을 제공하기 위한 클라이언트에
저장하는 값 - 쿠키는 접속 서버 정보를 이름(식별자)으로 클라이언트에 저장

//Cookie 클래스로 인스턴스 생성 
		// => Cookie : 쿠키 정보를 저장한 인스턴스
		//Cookie(String name, String value) : 쿠키명과 쿠키값을 전달하여 인스턴스를 생성하는 생성자
		// => 쿠키명 : 쿠키값을 제공받기 위한 식별자
		// => 쿠키명과 쿠키값은 영문자, 숫자, 일부 특수문자만 사용하여 저장 가능
		Cookie idCookie=new Cookie("id", "abc123");
		Cookie countCookie=new Cookie("count", "0");

저장될 쿠키의 유지시간 변경 가능 기본값은 -1로 브라우저 종료시 자동 소멸!

countCookie.setMaxAge(24*60*60);//쿠키 유지시간을 1일로 변경

 쿠키를 클라이언트에게 전달

	//쿠키를 클라이언트에 전달 - 클라이언트은 전달받은 쿠키를 저장
		// => 유지시간을 변경하지 않은 쿠키는 브라우저 메모리에 저장
		// => 유지시간을 변경한 쿠키는 쿠키 파일에 저장
		//HttpServletResponse.addCookie(Cookie cookie) :  클라이언트에게 쿠키를 전달하는 메소드
		response.addCookie(idCookie);
		response.addCookie(countCookie);

클라이언트에서 전달된 모든 쿠키를 반환받아 저장

		// HttpServletRequest.getCookies() : 클라이언트에서 전달된 모든 쿠키를 Cookie 배열로 반환하는 메소드
		Cookie[] cookies = request.getCookies();

 


- 세미 팀플 -

> 금요일까지 각 화면 정의서 완성!

> 페이지 선택 완료

> 각 파트별로 HTML 알아오기 - 깨진 파일은 웹 페이지 소스보기


- 스터디 내용 및 결과 - 

> 파일 업로드의 개념 확실히.

> 쿠키의 개념과 읽는 방식 확실히.

반응형

'레거시' 카테고리의 다른 글

2022.1.10의 기록  (0) 2022.01.11
2022.1.7의 기록  (0) 2022.01.07
2021.1.5  (0) 2022.01.05
2021.1.4의 기록  (0) 2022.01.04
2022.1.3의 기록  (0) 2022.01.03