jstl 내장함수

JSTL functions은 JSTL에서 제공하는 각종 함수를 사용해서 문자열이나, 컬렉션들을 처리함.
fn태그는 단독으로 사용할 수 없고 EL 표현식 내에서 사용해야함.
like ${fn:length(...)}

jsp 페이지 시작점에 다음 태그로 선언 해줘야 사용 할 수 있음.

  <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

 


 

boolean contains(String sting, String substring)

string이 substring을 포함하면 return true.

boolean containsIgnoreCase(String string, String substring)

대소문자에 관계없이, string이 substring을 포함하면 return true.

 

  ${fn:contains("helloworld", "world")} // true

  ${fn:containsIgnoreCase("hello world!", "WoRLd")} // true

 


 

boolean startsWith(String string, String prefix)

string이 prefix로 시작하면 return true.

boolean endsWith(String string, String substring)

string이 suffix로 끝나면 return true.

 

  ${fn:startsWith("hello world!", "ld!")} // false

  ${fn:endsWith("hello world!", "ld!")} // true

 


 

String escapeXml(String string)

string에서 XML, HTML의 < >& ' " 문자들을 각각 < > & ' "로 치환하여 리턴.

 

  <c:out value="${fn:escapeXml('<>')}"/> // &lt;&gt;

 


 

int indexOf(String string, String substring)

string에서 substring이 처음으로 나타나는 인덱스 리턴.

 

  ${fn:indexOf("abcdefg", "f")} // 5

 


 

String[] split(String string, String separator)

string 내의 문자열을 separator에 따라 잘라내서 잘려진 문자열들을 배열로 리턴.

String join(String[] strings, String separator)

배열 요소들을 separator를 구분자로 하여 모두 연결해서 리턴.

 

// 예시를 위한 배열 생성
<c:set var="texts" value="${fn:split('Hi My name is waldo', ' ')}"/>
<c:out value="${fn:join(texts, '-')}"/> // Hi-My-name-is-waldo

 


 

int length(Object item)

item이 배열이나 컬렉션이면 요소의 개수를, 문자열이면 문자의 개수를 리턴.

 

<c:set var="texts" value="${fn:split('Hi My name is waldo', ' ')}"/>

${fn:length(texts)} // 5

${fn:length("123456")} // 6

 


 

String replace(String string, String before, String after)

string 내에 있는 before 문자열을 after 문자열로 모두 바꿔서 리턴.

 

${fn:replace("hi hello", "hello", "hi")} // hi hi

// replace 함수는 HTML에서 공백과 줄바꿈을 표현할 때 사용할 수 있다.
${fn:replace("hell            o          o       ~", " ", "&nbsp;")} // hell            o          o       ~

