반응형

자바8에 추가된 Time 패키지에는 Duration과 Period라는 상당히 비슷해 보이는 2개의 클래스가 있습니다. 이 두개의 클래스는 둘 다 시간의 길이을 나타내기 위해서 사용되는데요. Duration은 두 “시간” 사이의 간격을 나타내는 반면에 Period는 두 “날짜” 사이의 간격을 나타낸다는 차이점이 있습니다. 이 게 무슨 말인지 예제를 통해서 살펴보도록 하겠습니다.

Duration

먼저 Duration 클래스는 두 시간 사이의 간격을 초나 나노 초 단위로 나타냅니다. 다음 예제는 10시 35분 40초와 10시 36분 50.0000008초 사이의 Duration을 생성 후, 초와 나노 초를 출력하고 있습니다. Duration 클래스의 between() 정적 메서드에 시작 시간과 종료 시간을 넘기면 두 시간의 간격을 나타내는 Duration 객체를 생성해줍니다.

LocalTime start = LocalTime.of(10, 35, 40);
LocalTime end = LocalTime.of(10, 36, 50, 800);

Duration duration = Duration.between(start, end);

System.out.println("Seconds: " + duration.getSeconds());
System.out.println("Nano Seconds: " + duration.getNano());
Seconds: 70
Nano Seconds: 800

시작 시간과 종료 시간 없이 Duration 클래스의 ofXxx() 정적 메서드를 사용하면 다음과 같이 바로 Duration 클래스를 생성할 수 있습니다. Duration 클래스를 통해 제어할 수 있는 가장 큰 시간 단위는 “일” 입니다. 그보다 큰 시간 단위는 Period 클래스를 통해서 제어가 가능하며 다음 섹션에서 자세히 다루도록 하겠습니다.

Duration ofMinutes = Duration.ofMinutes(1);
System.out.printf("1 minute is %d seconds\n", ofMinutes.getSeconds());

Duration ofHours = Duration.ofHours(1);
System.out.printf("1 hour is %d seconds\n", ofHours.getSeconds());

Duration ofDays = Duration.ofDays(1);
System.out.printf("1 day is %d seconds\n", ofDays.getSeconds());
1 minute is 60 seconds
1 hour is 3600 seconds
1 day is 86400 seconds

Duration은 PnDTnHnMn.nS 포멧을 사용하고 있으며, parse() 정적 메소드를 사용해서 이 포멧을 따르는 문자열로 부터 객체를 생성할 수 있습니다.

Duration duration = Duration.parse("PT10H36M50.008S");
System.out.println(duration);
System.out.printf("Seconds: %d, Nano Secodns: %d\n", duration.getSeconds(), duration.getNano());
PT10H36M50.008S
Seconds: 38210, Nano Secodns: 8000000

Period

한편, Period 클래스는 두 날짜 사이의 간격을 년/월/일 단위로 나타냅니다. Duration과 마찬가지로 between() 정적 메소드를 제공하고 있으며, 시작 날짜와 종료 날짜를 나타내는 두 개의 LocalDate 객체를 인자로 받습니다. 아래 예제는 세계 2차 대전이 얼마동안 지속이 되었는지를 구하는 코드입니다. 1939년 9월 1일에 시작되어 1945년 9월 2일에 끝난 이 전쟁은 6년 1일간 치뤄졌습니다.

LocalDate startDate = LocalDate.of(1939, 9, 1);
LocalDate endDate = LocalDate.of(1945, 9, 2);

Period period = Period.between(startDate, endDate);

System.out.println("Years: " + period.getYears());
System.out.println("Months: " + period.getMonths());
System.out.println("Days: " + period.getDays());
Years: 6
Months: 0
Days: 1

시작 날짜와 종료 날짜 없이 of() 메서드를 통해서 바로 Period 객체를 생성할 수도 있습니다.

Period period = Period.of(6, 0, 1);

System.out.println("Years: " + period.getYears());
System.out.println("Months: " + period.getMonths());
System.out.println("Days: " + period.getDays());
Years: 6
Months: 0
Days: 1

Peroid은 PnYnMnD 포멧을 사용하고 있으며, parse() 정적 메소드를 사용해서 이 포멧을 따르는 문자열로 부터 객체를 생성할 수 있습니다.

