[Backend] JDBC
Web Back-End : Servlet/JSP 연동
서버단에서 실행하는 가장 대표적인 디비를 http프로토콜로 이용하는건 불가능하죠 자바와 디비 프로토콜 연결하는 JDBC 사용
클라이언트가 서버에 요청.(Request) . 그리고 당연히 요청시 데이터를 가지고 요청하는데 이 떄 데이터를 파라미터라 한다.
그럼 서버에선해당 사이트는 내 접속을 처리할 수 있는 서버가 필요한데 이걸 Web Server 라 한다(다른 말로 http서버라 한다)
html이나 css,js만 인식 가능.
얘들만 가지고 할 수 없는 일 들
RDBMS는 디비 서버라 치면 얘들을 연결시켜야 하는데 중간에 뭔가가 필요하다 그걸 APplication Server 라 하고 우리는 자바 사용
얘가 하는일은 Logic 처리고 일괄적인 비즈니스 로직( 데이터베이스 로직이 됨.) presetnation 은 화면에 보이는 역할.
톰캣은 웹서버 역할보다 어플리케이션 서버 역할을 한다. WAS는 이 2개를 합쳐둔 거(Web Server+ Application Server)
톰캣은 이 두가지를 같이 처리할 수 있다.
어플리케이션 서버에서 자바 사용한다 했는데 우리가 해왔던 자바가 아니라 웹에서 수행할 수 있는 자바를 써야한다.
우리가 쓴건 java se(standard edition)
웹이 들어간 건 serverside 프로그램이 되고 그걸 enterprise라고 한다
-> javaEE(Enterprise Edition) 그리고 javaEE에서 서블릿을 사용한다. 서블릿은 웹에서 돌아가는 자바라 보면 된다.
그리고 서블릿으로만 처리하기 방대한데 이걸 해결하기 위해 JSP가 나왔고 사용한다.(서블릿과 문법 비슷)
마지막으로 RDBMS와 연결해주는걸 JDBC라 보면 된다.
사이트 만들면 실제 사이트는 이클립스에서 실행하지 않으거 내가 만든 서버는 이러이러한거고 이러하다는 걸 설정하는데 그 많은 파일들 중 구분할 수 있게 하는 게 web.xml를 사용.
근데 3.0 이상부터는 Annotation사용 (ex. @Override) 아무튼 저부분을 꼭 체크해주자.
서블릿 임플리먼트 하면 5개의 메서드 호출(이건 우리가 하느넥 아닌 톰캣에서 자동으로 하는 거) destroy는 서버에서 제거될 떄 자원 끊을 때 (톰캣 종료시 생성했던 내용들 제거)
2.는 아직 잘 모르겠다. 3은 서블릿의 정보같은데. 아직 정확한 용도는 잘 모르겠다.
4.init은 destroy와 반대
5.마지막 서비스라는 메서드가 아주 중요
클라이언트가 요청한걸 request, 응답을 response한걸 여기서 service가 다 해준다.
이걸 안 만들면 서비스에 요청처리를 할 수 없다. 위의 4개는 반드시 만들 필요는 없는데, service 메서드는 반드시 만들고 필요하다.
근데 불편해서 GenericServlet 상속받자. 그리고 서비스라는 메서드 오버라이드
흔히 form쓰는데 어떠한 데이터를 서버에 전송하는데 방식이 2가지 있다. get, post
get은 url로 주소뒤에 ?해서 넘어감. 길이제한과 노출 위험성 post는 바디에 포함되서 길이제한과 노출 위험성이 줄어듬.
get, post때의 처리방식이 조금씩 다르다. http전용환경이다
얘들은 정해져 있어서 제네릭서블릿 쓰기보다
Httpservlet사용 근데 얘도 추상클래스네.
추상메서드가 없는 추상클래스는 그 메서드 중들 하나만 골라서 구현해도 된다.(하나 이상만 오버라이드)
urlmapping은 아까 만든 클래스 이름과 동일. page 이동은 get,post있는데 일단 get만
저 상위클래스의 메서드 사용하면 출력 가능하다고 적혀있다.
아까 url 부분을 ssafy로 바꿨는데 저기가 root context. 싸피는 뒤에보니까 HelloSsafy인데 이건 타입 이름.
그리고 그 뒤는 매핑한 걸 찾아가는
get이냐 post에 따라 doGet 이 부분 결정
화면에 저런 내용들 보여주라고 요청. 서블릿 역할 = 1. 데이터 보내주는 거 얻어내세요. 2. 그 데이터 보낸거로 일처리 해주세요.(로직처리) 3. 응답 페이지 만들어내기(html)
url 패턴이 hello ssfay.do라는 걸 찾는다.
서블릿에는 파라미터 구분하는 게 존재.
실행하면 주소창에 이렇게 나오는데 http://localhost:8080/backend/singleparam.do?userid=cyh1219&username=%EC%A1%B0%EC%96%91%ED%9B%88&area=0 url 인코더를 브라우저가 알아서 해줬따.
- data get
- Logic
- 응답page
get, post 방식 바꿔서 실행해보자.
post일때 깨지는데 get, post에서의 한글처리 방식을 꼭 기억하자.
하나의 파라미터 넘어오면 getParameter, 여러개 넘어오면 getParameterValues 쓴다고 기억해두자.(checkbox이런거 제외하면 다 getParameter)
JSP
web에서 이 3개는 안 쓸 수가 없다.
하나 바뀐게 1.서블릿 자바파일로 변환
jsp는 서블릿 변환이 있으니까 jsp 보다 느림. 근데 최초에 한번 할때만 저 작업이 일어나고 그 뒤는 jsp 처럼 서블릿 메서드만 호출된다.
스크립트기반과 컴파일기반 언어(자바) 이런거의 차이는? 코딩시에는 스크립트 언어 따르지만 실행시엔 컴파일 언어 따름. 그러면 두개의 장점만 가져와서 따른다.
post는 jsp는 제일 처음 한번만 서블릿 변환. get,post와는 변환되는 거와 연관성이 없다.
메서드 영역 선언부
중요한 건 !로 선언한다는거
응답페이지 만드는 건 태그 밖에 html태그로 쓰면 됨
Data get, Logic, response 객체같은 걸 쓸 수 있다.
jsp는 자바로 변환 이 안에있는 코드가 서블리승로 변환시 포함 시키지 마라.
자바의 주석과 html 주석과 이런거 차이 보자.
pagecontext나 application도 간혹 사용. 기본객체들 중에는 어떤 객체 담을 수 있는 바구니의 개념. pagecontext는 자바 어떤 객체 담아내거나 forward include할 때 사용
ServletConfig는 설정정보 얻어올 떄 사용
서블릿 쓰다 테이블 sql 다 작성했는데 에러 났다 살펴보니까.
와 같은 에러였는데 guestBookWrite.java로 가서 jdbc와 연결하는 곳의 id,pw를 보니까 root, 내비밀번호가 아니여서 연결이 안되었던거 바꿔주자
성공 확인 ㅇㅇ
init 메서드로 드라이버 로딩
한번에 바꾸는 건 블럭처리하고 refactor에 rename 사용
프로젝트 안에서 저 참조하던걸 다 바꿈. war로 export함 그럼 was가 알아서 해주는 거들이 있대.(다른html,js, jsp등등 ) 있어서
jsp 연결하면 에러나는데 mysqlconnector가 없어서 그건 그 프로젝트 안에서(서블릿)만 돌고 다른 jsp 쓰는 파일은 안된다. 그래서 이걸 어떻게 해결하나?
이걸 was의 라이브러리에 가져다두자 jar에 가져다 둬도 된다. 근데 모든 플젝이 디비 쓰는게 아니니까 일단 was
여기다 가져다 두면 된다.
그럼 아까 jsp에서 글쓰기 안됐는데 확인해보자.
앞으로 하는 모든 플젝은 디비 사용 jar에 가져다 둬도 되ㅗㄱ was에(톰캣) 가져다 둬도 되는데 maven쓰면 나중엔 동적으로 다운받음.
같은 서블릿을 그대로 옮긴 jsp안에 서블릿(java)파일을 그대로 옮겼다.
!(한참 찾았는데.)
그리고 서블릿 내용 그대로 jsp 적용 가능
이 아래에서 조금 바뀜
sendRedirect(location)하면 기존 있던 ㅂ정보 버리고 새로고침해서 이동시켜준다고 보면 된다. location은 url 사용 데이터 전달할 떄는 쿼리스트링으로 전달한다. 그리고 어디든 이동가능.
이렇게 아까 만든 jsp 대신 네이버로 넣어도 이동이 된다.
포워드는 어디서 많이 썼나? mail에서 (포워딩) 공유기
포워드는 전달로 기존 내용들이 그대로 전달된다고 생각하면 된다. requeset가 가진 메서드 중요한건 path는 location은 url이라 https 지원하는 모든 곳 이동 가능 path는 프로젝트 안에 있는 파일로만 이동 가능.(기억!) 그리고 request,response 전달.
데이터 유지는 sendRedirect는 쿼리스트링 쓰던가(?) 적힌 대로 사용한다.
저 파란색 친 부분이 빠져있다.
sendRedirect은 url이기 떄문에 풀 url이 나와야 한다.
근데 막 프로젝트나 이런거 바뀔때마다 귀찮다.
아까 루트 컨텍스트 얻어와서 설정,
실제 톰캣 접근할 떄 guestbookjsp써야 거기에 코딩한 부분 접근할 수 있다.
getcontextmethod 하면 동적으로 받아와서 수정 안해도 됨. 그리고 sendRedirect는 풀 url을 사용한다! 중요
포워드는 아까 저기가 url이 아니라 path였따 path에는 contextpath가 들어가나?
포워드는 외부로 못나간다. 프로젝트 안으로 들어간다. 포워드 할떄 안으로 들어가면 오히려 guestbookjsp밑에guestbookjsp이 또 들어가서 쓰면 안됨
포워드떄는 저걸 쓰면 안됨(쓸 필요가 없는게 아님 쓰면 안됨!)
join.jsp가 5군데 있다 생각하자. 만약 join.jsp를 register.jsp같이 이름 바꾸면 5군데 다 바꿔야 한군데라도 안 바꾸면 에러남.
앞으로 링크 클릭하면 페이지 이동시 jsp 다이렉트 이동은 안 만들 것. 항상 모든 이동은 서블릿으로 통해 이동할 거(이게 가장 기본)
main이라는 서블릿을 만들고
뭐하면 이런 식으로 처리 메서드 한개 만들어서 get이든 post든 전부 하나의 메서드로 처리하게 해도 된다.
get일떄는 리퀘스트 그냥 전달 post는 리퀘스트 세팅하고 전달.
res가서 gusetbook과 연결하기 위해 sql 가서 사용하자.
서블릿 쓰다보니 불편한 점이 있어서 asp처럼 쉽게 백엔드 구성하기 위해 자바에서도 문법 비슷하게 사용
서블릿
- 웹 컨테이너에서 실행되며, 동적인 컨텐츠를 생성하기 위한 자바클래스.
서블릿 프로그램
- 장점
- 플랫폼 독립성
- 서버 독립성
- 확장성
- 개발 용이.
직접 임포트 안하고 자동 임포트 되긴 하는데 일단 기억은 해두자.
클라이언트로 부터 요청 왔을 때 달라는 걸 줘야되는 데 그때 응답
맨 위 하얀 줄이 요청줄 Get방식으로 서블릿 달라고 요청. 그 밑으로 body가 들어감.
파라미터가 어디에 담겨서 가냐.
클라이언트가 요청 보내면 리퀘스트와 리스폰스 객체 만듬.(타입은 HttpRequest, HttpResponse), 톰캣이 일단 요청 받음
저 두개를 컨테이너(톰캣)이 만든다.(리퀘스트 톰캣이 받음), 리스폰은 아직 값이 없어서 아무것도 없다. 필요한 정보는 리퀘스트에 넣어놈.
스레드한테 전달(스레드도 톰캣이 new 해서 만듬) 스레드 하나 만들고 나서 스레드 한 녀석 만들고 얘한테 리퀘스트와 리스폰을 전달. 스레드는 클라이언트 수만큼 만듬(클라이언트가 500개면 스레드도 500개)
스레드가 서비스 메서드. doget사용해서 실행해서 답 만들고 만든 답을 리스폰에 담고 프린트해서 담은 답을 컨테이너가 담고 마지막 답을 클라이언트에 전달하고 그동안 쓰던 건 없애준다. 그리고 서비스 함수 실행해서 답을 막 만들어냄(response에 답을 담음)
톰캣 담은거 요청보내고
리스폰,리퀘스트 담은 스레드 없애고 클라이언트한테 보냄
jsp 페이지 처리과정
jsp와 똑같은 일 하는 서블릿(반대도 가능 서블릿이 하는 거 jsp에 넣어서 하기도 가능하지만 일반적으로 mvc로 나눠서 실행한다.)
우리가 만든 jsp를 톰캣이 서블릿으로 변환시켜 주는데 변환시 규치깅 있다.
규칙에 따라서 자바를(서블릿을) 만들어 주는 거기 때문에 jsp에서 코딩한 건 10줄인데 10줄코딩한 jsp를 자바로(톰캣으로) 바꿔준다해서 열어보자
jsp 도 언어기 떄문에 문법이 존재한다.
하나는 html태그(1번)이라 신경 별로 안써도 되지만 jsp에서 새로 나오는 건 element(원소)가 나온다.
그리고 그 elements는 또 3가지로 나눠진다.
저기 식 언어는 뒤에 물어본다.
html,css, js 파일은 세 군데 중 어디에 와야 하나?
static 한 것들은 다 Ws에 줌.
현재 http 1.1버전 쓰고 포트번호 8080
이 부분은 우리 맘대로 수정하면 된다.
컨테이너와 컴포넌트 개념을 알아야 한다.
지시어는 < % 로 시작하고 끝남
@이 뒤에 지시어가 온다 그리고 저 3개중 하나가 올 수 있다.
지시어 속성에 지시할 내용을 주면 된다. 맘대로 주면 안되고 지시할 내용이 정해져 있다.
설명 달아둘때는 info라는 속성 사용.
import 라는 속성 제외하고는 속성이 또 나오면 에러남(임포트는 여러개가 나와도 된다.)
throwable 타입 밑에 error, exception
하나의 파일 안에 다른 파일 포함시키는게 한가지 더 있음. include 지시어로 포함시키는 건 복붙.
a.jsp안에 in.jsp가 포함되어있는데 in.jsp 내용이 수정되었다. 그럼 어떻게 하나? in.jsp 내용 가져다 하는게 a.jsp 근데 in.jsp 내용이 수정되었으면 a.jsp 내용도 바뀌어야 한다.
지시어로 다른파일 포함하고 가져다 넣고 하는 건 들어오는 애. 포함 되는 애가 자주 안 바뀌는 경우. 한번 복사해서 붙여넣기 하면 바뀔 경향이 없을 때 지시어로 넣음.
아니면 매번 복붙을 해야한다. in.jsp 같은 애들이 자주 안 바뀌는 경우에(들어가는 애)
변수이름이나 메서드 출력한 후 값 출력
마지막 스크립트 렛
<%%> 안에는 마음대로 넣어도 된다.
이름에서 알다싶이 scriptlet이라는 부분은 전체에서 최소한으로 줄여야 한다.
let이라 붙으면 의미가 좀 작은 걸 의미.(피글렛 우글렛 등등)
스크립테 렛도 스크립트는 스크립트인데 좀 작다.
변환 시킬때 이 자바 사이즈가 커지는 데 지금 3가지 봤다.
생긴거 + 어떻게 쓰이는 지 이 부분들을 잘 알아두자.
이걸 섞어서 이런 jsp 기능을 만들어 주세요 했을 떄 구현 할 수 있어야 한다.
서블릿에 .do는 만드는 사람 마음.
헬로 서블릿은 주소창에 표기되는 거.
get방식. post는 주소창에서 바로 입력 못함.
//@WebServlet("/HelloServlet")
//@WebServlet(value = {"/hello","/sub/hello","hello2"}) // 슬래시 다음 hello,sub/hello, hello2 가 오든 뭐가오든 전부 얘가 처리한다는 의미
@WebServlet(value = {"/board","/board/","hello2"})
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//
// public HelloServlet() {
// super();
// // TODO Auto-generated constructor stub
// }
Restapi
get으로 board 요청하고 post로 보드요청
일단 url 매핑은 절대 헷갈리지 말자 주소에 클라이언트가 어떤 주소를 치고 들어오느냐에 따라 그 주소에 맞는 적절한 서버 자원을 매칭시키는게 url 매핑이고 이게 아주 중요하다.
서버를 띄우지 못해서 실행을 할 수 없다.
톰캣 404, 403, 500 보고 이해하고 해결할 줄 알아야 한다.
기본적으로 웹은 멀티쓰레드 고려해야(다양한 상황 고려해야)