Server 주요 개념 정리

·2023년 7월 4일
0

Server

목록 보기
6/35
post-thumbnail

📝 Server 구현 주요 개념


💡 JNDI(Java Naming and Directory Interface API)

디렉토리에 접근하는 데 사용하는 Java API
-> 애플리케이션(프로그램, 웹앱)은 JNDI를 이용해서 파일 또는 서버 Resource를 찾울 수 있음


💡 DataBase Connection Pool(DBCP)

미리 DB와 연결되어 있는 Connection을 일정 개수 만들어 두고 클라이언트 요청 시 만들어 둔 Connection을 빌려주고 요청 처리 완료 시 다시 반환받는 기법

⏬ 자세한 사용법 참조하기(링크) 👀 ⏬
서버 구현 - 로그인 기능 (23.07.04~05)

📌 장점

1) 미리 Connection을 만들어 두기 때문에 요청 시 속도가 빠름
(예전에는 그때 그때 만들어서 오래 걸림)

2) Connection 개수에 제한을 두어 DB에 과도하게 요청되는 경우를 방지할 수 있음

    <!-- DBCP 세팅 -->   
   <Resource 
      name="jdbc/oracle" 
      auth="Container"
      type="javax.sql.DataSource" 
      driverClassName="oracle.jdbc.OracleDriver"
      url="jdbc:oracle:thin:@localhost:1521:xe"
      username="community_ash" 
      password="community1234" 
      maxTotal="50"      
      maxIdle="10"
      maxWaitMillis="-1"
    />

name

  • JNDI 이름 Context의 lookup()을 사용하여 자원을 찾을때 사용함
  • java:comp/env 디렉터리에서 찾을 수 있음

auth

  • 자원 관리 주체 지정(Application 또는 Container)

type

  • Resource의 타입 지정

driverClassName

  • JDBC 드라이버 클래스 이름

maxTotal

  • DataSource에서 유지할 수 있는 최대 커넥션 수

maxIdle

  • 사용되지 않고 풀에 저장될 수 있는 최대 커넥션의 개수
    -> 음수일 경우 제한이 없음

maxWaitMillis

  • 커넥션 반납을 기다리는 시간 (-1은 반환될 때 까지 기다림)


💡 필터(Filter)

클라이언트 요청 시 생성되는 HttpServletRequest, HttpServletResponse가 요청을 처리하는 Servlet에 도달하기 전에 특정 코드를 수행하는 클래스

⏬ 자세한 사용법 참조하기(링크) 👀 ⏬
서버 구현 - 로그인 기능 (23.07.04~05)

📌 요청 흐름

클라이언트 -> 요청 -> HttpServletRequest HttpServletResponse 생성 -> 필터 -> 요청 처리 Servlet

  • 여러 필터를 만들어 연쇄적으로 연결하여 수행할 수 있다. (FilterChain)

📌 @WebFilter("url패턴")

  • 해당 클래스를 필터 클래스로 등록
  • url 패턴에 일치하는 요청이 있을 경우 해당 요청을 필터링함

filterName 속성

  • 필터의 이름 지정, 필터 순서 지정 시 사용

urlPatterns 속성

  • 요청 주소 패턴

/

  • == /community == 최상위 주소

*

  • == 모든