<% pageContext.setAttribute("enter","\n"); %>
${fn:replace(info.text, enter, '<br/>') // 엔터처리

<% pageContext.setAttribute("enter","\n"); %>
${fn:replace(fn:replace(fn:escapeXml(info.content_txt), enter, '<br/>') , ' ', '&nbsp;')} // 엔터와 공백 처리

 


 

String substring(String string, int begin, int end)

string에서 begin 인덱스에서 시작해서 end 인덱스에 끝나는 부분의 문자열을 리턴.

String substringAfter(String string, String substring)

string에서 substring이 나타나는 이후의 부분에 있는 문자열을 리턴.

String substringBefore(String string, String substring)

string에서 substring이 나타나기 이전의 부분에 있는 문자열을 리턴.

 

${fn:substring(text, 3, 19)} // My name is waldo

${fn:substringAfter(text, "Hi ")} // My name is waldo

${fn:substringBefore(text, "waldo")} // Hi My name is

 


 

String toLowerCase(String string)

string을 모두 소문자로 치환.

String toUpperCase(String string)

string을 모두 대문자로 치환.

 

<c:set var="text" value="Hi My name is waldo"/>

${fn:toLowerCase(text)} // hi my name is waldo

${fn:toUpperCase(text)} // HI MY NAME IS WALDO

 


 

String trim(String string)

string 앞뒤의 공백을 모두 제거.

 

<c:set var="text" value="          blank spcae          "/>
${fn:length(text)}  // 31

<c:set var="text" value="${fn:trim(text)}"/>
${fn:length(text)}  // 11
728x90
반응형

windows 10 NVM 과 nodejs 설치하기

nvm은 Node Version Manager의 약자로, node.js 버전이 다른 개발환경을 필요로 할경우 해당 버전의 설치를 지원하여 사용할 버전을 선택할 수 있도록 도와줌.

OS 환경

  • Windows 10

NVM 설치

PS C:\Users\jeaha> nvm version
1.1.7

nodejs 설치

  • nvm이 설치 되었다면, 필요로 하는 nodejs 의 버전을 확인한다.
    • nodejs & npm 버전 확인
  • 설치할 버전을 확인 했다면 cmd에서 다음 명령으로 설치하면 된다.
nvm install v{버전}
  • 여기까지 하면 nodejs를 사용할 준비가 되었지만, 어떤 버전을 사용할지 설정하지 않은 상태이다.
  • nvm use {버젼} 명령으로 사용 버전을 지정 해 줘야 한다.
  • 설정한 node/npm 버전 확인
PS C:\Users\jeaha> nvm use 14.15.1
Now using node v14.15.1 (64-bit)

PS C:\Users\jeaha> nvm ls

  * 14.15.1 (Currently using 64-bit executable)

PS C:\Users\jeaha> node -v
v14.15.1

PS C:\Users\jeaha> npm -v
6.14.8
728x90
반응형

'Language > JavaScript' 카테고리의 다른 글

[JS] 페이지 리로드  (0) 2021.06.07
[JavaScript] url을 a 태그로 변환하기  (0) 2021.01.06
[JS] 날짜 비교  (0) 2020.11.11
[Modern JS] 동기 처리를 위한 Async Await  (0) 2020.06.14
[Modern JS] Promise  (0) 2020.06.14

SiteMesh와 Tiles

이직 하고 프로젝트를 인계 받다 보니 SiteMesh라는 것을 사용하고 있었다.
도대체 이게 뭐신고 하니 apache tiles 와 같은 화면 구성을 위한 템플릿 프레임워크였다.

현재는 소멸 된 오픈 소스 프로젝트로(이마짚...) 2015년 이후로는 업데이트가 없다는 설명에 tiles와 무슨 차이가 있는건지 찾아보았다.

혹시 라도 SiteMesh 사용법을 찾는 사람이라면 여기서 뒤로가기를 누르시라...

 


 

Google Trends

SiteMesh가 과연 얼마나 자주 사용 되는 것인가가 궁금해서 Google Trends에 비교 검색 해 보았다.

지난 5년간 압도적으로 Tiles 검색이 더 많았다...

지역별 비교 분석을 보면 한국과 중국에서 많이 검색을 했단다...

"공공 SI 에서 많은 메뉴들을 간단한 설정으로 표출 하고 싶어서" 가 아닐까 싶다.

 


 

SiteMesh와 Tiles의 차이점

 

SiteMesh와 Tiles의 가장 큰 차이점은 패턴이다.
Tiles의 경우에는 Composite View 패턴을, SiteMesh의 경우에는 Decorator 패턴을 사용하고 있다.

아래 비교 내용는 해당 링크에서 가져왔다. http://tiles.apache.org/framework/tutorial/pattern.html

Composite View vs. Decorator

Tiles is a composite view framework: it allows to reuse page pieces across the application. But another approach to achieve the same result is using the Decorator pattern. For example, Sitemesh is based on the Decorator pattern.

Instead of creating a template and organizing the pieces together, the Decorator pattern (in this case) takes a simple HTML page, transforms it adding the missing pieces (in our example, adding header, footer and menu) and finally renders it.

Here you can find a comparison table between the two patterns.

Aspect Composite View Decorator
Reusability The different parts of the page (template and pieces) can be reused across the whole application. Each decorator can be reused, but the decoration itself can be applied to one page at a time.
Ease of configuration Each page must be defined explicitly. The decorator can be applied even to the entire application.
Runtime configuration The pages can be configured and organized at runtime Since one page is decorated at a time, this feature is not present.
Performances Low overhead for composition. The page to be decorated has to be parsed.



재사용성

Composite View Pattern의 Tiles의 경우에는 페이지의 모든 부분을 모두 재사용 가능하다.
반면, Decorator Pattern을 사용하는 SiteMesh는 각각의 데코레이터를 재사용 할수는 있지만, 데코레이션 자체는 한 페이지씩 적용할 수 있다고 한다.
데코레이터가 무엇인지 모르겠지만, 모든 부분을 재사용할 수 있는 Composite View Pattern이 Decorator Pattern 보다 나아보인다.

설정

각 페이지를 일일히 다 정의 해야하는 Tiles 보다는 SiteMesh가 더 쉽다고 한다.
근데 Tiles도 일일히까지는 설정 안해도 됬던 것으로 기억하는데,,

실행중 수정 여부

Composite View Pattern은 런타임중 각 페이지의 설정을 변경할 수 있고, Decorator Pattern 은 최초 한번에 적용 되기 때문에 런타임준 수정할 수 있는 기능은 제공하지 않는다.

성능

Composite View Pattern에 비해 매번 페이지를 파싱해야 하는 Decorator Pattern은 성능면에서는 당연히 떨어질 것이라 생각한다.

 


 

결론

이렇게 보니, Tiles가 trend인 이유도, 공공 SI에서 SiteMesh를 사용하는 이유도 이해가 간다.
간단한 프로그램에 복잡하지 않지만 페이지의 양이 많은 공공 지자체 SI라면 SiteMesh를 사용하는 합리적인 이유인것 같긴 하다만, 그래도 Tiles가 더 편한 것 같다는 생각은 변하지 않는다.
SiteMesh가 2015년 이후로 업데이트가 없었고, Tiles는 2016 이후로 retired 했다고 한다. (?)
그리고 비슷한 대안으로 Thymeleaf, Freemarker, mustach.java등이 있다고 한다. 그리고 Thymeleaf가 Tiles 만큼 사용율도 높다...

기술 트렌드... 참 사람 어쩌라는 건지 모르겠다.

728x90
반응형

Java 에서 Map 안의 요소 반복문으로 꺼내기.

package dev.jeaha.practice;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class MapIterationPractice {

  public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();

    map.put("k00", "v00");
    map.put("k01", "v01");
    map.put("k02", "v02");
    map.put("k03", "v03");
    map.put("k04", "v04");
    map.put("k05", "v05");
    map.put("k06", "v06");
    map.put("k07", "v07");
    map.put("k08", "v08");
    map.put("k09", "v09");
    map.put("k10", "v10");

    System.out.println(">>>> SOLUTION 01-1 <<<<");
    /**
     * Generic 미사용.
     * Java 버젼이 낮을 경우 사용할 수 있는 방법.
     */
    Iterator entries = map.entrySet().iterator();
    while( entries.hasNext() ) {
      Map.Entry entry = (Map.Entry) entries.next();
      String key = (String) entry.getKey();
      String val = (String) entry.getValue();
      System.out.println( String.format("key : %s, value : %s", key, val ) );
    }


    System.out.println("\n\n>>>> SOLUTION 01-2 <<<<");
    /**
     * Generic, Entry 사용
     */
    Iterator<Map.Entry<String, String>> entriex = map.entrySet().iterator();
    while( entriex.hasNext() ) {
      Map.Entry<String, String> entry = entriex.next();
      System.out.println( String.format("key : %s, value : %s", entry.getKey(), entry.getValue() ) );
    }

    System.out.println("\n\n>>>> SOLUTION 01-3 <<<<");
    /**
     * Generic 사용, Entry 미사용
     */
    Iterator<String> keys = map.keySet().iterator();
    while( keys.hasNext() ) {
      String key = keys.next();
      System.out.println( String.format("key : %s, value : %s", key, map.get(key)) );
    }

    System.out.println("\n\n>>>> SOLUTION 02 <<<<");
    /**
     * Entry에 for-each loop 사용.
     * 가장 일반적이고 많은 경우에 사용됨.
     * 반복문 안에서 key 값과 value 값이 전부 필요할 때 사용.
     * Java 1.5 이상부터 사용 가능. NullPointerException 발생 가능.
     */
    for( Map.Entry<String, String> entry : map.entrySet() ) {
      System.out.println( String.format("key : %s, value : %s", entry.getKey(), entry.getValue() ) );
    }

    System.out.println("\n\n>>>> SOLUTION 03 <<<<");
    /**
     * entry 대신에 key 값이나 value 값만 필요할 때 사용.
     * entrySet을 사용할 때보다 약 10% 빠르다고 함.
     */
    for( String key : map.keySet() ) {
      System.out.println( String.format("key : %s", key ) );
    }
    for( String value : map.values() ) {
      System.out.println( String.format("value : %s", value ) );
    }

    System.out.println("\n\n>>>> SOLUTION 04 <<<<");
    /**
     * 코드상으로는 깔끔해 보이지만 비효율 적이고 성능면에서 좋지 않은 방법.
     * key 값을 이용해서 value 를 찾는 과정에서 시간 소모가 많음.
     * SOLUTION 02에 비해 20~200% 성능 저하 유발.
     */
    for( String key : map.keySet() ) {
      System.out.println( String.format("key : %s, value : %s", key, map.get(key) ) );
    }

    System.out.println("\n\n>>>> SOLUTION 05 <<<<");
    /**
     * stream을 사용한 forEach.
     */
    map.entrySet()
    .stream()
    .forEach(System.out::println);

    System.out.println("\n\n>>>> SOLUTION 06 <<<<");
    /**
     * forEach 및 Lambda를 사용한 반복.
     * forEach() 내에서 람다 표현식 사용.
     */
    map.forEach( (key, val) -> {
      System.out.println( String.format("key : %s, value : %s", key, val ) );
    });
  }
}
728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] 문자열이 날짜 형식인지 확인하기  (0) 2021.10.18
[Java] 성능을 고려한 try-catch 문  (0) 2020.12.16
[JAVA] 구 버젼 설치  (0) 2020.11.02
[Java] ArrayList Sort  (0) 2020.05.22