Period period = Period.parse("P6Y1D");
System.out.println(period);
System.out.println("Years: " + period.getYears());
System.out.println("Months: " + period.getMonths());
System.out.println("Days: " + period.getDays());
P6Y1D
Years: 6
Months: 0
Days: 1

ChronoUnit

Duration 또는 Period 객체를 생성하지 않고도 간편하게 특정 시간 단위로 시간의 길이를 구하는 방법이 있습니다. 바로 아래 예체처럼 ChronoUnit을 사용하면 됩니다.

LocalDate startDate = LocalDate.of(1939, 9, 1);
LocalDate endDate = LocalDate.of(1945, 9, 2);

long months = ChronoUnit.MONTHS.between(startDate, endDate);
long weeks = ChronoUnit.WEEKS.between(startDate, endDate);
long days = ChronoUnit.DAYS.between(startDate, endDate);

System.out.println("Months: " + months);
System.out.println("Weeks: " + weeks);
System.out.println("Days: " + days);

LocalTime startTime = LocalTime.of(10, 35, 40);
LocalTime endTime = LocalTime.of(10, 36, 50, 800);

long hours = ChronoUnit.HOURS.between(startTime, endTime);
long minutes = ChronoUnit.MINUTES.between(startTime, endTime);
long seconds = ChronoUnit.SECONDS.between(startTime, endTime);

System.out.println("Hours: " + hours);
System.out.println("Minutes: " + minutes);
System.out.println("Seconds: " + seconds);
Months: 72
Weeks: 313
Days: 2193
Hours: 0
Minutes: 1
Seconds: 70

이상으로 Java8에서 시간의 길이를 다루는 다양한 방법에 대해서 알아보았습니다.

참고

 

 

출처 : https://www.daleseo.com/java8-duration-period/

반응형

'JAVA' 카테고리의 다른 글

접근제어자 범위  (0) 2021.04.09
@Scheduled 쉽게 사용하기  (0) 2019.03.07
JAVA 메일 보내기 글자 깨짐현상  (0) 2019.02.27
파일 업로드 목록, 다운로드  (0) 2019.02.11
JAVA 업로드 된 파일 삭제하기  (0) 2019.02.11
반응형
function numberPad(n, width) {
    n = n + '';
    return n.length >= width ? n : new Array(width - n.length + 1).join('0') + n;
}

위 함수는 3을 03으로 표현하고 싶을때,

 

numberPad(3, 2); 를 입력하면 3 -> 03으로 return 되게 됩니다.

 

출처 : https://matthew-jo.tistory.com/8

반응형
반응형

VO를 사용할 때 List Type 을 사용하여 

여러 FormTag를 리스트(배열)로 받는 예제이다.

 

 

 


 

한 Form 에서 전송할 때 보통은 VO 를 하나만 매칭시켜서 Controller 에서 받는다.

 

근데 나는 한 Form 에서 전송하고 Controller 에서 VO 를 리스트로 받아야 하는 경우가 생겼다.

 


 

 

예를 들어

public class NameVO{
 
 private String name;
 
 
 public String getName() {
  return name;
 }
 
 public void setName(String name) {
  this.name = name;
 }
 
}
 
cs

와 같은 VO 객체가 있고

 



 

<form:form commandName="NameVO" name="dataForm" id="dataForm" >
 
<form:input path="name" value="홍길동"/>
 
<form:input path="name" value="김길동"/>
 
<form:input path="name" value="강길동"/>
 
</form:form>
 
cs

와 같은 구조의 FORM 이 있는데

 

이 FORM 을 전송 할 경우

 

그냥 전송해 버리면 NameVO의 Name에는 "홍길동,김길동,강길동" 이 들어있다.

 

split 으로 잘라서 써도 되지만 조금 더 나은 방법으로 아예 List 로 받아버리자

 

public class NameVO{
 
 private String name;
 
 
 
 
 private List<NameVO> nameVOList;
 
 
 
 
public List<NameVO> getNameVOList() {
  return nameVOList;
 }
 
 public void setNameVOList(List<NameVO> nameVOList) {
  this.nameVOList = nameVOList;
 }
 
 
 public String getName() {
  return name;
 }
 
 public void setName(String name) {
  this.name = name;
 }
 
}
 
cs