/*

  • == 최상위 주소 하위 모든 == 모든 요청

📌 init() 메소드

서버 실행 시 또는 필터 코드 변경 시 필터 객체가 자동 생성되는데,
그때 필터에 필요한 내용을 초기화하는 메소드

public class EncodingFilter extends HttpFilter implements Filter {

	public void init(FilterConfig fConfig) throws ServletException {
	}

📌 destroy() 메소드

서버 실행 중 필터 코드가 변경되어 기존 필터를 없애야 할 때 수행되는 메소드

	public void destroy() {
		System.out.println("문자 인코딩 필터 파괴");
	}

📌 doFilter() 메소드

필터 역할을 수행하는 메소드

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		// ServletRequest == HttpServletRequest의 부모 타입
		// ServletResponse == HttpSErvletResponse의 부모 타입
		// -> 필요 시 다운캐스팅
		
		// 모든 요청의 문자 인코딩을 UTF-8로 설정
		request.setCharacterEncoding("UTF-8");
		
		// 모든 응답의 문자 인코딩을 UTF-8로 설정
		response.setCharacterEncoding("UTF-8");
		
		// 연결된 다음 필터 수행(없으면 Servlet 수행)
		chain.doFilter(request, response);
	}

}

💡 Lombok 라이브러리

VO(Value Object) 또는 DTO(Data Transfer Object)에 작성되는 공통 코드(getter/setter/생성자)를 자동 추가해 주는 라이브러리


import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter // getter 자동 추가
@Setter // setter 자동 추가
@ToString // toString 자동 추가
@NoArgsConstructor // 기본 생성자
@AllArgsConstructor // 모든 필드 초기화하는 매개변수 생성자

💡 쿠키

클라이언트(브라우저)에서 관리하는 파일

⏬ 자세한 사용법 참조하기(링크) 👀 ⏬
서버 구현 - 로그아웃, 아이디 저장 기능 (23.07.06)
서버 구현 - 회원 탈퇴 기능 (23.07.11)

  • 특정 주소 요청 시마다 해당 주소와 연관된 쿠키 파일을 브라우저가 알아서 읽어옴
    -> 읽어온 쿠키 파일 내용을 서버에 같이 전달함

📌 생성 및 사용 방법

1) 서버가 요청에 대한 응답을 할 때 쿠키를 생성한 후 응답에 쿠키를 담아서 클라이언트에게 전달

2) 응답에 담긴 쿠키가 클라이언트에 파일 형태로 저장

3) 이후 특정 주소 요청 시 쿠키 파일을 브라우저가 찾아서 자동으로 요청에 실어서 보냄

4) 서버는 요청에 실려온 쿠키 파일을 사용함

🔎 예시 1 - 아이디 저장

				// 쿠키 객체 생성
//				Cookie c = new Cookie("클라이언트쪽에 저장될 쿠키 이름", "쿠키 내용");
				Cookie c = new Cookie("saveId", inputEmail);
				
				// 아이디 저장이 체크된 경우
				if(req.getParameter("saveId") != null) {
					// 쿠키 파일을 30일 동안 유지
					c.setMaxAge(60 * 60 * 24 * 30); // 30일(1초 단위)
					
				} else {
					// 쿠키 파일을 0초 동안 유지
					// -> 기존에 존재하던 쿠키 파일에 유지 시간을 0초로 덮어씌움
					//	  == 삭제하겠다는 소리
					c.setMaxAge(0);
				}
				
				// 해당 쿠키 파일이 적용될 주소를 지정
				c.setPath( req.getContextPath() );
				// req.getContextPath() : 최상위 주소(/community)
				// -> /community로 시작하는 주소에서만 쿠키 적용
				
				// 응답 객체를 이용해서 클라이언트로 전달
				resp.addCookie(c); // 코드가 해석되는 순간 바로 전달

🔎 예시 2 - 회원 탈퇴 후 쿠키 지우기

Cookie c = new Cookie("saveId", ""); // 쿠키 생성
c.setMaxAge(0); // 쿠키 수명
c.setPath(req.getContextPath()); // 쿠키 적용 경로
resp.addCookie(c); // 쿠키 클라이언트에 전송

클라이언트 요청 -> 서버 요청 처리(Servlet) -> 응답 화면 만들어 줘!(JSP 위임)

💡 forward

요청 위임

  • Servlet으로 응답 화면 만들기가 불편하기 때문에 JSP로 req, resp 객체를 위임하여 요청에 대한 응답 화면을 대신 만듦
  • 화면이 변경되어도 요청 주소가 유지됨
  • 예시
ex) 아이스 아메리카노 주세요 -> 	주문 받음		-> 바리스타가 만든 커피
		   클라이언트           캐셔(Servlet)		     응답 결과(JSP)

💡 redirect

재요청

  • 현재 Servlet에서 응답 페이지를 만들지 않고 응답 페이지를 만들 수 있는 다른 요청의 주소로 클라이언트를 이동시킴(재요청)

    ⏬ 자세한 사용법 참조하기(링크) 👀 ⏬
    서버 구현 - 로그인 기능 (23.07.04~05)
클라이언트 재요청
-> 기존 HttpServletRequest/Response 제거
-> 새로운 HttpServletRequest/Response 생성
			
---> 리다이렉트 시 request 객체가 유지되지 않기 때문에
특정 데이터를 전달하거나 유지하고 싶으면
Session 또는 application 범위에 세팅해야 한다!
  • 예시
[CGV 카페]
ex) 팝콘 주세요		->	팝콘 파는 위치 알려 줌	-> (클) 팝콘 파는 곳으로 이동
    클라이언트			  캐셔(Servlet)		  클라이언트의 다른 주소 재요청

💡 session.invalidate();

세션 무효화

⏬ 자세한 사용법 참조하기(링크) 👀 ⏬
서버 구현 - 로그아웃, 아이디 저장 기능 (23.07.06)

  • 현재 세션을 없앰 -> 자동으로 새로운 세션이 생성됨

💡 HttpServletRequestWrapper

클라이언트 요청 객체 HttpServletRequest를 오버라이딩 하는 방법을 제공하는 클래스

⏬ 자세한 사용법 참조하기(링크) 👀 ⏬
서버 구현 - 개인정보 암호화 (23.07.10)

-> Wrapper 클래스 생성 시 반드시 HttpServletRequest 객체를 매개변수로 전달해야 한다.

💡 암호화 메소드(SHA-512 해시 함수)

📌 해시 함수

어떤 문자열이든 일정한 길이의 무작위 문자열로 변환하는 함수(중복X)


💡 쿼리스트링

주소에 담겨져서 전달되는 파라미터를 나타내는 문자열

📌 작성법

주소?name속성=값&name속성=값

🔎 예시

/member/login?memberEmail=user01&memberPw=1234

💡 웹 페이지 앞/뒤로 가기

⏬ 자세한 사용법 참조하기(링크) 👀 ⏬
서버 구현 - 목록으로 돌아가기 기능 (23.07.20)

📌

뒤로 가기

📌 history.go(숫자)

  • 양수(앞으로가기)
  • 음수(뒤로가기)

📌 URL 내장 객체

주소 관련 정보를 나타내는 객체

📌 location.href

현재 페이지 주소 + 쿼리스트링

location.href = "주소"; // 해당 주소로 이동
const pathname = location.pathname; // 주소상에서 요청 경로 반환

📌 URL.searchParams

쿼리 스트링만 별도 객체로 반환


💡 코드 해석 순서

EL == JSTL -> HTML -> JS

  • jsp 파일 : html, css, js, el, jstl 사용 가능
  • js 파일 : js만 사용 가능
    -> JS 코드에서 EL/JSTL을 작성하게 된다면 반드시 ""를 양쪽에 추가

💡 업로드 관련 개념

input type="file" 요소는 파일이 선택될 때 change 이벤트가 발생한다.

⏬ 자세한 사용법 참조하기(링크) 👀 ⏬
서버 구현 - 프로필 수정 미리보기 기능 (23.07.24)

📌 files

input type="file"만 사용 가능한 속성으로 선택된 파일 목록(배열)을 반환

📌 FileReader()

웹 애플리케이션이 비동기적으로 데이터를 읽기 위하여 사용하는 객체

📌 FileReader.readAsDataURL(파일)

  • 지정된 파일의 내용을 읽기 시작함
  • 읽어오는 게 완료되면 result 속성 data:에 읽어온 파일의 위치를 나타내는 URL이 포함됨
    -> 해당 URL을 이용해서 브라우저에 이미지를 볼 수 있다.

📌 FileReader.onload = function(){}

  • FileReader가 파일을 다 읽어온 경우 함수를 수행함

📌 enctype

form 태그가 데이터를 서버로 제출할 때 데이터의 인코딩 형식을 지정하는 속성

⏬ 자세한 사용법 참조하기(링크) 👀 ⏬
서버 구현 - 프로필 업로드/삭제 기능 (23.07.25)

🔎 applicateion/x-www-form-urlencoded

  • 모든 문자를 서버로 제출하기 전에 인코딩 (모든 데이터가 문자)
    (form태그 기본값)

🔎 multipart/form-data

제출할 때 인코딩을 하지 않음

  • multipart/form-data로 설정 시 method는 무조건 POST
  • 모든 데이터가 원본 형태를 유지함 (파일을 파일 상태로 서버로 제출)
    -> 따라서 파라미터가 인지되지 않아, multipart/form-data 형식의 요청을 처리할 수 있는 전용 request 객체가 필요하다!

📌 MultipartRequest

파일 업로드 라이브러리
http://www.servlets.com/ (cos.jar 라이브러리 이용)

🔎 MultipartRequest.getFileNames()

요청 파라미터 중 모든 file 타입 태그의 name 속성 값을 얻어와 Enumeration 형태로 반환 (Iterator의 과거 버전)
-> 해당 객체에 여러 값이 담겨 있고 이를 순서대로 얻어오는 방법을 제공
(보통 순서가 없는 모음(Set과 같은 경우)에서 하나씩 꺼낼 때 사용)

📌 accept

input type="file" 에서 쓸 수 있는 속성

// 예시
<input type="file" name="profileImage" id="input-image" accept="image/*">

	accept="image/*" : 이미지 파일 확장자만 선택 허용
	accept="video/*" : 동영상 파일 확장자만 선택 허용
	accept=".pdf" : pdf 파일 확장자만 선택 허용

💡 Array.from(유사배열 | 컬렉션)

유사배열 | 컬렉션을 배열로 변환해서 반환

⏬ 자세한 사용법 참조하기(링크) 👀 ⏬
서버 구현 - 게시글 수정 기능 (23.07.27)

profile
풀스택 개발자 기록집 📁

0개의 댓글