기존에 무한스크롤링으로 되어있던 상품리스트 페이지를 페이지네이션으로 바꿔야할 일이 생겨서 오랜만에 페이지네이션을 공부하게되었다.

 

현재 페이지 번호와 데이터 전체 수를 파라미터로 받아서 front로 보낼 수 있도록 함수를 구현했다.


private void getGoodsPaging(Map<String, Object> params, Map<String, Object> result){
    int page = params.getInt("page"); //현재 페이지 (get)
    int totalCount = params.getInt("totalCount"); //row 전체의 수 (get)
    int beginPage;  //출력 시작
    int endPage;    //출력 끝
    int displayRow = params.getInt("pageSize");  //한 페이지에 몇 개의 데이터 (선택 set)
    int displayPage = params.getInt("displayPageSize");  //한 페이지에 몇 번의 페이지까지 (선택 set)
    boolean prev; //prev 버튼이 보일건지 안보일건지
    boolean next; //next 버튼이 보일건지 안보일건지

    endPage = ((int) Math.ceil(page / (double) displayPage)) * displayPage;
    beginPage = endPage - (displayPage - 1);
    int totalPage = (int) Math.ceil(totalCount / (double) displayRow);
    if (totalPage <= endPage) {
        endPage = totalPage;
        next = false;
    } else {
        next = true;
    }
    prev = (beginPage == 1) ? false : true;

    result.put("beginPage", beginPage);
    result.put("endPage", endPage);
    result.put("next", next);
    result.put("prev", prev);
}

회사에서 input값에 'javascript:test()' 등의 값을 입력할 일이 있었는데

저장을 할 때 '가 &#39;로 출력되어서 찾아보니 Lucy-xss-filter-servlet에서 모든 요청 파라미터에 대해 기본적인 XSS 방어 필터링을 수행하고 있었다.

 

XSS(Cross Site Scripting)

먼저 XSS란, SQL injection과 함께 웹 상에서 가장 기초적인 취약점 공격 방법의 일종으로, 악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법을 말한다. 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며, 보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취한다.

 

Overview

이 라이브러리는 기존의 lucy-xss-filter를 사용해도 여전히 아래와 같은 사유로 XSS 공격에 시달리고 있어 이에 대한 해결책으로 등장한 자바 서블릿 필터 기반의 라이브러리 입니다.

  • 필요한 곳에 XSS 방어코드 누락
  • 불필요한 곳에 XSS 방어코드가 적용되는 경우
  • 여기저기 XSS 방어코드가 혼재되어 유지보수 비용 증가

Lucy-Xss-Servlet-Filter는 웹어플리케이션으로 들어오는 모든 요청 파라메터에 대해 기본적으로 XSS 방어 필터링을 수행하며 아래와 같은 필터링을 제외할 수 있는 효과적인 설정을 제공합니다.

  • 설정한 url 필터링 제외
  • 설정한 prefix로 시작하는 파라메터 필터링 제외
  • 설정한 파라메터 필터링 제외

Lucy-Xss-Servlet-Filter를 적용하게 되면 아래와 같은 장단점이 있습니다.

  • XML 설정 만으로 XSS 방어가 가능해짐
  • 비지니스 레이어의 코드 수정이 발생하지 않음
  • 개발자가 XSS 방어를 신경 쓰지 않아도 됨
  • XSS 방어가 누락되지 않음
  • 설정 파일 하나로 XSS 방어절차가 파악됨
  • 파라메터명에 대해 관리가 필요해짐
  • 일괄 적용되어 영향 받기 때문에 정확한 필터링 룰 정의가 중요함

Release Information

<dependency>
	<groupId>com.navercorp.lucy</groupId>
	<artifactId>lucy-xss-servlet</artifactId>
	<version>2.0.0</version>
</dependency>

Getting started

<filter>
	<filter-name>xssEscapeServletFilter</filter-name>
	<filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>xssEscapeServletFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

web.xml example

...
<!-- xssEscapeServletFilter는 CharacterEncodingFilter 뒤에 위치해야 한다. -->
<filter>
	<filter-name>encodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>encodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
	<filter-name>xssEscapeServletFilter</filter-name>
	<filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>xssEscapeServletFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
