20/09/09 웹 프로그래밍 기초
<액션 태그 : jsp 스펙에 포함된 커스텀태그들>
<jsp:include> 하면 jsp 2개가 합쳐져(include) 나타남. = 모듈화
모듈화 : 책임이 쪼개져있는 구조
장점: 유지보수 비용 감소
버퍼의 동작 순서가 다르다?
이동을 하는 과정에서 버퍼를 방출하냐/안 하냐
flush 하는순간 응답 데이터 나감. 한번이라도 방출하면 그 이후엔 에러가 발생해도 에러메시지 내보낼 수 없음
* include로 페이지 모듈화할때 한번쯤 버퍼가 방출됨. 근데 그러면 그 에러를 클라이언트한테 전달할 수 없음 (이미 상태코드가 200으로 나가서)
모듈화 해야할 땐 페이지 방출되는 상황 / 버퍼 제어할 방법 고려해야함.
<JavaBean : 자바빈 규약에 따라 정의된 재사용 가능한 객체>
VO(Value Object), DTO(Data Transfer Object), Model(MVO패턴)
- VO, DTO- 값을 가질 수 있고, 직렬화가 가능해야함
- Model- 컨트롤러가 만들어야되는 데이터, 뷰가 보여줘야하는 데이터. 현재 app에서 보여줘야하는 핵심 컨텐츠
자바빈 규약
1. 값(data)을 가질 수 있는 property 존재해야함
2. property가 적절하게 캡슐화되어있어야함 (private)
3. 캡슐화된 property에 접근할 수 있는 인터페이스 제공 (getter, setter)
4. 객체의 상태를 비교할 수 있는 방법을 지원해야함 (equals를 override해 재정의)
5. 객체의 상태를 확인할 수 있는 방법을 제공해야함 (toString)
6. 직렬화 가능해야함 (for 전송) (implements Serializable)
모든 db, framework에서 데이터의 최소단위: 객체
e.g. private int age; 했을때 db에서 NULL되면 큰일 남요
<useBean 액션태그>
1. id에 해당하는 속성데이터를 scope에서 검색
2. 존재하지 않으면 해당 객체를 생성하고 변수에 할당
3. 생성된 객체를 해당 scope에 속성으로 저장.
<jsp:useBean id="fcvo1" class="kr.or.ddit.vo.FileCommandVO" scope="request"></jsp:useBean>
<jsp:setProperty property="command" name="fcvo1" param="command"/>
//fcvo1이라는 객체가 가지고 있는 command라는 property 불러
//내부적으로 setter가 불러지는데 세터 이름을 만약 setComm11and 이런식으로 지었으면 규칙위반이라 실행 안됨
//param: queryString으로 붙는 param에 그 값 넣어드립니다~
<jsp:setProperty property="*" name="fcvo1"/>
<jsp:getProperty property="command" name="fcvo1"/>
<Include>
분류: include 시점과 include 대상의 차이
include 시점 | include 대상 | 사용법 | 비고 | ||
Dynamic Include (동적) | Runtime (실행 시점엔 바이트 코드 없고 결과data만 남음) | 실행결과를 | dispatcher.include, jsp:include | ||
Static Include (정적) |
jsp에 해당하는 서블릿 소스가 파싱되는(만들어지는) 시점 | 소스 자체를 | include 지시자(하나의 페이지를 대상으로 함) , web.xml (jsp-config, 어플리케이션 전체를 대상으로 함 | _jspServlet 보면 해당 소스가 그대로 들어옴 (= 그 안에 있는 변수 사용 가능) | 문제 생기면 찾기 어려움 |
당연히 정적 include 먼저 됨
<카페 레이아웃을 include를 사용해 만들기 : 페이지가 모듈화된 구조>
<a href="?"> 하면 그 위치
leftMenu.jsp-> layout jsp에서 content안에들어갈거 만들고 -> servlet에서 service parameter 잡아서 -> layout.jsp 로 보냄 -> layout jsp 랑 servlet 공유하니까 scope 쓴다. 여기서 최소 스코프: request scope.
- preScript.jsp에 jQuery등 공통 사용하는 부분 넣기
- <form>에서 action 없으면 browser상 그 위치
- form 안에 <input type="hidden">는 데이터를 전송하기 위함
- a href 쓸 때 html이 href가 아니면 링크가 없다고 판단함. 그래서 마우스 커서 모양을 바꾸지 않으면 a href="#"를 하면 됨
- 리팩토링: 결과적으로 클라이언트에게 나가는 결과는 똑같지만 방법이 다름
<Cookie>
http의 stateless라는 특성을 보완하기 위한 방법
1. session: 대화를 위한 상태 정보를 서버 측에 저장하는 방법
1) 서버 부하 쉬움
2) 데이터의 저장 기간이 제한됨 (Timeout 이내에서만 데이터 유지)
2. cookie: 대화를 위한 상태 정보를 클라이언트 측에 저장하는 방법
1) 보안에 취약
2) 서버에서 만든 데이터를 응답으로 내보내면 용량이 커져 네트워크 부하 걸리기 쉬움. => 한 사이트당 생성될 수 있는 쿠키의 개수와 내보낼 수 있는 데이터의 크기 제한됨
- a small amount of information sent by a servlet to a Web browser, saved by the browser, and later sent back to the server
- support 20 cookies for each Web server, 300 cookies total, and may limit cookie size to 4 KB each.
쿠키 사용방법
(서버가 할 일)
1. 서버side에서 쿠키(객체) 생성 -name, value (required)
2. 쿠키의 속성 설정
3. 응답 데이터 안에 쿠키를 포함시켜 클라이언트 측으로 전송
(클라이언트가 할 일)
4. 브라우저가 쿠키를 받아 자기 저장소에 저장 (F12 - Application 창에서 확인 가능)
5. 다음번 요청에 쿠키를 재전송
(서버가)
6. 재전송된 쿠키를 받고, 상태 복원 (Request Header에서 확인 가능)
(Response Headers에 Set-Cookie에도 있음)
브라우저 상에서 cookie 생성을 차단해놓으면 세션이 서버로 전송되지않아 서버는 그걸 최초의 요청으로 인식함.
3 Level (e.g. www.naver.com)
- com: GTLD, Global
4 Level (
- kr: NTLD, National
오른쪽으로 갈 수록 수준 높아짐
저수준의 레벨은 고수준의 레벨에 포함된다 (naver라는 기업은 com(company)에 포함된다)
com, kr -> TLD(Top Level Domain)
mail.naver.com
blog.naver.com
hostname: 서비스의 종류를 알려줌
Domain: 쿠키를 재전송할 때 첫번째 기준