위와 같이 자신을 참조하는 List 와 getter/setter 를 생성하고

 



 

<form:form commandName="NameVO" name="dataForm" id="dataForm" >
 
<input type="text" name="nameVOList[0].name" >
 
<input type="text" name="nameVOList[1].name" >
 
<input type="text" name="nameVOList[2].name" >
 
</form:form>
 
cs

이와 같이 리스트 번호와 그 리스트에 담을 name값을 정해주면

 

 

NameVO 객체 안에 nameVOList 에 순차적으로 VO 의 name에 담겨있음을 확인할 수 있다. 



출처: https://cofs.tistory.com/84 [CofS]

반응형

'Spring' 카테고리의 다른 글

CharacterEncodingFilter를 통한 UTF-8 한글 인코딩  (0) 2020.12.04
반응형

 

 

 

https://www.popit.kr/rest-%EA%B8%B0%EB%B0%98%EC%9D%98-%EA%B0%84%EB%8B%A8%ED%95%9C-%EB%B6%84%EC%82%B0-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B5%AC%ED%98%84-1%ED%8E%B8/

반응형

'ETC' 카테고리의 다른 글

GET DIAGNOSTICS  (0) 2019.01.08
톰캣 포트 죽이기  (0) 2019.01.03
반응형

문서 객체 모델(DOM, Document Object Model)은 XML이나 HTML 문서에 접근하기 위한 일종의 인터페이스입니다.

이 객체 모델은 문서 내의 모든 요소를 정의하고, 각각의 요소에 접근하는 방법을 제공합니다.

 

이러한 DOM은 W3C의 표준 객체 모델이며, 다음과 같이 계층 구조로 표현됩니다.

 

 

자바스크립트는 이러한 객체 모델을 이용하여 다음과 같은 작업을 할 수 있습니다.

 

- 자바스크립트는 새로운 HTML 요소나 속성을 추가할 수 있습니다.

- 자바스크립트는 존재하는 HTML 요소나 속성을 제거할 수 있습니다.

- 자바스크립트는 HTML 문서의 모든 HTML 요소를 변경할 수 있습니다.

- 자바스크립트는 HTML 문서의 모든 HTML 속성을 변경할 수 있습니다.

- 자바스크립트는 HTML 문서의 모든 CSS 스타일을 변경할 수 있습니다.

- 자바스크립트는 HTML 문서에 새로운 HTML 이벤트를 추가할 수 있습니다.

- 자바스크립트는 HTML 문서의 모든 HTML 이벤트에 반응할 수 있습니다.


DOM의 종류

W3C DOM 표준은 세 가지 모델로 구분됩니다.

 

1. Core DOM : 모든 문서 타입을 위한 DOM 모델

2. HTML DOM : HTML 문서를 위한 DOM 모델

3. XML DOM : XML 문서를 위한 DOM 모델

 

------------------------------------------------------------------------------------------------------

 

DOM은 정확히 무엇일까?

DOM(Document Object Model)은 웹 페이지에 대한 인터페이스입니다. 기본적으로 여러 프로그램들이 페이지의 콘텐츠 및 구조, 그리고 스타일을 읽고 조작할 수 있도록 API를 제공합니다. 먼저 DOM을 이해하기 전에 웹 페이지가 어떻게 빌드 되는지 살펴보겠습니다.

웹 페이지는 어떻게 만들어질까?

웹 브라우저가 원본 HTML 문서를 읽어들인 후, 스타일을 입히고 대화형 페이지로 만들어 뷰 포트에 표시하기까지의 과정을 “Critical Rendering Path”라고 합니다. Understanding the Critical Rendering Path 에서 다루듯이 이 과정은 여러 단계로 나누어져 있지만, 이 단계들을 대략 두 단계로 나눌 수 있습니다. 첫 번째 단계에서 브라우저는 읽어들인 문서를 파싱하여 최종적으로 어떤 내용을 페이지에 렌더링할지 결정합니다. 그리고 두 번째 단계에서 브라우저는 해당 렌더링을 수행합니다.


첫 번째 과정을 거치면 “렌더 트리”가 생성됩니다.
렌더 트리는 웹 페이지에 표시될 HTML 요소들과 이와 관련된 스타일 요소들로 구성됩니다. 브라우저는 렌더 트리를 생성하기 위해 다음과 같이 두 모델이 필요합니다.

  • DOM(Document Object Model) – HTML 요소들의 구조화된 표현
  • CSSOM(Cascading Style Sheets Object Model) – 요소들과 연관된 스타일 정보의 구조화된 표현

