CS/웹

[Web] DAO, DTO, VO / RESTful / HTTP SET-Cookie / URI, URL, URN

얌얌념념 2022. 3. 24. 10:18

질문 출처 : https://github.com/jjuyeon/Tech-Interview-Study/tree/main/web [7. Web/Web]

DAO, DTO, VO란?

MVC 패턴에서 사용되는 객체이다.

DAO (Data Access Object)
  • DB와 관련된 CRUD 작업을 전담하도록 만든 객체이다. 비즈니스 로직에서 DB 접근 로직을 분리하기 위해 사용된다.
  • 사용자는 자신이 필요한 인터페이스를 DAO에게 던지고 DAO는 이 인터페이스를 구현한 객체를 사용자에게 편리하게 사용할 수 있도록 반환해 준다.
DTO (Data Transfer Object)
  • 계층간의 데이터 교환을 위해 만들어진 Java Beans. (여기서 말하는 계층이란 Controller, View, Busniess, Persistence 계층을 말한다)
  • 대표적인 DTO로 폼데이터빈, 데이터베이스 테이블 빈 등이 있으며, 각 폼 요소나 데이터베이스 레코드의 데이터를 매핑하기 위한 데이터 객체를 말한다.
  • 일반적인 DTO는 로직 없는 순수한 데이터 객체이며, 속성과 속성에 접근할 수 있는 getter/setter 메소드만을 가진다. 비즈니스 논리 메서드를 추가하는 것은 권장되지 않는다.
VO (Value Object)
  • DTO와 마찬가지로 데이터 값을 담는 객체이다.
  • DTO와 비슷하지만, VO는 담긴 데이터를 수정할 수 없다는 점에서 차이가 존재한다.
dto VS vo
dto1 = new Object(1)
dto2 = new Object(1)
dto1 != dto2

vo1 = new Object(1)
vo2 = new Object(1)
vo1 == vo2

원래는 다른 건데 현업에서는 섞어서 사용하는 경향이 있다.

entity... db의 한 행을 가리키는..? id에 따라 구별되는 느낌인데. jpa에서 자동으로 db를 업데이트 할 때 사용...???

jstl에서 객체의 이름을 받아올 때 변수가 아니라 getter/setter의 이름으로 접근함.

참조글
https://martinfowler.com/eaaCatalog/dataTransferObject.html


RESTful이란?

REST = Representational State Transfer의 약자. 웹의 장점을 최대한 활용할 수 있는 아키텍처를 의미한다.

Get, Post, Put, Delete

https://wonning.wordpress.com/2015/12/02/restful/


HTTP SET-Cookie란?

서버에서 사용자 브라우저에 쿠키를 전송하기 위해 사용되는 HTTP 응답 헤더이다.

 속성  설명 
 이름=값  필수 속성.
 이름과 값 모두 큰타옴표로 감싸지 않은 세미콜론, 쉼표, 등호, 공백을 포함하지 않는 문자열이다.
 Set-Cookie: id=1234
 expires  선택 속성.
 쿠키의 만료일 문자열이고 날짜 형식은 다음과 같다.

 요일, DD-MM-YY HH:MM:SS GMT

 사용할 수 있는 타임존은 GMT 뿐이며 날짜 요소 간에 구분자는 - 이어야 한다. 쿠기에 expires 를 명시하지 않으면 세션 쿠키가 되고 세션 쿠키는 세션 종료시 만료된다. 

 Set-Cookie: id=1234; expires=Wednesday, 09-Nov-99 21:00:00 GMT
 domain  선택 속성.
 브라우저는 이 속성에 기술된 도메인을 사용하는 서버 호스트에만 쿠키를 전송한다.
 도메인이 명시되어 있지 않으면 Set-Cookie 응답을 생성한 서버의 호스트를 기본값으로 사용한다.
 만약 domain=naver.com 으로 되어 있으면 naver.com, www.naver.com 으로 요청을 전송할 때에 쿠키를 사용하게 된다.
 
 Set-Cookie: id=1234; domain="www.naver.com"
 path  선택 속성.
 path 속성에 기술된 값이 URL 경로의 앞부분과 일치하면 쿠키를 전송한다.
 만약 경로를 명시하지 않으면 Set-Cookie 응답을 전달하는 URL 의 경로가 사용된다.


 Set-Cookie: id=1234; path=/test
 secure  선택 속성.
 이 속성이 포함되어 있으면 쿠키는 HTTP가 SSL 보안 연결을 사용할 때만 쿠키를 전송한다. 


 Set-Cookie: id=1234; secure
문법
Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>		// 쿠키의 최대 생존 시간
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>	// 쿠키가 만료될 때 까지의 시간 (Expires보다 우선순위 높음)
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>		// 쿠키가 적용되어야 하는 호스트를 지정
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>		// 쿠키 헤더를 보내기 전에 요청 된 리소스에 있어야하는 URL 경로
Set-Cookie: <cookie-name>=<cookie-value>; Secure		// 보안 쿠키. 보안 쿠키는 서버에서 요청이 SSL을 사용하며, HTTPS 프로토콜을 사용할 때에만 전송된다.
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly		// XMLHttpRequest and Request APIs를 통한 자바스크립트로 접근할 수 없음..

