본문 바로가기
학원수업/2월

02/17 56회차 수업 - RESTful API, JSP, Servlet정리

by 코딩마스터^^ 2023. 2. 17.

웹 서비스( Web service)는 웹을 통해 제공되는 소프트웨어 시스템입니다. 일반적으로 클라이언트-서버 아키텍처를 기반으로 하며, 다양한 클라이언트에서 액세스할 수 있도록 설계되어 있습니다. 웹 서비스는 네트워크를 통해 데이터를 주고받을 수 있으며, 일반적으로 XML 또는 JSON과 같은 표준 데이터 형식을 사용합니다.

RESTful API(Representational State Transfer API)

웹 서비스의 한 유형입니다. RESTful API는 웹 리소스에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행하는 API입니다. RESTful API는 HTTP 프로토콜을 사용하여 작동하며, URI(Uniform Resource Identifier)를 사용하여 리소스를 식별하고 HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 해당 리소스에 대한 작업을 수행합니다.

RESTful API는 단순하고 유연한 아키텍처로 구성되어 있으며, 클라이언트와 서버 간에 느슨한 결합을 제공합니다. 이는 클라이언트와 서버 간의 상호 작용을 단순화하고, 서버 측에 대한 변경 사항이 클라이언트 측에 영향을 미치지 않도록 보장합니다. 또한, RESTful API는 인터넷에서 널리 사용되는 표준 HTTP 프로토콜을 사용하기 때문에, 다양한 플랫폼과 언어에서 쉽게 구현될 수 있습니다.

 

JSP(JavaServer Pages)

동적 웹 페이지를 만드는 데 사용되는 서버 측 웹 프로그래밍 언어입니다. JSP는 Java 언어를 기반으로 하며, HTML 코드와 Java 코드를 혼합하여 사용할 수 있습니다.

웹 서비스와 RESTful API는 클라이언트-서버 아키텍처를 기반으로 하며, 데이터를 주고받는 데 사용됩니다. 반면에 JSP는 서버 측에서 동적 웹 페이지를 생성하는 데 사용됩니다. 따라서, JSP는 서버 측에서 웹 페이지를 렌더링하고, 해당 페이지를 클라이언트에 전송하는 데 사용되는 반면, 웹 서비스 및 RESTful API는 클라이언트가 데이터를 요청하고 서버가 해당 데이터를 반환하는 데 사용됩니다.

그러나 JSP를 사용하여 동적 웹 페이지를 생성하는 데 RESTful API를 호출하여 데이터를 검색하거나 제공할 수도 있습니다. 이러한 경우 JSP는 서버 측에서 웹 페이지를 생성하고, RESTful API는 클라이언트-서버 아키텍처를 기반으로 하는 데이터 교환을 처리합니다.

Servlet은

Java 언어를 기반으로 하는 서버 측 웹 프로그래밍 기술 중 하나입니다. Servlet은 클라이언트의 요청을 처리하고, 동적으로 웹 페이지를 생성하고 응답을 반환하는 데 사용됩니다. Servlet은 JSP와 마찬가지로 Java 웹 애플리케이션에서 사용됩니다.

JSP는 Servlet을 기반으로 하며, JSP 코드는 Servlet으로 컴파일됩니다. JSP는 HTML 코드와 Java 코드를 혼합하여 사용할 수 있으며, 이를 통해 동적 웹 페이지를 생성할 수 있습니다. Servlet은 JSP와 다르게 HTML 코드를 생성하는 것이 아니라, 서버 측에서 직접 응답 데이터를 생성하고 반환합니다.

 

서블릿은 클라이언트의 요청을 처리하고, HTTP 요청 및 응답 객체를 사용하여 요청 데이터를 가져오고, 응답 데이터를 생성하고, HTTP 응답을 보내는 데 사용됩니다.

 

서블릿은 일반적으로 다양한 기능을 수행하는 웹 응용 프로그램의 일부로 사용되며, 데이터베이스 액세스, 인증, 보안 등의 작업을 수행하는 데 사용됩니다.

 