DBeaver로 cubrid 연결하기

dbeaver 설정 파일을 연다.
dbeaver를 기본 설정으로 설치했다면 C:\Program Files\DBeaver에 위치한다.

C:\Program Files\DBeaver

 

마지막 줄에 다음 설정을 넣어준다.

-Dfile.encoding=utf8

dbeaver.ini

 

 

 

아니 근데 국산 DB 좀 안 썼으면 좋겠다.

728x90
반응형

'Database' 카테고리의 다른 글

락 걸린 테이블 확인 및 락 해제  (0) 2022.02.16
[DB] INDEX REBUILD  (0) 2021.01.07
[SQL] 계층 쿼리  (0) 2020.10.19
[MongoDB] 설치하기 (MacOS)  (0) 2020.05.18
[SQL] TIMESTAMP TO MILLIS  (0) 2020.04.09

네트워크 설정 및 점검

  • 학습 개요
    네트워크 인터페이스와 네트워킹과 관련이 있는 시스템 서비스를 확인해 보자.
    네트워크 설정을 확인하거나 설정을 바꾸는 명령을 학습하고 네트워크 설정 정보를 가지고 있는 파일에 관해 살펴보자.
    네트워크의 상태를 점검하는 명령의 기능과 사용법을 알아보자.

  • 학습 목표

    1. ifconfig 명령의 사용법과 출력 결과의 이해.
    2. 네트워크 설정 파일을 나열.
    3. 네트워크 상태를 점검하는 명령을 나열하고 설명.