DOM은 어떻게 생성될까 (그리고 어떻게 보여질까)?

DOM은 원본 HTML 문서의 객체 기반 표현 방식입니다. 둘은 서로 비슷하지만, DOM이 갖고 있는 근본적인 차이는 단순 텍스트로 구성된 HTML 문서의 내용과 구조가 객체 모델로 변환되어 다양한 프로그램에서 사용될 수 있다는 점입니다.
DOM의 개체 구조는 “노드 트리”로 표현됩니다. 하나의 부모 줄기가 여러 개의 자식 나뭇가지를 갖고 있고, 또 각각의 나뭇가지는 잎들을 가질 수 있는 나무와 같은 구조로 이루어져 있기 때문입니다. 이 케이스의 경우, 루트 요소인 <html> 은 “부모 줄기”, 루트 요소에 내포된 태그들은 “자식 나뭇가지” 그리고 요소 안의 컨텐츠는 “잎”에 해당합니다.
아래 HTML 예시에서,


이 문서는 아래와 같은 노드 트리로 표현됩니다.

DOM이 아닌 것

위 예제 혹은 DevTools에서 DOM은 마치 HTML 문서와 1 대 1 매핑이 되는 것처럼 보입니다. 그러나 둘 간에는 몇 가지 차이점이 있습니다.
DOM이 무엇인지 완전히 이해하기 위해, 어떤 것이 DOM이 아닌지 살펴보겠습니다.

1. DOM은 HTML이 아닙니다.

DOM은 HTML 문서로부터 생성되지만 항상 동일하지 않습니다. DOM이 원본 HTML 소스와 다를 수 있는 두 가지 케이스가 있습니다.

작성된 HTML 문서가 유효하지 않을 때

DOM은 유효한 HTML 문서의 인터페이스 입니다. DOM을 생성하는 동안, 브라우저는 유효하지 않은 HTML 코드를 올바르게 교정합니다.
아래 예시를 살펴보시면,


문서에 유효한 HTML 규칙의 필수 사항인 <head> 와 <body> 요소가 빠져있습니다. 그렇지만 생성된 DOM 트리에는 올바르게 교정되어 나타납니다.

자바스크립트에 의해 DOM이 수정될 때

DOM은 HTML 문서의 내용을 볼 수 있는 인터페이스 역할을 하는 동시에 동적 자원이 되어 수정될 수 있습니다.
예를 들어, 자바스크립트를 사용해 DOM에 새로운 노드를 추가할 수 있습니다.


이 코드는 DOM을 업데이트합니다. 하지만 HTML 문서의 내용을 변경하진 않습니다.

2. DOM은 브라우저에서 보이는 것이 아닙니다.

브라우저 뷰 포트에 보이는 것은 렌더 트리로 DOM과 CSSOM의 조합입니다. 렌더 트리는 오직 스크린에 그려지는 것으로 구성되어 있어 DOM과 다릅니다.
달리 말하면, 렌더링 되는 요소만이 관련 있기 때문에 시각적으로 보이지 않는 요소는 제외됩니다.
예를 들어, display: none 스타일 속성을 가지고 있는 요소입니다.


DOM은 <p> 요소를 포함시킵니다.
 


그러나 렌더 트리에 해당하는 뷰 포트에 표시되는 내용은 <p> 요소를 포함하지 않습니다.


 

3. DOM은 개발도구에서 보이는 것이 아닙니다.

개발도구의 요소 검사기는 DOM과 가장 가까운 근사치를 제공합니다. 그러나 개발도구의 요소 검사기는 DOM에 없는 추가적인 정보를 포함합니다.
가장 좋은 예는 CSS의 가상 요소입니다. ::before 과 ::after 선택자를 사용하여 생성된 가상 요소는 CSSOM과 렌더 트리의 일부를 구성합니다.
하지만, 기술적으로 DOM의 일부는 아닙니다. DOM은 오직 원본 HTML 문서로부터 빌드 되고, 요소에 적용되는 스타일을 포함하지 않기 때문입니다.
가상 요소가 DOM의 일부가 아님에도 불구하고, 요소 검사기에서는 아래와 같이 확인됩니다.