따라서, Servlet과 JSP는 모두 Java 웹 애플리케이션에서 사용되며, Servlet은 HTTP 요청 및 응답을 처리하는 데 사용되고, JSP는 HTML 코드와 Java 코드를 혼합하여 동적으로 웹 페이지를 생성하는 데 사용됩니다.

 

요청을 받는것은 Servlet이고 응답은 JSP에서 나온다.

웹서비스의 흐름도

서블릿은 웹 애플리케이션에서 클라이언트의 요청을 처리하는 Java 클래스입니다. 서블릿은 다수의 클라이언트 요청을 처리할 수 있도록 설계되었기 때문에, 서블릿 인스턴스를 여러 개 생성하는 것이 아니라, 하나의 인스턴스를 사용하여 모든 클라이언트 요청을 처리합니다. 이것이 바로 서블릿의 싱글톤 패턴(Singleton Pattern)입니다.

싱글톤 패턴

객체를 단 하나만 생성하여 사용하는 디자인 패턴입니다. 이 패턴은 객체의 생성, 소멸, 메모리 사용 등에 대한 오버헤드를 줄이고, 객체를 공유하여 자원을 효율적으로 사용할 수 있게 합니다.

서블릿은 웹 애플리케이션의 생명주기(lifecycle) 동안 계속해서 유지되며, 클라이언트 요청마다 인스턴스를 생성하는 것은 비효율적입니다. 따라서, 서블릿은 웹 애플리케이션 컨테이너에 의해 단 하나의 인스턴스가 생성되고, 이 인스턴스는 모든 클라이언트 요청을 처리합니다. 이를 통해, 서블릿은 메모리 사용을 최적화하고, 성능을 향상시키는 등의 이점을 제공합니다.

즉, 서블릿의 싱글톤 패턴은 웹 애플리케이션의 메모리 사용을 최적화하고, 성능을 향상시키는 등의 이점을 제공합니다.

 

 

웹서비스 제공을 위한 언어

get방식

-서버측의 리소스(html,css,js...)를 가져오기 위해서...

 

웹서비스 요청을 어디에 하지?

-브라우저에

-URL로 한다

http/ https+TLS암호화

http(hyper text transfer protocol)-텍스트를 전송하는 프로토콜이다.

? 아니잖아....난 이미지도 보는데?

mime type덕분이다.

mime type 있기때문에 텍스트가 아닌 다른것도 볼 수 있다.

 

 

요청 방식에는 몇가지가 있지?

4가지

get

post

delete

?

 요청을 위해서는 무엇이 준비되어 있어야 하나요?

RESTful API

 

//단위 테스트가 불가하다-Postman을 사용하면 가능하다.
//POST 방식은 브라우저를 통해서 테스트 불가하다.

 

GET방식

-서버측의 리소그(html,css,js...)를 가져오기 위해서...

-쿼리스트링 전송(소용량)

-노출

-데이터 공유에 유리하다.

-검색에 사용

ex)쿠팡에 도메인?상품아이디=dfgs1234

상품을 검색할때 조건을 검색할때 사용가능

 

 

POST방식

서버에 데이터를 올리기 위해 설계됨

전송 데이터의 크기에 제한이 없음(대용량)

보안에 유리, 공유 불리

데이터의 메시지의 body에 담아 전송한다. 크게 제약이 없다.

글쓰기, 로그인, 회원가입

 

간단하게 프리뷰 보여준다.

 

서블릿 생명주기

  • init()
    • 디폴트 생성자를 이용해서 서블릿 객체를 생성함으로 init()메소드를 사용해서 서블릿 객체를 초기화한다.
    • 서블릿의 일생동안 단 한번 호출된다.
  • service()
    • HTTP 메소드를 참조하여 doGet()을 호출할지, doPost()를 호출할지 결정한다.
    • 요청이 있을때 마다 호출된다.
  • destroy()
    • 서블릿이 소멸될때 호출된다. 자원해제와 관련된 작업을 한다.
    • 서블릿의 일생동안 단 한번 호출된다.

 