...
  • /resource 폴더 내에 "lucy-xss-servlet-filter-rule.xml" 파일을 생성
  • lucy-xss-servlet-filter-rule.xml 필터링 룰 작성

lucy-xss-servlet-filter-rule.xml example

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.navercorp.com/lucy-xss-servlet">
   <defenders>
       <!-- XssPreventer 등록 -->
       <defender>
           <name>xssPreventerDefender</name>
           <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssPreventerDefender</class>
       </defender>

       <!-- XssSaxFilter 등록 -->
       <defender>
           <name>xssSaxFilterDefender</name>
           <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssSaxFilterDefender</class>
           <init-param>
               <param-value>lucy-xss-sax.xml</param-value>   <!-- lucy-xss-filter의 sax용 설정파일 -->
               <param-value>false</param-value>        <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 -->
           </init-param>
       </defender>

       <!-- XssFilter 등록 -->
       <defender>
           <name>xssFilterDefender</name>
           <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssFilterDefender</class>
           <init-param>
               <param-value>lucy-xss.xml</param-value>    <!-- lucy-xss-filter의 dom용 설정파일 -->
               <param-value>false</param-value>         <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 -->
           </init-param>
       </defender>
   </defenders>

    <!-- default defender 선언, 별다른 defender 선언이 없으면 default defender를 사용해 필터링 한다. -->
    <default>
        <defender>xssPreventerDefender</defender>
    </default>

    <!-- global 필터링 룰 선언 -->
    <global>
        <!-- 모든 url에서 들어오는 globalParameter 파라메터는 필터링 되지 않으며 
                또한 globalPrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. -->
        <params>
            <param name="globalParameter" useDefender="false" />
            <param name="globalPrefixParameter" usePrefix="true" useDefender="false" />
        </params>
    </global>

    <!-- url 별 필터링 룰 선언 -->
    <url-rule-set>
       
       <!-- url disable이 true이면 지정한 url 내의 모든 파라메터는 필터링 되지 않는다. -->
       <url-rule>
           <url disable="true">/disableUrl1.do</url>
       </url-rule>
       
        <!-- url1 내의 url1Parameter는 필터링 되지 않으며 또한 url1PrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. -->
        <url-rule>
            <url>/url1.do</url>
            <params>
                <param name="url1Parameter" useDefender="false" />
                <param name="url1PrefixParameter" usePrefix="true" useDefender="false" />
            </params>
        </url-rule>
        
        <!-- url2 내의 url2Parameter1만 필터링 되지 않으며 url2Parameter2는 xssSaxFilterDefender를 사용해 필터링 한다.  -->
        <url-rule>
            <url>/url2.do</url>
            <params>
                <param name="url2Parameter1" useDefender="false" />
                <param name="url2Parameter2">
                    <defender>xssSaxFilterDefender</defender>
                </param>
            </params>
        </url-rule>
    </url-rule-set>
</config>

자세한 사용방법은 아래를 참고해 주세요

출처 : https://github.com/naver/lucy-xss-servlet-filter

 

GitHub - naver/lucy-xss-servlet-filter

Contribute to naver/lucy-xss-servlet-filter development by creating an account on GitHub.

github.com

 

- java에서 치환방법 예시

//java에서 치환방법 예시
//ex) input = <script>
String msg   = request.getParameter("input");    //&lt;script&gt;
String convertMsg = XssPreventer.unescape(msg);//<script>

단, form데이터로 넘긴 데이터만 적용이 가능하고 JSON으로 넘긴 데이터는 적용이 안된다고 하는데 확인이 필요해 보인다.

1. 뷰이름의 명시적 지정

ModelAndView 나 String을 리턴해야한다. 

(ModelAndView를 리턴해서 뷰를 지정하는 예)

 

@RequestMapping("index.do")

 public ModelAndView index() {

    ModelAndView mav = new ModelAndView("index");

    ....

    return mav;

  }