이러한 이유로 가상 요소는 DOM의 일부가 아니기 때문에 자바스크립트에 의해 수정될 수 없습니다.

요약정리

DOM은 HTML 문서에 대한 인터페이스입니다. 첫째로 뷰 포트에 무엇을 렌더링 할지 결정하기 위해 사용되며,
둘째로는 페이지의 콘텐츠 및 구조, 그리고 스타일이 자바스크립트 프로그램에 의해 수정되기 위해 사용됩니다.
DOM은 원본 HTML 문서 형태와 비슷하지만 몇 가지 차이점이 있습니다.

  • 항상 유효한 HTML 형식입니다.
  • 자바스크립트에 수정될 수 있는 동적 모델이어야 합니다.
  • 가상 요소를 포함하지 않습니다. (Ex. ::after)
  • 보이지 않는 요소를 포함합니다. (Ex. display: none)

 

 

 

출처 : http://www.tcpschool.com/javascript/js_dom_concept

 

참고 문서

반응형
반응형

OSI 모형(Open Systems Interconnection Reference Model)은 국제표준화기구(ISO)에서 개발한 모델로, 컴퓨터 네트워크 프로토콜 디자인과 통신을 계층으로 나누어 설명한 것이다. 일반적으로 OSI 7 계층이라 불리기도 한다.

흔히들 각 계층을 L(ayer)로 줄여서 간편하게 부른다. 예를 들어 1계층인 물리 계층(Physical layer)의 경우 L1, 5계층인 세션 계층(Session layer)의 경우 L5로 부른다.

추가로, 컴퓨터는 OSI 7개의 계층 모두를 포함한다.

 

 

계층 별 예시

계층기타TCP/IP 스위트SS7AppleTalk 스위트OSI 스위트IPX 스위트SNAUMTS

7 - 응용(Application) HL7, Modbus, SIP HTTP, SMTP, SNMP, FTP, 텔넷, NFS, NTP ISUP, INAP, MAP, TUP, TCAP AFP, PAP FTAM, X.400, X.500, DAP   APPC  
6 - 표현(Presentation) TDI, ASCII, EBCDIC, MIDI, MPEG XDR   AFP, PAP        
5 - 세션(Session) FIFO(파이프), 넷바이오스, SAP, SDP, SSL, TLS TCP의 세션 관리 부분,   ASP, ADSP, ZIP   NWLink DLC?  
4 - 전송(Transport) NetBEUI TCP, UDP, RTP, SCTP   ATP, NBP, AEP, RTMP TP0, TP1, TP2, TP3, TP4, OSPF SPX, RIP    
3 - 네트워크(Network) NetBEUI, Q.931 IP, ICMP, IPsec, ARP, RIP, BGP MTP-3, SCCP DDP X.25 (PLP), CLNP IPX   RRC (라디오 리소스 제어)
2 - 데이터 링크(Data Link) 이더넷, 토큰링, FDDI, PPP, HDLC, Q.921, 프레임 릴레이, ATM, Fibre Channel   MTP-2 로컬토크, 토큰토크, 이더토크, 애플 리모트 액세스, PPP X.25 (LAPB), 토큰 버스 802.3 프레이밍, 이더넷 II 프레이밍 SDLC 미디어 접근 제어(MAC)
1 - 물리(Physical) RS-232, V.35, V.34, Q.911, T1, E1, 10BASE-T, 100BASE-TX, ISDN, SONET, DSL   MTP-1 Localtalk on shielded, Localtalk on unshielded (PhoneNet) X.25 (X.21bis, EIA/TIA-232, EIA-422, EIA/TIA-449, EIA-485, EIA-530, G.703)   Twinax PHY (물리 계층: Physical Layer)

 

계층 1: 물리 계층

물리 계층(영어: physical layer)은 컴퓨터 네트워킹 OSI 7계층 모델에서 가장 낮은, 첫 번째 계층이다. 이 계층의 구현 이름은 PHY라는 용어로도 불린다.

 

하드웨어 장비(네트워크 노드)의 예

  • 네트워크 어댑터
  • 리피
  • 네트워크 허브
  • 모뎀

 