서블릿은 세가지 생명주기를 갖는다.

처음 서블렛 웹서비스할때 init연다. 그후 요청할때 service만 연다. 그래서 두번째부터는 속도가 빨라진다.

 

<% %> 스크립틀릿

자바 코드 작성

메소드 안에 또다른 메소드 정의 할 수 없다.

선언된 변수는 지변이다.

초기화를 생략 할 수 없다.

 

<%! %>디클러레이션

선언문이다.

여기서 선언된것은 다 전역변수이다,

메소드 선언이 가능하다.

초기화 생략가능하다.

그런데 잊으세요. 얘 쓰면 망하는거야^^

왜요?

화면과 로직은 분리한다.

->MVC패턴

그래서 있지만 쓸 일이 없다.

 

<%=" "%> 출력문

<% out.print(" "); %>와 같다.

 

<%@ page import="java.util.Map" contentType="text/html;charset=UTF-8" %>

임포트문 넣을때 사용

 

WAS제품마다 java로 바꾸는 명령 규칙이 다르다.

따라서 인스턴스화가 불가능하다.

나는 톰캣을 사용중이다.

a.jsp  -> a_jsp.java

a_XXX.java

 

오른쪽 마우스-Source-override method  선택

package com.day1;

import java.io.IOException;

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 org.apache.log4j.Logger;
//GenericServlet(service()) <- HttpServlet(doGet, doPost)
//WebServlet 어노테이션이 있는 서블릿은 컨트롤 계층을 담당함
//서블릿은 구조상 뷰계층을 담당하지 않음(MVC패턴에서)
@WebServlet("/lifecycle") //spring @Controller[컨트롤계층]+@RequestMapping[URL패턴을 정의]
public class LifeCycleServlet extends HttpServlet {
	Logger logger=Logger.getLogger(LifeCycleServlet.class);
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		//입력, 처리, 출력을 담당함
		//사용자의 요청을 받는 메소드
		logger.info("service호출");
	}

	@Override
	public void destroy() {
		//서블릿이 메모리에서 제거될때 서블릿 컨테이너에 의해 자동 호출됨
		logger.info("destroy호출");
	}

	@Override
	public void init() throws ServletException {
		//서블릿이 초기화 될때 자동으로 호출되는 메소드
		//서블릿의 초기화 작업 담당
		//개발자가 호출하는 메소드 아님
		//서블릿을 초기화 해주는 init메소드
		logger.info("init호출");
	}

}

 

javax.servlet.http.HttpServlet 동작 구조

참고

 

 

 

  • GET
    • GET 방식은 서버에 있는 정보를 가져오기 위해 설계된 데이터 전달 방법입니다. ( 최대 240 Byte까지 )
    • QUERY_STRING 환경 변수를 통해서 서버로 전달되는데, 형식은 아래와 같습니다.
      http://www.xxx.co.kr/servlet/login?id=hj&name=hong
    • url을 보면 login 뒤에 ? 가 있습니다.
      • ? 이후의 값들은 서버에서 QUERY_STRING을 통해 전달됩니다.
    • 속성 = 값 형태로 사용해야 하며, &는 여러 속성 값을 전달할 때 구분해서 연결해주는 문자열입니다.
    • 이렇게, url에 데이터가 모두 노출되기 때문에 보안에 취약하다는 단점이 있습니다.
  • POST
    • POST 방식은 서버로 정보를 올리기 위해 설계된 방법입니다.
    • HTML 폼에 입력한 내용을 서버에 전달하기 위한 요청이며, 정보를 메시지 body에 포함시켜 전달합니다.
    • 서버에 전달할 수 있는 데이터 크기 제한이 없어서, 파일 업로드에 자주 사용됩니다.
    • GET 방식과 달리, ur에는 매개변수가 표시되지 않아 보안이 유지됩니다.
    • 호출이 안된다. 