ModelAndView를 리턴할 경우 ModelAndView 클래스의 생성자나 setViewName() 메서드를 이용해서 뷰 이름을 지정할 수 있다.

위 코드는 ModelAndView 클래스의 생성자를 이용해서 뷰 이름을 지정하고 있다. 다음과 같이 setViewName()메서드를 사용해도 된다.

 

ModelAndView mav = new ModelAndView();

 mav.setViewName("search/game");

 

String 타입을 리턴할 경우, 문자열 값이 뷰 이름으로 사용된다. 아래 코드는 String 을 리턴하는 예를 보여주고 있다. 아래 코드는 보여줄 뷰 이름으로 "help/main" 을 지정하고 있다.

 

@RequestMapping("/help/main.do")

 public String helpMain("ModelMap model){

   ...

   return "help/main";

}

 

2. 뷰 이름 자동 지정

다음의 경우는 RequestToNameTranslator를 이용해서 URL 로부터 뷰 이름을 결정한다.

◎ 리턴 타입이 Model이나 Map일경우

◎ 리턴 타입이 void 이면서 ServletResponse나 HttpservletResponse 타입의 파라미터가 없는 경우

 

스프링 설정 파일에 RequestToViewNameTranslator 빈이 존재하지 않을 경우 기본적으로 DefaultRequestToViewNameTranslator 를 사용한다. 이 클래스는 요청 URI 부터 맨 앞의 슬래시와 확장자를 제외한 나머지 부분을 뷰 이름으로 사용한다. (더 정확하게는 전체 경로를 사용하지 않도록 설정한 경우 서블릿 경로를 제외한 나머지 경로가 사용된다.) 

 

@RequestMapping("/search/game2.do")

public Map<Sttring, Object> search() {

    HashMap<String, Object> model = new HashMap<String, Object>();

    ....

    return model;

}

 

위 코드는 뷰에 전달할 모델 데이터를 갖고 있는 Map을 리턴하고 있다. 이 경우 ReqeustToViewTranslator를 이용해서 결과를 보여줄 뷰 이름을 결정하게 되는데 ,DefaultRequestToViewNameTranslator가 사용될 경우 다음과 같이 URL로 부터 뷰 이름이 결정된다.

 

/search/game2.do   --> search/game2

 

전체 경로 사용 여부에 따라서 뷰 이름이 결정되는 방식이 달라진다.

리다이렉트 뷰

뷰 이름에 "redirect:" 접두어를 붙이면. 지정한 페이지로 리다이렉트 된다. 리다이렉트 URL은 다음과 같이 두 가지 방식으로 입력할 수 있다.

 

◎ redirect : /bbs/list - 현재 서블릿 컨텍스트에 대한 상대적인 경로로 리다이렉트

◎redirect:http://host/bbs/list - 지정한 절대 URL로 리다이렉트

 

아래 코드는 'redirect:" 접두어를 사용하여 뷰 이름을 지정한 예이다.

 

ModelAndView mav = mew ModelAndView();

mav.setViewName("redirect:/error.do");

return mav;

 

redirect: 접두어는 UrlBasedViewResolver 클래스르 상속받은 ViewResolver에서 올바르게 처리된다.InternalResourceViewResolver나 VelocityViewResolver와 같이 주로 사용되는 VieiwResolver는 UrlBasedViewResolver 클래스를 상속받고 있기 때문에 모두 redirect:접두어를 지원하고 있다.

 

 Map, Model ,ModelMap을 통한 모델설정

Map,Model,ModelMap을 이용하면 뷰에 전달할 모델을 생성할 수 있따. 첫 번째 방법은 이들 세 가지 타입 중 한가지를 파라미터로 전달받는 것이다.

 

@RequestMapping("/search1.do")

public String search1(Map model){

model.put("result", searchResult);

...

}

@RequestMapping("/search2.do")

public String search1(Model model){

   model.addAttribute("result", searchResult);

  ...

 }

@ResultMapping("/search3.do")

public String1(ModelMap model){

   model.addAttribute("result", searchResult);

  ...

}

 

Map, Model, ModelMap을 파라미터로 전달받는 경우, 이들이 제공하는 메서드를 이용해서 모델 데이터를 추가할수 있다.