물리 계층은 실제 장치들을 연결하기 위해 필요한 전기적, 물리적 세부 사항들을 정의한다. 예를 들어, 핀들의 배치나 전압, 전선의 명세 등이 이 계층에 포함된다. 허브(리피터)가 물리 계층의 장치이다. 물리 계층에서 수행되는 중요한 일들은 다음과 같다.

- 물리적인 정보 전달 매개체에 대한 연결의 성립 및 종료.

- 여러 사용자들 간의 통신 자원을 효율적으로 분배하는 데 관여. (예를 들어 경쟁 상태의 해소나 흐름 제어(congestion control) 등.)

- 통신 채널을 통해 전송되는 사용자 장치의 디지털 데이터를 이에 상응하는 신호들로 변환, 변조. 이 신호들은 구리선이나 광섬유 선을 통해 전달 되는 신호들이다. 예를 들어 SCSI가 여기에 속한다.

- 물리계층은 네트워크상에서 데이터 비트를 전송하는 계층이다. 데이터 링크 개체 간의 비트 전송을 위한 물리적 연결을 설정, 유지, 해제하기 위한 수단을 제공한다. 전송 매체는 신호 보내는 방법을 정의한다.

단위 - bit
대표 장치 - Hub

계층 2: 데이터 링크 계층

 이 부분의 본문은 데이터 링크 계층입니다.

데이터 링크 계층(Data[3]link layer)은 포인트 투 포인트(Point to Point) 간 신뢰성있는 전송을 보장하기 위한 계층으로 CRC 기반의 오류 제어와 흐름 제어가 필요하다. 네트워크 위의 개체들 간 데이터를 전달하고, 물리 계층에서 발생할 수 있는 오류를 찾아 내고, 수정하는 데 필요한 기능적, 절차적 수단을 제공한다. 주소 값은 물리적으로 할당 받는데, 이는 네트워크 카드가 만들어질 때부터 맥 주소(MAC address)가 정해져 있다는 뜻이다. 주소 체계는 계층이 없는 단일 구조이다. 데이터 링크 계층의 가장 잘 알려진 예는 이더넷이다. 이 외에도 HDLC나 ADCCP 같은 포인트 투 포인트(point-to-point) 프로토콜이나 패킷 스위칭 네트워크나 LLC, ALOHA 같은 근거리 네트워크용 프로토콜이 있다. 네트워크 브릿지나 스위치 등이 이 계층에서 동작하며, 직접 이어진 곳에만 연결할 수 있다.

  • 프레임에 주소부여(MAC - 물리적주소)
  • 에러검출/재전송/흐름제어

계층 3: 네트워크 계층

 이 부분의 본문은 네트워크 계층입니다.

네트워크 계층(Network layer)은 여러개의 노드를 거칠때마다 경로를 찾아주는 역할을 하는 계층으로 다양한 길이의 데이터를 네트워크들을 통해 전달하고, 그 과정에서 전송 계층이 요구하는 서비스 품질(QoS)을 제공하기 위한 기능적, 절차적 수단을 제공한다. 네트워크 계층은 라우팅, 흐름 제어, 세그멘테이션(segmentation/desegmentation), 오류 제어, 인터네트워킹(Internetworking) 등을 수행한다. 라우터가 이 계층에서 동작하고 이 계층에서 동작하는 스위치도 있다. 데이터를 연결하는 다른 네트워크를 통해 전달함으로써 인터넷이 가능하게 만드는 계층이다. 논리적인 주소 구조(IP), 곧 네트워크 관리자가 직접 주소를 할당하는 구조를 가지며, 계층적(hierarchical)이다.

서브네트의 최상위 계층으로 경로를 설정하고, 청구 정보를 관리한다. 개방형 시스템들의 사이에서 네트워크 연결을 설정, 유지, 해제하는 기능을 부여하고, 전송 계층 사이에 네트워크 서비스 데이터 유닛(NSDU : Network Service Data Unit)을 교환하는 기능을 제공한다.

  • 주소부여(IP)
  • 경로설정(Route)

계층 4: 전송 계층[편집]

 이 부분의 본문은 전송 계층입니다.