HttpServletRequest, HttpServletResponse

 

  • WAS가 웹브라우져로부터 Servlet요청을 받으면 요청을 받을 때 전달 받은 정보를 HttpServletRequest객체를 생성하여 저장
    • 웹브라우져에게 응답을 돌려줄 HttpServletResponse객체를 생성(빈 객체)
    • 생성된 HttpServletRequest(정보가 저장된)와 HttpServletResponse(비어 있는)를 Servlet에게 전달

 

  • HttpServletRequest
    • Http프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용
    • Header정보, Parameter, Cookie, URI, URL 등의 정보를 읽어들이는 메소드를 가진 클래스
      Body의 Stream을 읽어들이는 메소드를 가지고 있음
  • HttpServletResponse
    • Servlet은 HttpServletResponse객체에 Content Type, 응답코드, 응답 메시지등을 담아서 전송함



ServletConfig VS ServletContext

 

  • ServletConfig : 한 서블릿에 제한적인 객체
    • ServletConfig 객체는 Container가 서블릿을 생성할 때 생성되는 객체다.
    • DD(web.xml)를 읽어서 이름/값의 쌍으로 된 초기화 파라미터를 읽어서 저장한다.
    • ServletConfig 객체는 Servlet 객체당 한 개씩 생성된다.
    • Servlet에서는 getServletConfig()를 이용해서 Servlet과 관련된 ServletConfig 객체를 얻을 수 있다.

 

  • ServletContext : 여러 서블릿에서 사용 가능
    • ServletContext 객체는 web application 당 하나씩 생성된다.
    • web application 전체에서 참조할 수 있는 초기화 파라미터를 저장할 수 있다.
    • Servlet에서는 getServletContext()를 이용해서 ServletContext 객체를 얻을 수 있다.

출처 : https://velog.io/@corone_hi/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0-Servlet-LifeCycle

 

서블릿 생명주기 (Servlet LifeCycle)

참고init() 디폴트 생성자를 이용해서 서블릿 객체를 생성함으로 init()메소드를 사용해서 서블릿 객체를 초기화한다.서블릿의 일생동안 단 한번 호출된다.service() HTTP 메소드를 참조하여 doGet()을

velog.io

 

싱글톤-하나

기능이 같으니까 하나만 만들어서 사용한다.

대신 순서가 필요하다. 스레드가 필요하다. 톰캣이 대신 해준다.

 

HttpSession객체가 있어야 세션 사용 가능하다.

세션은 서버에 캐쉬메모리 안에 저장된다. 아주 비쌈.

 

동시 접속자 수가 많을때 비상태 프로토콜을 이용한다.

게임에 모든 유저가 다 같이 계속 들어와있으면 큰일남.

그래서 비상태이다.

 

웹 애플리케이션에서 세션(Session)은 클라이언트와 서버 간의 지속적인 상태 유지를 가능케 하는 기술입니다. 세션은 클라이언트가 서버에 접속한 후, 서버에 대한 요청을 하고 응답을 받는 동안에만 유지됩니다. 이 때, 세션은 다양한 스코프(scope)를 가지고 있습니다.

 

세션의 스코프(scope)

  1. Application Scope: 웹 애플리케이션 전체에서 유효한 범위를 가지는 스코프입니다. 이 스코프에 저장된 데이터는 웹 애플리케이션이 실행되는 동안 계속해서 유지됩니다. 이 스코프에 저장된 데이터는 ServletContext 객체를 사용하여 접근할 수 있습니다.  ---쓰지마!!!
  2. Session Scope: 세션 범위를 가지는 스코프입니다. 이 스코프에 저장된 데이터는 세션이 유지되는 동안에만 유지됩니다. 이 스코프에 저장된 데이터는 HttpSession 객체를 사용하여 접근할 수 있습니다.
  3. Request Scope: 요청 범위를 가지는 스코프입니다. 이 스코프에 저장된 데이터는 해당 요청 처리가 완료되면 사라집니다. 이 스코프에 저장된 데이터는 HttpServletRequest 객체를 사용하여 접근할 수 있습니다.
  4. Page Scope: JSP 페이지 범위를 가지는 스코프입니다. 이 스코프에 저장된 데이터는 해당 JSP 페이지가 렌더링되는 동안에만 유지됩니다. 이 스코프에 저장된 데이터는 JSP 내에서만 사용할 수 있으며, pageContext 객체를 사용하여 접근할 수 있습니다.