두 번째 방법은 Map과 Model을 리턴하는 것이다. 이 둘은 모두 인터페이스이기 때문에 실제로는 인터페이스를 구현한 클래스의 객체를 생성해서 리턴하면된다.

사용예)

 

 

 

Spring은  org.springframework.ui.Model 인터페이스의 구현 클래스인 ExtendedModelMap 클래스를 동일한 패키지에 제공하고 있으므로, ExtendedModelMap 클래스를 이용해서 모델을 설정하면된다. Map의 경우 많이 사용하는 java.util.HashMap 클래스를 이용해서 모델을 설정한다.

Model 인터페이스의 주요 메서드

org.springframework.ui.Model 인터페이스는 모델을 설정할 수 있도록 다음과 같은 메서드를 제공한다.

 

◎ ModeladdAttriibute(String name, Object value)

value 객체를 name 이름으로 추가한다. 뷰 코드에는 name으로 지정한 이름을 통해서 value를 사용한다.

 

◎ ModeladdAttribute(object value)

value를 추가한다. value의 패키지 이름을 제외한 단순  클래스 이름을 모델이름으로 사용한다. 이 떄 첫 글자는 소문자로 처리한다.

value가 배열이거나 콜렉션인 경우  첫 번째 원소의 클래스 이름뒤에 "List" 를 붙일 걸 모델이름으로 사용한다. 이 경우에도 클래스 이름의 첫글자는 소문자로 처리한다.

 

◎ModeladdAllAttributes(Collection<?> values)

addAttribute(Object value)) 메서드를 이용해서 콜렉션에 포함된 객체들을 차례대로 추가한다.

 

◎ModeladdAllAttributes(Map<String,?> attributes)
Map에 포함된 <키,값>에 대해 키를 모델 이름으로 사용해서 값을 모델로 추가한다.

 

◎Model mergeAttributes(Map<String,?> attributes)

Map에 포함된 <키,값>을 현재 모델에 추가한다. 단. 키와 동일한 이름을 갖는 모델 객체가 존재하지 않는 경우에만 추가한다.

 

◎Boolean containsAttributes(String name) 

지정한 이름의 도델 객체를 포함하고 있는 경우 true를 리턴한다.

 

ModelAndView 를 통한 모델 설정

객체생성방법

ModelAndView 객체 생성은 setViewName(String viewName) 메서드를 이용해서 뷰 이름을 설정하고, addObject(String name, Object value) 메서드를 이용해 뷰에 전달할 값을 추가하는 것이다.

 

@RequestMapping("/search/game.do")

public ModelAndView search(SearchCommand command){

   ...

   ModelAndView mav = new ModelAndView();

   mav.setViewName("search/game");

   mav.addObject("searchResult", searchResult);

   mav.addObject("searchTypeList", typeList);

   return mav;

  }

 

Map에 저장된 <키,값> 쌍 전체를 뷰에 전달할 값으로 ModelAndView 객체에 추가하고 싶다면 다음과 같이 addAllObjects(Map modelMap) 메서드를 사용하면 된다.

 

Map referenceMap = referenceDate();

mav.addAllObjects(referenceMap);

 

생성자를 사용해서 뷰 이름과 Map을 전달할 수도 있다.

 

Map referenceMap = referenceDate();

return new ModelAndView("search/game", referenceMap);

 

뷰에 전달할 객체가 한 개 뿐이라면 다음과 같은 생성자를 이용해서 코드 분량을 줄일수 있을 것이다.

 

return new ModelAndView("search/game","result", searchResult);

 

[출처] 뷰 이름 명시적 지정 :ModelAndView와 String 리턴 타입|작성자 시아

가끔 svn에서 checkout을 하고나서 프로젝트는 잘 실행이 되는데

 

프로젝트에 빨간색 엑프표시가 뜨는 경우가 있었다.

 

프로젝트에 빨간색 엑스표시

 

프로젝트를 실행하는데는 문제가 없지만 거슬리기에 문제를  해결해보았다.

 