전송 계층(Transport layer)은 양 끝단(End to end)의 사용자들이 신뢰성있는 데이터를 주고 받을 수 있도록 해 주어, 상위 계층들이 데이터 전달의 유효성이나 효율성을 생각하지 않도록 해준다. 시퀀스 넘버 기반의 오류 제어 방식을 사용한다. 전송 계층은 특정 연결의 유효성을 제어하고, 일부 프로토콜은 상태 개념이 있고(stateful), 연결 기반(connection oriented)이다. 이는 전송 계층이 패킷들의 전송이 유효한지 확인하고 전송 실패한 패킷들을 다시 전송한다는 것을 뜻한다. 가장 잘 알려진 전송 계층의 예는 TCP이다.

종단간(end-to-end) 통신을 다루는 최하위 계층으로 종단간 신뢰성 있고 효율적인 데이터를 전송하며, 기능은 오류검출 및 복구와 흐름제어, 중복검사 등을 수행한다.

  • 패킷 생성(Assembly/Sequencing/Deassembly/Error detection/Request repeat/Flow control)

계층 5: 세션 계층

 이 부분의 본문은 세션 계층입니다.

세션 계층(Session layer)은 양 끝단의 응용 프로세스가 통신을 관리하기 위한 방법을 제공한다. 동시 송수신 방식(duplex), 반이중 방식(half-duplex), 전이중 방식(Full Duplex)의 통신과 함께, 체크 포인팅과 유휴, 종료, 다시 시작 과정 등을 수행한다. 이 계층은 TCP/IP 세션을 만들고 없애는 책임을 진다.

통신하는 사용자들을 동기화하고 오류복구 명령들을 일괄적으로 다룬다.

  • 통신을 하기 위한 세션을 확립/유지/중단 (운영체제가 해줌)

계층 6: 표현 계층

 이 부분의 본문은 표현 계층입니다.

표현 계층(Presentation layer)은 코드 간의 번역을 담당하여 사용자 시스템에서 데이터의 형식상 차이를 다루는 부담을 응용 계층으로부터 덜어 준다. MIME 인코딩이나 암호화 등의 동작이 이 계층에서 이루어진다. 예를 들면, EBCDIC로 인코딩된 문서 파일 ASCII로 인코딩된 파일로 바꿔 주는 것이 표현 계층의 몫이다.

  • 사용자의 명령어를 완성및 결과 표현.
  • 포장/압축/암호화

계층 7: 응용 계층

 이 부분의 본문은 응용 계층입니다.

응용 계층(Application layer)은 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행한다. 일반적인 응용 서비스는 관련된 응용 프로세스들 사이의 전환을 제공한다. 응용 서비스의 예로, 가상 터미널(예를 들어, 텔넷), "Job transfer and Manipulation protocol" (JTM, 표준 ISO/IEC 8832) 등이 있다.

  • 네트워크 소프트웨어 UI 부분
  • 사용자의 입출력(I/O)부분

 

 

 

 

 

 

 

출처 : https://ko.wikipedia.org/wiki/OSI_%EB%AA%A8%ED%98%95

반응형
반응형

- URL 파라미터 값 가져오기 -


URL상에 보이는 파라미터나

 

location.href 를 이용하여 이동할때 보내는 파라미터 값을

 

스크립트로 가져와서 사용해 보도록 하자


기본적으로 자바스크립트의 내장 함수인

 

location.search 를 이용하여 URL에 물음표 뒤에 있는 파라미터들을 가져올수 있다.

 

 

 

위와같이 파라미터 정보를 가져오며 저기서 이제 원하는 값을 뽑아와야하는데

 

널리 퍼져 많은 사람들이 사용하고있는 함수들이 있다 

 

내장되어 있는게 아니라 선언을 해줘야한다.

 

선언만 해주면 여타 함수를 호출하는것과 마찬가지로 호출해 사용해주면 된다.


1. 정규식 표현을 이용한 함수

 

 

1

2

3

4

5

6

function getParameterByName(name) {

        name = name.replace(/[\[]/"\\[").replace(/[\]]/"\\]");

        var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),

                results = regex.exec(location.search);

        return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));

    }

Colored by Color Scripter

cs

 

getParameterByName(파라미터 이름) 함수를 사용해 쉽게 가져올 수 있다. 사용법은 다음과 같다.

 

1

var patId = getParameterByName('category'); // 1060192

cs

 

 

