WEB Application

20/09/09 웹 프로그래밍 기초

Tech Signal 2020. 9. 9. 17:24

<액션 태그 : jsp 스펙에 포함된 커스텀태그들>

Action Tags

<jsp:include> 하면 jsp 2개가 합쳐져(include) 나타남. = 모듈화

모듈화 : 책임이 쪼개져있는 구조

장점: 유지보수 비용 감소

액션태그를 사용했을 때와는 버퍼의 동작 순서가 달라짐 

버퍼의 동작 순서가 다르다?

이동을 하는 과정에서 버퍼를 방출하냐/안 하냐

flush 하는순간 응답 데이터 나감. 한번이라도 방출하면 그 이후엔 에러가 발생해도 에러메시지 내보낼 수 없음

* include로 페이지 모듈화할때 한번쯤 버퍼가 방출됨. 근데 그러면 그 에러를 클라이언트한테 전달할 수 없음 (이미 상태코드가 200으로 나가서)

모듈화 해야할 땐 페이지 방출되는 상황 /  버퍼 제어할 방법 고려해야함. 

flush 여부를 고려하자.

 


<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)

4. hashCode() 만들어짐
같은 객체일 경우 해시코드가 같아야함.

 

모든 db, framework에서 데이터의 최소단위: 객체

e.g. private int age; 했을때 db에서 NULL되면 큰일 남요


<useBean 액션태그>

request scope에서 fcvo1이라는 attribute를 찾는다.

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 먼저 됨 

아니면 web.xml에서 해줘도 됨

 


<카페 레이아웃을 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 생성을 차단해놓으면 세션이 서버로 전송되지않아 서버는 그걸 최초의 요청으로 인식함.


.naver.com 의 경우 hostname이 없기 때문에 네이버의 모든 서버에서 사용 가능. 

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: 쿠키를 재전송할 때 첫번째 기준