보통은 톰캣의 버전이 Project Facet 설정과 맞지 않아서 발생하는 문제이다.

 

그러면 프로젝트의 Properties -> Project Facet 를 열어본다.

 

 

그리고 빨간색 표시에 Runtimes를 눌러준다.

 

 

그리고나서 Apache Tomcat에 맞는 버전을 체크해주고 Apply and Close를 눌러주면

 

프로젝트에 빨간색 표시가 없어진다!!

'트러블슈팅' 카테고리의 다른 글

[Tomcat 오류] May be locked by another process  (0) 2020.05.30

회사에서 MySQL(MariaDB), Oracle, MSSQL을 다 사용하다보니

 

MyBatis에서 like를 사용할때 처리하는 방법이

 

다 제각각이기에 정리를 해보았다.

 

[기본]

title like '%keyword%'


[MySQL]
title like CONCAT('%',#{keyword},'%')


[Oracle]
title like '%' ||  #{keyword} || '%'


[MSSQL]
title like '%' + #{keyword} + '%'

'DB' 카테고리의 다른 글

[MyBatis] 동적쿼리 foreach문  (0) 2020.06.13
[DB] Join의 종류  (0) 2020.05.30
[My-SQL] 날짜관련 함수 모음  (0) 2020.05.30

예를들어, DB에 insert를 10개 한다하면 나는 serviceimpl에서 for문을 10번 돌려가면서

 

insert를 했었다. 그러다보니 코드도 지저분해지는 것이 보이고 하여 MyBatis foreach를 접하게되었다.

 

MyBatis foreach문 지원 태그

 

collection : 전달받은 인자. List or Array 형태만 가능

item : 전달받은 인자 값을 alias 명으로 대체

open : 구문이 시작될때 삽입할 문자열

close : 구문이 종료될때 삽입할 문자열

separator : 반복 되는 사이에 출력할 문자열

index : 반복되는 구문 번호이다. 0부터 순차적으로 증가

 

예시)

1. 배열을 Map에 넣어 데이터를 보낼경우(mapper.xml에서 Collection은 DAO 변수와 일치시켜줘야한다!)

//DAO
public List<Members> getDeptList(String[] memArray) {
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("memArray",memArray);
		return sqlSession.selectList("getDeptList", map);
}
<!-- mapper.xml -->
<select id="getDeptList"  resultType="members">
SELECT * FROM members m
JOIN dept d ON m.dept_name = d.dept_name
WHERE m.emp_seq IN
<foreach collection="memArray" item="arr" open="(" close=")" separator=",">
 #{arr}
</foreach>
ORDER BY m.emp_seq;
</select>

 

2. 배열을 직접 보낼경우(mapper.xml에서 Collection은 array로 작성해야한다!)

//DAO
public List<Members> getDeptList(String[] memArray) {
		return sqlSession.selectList("getDeptList", memArray);
}
<!-- mapper.xml -->
<select id="getDeptList"  resultType="members">
SELECT * FROM members m
JOIN dept d ON m.dept_name = d.dept_name
WHERE m.emp_seq IN
<foreach collection="array" item="arr" open="(" close=")" separator=",">
 #{arr}
</foreach>
ORDER BY m.emp_seq;
</select>

 

3. List를 Map에 넣어 데이터를 보낼경우(mapper.xml에서 Collection은 DAO 변수와 일치시켜줘야한다!)

//DAO
public List<Members> getDeptList(List<Members> empList) {
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("empList",empList);
		return sqlSession.selectList("getDeptList", map);
}
<!-- mapper.xml -->
<select id="getDeptList"  resultType="members">
SELECT * FROM members m
JOIN dept d ON m.dept_name = d.dept_name
WHERE m.emp_seq IN
<foreach collection="empList" item="list" open="(" close=")" separator=",">
 #{list.emp_seq}
</foreach>
ORDER BY m.emp_seq;
</select>

 

4. 리스트를 직접 보낼경우(mapper.xml에서 Collection은 list로 작성해야한다!)

