Servlet 이란?
- 웹 서비스를 위한 자바 클래스( 자바를 이용하여 웹을 만들기 위해 필요한 기술)
- 웹 프로그래밍에서 클라이언트의 요청(Request)을 처리하고, 그 결과를 다시 클라이언트에게
응답(Response)하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그래밍 기술
Servlet 특징
- 클라이언트의 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
-> 클라이언트 요청에 대한 서버 응답 시 미리 만들어둔 화면(정적)이 아닌
요청을 받을때 마다 알맞은 화면을 만들어(동적)응답함.
- HTML을 사용하여 요청에 응답
- java thread를 이용하여 동작.(요청마다 별도 thread가 생성됨)
- servlet에 작성한 html 코드 변경 시 재컴파일 해야 하는 단점이 있음
- 서블릿 코드를 작성할 클래스는 반드시 javax.servlet.http.HttpServlet 클래스를 상속받아 메소드를 구현해야 함
Servlet Container
- 서버에 만들어진 서블릿이 스스로 작동하는 것이 아니라, 서블릿을 관리해주는 것이 필요한데,
이러한 역할을 하는 것이 바로 서블릿 컨테이너라고 한다.
- 배포를 위한 포트연결, 웹 서버 통신을 위한 소켓, 입/출력 스트림을 생성하는 역할을 함.
- 서블릿 : 어떤 역할을 수행하는 정의서
서블릿 컨테이너 : 정의된 서블릿을 보고 수행
- 클라이언트이 요청을 받을 때 마다 새로운 자바 스레드를 만들어 요청을 처리하고 응답을 해줌
Server Container의 역할
1. 웹 서버와의 통신 지원
-> 서블릿과 웹 서버가 손쉽게 통신할 수 있게 함
2. 서블릿 생명주기 관리
-> 서블릿 클래스를 로딩하여 인스턴스화 하고, 초기화 메소드를 호출하고, 요청이 들어오면
적절한 서블릿 메소드 호출. 서블릿이 생명을 다 한 순간에는 적절하게 가비지 컬렉션을 진행하여 편의 제공
3. 멀티쓰레드 지원 및 관리
-> 서블릿 컨테이너는 요청이 올 때마다 새로운 자바 스레드를 생성하는데
http 서비스 메소드를 실행하고 나면 스레드는 자동으로 사라짐
4. 선언적인 보안관리
-> 일반적으로 보안관리는 xml배포 서술자(DD(web.xml)) 에다가 기록하므로 보안에
관련된 내용을 서블릿 또는 자바 클래스에 구현하지 않아도 됨
메소드별 오버라이딩
- 웹 클라이언트의 요청 방식이 GET방식으로 요청해오면 doGet( ) 메소드로 응답,
웹 클라이언트의 요청 방식이 POST 방식으로 요청해오면 doPost( ) 메소드로 응답.
-> 반드시 doGet( ) 메소드와 doPost( ) 메소드는 Overriding을 해주어야 함.
Get 방식과 Post 방식의 비교/차이
1) Get 방식 : (데이터를) 가져오다, 얻어오다
- URL에 변수(데이터)를 포함시켜 요청
-> 보안 유지를 안하기 때문에 로그인 같은 경우는 get방식으로 하면 부적합
- 전송하는 길이 제한( 보내는 길이가 너무 길면 초과데이터는 절단됨 )
- 데이터를 HTTP Header에 포함하여 전송
- 캐싱 가능( ex) 즐겨찾기, 북마크)
-> 한번 접근 후, 또 요청할 시 빠르게 접근하기 위해 데이터를 저장시켜 놓는것
2) Post 방식 : (데이터를) 붙이다
- 데이터를 서버로 제출하여 추가 또는 수정하기 위해 데이터를 전송하는 방식
- URL에 변수를 노출하지 않고 요청 데이터를 HTTP Body에 포함하여 전송
- 헤더필드 중 Body의 데이터를 설명하는 Content-Type이라는 헤더필드가 들어가고
어떤 데이터 타입인지 명시해주어야 함
- HTTP Body를 통해서 데이터를 전달하는데 이때, 문자 인코딩은 서버의 기본 문자 인코딩을 따름
-> 문자 인코딩 처리 필요
- 전송하는 길이 제한 없음
-> Body에 데이터가 들어가기 때문에 길이에 제한이 없음
- 캐싱 할 수 없음
-> URL에 데이터가 노출되지 않으므로 즐겨찾기나 캐싱 불가능
하지만 쿼리스트링(문자열)데이터, 라디오 버튼, 텍스트 박스와 같은 객체들의 값도 전송 가능
Parameter
- 요청 시 전달된 input 태그의 값
- getParameter( )는 전달된 input 태그의 name이 하나일 때만 가능
- 같은 name이 여러개면 String[ ]로 반환하는 getParameterValues( )사용
form
- form태그 : 내부에 작성된 input태그의 값을 서버 또는 페이지로 제출(전달)하는 역할
* 이 때, 어떤 input태그에 작성된 값이 제출 된것인지 알 수 있도록 input태그에 name 속성을 반드시 작성!!
- action : input 태그 값을 전달할 서버 또는 페이지 주소를 작성하는 속성
- method : 데이터 전달 방식 지정하는 속성(get / post)
- http://localhost:8080/ServletProject1/
( http://아이피:포트번호) : 통신규약 서버 컴퓨터 위치 지정
( /ServletProject1/) : 요청하고자 하는 내용을 나타내는 주소
-> button을 누르면 example1.do라는 주소로 갈수있게 해준다.
-> button을 누르고 제출하면 이 요청주소로 이동하고 get방식이기 때문에 주소창에 내가 입력한 값이 나온다.(보안취약)
@WebServlet("요청주소") 어노테이션
- 해당 클래스를 Servlet 클래스로 등록(<servlet>)하고 어떤 요청 주소를 처리할지 지정(<servlet-mapping>)
- form태그와 마찬가지로 저 글을 클릭하면 EL/scope라는 요청 주소로 보냄
-> 어노테이션을 사용해서 요청주소를 Servlet 처리해준다.
Lombok 라이브러리
- VO(Value Object) 또는 DTO(Data Transfer Object)에 작성되는 공통코드(getter / setter / 생성자)를 자동 추가해주는 라이브러리
-> 직접 작성하지 않아도 어노테이션만 사용해주면 작성한 효과와 동일