네트워크 설정

네트워크 인터페이스

  • 컴퓨터와 네트워크 간의 연결을 제공하는 장치.
  • 네트워크 인터페이스 카드(NIC)에 위치함.
    • 랜(LAN) 카드 또는 이더넷(Ethernet) 카드라고도 불림.
  • 개별 네트워크 인터페이스 카드는 고정된 이더넷 주소(MAC ADDR)를 가지고 있으며 IP 주소를 할당 받을 수 있음.

ifconfig

  • 네트워크 인터페이스 정보를 확인하거나 설정하는 명령.

    • 이더넷 주소와 IP 주소를 확인할 수 있음.
    • 관리자는 IP 주소를 설정할 수 있음.
    • 네트워크 인터페이스 설정이나 통계를 확인할 수 있음.
      [ec2-user@AWS ~]$ ifconfig
      eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9001
            inet  172.31.0.0 (IP)  netmask 255.255.240.0 (class c의 주소)  broadcast 172.31.0.0
            inet6 0::0:0:0:0  prefixlen 64  scopeid 0x20<link>
            ether 0:0:0:0:0:0  txqueuelen 1000  (Ethernet)
            RX    packets 1516448  bytes 525514468 (501.1 MiB)
            RX    errors 0  dropped 0  overruns 0  frame 0
            TX    packets 1250885  bytes 169586125 (161.7 MiB)
            TX    errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
      lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
          inet  127.0.0.1  netmask 255.0.0.0
          inet6 ::1  prefixlen 128  scopeid 0x10<host>
          loop  txqueuelen 1000  (Local Loopback)
          RX    packets 12  bytes 848 (848.0 B)
          RX    errors 0  dropped 0  overruns 0  frame 0
          TX    packets 12  bytes 848 (848.0 B)
          TX    errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    • eth : 이더넷.
    • lo : (loop back interface) 같은 컴퓨터 내에서 가상의 네트워크 인터페이스.
  • ifconfig [-a] [interface]

    • 옵션 -a는 모든 네트워크 인터페이스에 대한 정보를 보여줌.
    • 네트워크 인터페이스를 지정하면 해당 정보만 보여줌.
  • ifconfig interface [IP_ADDR] [NETMASK_ADDR] [BROADCAST_ADDR] [UP|DOWN]

    • interface : 네트워크 이름(ex: eth0).
    • IP_ADDR : 설정하려는 IP 주소.
    • NETMASK_ADDR : 설정하려는 서브넷 마스크.
    • BROADCAST_ADDR : 설정하려는 브로드캐스트 주소.
    • UP | DOWN : 해당 네트워크 인터페이스를 활성화 또는 비활.

