인터페이스 구현 2일차 (서버의 흐름, 구조)

2023. 1. 4. 10:53카테고리 없음

JSON (Javascript Objact Notation)

 

  • Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷
  • 웹 어플리케이션에서 데이터를 전송할 때 일반적으로 사용됨

  • JSON은 문자열 형태로 존재 (문자열 형태로 존재하기 때문에 네트워크 통신에 유용)
  • .json 확장자를 가진 단순 텍스트 파일에 저장 가능
  • MIME 타입은 application/json

JSON 구조

 

  • string, number, array, boolean, object 데이터 타입을 가질 수 있음
  • 다양한 형태의데이터 계층 구축이 가능
{
  "name": "jingu",
  "age": 35,
  "skill": [ 
    "java",
    "typescript",
    "rust"
  ],
  "career": true,
  "rectal": {
    "name": "koreaitacademy",
    "address": "busan"
  }
}

 

JSON 통신 예시

 

Request

const body = {
  name: "jihoon",
  age: 24
}

 

json 으로 변환

{
  "name": "jihoon",
  "age": 24
}

server로 전송

 

class User {
  String name;
  int age;

  public User(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

 

Response

class User {
  String name;
  int age;

  public User(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

json 으로 변환

{
  "name": "jihoon",
  "age": 24
}

 

client 로 전송

const body = {
  name: "jihoon",
  age: 24
}

 

Server 

  • Client에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 프로그램 또는 장치

서버는 4개

 

서버의 흐름
SSR = 옛날 스타일 CSR = 요새스타일  그래 따로사는게 트렌드

Web Server : Live Server, Node, Recat, Vue,. Angular, Html .등등등

  • 웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹페이지를 반환하는 컴퓨터 프로그램
  • HTTP 혹은 HTTPS(http의 secure port:430)를 통해 웹 브라우저에서 요청하는 HTML(고정되어있다) 문서나 오브젝트(미디어 파일 등)를 전송하는 서비스 프로그램
  • 정적 서버 콘텐츠를 수행 // 고정되어 있는 반환물을 내놓는다.

기능

  • HTTP
  • 통신 기록
  • 인증
  • 정적 콘텐츠 관리
  • HTTPS 지원

 

WAS: Spring, Nest, Java servlet, Express, Tomcat

  • 웹 어플리케이션과 서버 환경을 만들어 동작시키는 기능을 제공하는 소프트웨어 프레임워크
  • 인터넷 상에서 HTTP을 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행 해 줌
  • 동적 서버 콘텐츠를 수행 // 입력값에 다른 결과물을 내놓는 것.
  • 대부분 자바 기반이지만 비 자바 계열도 존재

기능

  • 프로그램 실행 환경과 데이터베이스 접속 기능
  • 트랜잭션 관리 (작업의 한단위 : 트랜잭션)
  • 비즈니스 로직 수행 (작업을 한 모든 작업을 비즈니스 로직)

 

Database Server : mySql, Oracle, maria, postgroSql, Mongo, MS SQL ....

  • 다수의 사용자가 공유하여 사용할 목적으로 체계화하여 통합, 관리하는 데이터들의 집합소

특징

  • 실시간 접근성
  • 지속적인 변화
  • 동시 공유
  • 내용에 대한 참조
  • 데이터 논리적 독립

Proxy Server

 

  • 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램
  • Proxy : 서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것

목적

  • 익명으로 컴퓨터 유지 (보안상의 이유)
  • 캐시를 사용하여 리소스로의 접근을 빠르게 하기 위함 (캐시 저장소 역할)
  • 네트워크 서비스나 콘텐츠로의 접근 정책을 적용하기 위함 (블랙리스트, 화이트리스트)
  • 사용률을 기록하고 검사하기 위함 (접근 로그)
  • 아웃바운드 콘텐츠를 검사하기 위함 (데이터 유출 보호)

 

Java Servlet Container (Engine)

 

Java Servlet

  • 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양
  • 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종
  • JSP와 비슷한 점이 있지만, JSP가 HTML 문서 안에 Java 코드를 포함하고 있는 반면, Servlet은 자바 코드 안에 HTML을 포함하고 있음
package controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import service.MainService;

@WebServlet(urlPatterns = {"/home", "/home/*"})
public class MainController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	private MainService service;
	
    public MainController() {
        service = new MainService();
    }
	
	protected void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// request, response character set 설정
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		
		// url path를 request에서 불러오기
		String path = request.getPathInfo();
		String url  = null;
		
		// requset에서 Session 객체 받아옴
		HttpSession session = request.getSession();
		// response에서 Writer 객체 받아옴
		PrintWriter script  = response.getWriter();
		
		// url이 localhost:port/project/home 일 때 
		if(path == null) {
			url = "/main/main.jsp";
		}
		
		// url이 localhost:port/project/home/ 일 때 
		else if(path.equals("/")) {
			response.sendRedirect("../home");
			return;
		}
		
		// url이 localhost:port/project/home/login 일 때 
		else if (path.equals("/login")) {
			url = "/main/login.jsp";
		}
		
		// url이 localhost:port/project/home/join 일 때 
		else if (path.equals("/join")) {
			url = "/main/join.jsp";
		}
		
		// url이 localhost:port/project/home/joinAction 일 때
		else if (path.equals("/joinAction")) {
			int rs = service.joinAction(request);
			
			if(rs == 0) {
				response.sendRedirect("./login");
				return;
			}
			else if(rs == 1) {
				script.println("<script>");
				script.println("alert('모두 입력하세요.');");
				script.println("history.back();");
				script.println("</script>");
				return;
			}
			else if(rs == 2) {
				script.println("<script>");
				script.println("alert('비밀번호가 서로 다릅니다.');");
				script.println("history.back();");
				script.println("</script>");
				return;
			}
			else {
				script.println("<script>");
				script.println("alert('회원가입에 실패했습니다.');");
				script.println("history.back();");
				script.println("</script>");
				return;
			}
		}
		
		// url이 localhost:port/project/home/loginAction 일 때
		else if(path.equals("/loginAction")) {
			int rs = service.login(request);
			
			if(rs == 0) {
				session.setAttribute("user_id", request.getParameter("user_id"));
				response.sendRedirect("../home");
				return;
			}
			else if(rs == 1) {
				script.println("<script>");
				script.println("alert('로그인 정보가 일치하지 않습니다.');");
				script.println("history.back();");
				script.println("</script>");
				return;
			}
			else if(rs == 2) {
				script.println("<script>");
				script.println("alert('모두 입력해주세요.');");
				script.println("history.back();");
				script.println("</script>");
				return;		
			}
			else if(rs == -1) {
				script.println("<script>");
				script.println("alert('데이터베이스 오류입니다.');");
				script.println("history.back();");
				script.println("</script>");
				return;
			}
		}
		
		// url이 localhost:port/project/home/logout 일 때
		else if(path.equals("/logout")) {
			session.invalidate();
			response.sendRedirect("../home");
			return;
		}
		
		// url이 localhost:port/project/home/idCheck 일 때
		else if(path.equals("/idCheck")) {
			
			int rs = service.idCheck(request);
			response.getWriter().write(rs);
			
			return;
		}
		
		RequestDispatcher rd = request.getRequestDispatcher(url);
		rd.forward(request, response);
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}

}

Servlet Container

  • Servlet 생명 주기를 관리하고 Request에 따른 Thread 생성
  • HTTP Request 에 해당하는 Servlet을 실행시키고 결과를 Client에 Response 하는 기능을 가진 컴포넌트

 

선상님 曰 : 시간 없다.

 

Spring Framework, Apach Tomcat  바로 고고 이것저것 해봐야 신세계를 느끼는데 고마운줄 모르고.

 

Gateway 는 : 프로토스 질럿 뽑는데 그거

 

프록시 서버에서

inbound 와 outbound 를 지정하는 것

 

 

클라이언트가 데이터를 직접 조작할수 없게 해야 한다.

 

화이트리스트

화이트 리스트

 

M odel : Entity = class 엔터티를 가지고 하는 모든 행위를 모델이라고 한다.

V iew : 우린 눈에 보이는 거 : Front

C ontroller : 뷰와 모듈의 접점 // 프록시 서버가 하는 역할 //url:8080/api/*

 

엔터티(Entity)는 어트리뷰트(Attribute)의 집합 

Entity = class

 

 

Controller : 접근 제어

문제에 해당하는것 Service : 연산 작업 (반복문 돌리기. 단순 더하기 빼기 아니다)

Repository : 데이터베이스에서 값을 받아서