이러한 스코프들은 객체의 생명 주기와 연관이 있습니다. 스코프의 범위가 넓을수록 객체의 생명 주기가 길어지며, 스코프의 범위가 좁을수록 객체의 생명 주기가 짧아집니다. 스코프의 선택은 애플리케이션의 성능, 데이터 무결성, 보안 등을 고려하여 결정해야 합니다.

 

 

오후 수업 html과 java를 섞어쓰기

 

//MyBatis는 자바와 오라클 서버 사이에 위치하면서 DB연계를 지원하는 매핑서비스이다.
//물리적으로 떨어져있는 서버와의 통신을 위해 드라이버 클래스 로딩 / 연결 통로 확보 코드가 반복적으로 작성됨
//이것을 전담하는 SqlSessionFactory를 지원하고 있다 - MyBatis
//SqlSessionFactoryBean - Spring 적용시
public SqlSessionFactory sqlSessionFactory = null;
//SqlSessionFactory객체를 생성해 주는 메소드 입니다.

 

로그인 테스트 흐름도

1. intro아래 index.jsp실행

2.아이디와 비번을 입력 받는다.

3.로그인 버튼 누른다 ->자바스크립트의 login()호출

4.login.do호출한다->로그인 처리를 하는 서블릿 호출-doGet(),doPost()

5.com.mvc.dao.MemberDao클래스의 인스턴스화

5.메소드 호출-로그인 처리

7.MemberDao의 login(Map[mem_id(사용자가 입력한 아이디)와 mem_pw(사용자가 입력한 비번)있다.]) 호출

8.리턴타입으로 Map을 받아온다(mem_id,mem_name)

9.8번에서 돌려받은 Map에서 오라클 서버에서 조회된 아이디와 이름을 세션에 담기

10.페이지 이동은 sendRedirect나 forward둘다 모두 가능하다.

단, forward로 응답을 처리한 경우 인증 후에 다른 서비스를 forward로 처리하는것이 불가함-주의

 

 

Redirect와 Forward

requestDispature는 화면이 바뀌고 주소도 바뀐다.

주소가 안바뀌면 세션이 유지된다.

세션이랑 주소바뀌는것은 상관이 없다.

sendRedirect는 주소가 바뀌고 forward는 주소가 안바뀌고 페이지 이동이 일어난다.

세션은 둘다 된다. 주소바뀌는거랑 상관없기 때문이다.

 

https://doublesprogramming.tistory.com/63

 

Redirect VS, Forward (Redirect와 forward의 차이)

Redirect VS, Forward (Redirect와 forward의 차이) JSP환경에서 현재 작업중인 페이지에서 다른페이지로 이동하는 두가지 방식의 페이지 전환기능 사례를 통해 redirect와 forward의 차이점에 대해 감을 잡아보

doublesprogramming.tistory.com

 

forward는 a.jsp->b.jsp로 포워딩을 할때 a에 

package com.mvc.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.log4j.Logger;

import com.util.MyBatisCommonFactory;

public class MemberDao {
	//log4j모듈 활용해서 로그 출력 - 날짜와 시간, 클래스명, 라인번호, 링크
	//System.out.print()대신에 사용함
	Logger log = Logger.getLogger(TestDao.class);
	//DAO클래스와 오라클 서버 사이에 MyBatis Layer에 필요한 설정 내용 담기
	//member.xml의 물리적인 위치와 오라클 서버의 정보가 담긴 MyBatisConfig.xml의 정보를
	//IO로 읽어오는 코드가 포함됨
	//마이바티스는 쿼리문을 xml문서에 따로 관리한다. -자바로 관리하는 것보다 컴파일을 하지 않아도 되고 버전 관리에도 효과적임
	MyBatisCommonFactory mcf = new MyBatisCommonFactory();