네트워킹 관련 서비스

  • network 서비스
    • 네트워킹의 사용을 위해 반드시 필요하며 네트워크 카드의 활/비활을 담당.
    • 부팅시 수행되는 /etc/rc.d/init.d/network 스크립트를 의미.
  • NetworkManager 서비스.
    • 네트워크 설정의 편리한 관리를 위해 필요.
      • 네트워크의 자동 연결 또는 네트워크 설정의 변경을 즉시 인지하여 처리함.
    • 부팅시 수행되는 /etc/re.d/init.d/NetworkManager 스크립트를 의미.

ifconfig 명령으로 확인 가능한 네트워크 인터페이스 정보

INFO DESC
MAC 주소 Ethernet H/W 주소 또는 어댑터 주소라고도 하며 48bit 구성
IP 주소 32bit 구성
broadcast 주소 같은 네트워크에 속한 모두에게 메세지를 보낼 때 사용하는 주소. ARP(Address Resolution Protocol), DHCP(Dynamic Host Configuration Protocol) 등에 사용
subnet mask 서브 네트워크의 범위를 나타내는 값
MTU 패킷의 최대 크기, 보통 1500
RX packets 받은 패킷 수
TX packets 보낸 패킷 수
RX bytes 받은 바이트 수
TX bytes 보낸 바이트 수
Interrupt 주소 인터럽트 주소

네트워크 관리를 위한 GUI

  • GNOME -> '시스템 > 기본 설정 > 네트워크 연결'
    • '네트워크 연결' 창이 나타남.
    • 여기서 네트워크 인터페이스 정보를 확인하거나 변경 가능.
    • 데스크톱 패널에서 NetworkManager 아이콘을 사용할 수 있음.

네트워크 설정 파일

  • 네트워크를 사용하기 위해 필요한 여러 가지 정보를 저장.
    • 네트워크 기능이 정확하게 동작하기 위해 필요함.
    • 여러 네트워크 설정 파일이 존재함.
  • 네트워크 설정 파일은 대부분 /etc 디렉토리에 위치함.
    • 또는 /etc/sysconfig 디렉토리에 위치함.
  • /etc/sysconfig/network-scripts/ 디렉토리에 존재하는 ifcfg-eth0과 같은 인터페이스 설정 파일도 있음.
    • 개별로 인터페이스에 대한 IP 주소, 넷마스크, 브로드캐스트 주소와 네트워트 파라미터를 설정.

/etc/sysconfig/network

  • 네트워킹의 활성화 여부, 호스트 명, 기본 게이트웨이 등 기본적 네트워크 설정을 포함한 파일
    • 모든 네트워크 인터페이스에 적용됨.
    • 파일을 변경했다면 네트워크 서비스나 시스템을 재시작해야 효과가 나타남.
  • 라인별로 설정할 대상과 값을 표시함
    •   NETWORKING=yes
        HOSTNAME=unix.knou.ac.kr
        GATEWAY=192.168.0.1
    • NETWORKING : ... 네트워크 설정이 되어 있으면 yes
    • HOSTNAME : ... 호스트명. 도메인명으로 나타냄
    • GATEWAY : ...는 기본 네트워크 게이트웨이의 IP 주소

/etc/resolv.conf

  • DNS 서버를 지정하며 사용할 도메인명과 도메인 검색 경로 등도 지정.
    • 네임서버 설정이 없으면 숫자로 된 IP 주소를 사용해야 함.
  • 라인 별로 설정할 대상과 값을 표시 함.
    nameserver 192.168.0.1
    nameserver 192.168.0.1
    domain jeaha.dev
    search jeaha.dev abc.dev asdf.dev
    • nameserver :
      • DNS 서버의 IP 주소를 지정.
      • 만약 DNS 서버를 추가로 설정할 경우에는 새로운 줄에 nameserver와 함께 IP 주소를 기록.
      • 첫 번째 네임 서버에 문제가 생기면 다음 네임서버를 사용 함.
    • domain :
      • 로컬 도메인명을 기록
    • search :
      • 불완전하게 호스트명만 사용하는 경우, 도메인명으로 사용할 수 있는 것을 설정.
        • 기본적으로 로컬 도메인명이 사용됨.
        • 빈칸을 구분하여 최대 6개까지 지정할 수 있음.