// 크로스 사이트 요청과 함께 쿠키를 전송하지 않도록 만들 수 있다.
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax

// Multiple directives are also possible, for example:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly

(1) 쿠키생성
           - Cookie cookie = new Cookie(String key, String value);
           - cookie.setValue(newValue);
           - response.addCookie(name);
(2) 사용자의 요청에서 모든 쿠키를 얻기
           - Cookie[] cookies = request.getCookies();
(3) 원하는 쿠키 검색(이름)
          - String name = cookies[i].getName();
          - if( name.equals(“id”) ) { … } 
(4) 쿠키로부터 값을 얻음
          - String value = cookies[i].getValue();
(5) 쿠키 삭제 
          - 쿠키 생성 후 setMaxAge(0)을 사용
          -  response.addCookie(name);

요즘은 쿠키를 안쓴다는 말이.. 있다. 쿠키 대신 로컬 스토리지나 세션 스토리지를 사용한다고..?

https://velog.io/@kler/TIL4-%EB%A1%9C%EC%BB%AC%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EC%84%B8%EC%85%98%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EC%BF%A0%ED%82%A4-%EC%A0%95%EB%A6%AC

쿠키는 암호화를 할 수 있긴한데 엄청 손 많이 가고 빡세고... 굳이 클라이언트에 민감한 정보를 저장할 필요도 없고 매번 서버와 통신할 때 마다 빡센 복호화를 할 필요가 없다??

cookie - 모든 쿠키를 전송해야함, cookie를 가공함으로써 발생하는 side effect존재
webstorage - 개발자가 선택해서 전송할 수 있고 가공할 수도 있음

게다가 항상 코드를 작성해서 데이터를 넘겨줘야한다는 점이서 유지보수는 좀더 까다로운 편이다.


URI, URL, URN이란?

URI (Uniform Resource Identifier)
  • 인터넷 자원을 나타내는 고유 식별자이다.
  • 예를 들어 나의 거주지, 주민등록번호로 다른 사람과 나를 구별할 수 있는 객관적인 방법이 생기는 것과 유사하다.
// URI의 표현 방법
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
URL (Uniform Resource Location)
  • 통합 자원 위치. 웹 주소, 링크라고 불림
  • 자원에 접근할 수 있는 경로를 나타낸다. 일반적으로 사이트 도메인을 의미한다.
  • 웹 상 뿐만 아니라 컴퓨터 네트워크 상의 모든 자원을 나타낼 수 있다.
// URL의 표현 방법
scheme://<user>:<password>@<host>:<port>/<url-path>
URN (Uniform Resource Name)
  • 통합 자원 이름.
  • 자원의 이름을 나타낸다. 서로 중복되지 않는 유일한 값이어야 한다.
  • url과 달리 자원의 위치에 영향을 받지 않는다.
    OO도서관이 이전하여 주소가 XX시 XX동 XXX에서 XX시 YY동 YYY으로 바뀌었다고 해보자. 이 때 OO도서관이 실제로 위치하는 물리적 주소(URL)는 바뀌었지만 'OO도서관'이란 이름(URN)은 바뀌지 않는다.
<URN> ::= "urn:" <NID> ":" <NSS>

언제 어떻게 쓰는가? 왜 분리를 해 놨는가?

  • URL 어떻게 리소스를 얻을 것이고 어디에서 가져와야하는지 명시하는 URI이다.
  • URN은 리소스를 어떻게 접근할 것인지 명시하지 않고 경로와 리소스 자체를 특정하는 것을 목표로하는 URI이다.

URN의 역할은 WEB에 있는 컨텐츠나 파일 등을 고유한 이름으로 서버에 식별시키는 것

  • URL은 웹 상의 주소를 나타내는 문자열이기 때문에 더 효율적으로 리소스에 접근하기 위해 클린한 URL 작성을 위한 방법론들이 생겨났는데 REST API도 그 중 하나이다. (파일이 존재하는 것은 아니지만 프로그램을 돌려서 결과로 만들어진 리소스를 표현한 것도 URL, 예를 들면 데이터베이스의 학생 목록 같은 것들을 자원을 URL로 정의해서 CRUD하는 REST API가 그러함, Query하여 좀 더 자원을 특정한다고 하여 URL이 아니지 않음)
  • 실제 자원을 찾기 위해서는 URN을 URL로 변환하여 이용한다.

 

  1. The Scheme, which is the protocol that you’re using to interact.
  2. The Authority, which is the target you’re accessing. This breaks down into userinfo, host, and port.
  3. The Path, which is the resource you’re requesting on the host.
  4. The Query, which are the parameters being used within the web application.
  5. The Fragment, which is the target to jump to within a given page.