	public Map<String, Object> login(Map<String, Object> pmap) {
		Map<String, Object> map = null;
		//MyBatisConfig.xml문서를 통해 스캔한 오라클 서버 정보로 연결통로 확보
		SqlSessionFactory ssf = null;
		//위에서 SqlSessionFactory생성되면 쿼리문을 요청하는 selectOne메소드가 필요한데
		//그 메소드를 제공하는 클래스 및 commit, rollback지원
		SqlSession ss = null;
		try {
			//공통코드에서 연결통로 확보
			ssf = mcf.getSqlSessionFactory();
			//연결 통로 확보로 생성된 객체로 SqlSession 메모리에 로딩
			ss = ssf.openSession();
//			pmap = new HashMap<>();
//			pmap.put("mem_id", "lemon");
//			pmap.put("mem_pw", "1234");
			map = ss.selectOne("login", pmap);//메소드이름이랑 똑같이 줌
			log.info(map);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}
	
	public static void main(String[] args) {
		MemberDao md = new MemberDao();
		Map<String, Object> map = new HashMap<>();
		map.put("mem_id", "lemon");
		map.put("mem_pw", "12346");
		Map<String, Object> emap = md.login(map);
		System.out.println(emap);
	}
}

 

package com.mvc.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.log4j.Logger;

import com.util.MyBatisCommonFactory;

public class MemberDao {
	//log4j모듈 활용해서 로그 출력 - 날짜와 시간, 클래스명, 라인번호, 링크
	//System.out.print()대신에 사용함
	Logger log = Logger.getLogger(TestDao.class);
	//DAO클래스와 오라클 서버 사이에 MyBatis Layer에 필요한 설정 내용 담기
	//member.xml의 물리적인 위치와 오라클 서버의 정보가 담긴 MyBatisConfig.xml의 정보를
	//IO로 읽어오는 코드가 포함됨
	
	//마이바티스는 쿼리문을 xml문서에 따로 관리한다. -자바로 관리하는 것보다 컴파일을 하지 않아도 되고 버전 관리에도 효과적임
	MyBatisCommonFactory mcf = new MyBatisCommonFactory();

	public Map<String, Object> login(Map<String, Object> pmap) {
		Map<String, Object> map = null;
		//MyBatisConfig.xml문서를 통해 스캔한 오라클 서버 정보로 연결통로 확보
		SqlSessionFactory ssf = null;
		//위에서 SqlSessionFactory생성되면 쿼리문을 요청하는 selectOne메소드가 필요한데
		//그 메소드를 제공하는 클래스 및 commit, rollback지원
		SqlSession ss = null;
		try {
			//공통코드에서 연결통로 확보
			ssf = mcf.getSqlSessionFactory();
			//연결 통로 확보로 생성된 객체로 SqlSession 메모리에 로딩
			ss = ssf.openSession();
//			pmap = new HashMap<>();
//			pmap.put("mem_id", "lemon");
//			pmap.put("mem_pw", "1234");
			map = ss.selectOne("login", pmap);//메소드이름이랑 똑같이 줌
			log.info(map);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}
	
	public static void main(String[] args) {
		MemberDao md = new MemberDao();
		Map<String, Object> map = new HashMap<>();
		map.put("mem_id", "lemon");
		map.put("mem_pw", "12346");
		Map<String, Object> emap = md.login(map);
		System.out.println(emap);
	}
}

'학원수업 > 2월' 카테고리의 다른 글

02/21 58회차  (1) 2023.02.21
02/20 57회차 웹서버 개발-  (0) 2023.02.20
02/16 54회차 수업 JSP  (0) 2023.02.17
02/16 54회차 수업 JSP  (0) 2023.02.16
02/15 53회차 수업 JSP Servlet  (0) 2023.02.15

댓글