/etc/hosts

  • 호스트명과 IP 주소 및 별명을 설정한 파일.
    • 보통 첫 줄에 루프백 인터페이스에 대한 정보를 포함하고 있음.
    • 파일에 설정된 IP 주소는 DNS를 사용하지 않고 직접 전송함.
      127.0.0.1   localhost localhost.localdomain
      192.168.0.1 www.jeaha.dev

/etc/hosts.allow

  • host.deny 파일과 함께 '호스트 엑세스 제어 파일'이라 함.
  • 현재 시스템의 TCP/IP 서비스를 이용할 수 있는 호스트들을 설정.
  • 라인 별로 서비스와 호스트를 지정함
      sshd: 12.34.56.67, 192.168.0.
      httpd: ALL

/etc/hosts.deny

  • 현재 시스템의 TCP/IP 서비스를 이용할 수 없는 호스트들을 설정함
      sshd: 12.34.56.77
      in.telnetd: ALL
  • 두 파일 /etc/hosts.allow와 /etc/hosts.deny가 모두 있는 경우는 다음과 같이 처리 됨.
    • 우선 hosts.allow 파일 검사.
    • 매칭이 발생하면 첫 번째 것을 따름.
    • 두 파일에서 모두 매칭이 일어나지 않으면 허용 됨.

네트워크 점검

ping

  • ICMP(Internet Control Message Protocol)의 에코(echo)를 이용하여
    원격 호스트와의 연결 여부와 네트워크 상태 정보를 점검함.
  • ping [option] destination
    • destination은 호스트명 또는 IP 주소
    • 보낸 패킷 수(packet transmitted), 받은 패킷 수(received),
      유실된 패킷 수(packet loss), 응답 속도 등을 알 수 있음.
  • OPTION
    • -c count : 에코를 보내는 횟수 지정.
    • -i interval : 패킷을 보내는 간격(초)를 지정. 기본값은 1
    • -w deadline : ping 명령을 종료하는 시간(초)를 지정.

arp

  • 같은 네트워크에 있는 호스트들의 MAC 주소, IP 주소, 인터페이스 이름을 확인하는 명령
  • arp [hostname] || arp -a [hostname]
    • 인수 없는 arp 는 현재 같은 네트워크에 연결 되어 있는 시스템의 MAC 주소와 IP 주소를 출력
      • ARP 캐시 정보를 보여주는 것으로 /proc/net/arp 파일의 내용을 보여줌.

traceroute

  • 현재 호스트에서 특정 호스트까지 통신이 이루어지는 경로를 확인함.
    • IP 패킷에서 hop을 지날 때마다 ttl(time to live) 값이 줄어드는 성질을 이용.
    • 대상 호스트까지의 통신 가능 여부, hop 수, 지연 구간 등을 확인할 수 있음.
  • traceroute [option] hostname
OPTIONS DESC
-I ICMP의 에코를 이용하여 경로를 확인한다.
-T TCP의 SYN을 이용하여 경로를 확인한다.
-m max_ttl hop 수가 max_ttl을 넘지 않을 때까지만 경로를 확인한다. 기본값 30.
-q nqueries 각 hop에서 nqueries 번씩 패킷을 보냄. 기본값 3.

route

  • IP 라우팅 테이블을 설정하거나 확인하는 명령.

  • 단순한 route 명령은 라우팅 테이블의 내용을 출력함.

    • netstat -r 과 같음.
  • 라우팅 테이블을 편집할 수 있음.

    • 지정된 호스트를 라우팅 테이블에 추가하거나 삭제함.
    • route add [-net|-host] target [netmask, ...] [gw ..] ...
    • route del [-net|-host] target [netmask, ...] [gw ..] ...
    • target은 호스트명 또는 IP 주소
  • route 실행 예

      [ec2-user@ip-AWS ~]$ route
      Kernel IP routing table
    
      Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
      default         ip-172-xx-xx-1. 0.0.0.0         UG    0      0        0 eth0
      instance-data.a 0.0.0.0         255.255.255.255 UH    0      0        0 eth0
      172.xx.xx.0     0.0.0.0         255.255.240.0   U     0      0        0 eth0
    
  • 항목의 의미

    • Destination : 목적지 네트워크
    • Gateway: 목적지에 도달하는 데 사용되는 게이트웨이
    • Genmask : Netmask를 의미
    • Flags : 경로의 특징
    • Metric : 목적지까지의 거리
    • Ref : 접속을 이루려고 참조된 경로 횟수
    • Use : 이 경로를 통해 전송된 패킷 수
    • Iface : 사용되는 네트워크 인터페이스 이름