2. 모든 파라미터를 객체 형식으로 가져오는 함수

 

1

2

3

4

5

6

7

8

9

function get_query(){

    var url = document.location.href;

    var qs = url.substring(url.indexOf('?'+ 1).split('&');

    for(var i = 0, result = {}; i < qs.length; i++){

        qs[i] = qs[i].split('=');

        result[qs[i][0]] = decodeURIComponent(qs[i][1]);

    }

    return result;

}

Colored by Color Scripter

cs

 

사용법은 역시 여타 함수들과 마찬가지로 호출만 해준다.

 

1

var result = get_query();

cs

 

만약 파라미터가 ?name=mineIt&age=goodDay&you=andMe&test 라고 가정하여 사용한다 치면

 

결과는 다음과 같다.

 

1

2

3

4

5

6

{

  name"minelt",

  age: "goodDay",

  you: "andMe",

  test : undefined

}

cs

 

출처 : mine-it-record.tistory.com/278

 

출처 : https://fellowtuts.com/jquery/getting-query-string-values-in-javascript/?a=a

 

반응형
반응형

접근 제어자의 접근 범위

자바에서 접근 제어자의 접근 범위가 보다 많은 제어자부터 적은 제어자 순으로 나열하면 다음과 같습니다.

 

public > protected > default > private

 

 

접근 제어자 같은 클래스의 멤버 같은 패키지의 멤버 자식 클래스의 멤버 그 외의 영역
public
protected X
default X X
private X X X

 

 

출처 : www.tcpschool.com/java/java_modifier_accessModifier

반응형

'JAVA' 카테고리의 다른 글

Duration, Period, chronoUnit 사용법  (0) 2022.09.16
@Scheduled 쉽게 사용하기  (0) 2019.03.07
JAVA 메일 보내기 글자 깨짐현상  (0) 2019.02.27
파일 업로드 목록, 다운로드  (0) 2019.02.11
JAVA 업로드 된 파일 삭제하기  (0) 2019.02.11
반응형

게임 운영을 하다보면, 질의 결과를 Update해야 하는 경우가 있다. 이때 문제는 Mysql과 다른 db 프레임워크의 질의 방법이 다르다.

 

1. 일반적인 Update문

 일반적인 Update문은 아래와 같은 방식을 아래와 같은 방식이다.

 

UPDATE 
    [테이블명]
SET
    [필드명 = 새로운 값]
WHERE
    [조건문]

 

 2. Select 결과와 Join

 앞서 말한 것 처럼, Mysql과 다른 DB프레임워크의 방식이 다르다.

 

Mssql 버전

UPDATE 
    [테이블A]
SET
    [테이블A].필드 = [테이블B].필드
FROM
    [테이블A],[테이블B]
WHERE 
    [테이블A].id = [테이블B].id

 

Mysql 버전

UPDATE
    [테이블A],[Select 질의] B
SET
    [테이블A].필드 = B.필드
WHERE
	[테이블A].id = B.id

 

오라클 버전

UPDATE
	[테이블A] A
SET 
    A.필드 = [SELECT B.필드 FROM 테이블B B WHERE B.id = ###]
WHERE A.id = ###;

 

아래는 Mysql에서, 실제 시즌 랭킹의 상위 %별로, 그 점수를 유저의 재화로 UPDATE하고 있는 예제이다.

UPDATE 
	UserMoney as um,
	(SELECT user_id, curr  FROM
		(SELECT
		    id as user_id,
		    @prev := @curr as prev,
		    @curr := point as curr,
		    @rank := IF(@prev > @curr, @rank+@ties, @rank) AS rank,
		    (@rank/@total)*100 as percentrank
		FROM
			(SELECT * FROM UserPoint WHERE season = 3) c,
			(SELECT
					@curr := null,
			        @prev := null,
			        @rank := 0,
			        @ties := 1,
			        @total := count(*) from UserPoint where play_count > 10 and season = 3) b
		ORDER BY
		    point DESC ) a 
		WHERE percentrank >= 0 AND percentrank <= 1) d

SET 
	um.energy = d.curr
	
WHERE um.id = d.user_id;



출처: https://shakddoo.tistory.com/entry/Mysql-Select결과를-Update-문에-반영하기 [겨울팥죽 여름빙수]

반응형

+ Recent posts