//DAO
public List<Members> getDeptList(List<Members> empList) {
		return sqlSession.selectList("getDeptList", empList);
}
<!-- mapper.xml -->
<select id="getDeptList"  resultType="members">
SELECT * FROM members m
JOIN dept d ON m.dept_name = d.dept_name
WHERE m.emp_seq IN
<foreach collection="list" item="item" open="(" close=")" separator=",">
 #{item.emp_seq}
</foreach>
ORDER BY m.emp_seq;
</select>

'DB' 카테고리의 다른 글

[MyBatis] RDBMS별 like 검색처리 방법  (0) 2020.06.13
[DB] Join의 종류  (0) 2020.05.30
[My-SQL] 날짜관련 함수 모음  (0) 2020.05.30

그냥 List를 쓰면 더 편하지만

 

가끔 배열을 사용해야할때가 있다. 이번에 프로젝트를 하면서 문자열을 ,로 split하여

 

갖고온 데이터를 배열에 넣어서 합쳐야할 상황이 있었다.

 

그래서 배열을 하나로 합치는 System.arraycopy를 포스팅합니다.

 

 //영업부서 지원부서번호 다 가져옴
ArrayList<Map<String, Object>> getDeptList = (ArrayList<Map<String, Object>>) workEvaluationDAO.getTargetDeptList(getDept);

String[] strArr = ((String) getDeptList.get(0).get("target_seq_array")).split(",");
String[] strArr2 = ((String) getDeptList.get(1).get("target_seq_array")).split(",");
String[] strAdd = new String[strArr.length+strArr2.length];

System.arraycopy(strArr, 0, strAdd, 0, strArr.length);
System.arraycopy(strArr2, 0, strAdd, strArr.length, strArr2.length);

String temp = "AND (";

for(int i=0; i<strAdd.length; i++) {
    if(i!=strAdd.length-1) {
        temp += " AA.dept_seq = "+strAdd[i] + " or ";
    }else {
        temp += " AA.dept_seq = "+strAdd[i];
    }
}

temp += ")";

 

두개의 상위부서에있는 하위 부서들의 번호를 다 가져오고 이를 하나의 배열로 만드는 작업이었다.

 

그리고 그 하위 부서들의 번호를 가지고 동적 쿼리에 적용했었다.(좋지 않은 방법이긴 하지만 떠오른는 방법이 없었다...)

 

System.arraycopy는 자바 배열의 갑승ㄹ 복사할 경우 사용한다.

 

형식 : arraycopy(Object arr, int arrStart, object resultArr, int resultStart, length)

 

파라미터 :

    arr = 복사하고자 하는 배열

    arrStart = arr의 복사를 어디서부터 할것인지

    resultArr = 복사한 배열을 넣을 배열

    resultStart = resultArr의 어디부터 넣을것인지

    length = 복사하고자 하는 배열의 요소 갯수

'Java' 카테고리의 다른 글

[Java] 페이지네이션 함수 만들기  (0) 2022.09.09
[Java]Lucy-xss-filter-servlet 적용하기  (0) 2022.08.02
[Java] ModelAndView와 String 리턴  (0) 2020.06.16

아무래도 회사에서 그룹웨어 쪽을 많이 하다보니

 

특정 날짜가 무슨 요일인지 구해야 하는 경우가 종종 있었다.

 

function getDayOfWeek(날짜문자열){ //ex) getDayOfWeek('2022-06-13')

    const week = ['일', '월', '화', '수', '목', '금', '토'];

    const dayOfWeek = week[new Date(날짜문자열).getDay()];

    return dayOfWeek;

}

 

getDayOfWeek() 메소드는 날짜 문자열을 Date 객체로 만들어서 Date 객체의 이 날짜가 무슨 요일인지 숫자 값으로 반환합니다.

 

getDay가 반환하는 요일 값의 범위는 일요일(0) 부터 토요일(6) 입니다.

 

이렇게 함수로 만들어놓으면 필요할때 바로바로 사용할 수 있습니다.

 

어려운 함수는 아니지만 자주쓰는것 같기에 포스팅 합니다.

'Javascript' 카테고리의 다른 글

[jQuery] jQuery 셀렉터 모음  (0) 2020.05.30

+ Recent posts