netstat

  • 네트워크 상태에 관한 정보를 출력하는 명령
    • 네트워크 인터페이스 정보, 네트워크 연결 상태, 시스템 라우팅 테이블, 프로토콜멸 네트워크 통계, 멀티 캐스팅 등을 확인할 수 있음.
  • netstat [options]
OPTIONS DESC
-i 인터페이스의 정보 출력
-a 모든 소켓을 출력
-l liseten 하는 소켓을 출력
-p 소켓의 프로그램명과 PID 를 출력
-r 라우팅 테이블을 출력
-t 활성화된 TCP 소켓을 출력
-u 활성화 된 UDP 소켓을 출력

nslookup

  • DNS 서버를 이용하여 호스트이 IP 주소를 확인함.
  • nslookup [hostname]
    • hostname에 대한 IP주소를 보여 줌.
    • hostname을 생략하면 대화식으로 사용 가능.(exit으로 종료)
  • host 또는 dig 명령과 유사함.
➜ nslookup www.knou.ac.kr
Server:         xxx.xxx.xxx.xxx
Address:        xxx.xxx.xxx.xxx#53

Non-authoritative answer:
Name:   www.knou.ac.kr
Address: 203.232.172.70
728x90
반응형

'OS > Linux' 카테고리의 다른 글

[Linux] 웹 서버  (0) 2020.12.13
[Linux] 원격 관리  (0) 2020.12.13
[Linux] 쉘 스크립트 -2  (0) 2020.11.08
[Linux] 소프트웨어 관리  (0) 2020.11.01
[Linux] 프로세스 관리  (0) 2020.11.01

Exception starting filter Set Character Encoding

새 프로젝트를 인계 받고 톰캣을 시작하니 아래와 같은 에러가 발생했다.

  12월 01, 2020 14:01:47 오전 org.apache.catalina.core.StandardContext filterStart
  심각: Exception starting filter Set Character Encoding
  java.lang.ClassNotFoundException: filters.SetCharacterEncodingFilter
  at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
  at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
    ... 생략 ...

java.lang.ClassNotFoundException: filters.SetCharacterEncodingFilter

말 그대로 xml에서 사용하는 해당 클래스가 없다는 건데, 구글링 하니 의미없는 class raw 파일만 올려놓거나 project의 web.xml을 수정 하라는 등의 부정확한 해결 방법을 올려놓기만 했길래 내가 찾은 방법도 올려본다.

해결 방법 1

해당 프로젝트 우클릭 properties -> Deployment Assembly -> Add -> Java Build Path Entries -> next -> apply
하지만 이 방법이 안 통할 경우도 있다.

해결 방법 2

  1. Project Explorer 에서 Servers -> 해당 프로젝트를 구동하는 tomcat -> web.xml 열기
  2. Set Character Encoding을 찾는다.
  3. 해당 내용을 주석 처리 후 다음 내용을 넣는다.
<filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

728x90
반응형

Webpack과 Babel 그리고 Polyfill

client side 개발을 위해 구글링 하다 보면, 자주 듣는 이름들이 있다.
깊은 설명은 못하고 간단하게 기록해 본다.

Webpack

웹팩은 의존성을 분석해 모듈들을 하나의 파일로 번들링 시켜주는 역할을 한다.
프로젝트를 개발하다 보면 client side 에서 많은 js 파일을 include 혹은 import 하게 되는데,
이런 파일들이 많으면 브라우져에서 렌더링하기 전까지 요청해야 하는 파일이 많아 지게 된다.
프로젝트의 구조를 분석하고, 자바스크립트 모듈과 css, image 등 여러 리소스들을 번들로 묶어 패킹하는
모듈 번들러(Module Bundler)이다.

Babel

바벨은 최신 JS 문법을 구형 브라우져(IE 라던지, IE 같은, IE들)에서도 작동할 수 있도록 코드 자체를 변환시키는 역할을 한다.
최신 문법을 구형 문법으로 변환 하는 일종의 compiler 혹은 transpiler.

바벨 테스트 하러 가기

Polyfill

폴리필은 js run-time에 필요한 기능을 주입하는 역할을 한다.
Babel이 코드를 구 브라우져에서 사용가능하게 변환하지만, ES5 이상에서 추가된 Promise, Map, Set과 같은 전역 객체나, Array.find, Array.filter 등 전역 객체에 추가된 메소드등을 실행 환경에서 제공하는 역할을 한다.


세가지 모두 npm 환경의 nodejs나 react에서 주로 사용하지만, Spring / jsp 환경에서도 위 기능을 필요한 경우가 있다.
이를 위해 Babel에서 browser.js 라는걸 지원 한적이 있고, 가장 최신은 bablel-standalone이 있는 것으로 알고 있다.

<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"
integrity="sha512-kp7YHLxuJDJcOzStgd6vtpxr4ZU9kjn77e6dBsivSz+pUuAuMlE2UTdKB7jjsWT84qbS8kdCWHPETnP/ctrFsA=="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.12.1/polyfill.min.js"></script>
<script type="text/babel" data-presets="es2015">
  const a = (b) => {console.log( b );};
  a('asdf');

  const testTmplt = obj => {
    return `name : ${obj.name} age : ${obj.age}`;
  }
  
  const tmpRes = testTmplt({name:'asdf', age: 10});
  
  const ttTgt = document.getElementById('testTarget');
  ttTgt.innerText = tmpRes;
</script>
 

728x90
반응형

'WEB > CLIENT_SIDE' 카테고리의 다른 글

[성능 측정] Google Lighthouse  (0) 2024.04.01
[FE] 이벤트 버블링 (Event Bubbling)  (0) 2023.07.14

[JSP, JSTL] fn function 정리

jstl function (jstl fn) 정리

jsp 파일 최 생단에 다음과 같이 jstl functions를 사용하겠다고 선언 해야 함.

  <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

함수들은 단독으로 사용할 수 없고 EL 표현식과 함께 사용해야 함.

  ${fn:length(list)}
  ${fn:contains(str, str)}

fn:contains(string, substr)

string이 substr을 포함하면 return true

fn:containsIgnoreCase(string, substr)

대소문자 관계없이 string이 substr을 포함하면 return true

fn:startsWith(string, prefix)

string이 prefix로 시작하면 return True

fn:endsWith(string, suffix)

string이 suffix로 끝나면 return True

fn:escapeXml(string)

string에 XML과 HTML에서 < >& ' " 문자들이 있으면, XML엔티티 코드로 바꿔준뒤 문자열 반환

fn:indexOf(string, substr)

string에서 substr이 처음으로 나타나는 인덱스 반환

fn:split(string, separator)

string내의 문자열 separetor에 따라 나눈 배열로 반환

fn:join(array, separator)

array요소들을 separator를 구분자로 하여 연결해서 반환

fn:length(item)

item이 배열이나 컬렉션이면 요소의 개수를 문자열이면 문자의 개수를 반환

fn:replace(string, before, after)

string내에 있는 before 문자열을 after 문자열로 모두 변경해서 반환

fn:substring(string, begin, end)

string에서 begin인덱스에서 시작해서 end인덱스에 끝나는 부분의 문자열 반환

fn:substringAfter(string, substr)

string에서 substr이 나타나는 이후의 문자열 반환

fn:substringBefore(string, substr)

string에서 substr이 나타나는 이전의 문자열 반환

fn:toLowerCase(string)

string을 모두 소문자로 변경 후 리턴

fn:toUpperCase(string)

string을 모두 대문자로 변경 후 리턴

fn:trim(string)

string앞뒤의 공백을 모두 제거한 후 반환

728x90
반응형

[JSP, JSTL] forEach 잘 사용하기

Spring 개발을 하다 보면 jstl 의 forEach 를 많이 사용하게 된다.

간단하지만 varStatus 속성 사용을 잘 하면 보다 편하게 개발할 수 있는것 같아서 남겨본다.


<c:forEach items="${list}" var="item" varStatu="i">
  current (현재 객체)       : ${i.current}<br/>
  index (0부터의 순서)      : ${i.index}<br/>
  count (1부터의 순서)      : ${i.count}<br/>
  first (루프의 처음인가)   : ${i.first}<br/>
  last (루프의 마지막인가)  : ${i.last}<br/>
  begin (루프의 시작값)     : ${i.begin}<br/>
  end (끝값)                : ${i.end}<br/>
  step (증가값)             : ${i.step}<br/>
</c:forEach\>
728x90
반응형

+ Recent posts