'전체 글'에 해당되는 글 384건

  1. 2019.10.02 Git 사용법
  2. 2019.09.30 1일차
  3. 2019.09.26 IBSheet 그리드 특강
  4. 2019.09.26 DB모델링실습 - 인사평가시스템
  5. 2019.09.25 DB모델링실습 - 도서관리, PC제조판매
  6. 2019.09.24 DB모델링실습 - 제조판매관리시스템, 중고장터관리
  7. 2019.09.23 DB모델링실습 - 제품관리, 주문배송관리
  8. 2019.09.20 DB모델링실습 - 강좌, 보험회사, 학교
  9. 2019.09.18 정규표현식의 개념과 기초 문법 4
  10. 2019.09.18 innerHTML과 outerHTML 차이

Git 사용법

|

1. https://git-scm.com/downloads

 

2. Default로 설치 후 설치확인
  
git --version

 

3.  깃 사용자 정보 설정

   git config --global user.name “사용자명

   git config --global user.email메일주소

 

4. 깃 저장소폴더 만들기: c://gitwork

 

5. Project를 위한 저장소 생성

 - Team > Share Project

 - Configure Git Repository

 

6. 해당 Project 우클릭 > Team > Add to Index: 스테이지영역에 저장완료

 

5. Commit버튼(해당 Project 우클릭 or Git Staging 탭에서) Local 저장소에 저장완료

 

 

 

* git에서 파일 가져올 때

local은 내 컴퓨터에 있는거

remote는 fetch해서 가져온거

 

* 충돌 날 경우(내가 이클립스에서 수정한 것과 git에서 수정이 동시에 된경우?)

이클립스에서 수정 저장 상황과 깃에서 수정 저장한 상황이 충돌함.

이럴 경우 해결책은

1. 깃레퍼짓토리 -> 페치 -> 머지 후

2. 아래와 같이

=========== 기준으로

<<<< Head 는 이클립스에서 수정한 부분

>>>>>> refs~ 는 git에서 수정한부분

 

을 비교해서 생선살 발라내듯이 고쳐줘야함.

3. 내용수정후 - 커밋때리면 깃에 반영됨.

'Git' 카테고리의 다른 글

Gitlab 소스 내려받기  (0) 2023.07.26
cherry-pick  (1) 2023.01.27
풀-리퀘스트(Pull-request) 를 활용한 협업  (0) 2022.05.26
Git 서버 - SSH 공개키 만들기 ~ SourceTree 연결  (0) 2021.09.28
Git Bash 사용법(2)  (0) 2021.08.30
And

1일차

|

1. 개발샘플 : 조회 + 수정

//p0003.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="hm.p0003">
	<resultMap id="p0003Result01" type="p0003VO">
		<result property="cust_id" column="cust_id" />
		<result property="cust_name" column="cust_name" />
		<result property="cust_address" column="cust_address" />
		<result property="cust_state" column="cust_state" />
		<result property="cust_zip" column="cust_zip" />
		<result property="cust_country" column="cust_country" />
		<result property="cust_contact" column="cust_contact" />
		<result property="cust_email" column="cust_email" />
	</resultMap>

	<select id="searchMember" resultMap="p0003Result01" parameterType="java.util.Map"> 
      <![CDATA[
         select cust_id, cust_name, cust_address, cust_state, cust_zip, cust_country, cust_contact, cust_email
         from   customers
      ]]>
		<where>
			<if test=" p_id != ''  and  p_id != null">
				cust_id = #{p_id}
			</if>
		</where>
	</select>

</mapper>

-----------------------------------------
//p0004_init.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>    
<c:set var="contextPath"  value="${pageContext.request.contextPath}"  />
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>회원 검색창</title>
</head> 
<body>
   <form name="frm" method="post" action="${contextPath}/hm/p0003/searchMember.do">   
	   고객번호 : <input type="text" name="p_id">
	<input type="submit" value="조회하기">
   </form>
</body>
</html>
-----------------------------------------------------
//p0004_mod.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    import="java.util.*"
    import="sec02.ex01.*"
    pageEncoding="UTF-8"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<c:set var="contextPath"  value="${pageContext.request.contextPath}" />
<jsp:useBean  id="p0003VO"  class="project.hm.p0003.vo.P0003VO"  scope="request"/> 
<%
   request.setCharacterEncoding( "utf-8" );
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
  <script type="text/javascript">
	function frm_update() {
		var frmPro = document.frm;
		frmPro.method = "post";
		frmPro.action = "${contextPath}/hm/p0003/updateMember.do"; 
		frmPro.submit();
	}
	
   </script>
</head>
<body>
	<form name="frm" method="post" encType="UTF-8">
	고객번호 :<input type="text" name="cust_id" value="${p0003VO.cust_id}" disabled /><br>
	고객이름 :<input type="text" name="cust_name" value="${p0003VO.cust_name}"><br>
	고객주소 :<input type="text" name="cust_address" value="${p0003VO.cust_address}"><br>
	고객주 :<input type="text" name="cust_state" value="${p0003VO.cust_state}"><br>
	고객우편번호 :<input type="text" name="cust_zip" value="${p0003VO.cust_zip}"><br>
	고객국가 :<input type="text" name="cust_country" value="${p0003VO.cust_country}"><br>
	고객담당자 :<input type="text" name="cust_contact" value="${p0003VO.cust_contact}"><br>
	고객메일주소 :<input type="text" name="cust_email" value="${p0003VO.cust_email}"><br>
	
<c:if test="${command=='modSearch'}" > 	
	<input type="submit" name='submit' value="수정" onclick = "frm_update()">
	<input type='hidden' name='command' value='modUpdate'   />
	<input type='hidden' name='cust_id' value="${p0003VO.cust_id}"   />
</c:if>

	</form>
</body>
</html>
-----------------------------------------------------
//p0004_search.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    import="java.util.*"
    import="sec02.ex01.*"
    pageEncoding="UTF-8"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<!DOCTYPE html>
<html>
<head>
<style>
h1 {
text-align: center;
}
</style>
  <meta charset="UTF-8">
<title>고객 정보 출력창</title> 
</head>
<body>
<h1>고객 정보 출력</h1>
<%
   request.setCharacterEncoding( "utf-8" );
%>
 <table border='1' width='800' align='center'>
   <tr align='center' bgcolor='#FFFF66'> 
     	<td>고객번호</td>
		<td>고객이름</td>
		<td>고객주소</td>
		<td>고객주</td>
		<td>고객우편번호</td>
		<td>고객국가</td>
		<td>고객담당자</td>
		<td>고객메일주소</td>
		<td>수정</td>
</tr>

  <c:forEach var="searchMember" items="${searchMember}" >
  <c:url var="url"  value="searchMod.do"  >
	   <c:param  name="p_mod_id" value="${searchMember.cust_id}" />
	 </c:url>	

     <tr align=center>
    	<td>${searchMember.cust_id}</td>
		<td>${searchMember.cust_name}</td>
		<td>${searchMember.cust_address}</td>
		<td>${searchMember.cust_state}</td>
		<td>${searchMember.cust_zip}</td>
		<td>${searchMember.cust_country}</td>
		<td>${searchMember.cust_contact}</td>
		<td>${searchMember.cust_email}</td>
		<td><a href='${url}'> 수정 </a></td>
     </tr>
  </c:forEach>
</table>
</body>
</html>

-----------------------------------------------------
//P0004ControllerImpl
package project.hm.p0003.controller;

import java.io.File;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import project.hm.p0003.service.P0003Service;
import project.hm.p0003.vo.P0003VO;

@Controller("p0003Controller")
public class P0003ControllerImpl implements P0003Controller {
	private static final Logger logger = LoggerFactory.getLogger(P0003ControllerImpl.class);
	@Autowired
	P0003Service P0003Service;
	@Autowired
	P0003VO P0003VO;
	
	@Override
	@RequestMapping(value = "/hm/p0003/searchInit.do", method = { RequestMethod.GET, RequestMethod.POST })
	public ModelAndView searchInit(HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
		ModelAndView mav = new ModelAndView("hm/p0003_init");
		return mav;
	}
	
	@Override
	@RequestMapping(value = "/hm/p0003/searchMember.do", method = { RequestMethod.GET, RequestMethod.POST })
	public ModelAndView searchMember(@RequestParam(value="p_id", required=false) String p_id, HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
		Map<String, Object> searchMap = new HashMap<String, Object>();
		searchMap.put("p_id", p_id);	 
		
		List list = P0003Service.searchMember(searchMap);
		
		ModelAndView mav = new ModelAndView("hm/p0003_search");
		mav.addObject("searchMember", list);
		return mav;
	}
	
	@Override
	@RequestMapping(value = "/hm/p0003/searchMod.do", method = { RequestMethod.GET, RequestMethod.POST })
	public ModelAndView searchMod(@RequestParam(value="p_mod_id", required=false) String p_id, HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
		Map<String, Object> searchMap = new HashMap<String, Object>();
		searchMap.put("p_id", p_id);	 
		
		List list = P0003Service.searchMod(searchMap);
		if(!list.isEmpty()) {
			P0003VO = (P0003VO)list.get(0);
		}
		
		ModelAndView mav = new ModelAndView("hm/p0003_mod");
		mav.addObject("p0003VO", P0003VO);
		mav.addObject("command", "modSearch");
		return mav;
	}
	
	@Override
	@RequestMapping(value = "/hm/p0003/updateMember.do", method = { RequestMethod.GET, RequestMethod.POST })
	@ResponseBody
	public ResponseEntity updateMember(HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
		Map<String, Object> dataMap = new HashMap<String, Object>();
		Enumeration enu = request.getParameterNames();
		while (enu.hasMoreElements()) {
			String name = (String) enu.nextElement();
			String value = request.getParameter(name);
			dataMap.put(name, value);
		}

		String message;
		ResponseEntity resEnt = null;
		HttpHeaders responseHeaders = new HttpHeaders();
		responseHeaders.add("Content-Type", "text/html; charset=utf-8");		
		try {
			P0003Service.updateMember(dataMap);
			
			RequestDispatcher dispatch = request.getRequestDispatcher("/hm/p0003/searchMember.do");
			dispatch.forward(request, response);
		} catch (Exception e) {
			message = " <script>";
			message += " alert('오류발생');";
			message += " location.href='" + request.getContextPath() + "/hm/p0003/searchInit.do'; ";
			message += " </script>";
			resEnt = new ResponseEntity(message, responseHeaders, HttpStatus.CREATED);
			e.printStackTrace();
		}		
		return resEnt;
	}
	
	@RequestMapping(value = "/common/ajaxTest", produces="application/json", method = { RequestMethod.GET, RequestMethod.POST })
	@ResponseBody
	public Map<String, Object> ajaxTest() {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("id", "hong");
		map.put("name", "??浿");
		return map;
	}
	
}
-----------------------------------------------------
//P0003Controller
package project.hm.p0003.controller;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

public interface P0003Controller {
	public ModelAndView searchInit(HttpServletRequest request, HttpServletResponse response) throws Exception;	
	public ModelAndView searchMember(String p_id, HttpServletRequest request, HttpServletResponse response) throws Exception;
	
	public ModelAndView searchMod(String p_id, HttpServletRequest request, HttpServletResponse response) throws Exception;
	public ResponseEntity updateMember(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

-----------------------------------------------------
//P0003DAOImpl
package project.hm.p0003.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;

import project.hm.p0003.vo.P0003VO;


@Repository("p0003DAO") 
public class P0003DAOImpl implements P0003DAO {
	@Autowired
	private SqlSession sqlSession;

	@Override
	public List<P0003VO> searchMember(Map<String, Object> searchMap) throws DataAccessException {
		List<P0003VO> list = sqlSession.selectList("hm.p0003.searchMember", searchMap);
		return list;
	}
	
	@Override
	public List<P0003VO> searchMod(Map<String, Object> searchMap) throws DataAccessException {
		List<P0003VO> list = sqlSession.selectList("hm.p0003.searchMod", searchMap);
		return list;
	}
	
	@Override
	public void updateMember(Map<String, Object> datahMap) throws DataAccessException {
		sqlSession.update("hm.p0003.updateMember", datahMap);
	}

}
-----------------------------------------------------
//P0004DAOImpl
package project.hm.p0003.dao;

import java.util.List;
import java.util.Map;

import org.springframework.dao.DataAccessException;

import project.hm.p0003.vo.P0003VO;

public interface P0003DAO {
	 public List<P0003VO> searchMember(Map<String, Object> searchMap) throws DataAccessException;
	 public List<P0003VO> searchMod(Map<String, Object> searchMap) throws DataAccessException;
	 
	 public void updateMember(Map<String, Object> datahMap) throws DataAccessException;
	 
}
-----------------------------------------------------
//P0003ServiceImpl
package project.hm.p0003.service;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import project.hm.p0003.dao.P0003DAO;
import project.hm.p0003.vo.P0003VO;

@Service("p0003Service")
@Transactional(propagation = Propagation.REQUIRED)
public class P0003ServiceImpl implements P0003Service {
	@Autowired
	private P0003DAO P0003DAO;

	@Override
	public List<P0003VO> searchMember(Map<String, Object> searchMap) throws DataAccessException {
		List<P0003VO> list =  P0003DAO.searchMember(searchMap);
		return list;
	}
	
	@Override
	public List<P0003VO> searchMod(Map<String, Object> searchMap) throws DataAccessException {
		List<P0003VO> list =  P0003DAO.searchMod(searchMap);
		return list;
	}
	
	@Override
	public void updateMember(Map<String, Object> datahMap) throws Exception {
		P0003DAO.updateMember(datahMap);
	}

}
-----------------------------------------------------
//P0003Service
package project.hm.p0003.service;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.springframework.dao.DataAccessException;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import project.hm.p0003.vo.P0003VO;

public interface P0003Service {
	 public List<P0003VO> searchMember(Map<String, Object> searchMap) throws DataAccessException;
	 public List<P0003VO> searchMod(Map<String, Object> searchMap) throws DataAccessException;
	 
	 public void updateMember(Map<String, Object> datahMap) throws Exception;
	 
}
-------------------------------
// P0003VO

package project.hm.p0003.vo;

import java.sql.Date;

import org.springframework.stereotype.Component;

@Component("p0003VO")
public class P0003VO {
	private String cust_id;
	private String cust_name;
	private String cust_address;
	private String cust_state;
	private String cust_zip;
	private String cust_country;
	private String cust_contact;
	private String cust_email;
	
	public P0003VO() {
		System.out.println("MemberVO 생성자 호출");
	}

	public String getCust_id() {
		return cust_id;
	}

	public void setCust_id(String cust_id) {
		this.cust_id = cust_id;
	}

	public String getCust_name() {
		return cust_name;
	}

	public void setCust_name(String cust_name) {
		this.cust_name = cust_name;
	}

	public String getCust_address() {
		return cust_address;
	}

	public void setCust_address(String cust_address) {
		this.cust_address = cust_address;
	}

	public String getCust_state() {
		return cust_state;
	}

	public void setCust_state(String cust_state) {
		this.cust_state = cust_state;
	}

	public String getCust_zip() {
		return cust_zip;
	}

	public void setCust_zip(String cust_zip) {
		this.cust_zip = cust_zip;
	}

	public String getCust_country() {
		return cust_country;
	}

	public void setCust_country(String cust_country) {
		this.cust_country = cust_country;
	}

	public String getCust_contact() {
		return cust_contact;
	}

	public void setCust_contact(String cust_contact) {
		this.cust_contact = cust_contact;
	}

	public String getCust_email() {
		return cust_email;
	}

	public void setCust_email(String cust_email) {
		this.cust_email = cust_email;
	}
	
}

2. 개발샘플 : ajax 로 구현(VO는 1번과 동일)

//p0004.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="hm.p0004">
	<resultMap id="p0004Result01" type="p0004VO"> <!--column: SQL의 컬럼명 -->	
		<result property="cust_id" column="cust_id" />
		<result property="before_id" column="before_id" />
		<result property="after_id" column="after_id" />
		<result property="cust_name" column="cust_name" />
		<result property="cust_address" column="cust_address" />
		<result property="cust_state" column="cust_state" />
		<result property="cust_zip" column="cust_zip" />
		<result property="cust_country" column="cust_country" />
		<result property="cust_contact" column="cust_contact" />
		<result property="cust_email" column="cust_email" />
	</resultMap>

	<select id="searchMember" resultMap="p0004Result01" parameterType="java.util.Map">
		<![CDATA[
         SELECT *
         FROM (
           SELECT a.*
                 , LAG(cust_id, 1, 0) OVER (ORDER BY cust_id desc) as after_id
                 , LEAD(cust_id, 1, 0) OVER (ORDER BY cust_id desc) as before_id
           FROM customers a 
         )
      	]]>
		<where>
			<if test=" p_id != ''  and  p_id != null">
				cust_id = #{p_id}
			</if>
			ORDER BY cust_id desc
		</where>
	</select> 
		
	<update id="updateMember" parameterType="java.util.Map">
		update customers
		set  cust_name = #{cust_name,jdbcType=VARCHAR}
		   , cust_address = #{cust_address,jdbcType=VARCHAR}
		   , cust_state = #{cust_state,jdbcType=VARCHAR}
		   , cust_zip = #{cust_zip,jdbcType=VARCHAR}
		   , cust_country = #{cust_country,jdbcType=VARCHAR}
		   , cust_contact = #{cust_contact,jdbcType=VARCHAR}
		   , cust_email = #{cust_email,jdbcType=VARCHAR}
		where cust_id = #{cust_id, jdbcType=VARCHAR}
	</update>
	
</mapper>
-----------------------------------------
//p0004.ajax.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>    
<c:set var="contextPath"  value="${pageContext.request.contextPath}"  />	
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>p0004</title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
function fn_process(command){
	var v_url = '';
	var vp_id = $("#p_id").val();
	
	if(command == 'before'){
    	command = 'search';
    	var before_id = $("#before_id").val();
    	$("#p_id").val(before_id);  
    	vp_id = $("#p_id").val(); 
    }
    
    if(command == 'after'){
    	command = 'search';
    	var after_id = $("#after_id").val();
    	$("#p_id").val(after_id); 
    	vp_id = $("#p_id").val(); 
    }
    
 	// command 설정
    $("#command").val(command);  
	var params = $("#frm").serialize();
    
    console.log("cust_id : " + vp_id);
	console.log("command : " + command);
    
    // 조회 시 validation + 널값 체크
    if(command == 'search' && vp_id == ''){
    	$('#frm')[0].reset();
    	$('#cust_id').attr("readonly",true).attr("disabled",true) // 조회시 cust_id 활성화
    	alert("고객번호를 입력하세요");
    	return;
    }
    
 	// 추가 시 값 초기화 후 종료
    if(command == 'add'){
    	$('#frm')[0].reset();
    	$('#cust_id').attr("readonly",false).attr("disabled",false) 
    	return;
    }
    
 	// 저장 시 validation
    var v_id = $("#cust_id").val();
    if(command == 'save' && v_id == ''){
       alert("조회나 추가 후 저장을 선택해 주세요");
       return;
    }
    
    if(command == 'search'){
    	v_url = "${contextPath}/hm/p0004/searchMember.do";
    }else if(command == 'save'){
    	v_url = "${contextPath}/hm/p0004/updateMember.do";
    }
    
	$.ajax({
		type:"post",
	       async:false,  
	       url:v_url,
	       data: params,
	       dataType:"json",
	       success:function (data,textStatus){
	    	   //var jsonInfo = JSON.parse(data);
	           var jsonInfo = data;
			  if(command == 'search'){
				  if(jsonInfo.error_yn == 'Y'){
		        	   alert(jsonInfo.error_text);
		        	   $("#frm")[0].reset();
		        	   return;
		           }
		           console.log("search로그" + jsonInfo.cust_id);
					$('#cust_id').val(jsonInfo.cust_id);
					$('#before_id').val(jsonInfo.before_id);
		            $('#after_id').val(jsonInfo.after_id);
		            $('#idCopy').val(jsonInfo.cust_id);
					$('#cust_name').val(jsonInfo.cust_name);
					$('#cust_address').val(jsonInfo.cust_address);
					$('#cust_state').val(jsonInfo.cust_state);
					$('#cust_zip').val(jsonInfo.cust_zip);
					$('#cust_country').val(jsonInfo.cust_country);
					$('#cust_contact').val(jsonInfo.cust_contact);
					$('#cust_email').val(jsonInfo.cust_email);
					
			  }else if(command == 'save'){
		           if(jsonInfo.error_yn == 'Y'){
		        	   alert(jsonInfo.error_text);
		           }else{
	        	       alert('저장되었습니다');
		           }
	           }
		},
		error:function(request,textStatus,error){
	        alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);
        },
		complete:function(data,textStatus){
	        alert("작업을완료 했습니다");
    	}
	});
}	
</script>
</head>
<body>
	<form name="frm" id="frm">
	고객번호<input type="text" id="p_id" name="p_id" >
	<input type="hidden" id="command" name="command" />
	<input type="button" id="btn_search" value="조회" onClick="fn_process('search')"/> 
	<input type="button" id="btn_add" value="추가" onClick="fn_process('add')" /> 
	<input type="button" id="btn_save" value="저장" onClick="fn_process('save')" />
	<input type="button" id="btn_before" value="이전" onClick="fn_process('before')" />
	<input type="button" id="btn_after" value="이후" onClick="fn_process('after')" />
    
	<table border=1 align=left>
		<tr>
			<td>고객번호</td>
			<td><input type="text" name="cust_id" id="cust_id" disabled /></td>
			<input type="hidden" name="idCopy" id="idCopy">
			<input type="hidden" name="before_id" id="before_id">
			<input type="hidden" name="after_id" id="after_id">
		</tr>
	
		<tr>
			<td>고객이름</td>
			<td><input type="text" name="cust_name" id="cust_name"></td>
		</tr>
		
		<tr>
			<td>고객주소</td>
			<td><input type="text" name="cust_address" id="cust_address"></td>
		</tr>
		
		<tr>
			<td>고객주</td>
			<td><input type="text" name="cust_state" id="cust_state">
			</td>
		</tr>
		
		<tr>
			<td>고객우편번호</td>
			<td><input type="text" name="cust_zip" id="cust_zip"></td>
		</tr>
		
		<tr>
			<td>고객국가</td>
			<td><input type="text" name="cust_country" id="cust_country">
			</td>
		</tr>
		
		<tr>
			<td>고객담당자</td>
			<td><input type="text" name="cust_contact" id="cust_contact"></td>
		</tr>
		
		<tr>
			<td>고객메일주소</td>
			<td><input type="text" name="cust_email" id="cust_email"></td>
		</tr>
	</table>
	</form>
</body>
</html>

-----------------------------------------
//P0004ControllerImpl

package project.hm.p0004.controller;

import java.io.File;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import project.hm.p0004.service.P0004Service;
import project.hm.p0004.vo.P0004VO;

@Controller("p0004Controller")
public class P0004ControllerImpl implements P0004Controller {
	private static final Logger logger = LoggerFactory.getLogger(P0004ControllerImpl.class);
	@Autowired
	P0004Service P0004Service;
	@Autowired
	P0004VO P0004VO;
	
	@Override
	@RequestMapping(value = "/hm/p0004/searchInit.do", method = { RequestMethod.GET, RequestMethod.POST })
	public ModelAndView searchInit(HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
		ModelAndView mav = new ModelAndView("hm/p0004_ajax");
		return mav;
	}
	
	@Override
	@RequestMapping(value = "/hm/p0004/searchMember.do", method = { RequestMethod.GET, RequestMethod.POST })
	@ResponseBody 
	public Map searchMember(@RequestParam(value="p_id", required=false) String p_id, HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
        Map<String, Object> searchMap = new HashMap<String, Object>();   // 검색조건
        Map<String, Object> resultMap = new HashMap<String, Object>();    // 조회결과
        searchMap.put("p_id", p_id);	 
		
        List list = null;
        try {
            list = P0004Service.searchMember(searchMap);
            if(!list.isEmpty()) {
            	P0004VO = (P0004VO)list.get(0);
				resultMap = BeanUtils.describe(P0004VO);
				resultMap.put("error_yn", "N");				
            }else {
				resultMap.put("error_yn", "Y");
				resultMap.put("error_text", "존재하지 않습니다");
            }
        }catch(Exception e) {
            resultMap.put("error_yn", "Y");
            resultMap.put("error_text", "에러발생");
            e.printStackTrace();
        }		
        return resultMap;

	}
	
	@Override
	@RequestMapping(value = "/hm/p0004/updateMember.do", method = { RequestMethod.GET, RequestMethod.POST })
	@ResponseBody
	public Map updateMember(HttpServletRequest request, HttpServletResponse response) throws Exception {
	    request.setCharacterEncoding("utf-8");
	    Map<String, Object> dataMap = new HashMap<String, Object>();  // 저장할 Data
	    Map<String, Object> resultMap = new HashMap<String, Object>(); // 처리결과
	    Enumeration enu = request.getParameterNames();
	    while (enu.hasMoreElements()) {
	        String name = (String) enu.nextElement();
	        String value = request.getParameter(name);
	        dataMap.put(name, value);
	    }
					
	    try {
	        P0004Service.updateMember(dataMap);
	        resultMap.put("error_yn", "N");	
	    } catch (Exception e) {
	        resultMap.put("error_yn", "Y");
	        resultMap.put("error_text", "에러발생");
	        e.printStackTrace();
	    }
	    System.out.println("=======================>>"+resultMap.toString());
	    return resultMap;

	}
	
	@Override
	public ModelAndView searchInsert(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}
	
	@RequestMapping(value = "/common/ajaxTest2", produces="application/json2", method = { RequestMethod.GET, RequestMethod.POST })
	@ResponseBody
	public Map<String, Object> ajaxTest() {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("id", "hong");
		map.put("name", "??浿");
		return map;
	}
	
}

-----------------------------------------
//P0004Controller

package project.hm.p0004.controller;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

public interface P0004Controller {
	public ModelAndView searchInit(HttpServletRequest request, HttpServletResponse response) throws Exception;	
	public Map searchMember(String p_id, HttpServletRequest request, HttpServletResponse response) throws Exception;
	public ModelAndView searchInsert(HttpServletRequest request, HttpServletResponse response) throws Exception;
	
	public Map updateMember(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

-----------------------------------------
//P0004DAOImpl

package project.hm.p0004.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;

import project.hm.p0004.vo.P0004VO;


@Repository("p0004DAO") 
public class P0004DAOImpl implements P0004DAO {
	@Autowired
	private SqlSession sqlSession;

	@Override
	public List<P0004VO> searchMember(Map<String, Object> searchMap) throws DataAccessException {
		List<P0004VO> list = sqlSession.selectList("hm.p0004.searchMember", searchMap);
		return list;
	}
	
	@Override
	public void updateMember(Map<String, Object> datahMap) throws DataAccessException {
		sqlSession.update("hm.p0004.updateMember", datahMap);
	}

}

-----------------------------------------
//P0004DAO

package project.hm.p0004.dao;

import java.util.List;
import java.util.Map;

import org.springframework.dao.DataAccessException;

import project.hm.p0004.vo.P0004VO;

public interface P0004DAO {
	 public List<P0004VO> searchMember(Map<String, Object> searchMap) throws DataAccessException;
	 
	 public void updateMember(Map<String, Object> datahMap) throws DataAccessException;
	 
}

-----------------------------------------
//P0004ServiceImpl

package project.hm.p0004.service;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import project.hm.p0004.dao.P0004DAO;
import project.hm.p0004.vo.P0004VO;

@Service("p0004Service")
@Transactional(propagation = Propagation.REQUIRED)
public class P0004ServiceImpl implements P0004Service {
	@Autowired
	private P0004DAO P0004DAO;

	@Override
	public List<P0004VO> searchMember(Map<String, Object> searchMap) throws DataAccessException {
		List<P0004VO> list =  P0004DAO.searchMember(searchMap);
		return list;
	}
	
	@Override
	public void updateMember(Map<String, Object> datahMap) throws Exception {
		P0004DAO.updateMember(datahMap);
	}

}

-----------------------------------------
//P0004Service

package project.hm.p0004.service;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.springframework.dao.DataAccessException;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import project.hm.p0004.vo.P0004VO;

public interface P0004Service {
	 public List<P0004VO> searchMember(Map<String, Object> searchMap) throws DataAccessException;
	 
	 public void updateMember(Map<String, Object> datahMap) throws Exception;
	 
}

'Bitcamp > BITCAMP - Spring FW' 카테고리의 다른 글

7일차  (0) 2019.10.15
6일차  (0) 2019.10.11
5일차  (0) 2019.10.10
4일차  (0) 2019.10.08
3일차  (0) 2019.10.07
And

IBSheet 그리드 특강

|

1. 인사시스템 에서 활용해라~

2. IBSheetHTML개발자가이드_V7.0.13.x -> 를 참고할 것!

//grid.jsp(메인페이지)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<script src="./ibsheetinfo.js"></script>
	<script src="./ibsheet.js"></script>
	<script>
		function initPage(){
			createIBSheet2(document.getElementById("sheet_DIV"), "mySheet", "100%", "400px");
			
			var initSheet = {};
			initSheet.Cfg = {MergeSheet : msHeaderOnly, AutoFitColWidth:"initsearch"};
			initSheet.Cols = [
				{"DBTN":"X","Header":"상태","SaveName":"sStatus","Type":"Status","Align":"Center","MinWidth":60},
				{"DBTN":"X","Header":"달력","SaveName":"date","Type":"Text"},
				{"DBTN":"X","Header":"결재일","SaveName":"pay","Type":"Combo","Format":"Ymd","Align":"Center","MinWidth":100,"ComboText":"인사 | 사장","ComboCode":"01 | 02"},
				{"DBTN":"X","Header":"만기일","SaveName":"end","Type":"Date","Format":"Ymd","Align":"Center","MinWidth":100},
				{"DBTN":"X","Header":"직급","SaveName":"position","Type":"Button"}
			];
			IBS_InitSheet(mySheet, initSheet);
		}
		function action(str){
			switch(str){
			case 'insert':
				mySheet.DataInsert();
            break;
			case 'down':
				mySheet.Down2Excel({FileName:"mySheet.xlsx", SheetDesign:1});
			break;
			
			case 'search':
				var param = FormQueryString(document.frm);
				alert(param);
					mySheet.DoSearch("search.jsp", param);
			break;
			}
		}
	</script>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body onload="initPage()">
	<form name="frm">
		사원명 : <input type="text" name="sa_name"><br>
		부서 : <input type="text" name="sa_dept"><br>
	</form>
	<button type="button" onClick="action('insert')">추가</button>
	<button type="button" onClick="action('down')">엑셀다운</button>
	<button type="button" onClick="action('search')">조회</button>
	<hr>
	<div id="sheet_DIV"></div>

</body>
</html>

// search.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String[] sa_name = request.getParameterValues("sa_name"); //배열은 values로 받음.
	System.out.print("name" + sa_name);
%>   


1. html 자바스크립트 한계점을 극복하기 위한 것.
2. 대부분의 실무에서 사용.
3. html의 table div가 바탕이 됨.
4. 함수를 호출함으로써 각 컬럼의 기능, 데이터를 설정, 관여.
5. 데이터 조회방식 - 페이징조회, LazyLoad조회, 대량조회 (보통 한도는 max 50000여건)
-  데이터를 자바스크립트로 클라이언트 단에서 (예를 들어 1300개) 갖고 있고
fetch되는 갯수를 일정단위로 끊어서 보여줌.(50개씩 배열로 가지고 있고 계속 넘겨줌)
6. 그리드는 처음 조회된 값을 계속 기억하고 있음.
7. FrozenCol Integer,  MergeSheet  -> 주로사용하는 시트기본설정

 

'Bitcamp > BITCAMP - Front Web' 카테고리의 다른 글

6일차 JavaScript  (0) 2020.07.15
미니 프로젝트  (0) 2019.09.17
12일차 jQuery  (0) 2019.09.16
11일차 jQuery  (0) 2019.09.11
JavaScript - LinkedList, nodeType(재귀), Event 핸들러, DOM  (0) 2019.09.10
And

DB모델링실습 - 인사평가시스템

|

And

DB모델링실습 - 도서관리, PC제조판매

|

And

DB모델링실습 - 제조판매관리시스템, 중고장터관리

|

And

DB모델링실습 - 제품관리, 주문배송관리

|

 

// 모델을 엔티티로 하나더 올린 case

 

 

 

And

DB모델링실습 - 강좌, 보험회사, 학교

|

<파악하는 법>

여러번 읽으면서 파악 & 하면서 해당 것 색칠하기

관계적용하다보면 entity와 속성이 새로 생길수 있음.

1. entity : 빨강

2. 속성 : 파랑

3. 관계 : 초록

 

메인이 되는 엔티티들은 인조식별자를 둔다.

키가 많아지면 할아버지 속성도 바로접근할수 있으나, 뎁스가 깊어질 경우 키가 많아지는 단점이 있다.

 

/// 올바른 정답

 

/// 평가항목을 구분한 경우 -> 평가기준에 따라 취합된 최종 점수도 관리해야 한다.(구현할지 말지 고민해야하는부분) : 유추, 도출 될수 있는 속성은 논리모델에서 잘 안만듬.(퍼포먼스의 문제 -> 물리모델에서 구현함)

And

정규표현식의 개념과 기초 문법

|

정규표현식 : 무언가를 치환하고자 할때 사용...

 

1. 정규표현식 리터럴
var pattern = /a/  : a를 찾고자 한다.

2. 정규표현식 객체 생성자
var pattern = new RegExp('a'); : 찾고자 하는 패턴이 a 이다.

위 두가지는 모두 같은 결과를 만들어냄.

3. 정규표현식 메소드 실행
pattern.exec('abcde'); // ["a"]
pattern.exec('bcdef'); // null

// test는 인자 안에 패턴에 해당되는 문자열이 있으면 true, 없으면 false
pattern.test('abcde'); // true
pattern.test('bcdef'); // false

4. 문자열 메소드 실행
'abcde'.match(pattern); // ["a"]
'bcdef'.match(pattern); // null

'abcde'.replace(pattern, 'A'); // Abcde // 문자열에서 패턴을 검색해서 이를 변경한 후에 변경된 값 리턴

5. 정규표현식의 옵션
i -> i를 붙이면 대소문자를 구분하지 않는다.
var xi = /a/;
"abcde".match(xi); //  null
var oi = /a/i;
"abcde".match(oi); //  ["a"];

g -> g를 붙이면 검색된 모든 결과를 리턴한다.
var xg = /a/;
console.log("abcdea".match(xg));
var og = /a/g;
console.log("abcdea".match(og));

6. 캡처
괄호안의 패턴은 마치 변수처럼 재사용할 수 있다.
이 때 기호 $를 사용하는데 아래 코드는 coding과 everybody의 순서를 역전시킨다.
var pattern = /(\w+)\s(\w+)/; (\w+) : 문자 \s : 공백
var str = "coding everybody";
var result = str.replace(pattern, "$2, $1"); // everybody, coding

7. 치환
var urlPattern = /\b(?:https?):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*/gim;
var content = '생활코딩 : http://opentutorials.org/course/1 입니다. 네이버 : http://naver.com 입니다. ';
var result = content.replace(urlPattern, function(url){
    return '<a href="'+url+'">'+url+'</a>';
});
// 결과값 : a태그를 감싸게됨.
생활코딩 : <a href="http://opentutorials.org/course/1">http://opentutorials.org/course/1</a> 입니다. 네이버 : <a href="http://naver.com">http://naver.com</a> 입니다.

정규 표현식의 개념

정규표현식은 줄여서 정규식(영어로는 Regular Expression이고 줄여서 Regex, Regexp 등으로 불린다.) 이라고도 하는데, 컴퓨터 과학의 정규언어로부터 유래한 것으로 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식언어이다.

일반적인 어휘를 써서 이 말을풀어보자면 “어떤 텍스트 내에서 특정한 형태나 규칙을 가진 문자열을 찾기 위해 그 형태나 규칙을 나타내는 패턴”을 정의하는 것을 정규 표현식이라고 이해하면 된다.

정규 표현식의 종류

정규 표현식은 다양한 분야에서 쓰이기 시작했는데 각 분야의 정규식은 서로 영향을 주고 받으면서 발전해서 지금에 이르렀다. 아니 왜 뜬금없이 아름다운 역사 이야기를 갑자기 들먹이는 거냐면, 바로 정규식이 이렇게 쓰이는 곳이 다양한데 아름다운 역사 덕분에 정규식에는 하나의 통일된 표준이 없다는 문제가 있기 때문이다.

유닉스 명령줄 도구들에서 사용하던 정규 표현식은 후에 POSIX 표준에 편입되었다. 그러면서 이 시기의 표준으로 받아들여진 형식을 POSIX 정규식이라고 한다. 그리고 이후에 다시 POSIX 정규식은 POSIX BRE (POSIX 기본 정규식)와  POSIX ERE (POSIX 확장 정규식)으로 다른 버전이 나뉘게 된다. (grep에서 -e 스위치를 써서 확장 정규식을 쓰던 옵션이 바로 ERE를 쓴다는 의미이다.) 그 외에 BRE를 기본 골격으로 한 vim 정규식이 있다. 이 vim 정규식은 vim 편집기 내에서 찾기/바꾸기 등의 동작에서 범위를 지정하는데 사용된다. 하지만 오랜 역사를 따라 개선과 확장을 거듭하면서 이 vim 정규식 역시 POSIX 표준과는 좀 다른 규격으로 취급될 정도이다.

 

심지어 vim 내에서도 magic 모드, very magic 모드라는 것이 있어서 이후의 확장 정규식의 일부 기능을 사용하거나, 일부 punctuation 문자를 매칭하는 방법이 다시 갈리게 되는 지경이다.

그리고 문자열을 다루는데 특화된 스크립트 언어인 펄(perl)이 등장했다. 펄의 정규식 체계는 역시나 기본은 POSIX와 비슷한 골격에서 디자인되어 있다. 그런데 엄청나게 많은 확장이 들어갔다. 펄의 정규식은 PCRE라는 규격으로 정리되었으며, 이후 많은 프로그래밍 언어들이 이 규격을 차용하거나 계승한다. 여기서 중요한 것은 “일부 차용”이다. 이 규격은 워낙 방대해서 PCRE를 그대로 가져다 쓰지 않는 이상, 구현할게 너무 많기 때문이다.

 

참고로 Cocoa에서는 ICU 표준의 정규식을 따른다. 이 라이브러리 역시 PCRE를 기반으로 하고 있으며, 유니코드 문자열에 대한 정규식 패턴 매칭을 수행하는 알고리듬이 구현되어 있다.

정규식 기본 문법

정규식 기분 문법은 크게 세 가지 정도로 나눌 수 있다.

    1. 패턴 그대로를 매칭하는 경우 : 편집기에서 “찾기” 기능을 통해서 특정 단어를 찾는 것 처럼, 단어 그대로를 패턴으로 사용하여 매치되는 영역을 찾는다.
    2. 메타문자  수량 한정자를 적용하는 경우 : 정규식 패턴에 쓰이는 문자중에는 특별한 의미를 가지는 메타 문자들이 있는데, 이들을 사용하여 보다 폭넓은 패턴에 매치할 수 있다.

 

  1. 그룹 및 look around 기능을 사용하는 경우 : 제법 고급 정규식이라 할 수 있는 부분으로, 패턴의 일부를 그룹으로 묶거나, 특정 패턴의 앞 뒤로 다른 패턴이 오는 조건을 더하는 경우이다.

정규식 메타 문자

메타 문자는 특정한 문자 혹은 문자 계열을 대신하여 표시하는 문자이다. 메타문자를 이용하면 특정한 규칙을 가진 여러 단어를 하나의 패턴으로 함축할 수 있다.

메타 문자 의미
^
문자열의 시작. [...] 내에서 쓰이면 “일치하지 않는“의 의미가 된다.

^http는 문자열의 맨 처음에 http가 온 경우에 매치한다. (중간에 http가 나타난 경우는 매치하지 않음)
$ 문자열의 끝 them$은 문자열이 them으로 끝난 경우에 them에 매치한다.
\b 단어의 경계. 공백, 탭, 컴마, 대시 등이 올 수 있다.
\bplay\b는 play 의 양 끝에 단어 경계가 오는 경우에만 play에 매치한다. 따라서 “playground”의 play에는 매치하지 않는다.
\B
\b가 아닌 것. 정규식 메타문자에서는 대소문자가 바뀌면 반대의 의미를 지니는 것들이 있다.

\bplay\B는 play뒤에 단어 경계가 아닌 것이 왔을 때 play에 매치한다. 따라서 play에는 매치하지 않지만 playground, playball의 play에는 매치한다.
\s 공백문자 공백, 탭에 매치한다.
\S 공백문자가 아닌것
\d 숫자. [0-9]와 같다.
\D 숫자가 아닌 것. [^0-9]와 같다.
\w 단어를 만들 수 있는 글자. 알파벳 대소문자, 숫자, 언더스코어가 포함된다.
\W not \w . 위의 것이 아닌 글자들이 해당된다.
\n 개행문자. 캐리지리턴은 \r에 매치한다. 그외에 탭 문자는 \t 에 매치
\ 이스케이프용 문자. 정규식 상의 특별한 의미가 있는 기호들을 문자 그대로 사용할 때 쓴다. \., \*, \$, \( 등과 같이 메타 문자를 리터럴하게 매치할 때 사용.
. 임의의 문자 1개에 대응한다.

메타 문자의 패턴을 유심히 살펴보면 알겠지만, 소문자를 쓴 것과 대문자를 쓴 것이 서로 반대의 의미를 지닌다.

선택 패턴

| 문자를 이용하면 A | B 의 패턴으로 A 혹은 B에 매칭할 수 있다. 예를 들어 tomato와 potato에 모두 매칭하고 싶다면 tomato|potato 라고 쓸 수 있다.  선택 패턴은 이후에 등장하는 그룹 패턴과 관련하여 보다 강력하게 쓰일 수 있다.

그외의 선택패턴으로는 [ ... ]이 있다. 대괄호속에 넣은 문자 중에서 하나에 매칭하는 것이다. [cfh]all 이라는 패턴은 call, fall, hall에 모두 매치될 수 있다. 특히 선택 패턴은 A-B를 통해서 특정 범위를 표현할 수도 있는데, 숫자의 경우 [0-9],  알파벳 소문자의 경우 [a-z], 알파벳대문자의 경우 [A-Z] 와 같은 식으로 한 글자에 매칭하는 것이 가능하다. 유니코드를 지원하는 정규식에서는 [ㄱ-힣]을 이용해서 한글 한 글자에 매칭하는 것도 가능하다.

 

또한 선택 패턴 내에서 ^ 이 쓰이면 not 의 의미가 되며, 이 문자 뒤에 오는 문자들은 제외하게 된다. [^cfh]all 은 앞서 나온 call, fall, hall에는 매치하지 않으며 mall에는 매치하게 된다.

그룹

괄호로 둘러싼 단위는 그룹을 나타낸다. 그룹은 전체 패턴 내에서 다시 하나로 묶여지는 패턴 조각을 나타낸다. 특히 | 나 뒤에 나오는 수량 한정자를 그룹에 붙이는 형태로 많이 사용되며, 한 번 매치한 그룹이 다시 반복되어 나타나는 경우에도 사용할 수 있다.

  • (tom|pot)ato : tomato, potato에 모두 매치되는 패턴을 그룹을 써서 좀 더 줄였다.
  • (a|i){3}bc : a 혹은 i가 3개 온 후에 bc가 오는 패턴. aaabc, iiibc, aiabc, aaibc, iiabc 등에 매치된다.

괄호를 써서 묶은 부분은 1번부터 시작하는 그룹으로 참조할 수 있다. 앞서 매치한 그룹을 패턴 내에서 재사용하려면 \1과 같이 그룹번호를 역슬래시로 이스케이프하여 표현한다. tomato에서 to가 두 번 반복되는데 이는 다음과 같이 표현할 수 있다.

(to)ma\1 # 이 패턴을 각 절로 나누어서 살펴보면, ---- (to) # to 에 매치하는 첫번째 그룹을 캡쳐한다. ma # ma에 매치 \1 # 1번 그룹인 to가 다시 나온다.

이를 좀 더 응용하면 아래와 같은 패턴도 만들 수 있다.

 

(a|b|c){2}ma\1

 

이 패턴은 a 혹은 b 혹은 c 중에서 매치되는 두 글자를 그룹으로 캡쳐하고 ma  뒤에 동일한 글자가 반복되는 패턴이다. 따라서 aamaaa, bcmabc, abmaab 등에 매치된다. 캡쳐된 그룹을 재사용하는 패턴은 그룹의 패턴이 아닌 캡쳐된 내용에 매치하므로 aamabb에는 매치되지 않는다.

비캡쳐링 그룹

(?: ) 을 사용하면 그룹으로 묶어는 주지만 캡쳐는 하지 않는 비 캡쳐링 그룹이 된다. 이는 특정한 수량 한정자등을 적용은 하려 하지만 최종 결과에서 따로 구분하여 사용할 필요가 없는 경우에 적용한다. (사실 캡쳐만 해놓고 사용하지 않아도 무방하다.)

수량 한정자

동일한 글자 혹은 동일한 족(family)이 n 개 만큼 나오는 경우에 수량한정자를 뒤에 붙일 수 있다.

표현 의미
? 앞의 표현식이 없을 수 있다. apples? 에서 s? 는 있을 수도 없을 수도 있다는 의미이며, 이 패턴은 apple, apples 모두에 매치될 수 있다.
* 0개 이상이다. n\d* 는 n 뒤에 숫자가 0개 이상이라는 의미로, n, n1, n12 등이 모두 매치될 수 있다.
+ 1개 이상이다. *와 달리 적어도 1개는 있어야 매치된다.
{n} n 개 있다. n\d{3} 은 n 뒤에 숫자가 3개 온다는 의미이며, n1, n23, n3464 등은 매치되지 않는다.
{n, m} n개 이상, m 개 이하의 범위 숫자 두 개를 사용해서 범위를 지정할 수 있다.
{n,} n개 이상 우측 경계가 없는 범위로, 최소값 이상을 의미한다.

수량 한정자와 관련하여 *, + 는 기본적으로 greedy 하게 동작한다. 즉 가능한한 많은 글자를 먹고 다음 패턴을 찾는다는 것이다. 예를 들어

 

i like apples and bananas

 

라는 문장에 대해서 ^.*s를 매치하면 . 문자(아무 글자)는 욕심을 부려서 다 먹어치우기 때문에 bananas의 s까지, 전체 문장이 다 매치된다.

이 때, *  ? 를 조합하는 경우에는 반대로 동작하면서 가장 처음에 나오는 패턴까지 매치한다. 즉 ^.*?s로 패턴을 주면 i like apples 까지만 매치한다.

예제

몇 가지 예제를 통해 정규식의 동작에 대해 익혀보자. 해당 예제들은 hackker rank의 정규식 세션의 기본 문제에서 가져왔다.

개행이 아닌 문자에 매치하기

원글 주소 : https://www.hackerrank.com/challenges/matching-anything-but-new-line

abc.def.ghi.jkx의 형태에 매치하는 패턴을 찾는다. 각 변수 a,b,c…,x 는 개행문자가 아닌 한 글자의 문자에 해당한다.

이 문제는 다음과 같이 해석할 수 있다.

  1. 개행 문자가 아닌 글자 3개가 있고
  2. “.” 문자에 이어서 다시 개행 문자가 아닌 글자 3개가 온다.
  3. 그리고 2의 패턴은 3회 반복된다.

따라서 이를 나타내는 정규식 패턴은 다음과 같이 쓸 수 있다.

 

핸드폰 번호 매치하기

핸드폰 번호는 010-1234-5677 와 같은 식으로 쓰는데 구분자는 없을 수도 있고, 공백일 수도 있다.  따라서 다음과 같은 표현 중 어느 것이어도 유효한 핸드폰 번호라 할 수 있다.

  • 010-1234-5678
  • 01012345678
  • 010.1234.5678

그런데 예전 핸드폰 번호의 경우에는 011, 016, 017, 018, 019로 시작하는 것이 있을 수 있으며, 가운데 자리가 3자리만 있는 번호도 있다.

사실 010으로 시작하는 번호는 항상 가운데 번호가 4자리 이므로 010-123-4567과 같은 번호는 유효하지 않다. 하지만 지금까지 소개한 내용으로는 이를 판별하기 어렵기 때문에, 다음 글에서 보다 세밀하게 매치하는 패턴을 소개하겠다.

따라서 패턴은 다음과 같이 정리할 수 있다.

 

로그에서 값 추출하기

이전 글에서 사용했던 로그 추출하는 부분에 대해서 다시 검토해보자. 로그의 각 줄은 다음과 같이 생겼다.

 

 

여기서 필요한 것은 로그가 찍힌 시간과, 남은 힙, 네이티브 메모리의 양이다.  이전 글에서는 이를 다음과 같이 완전 무식한 패턴을 사용했었다.

^L.+\[(\d\d:\d\d:\d\d).+\[(\d+)/(\d+).+\[(\d+)/(\d+).*$

 

아마 이글을 쓰던 시점에는 Notepad++에서 정규식으로 치환하는 방법을 찾아서 기록만 해두던 시점이어서 그랬던 것 같다. 이는 다음과 같은 패턴으로 정리할 수 있다.

 

 

그리고 이 패턴에 매치한 결과를 \1,\2,\3 으로 치환하면 시간, heap, native 메모리 값만 남기고 나머지를 모두 제거할 수 있다. 정규식 동작 확인은 여기서 보면 좀 더 자세한 설명과 함께 볼 수 있을 것이다.

HTML 태그의 내용만 추출하기

특정 HTML 태그의 내용만 추출하는 것은 웹 페이지를 스크래핑하여 특정 정보만 빼내는데 특히 많이 사용된다. 적절하게 구분할 수 있는 힌트만 있다면 파이썬에서는 beautifulsoup 같은 HTML 파서 없이도 정규식을 통해서 내용을 추출할 수 있다.

웹 페이지 내 테이블 내의 특정 정보들을 추출하는 경우를 생각해보자. 테이블의 각 셀은 td 태그로 이루어져 있으므로 td 태그 내의 내용은 여는 태그와 닫는 태그 사이를 캡쳐하면 된다. 다음 패턴으로 얻을 수 있다.

 

 

해당 내용에 매치된 부분은 <td>, </td>를 포함하며, 캡쳐링 그룹으로 해당 내용을 선택할 수 있다.

다음 글에서는 Look Around라고 하는 백 레퍼런스 참고 기법과, IF 조건절을 정규식내에서 사용하는 방법 등 고급 정규식 기법에 대해서 살펴보도록 하겠다.

 

출처 : https://soooprmx.com/archives/7718

'JavaScript' 카테고리의 다른 글

JSON  (0) 2020.01.12
변수 선언 방법  (0) 2020.01.12
innerHTML과 outerHTML 차이  (0) 2019.09.18
자바스크립트에서 replace를 replaceAll 처럼 사용하기  (0) 2019.09.18
모듈  (0) 2019.09.08
And

innerHTML과 outerHTML 차이

|

innerHTML

innerHTML에서 지정한 요소 태그를 제외한 안쪽 태그만 값을 가져온다

자기자신 미포함

 

outerHTML

outerHTML에서 지정한 요소 태그도 포함하여 값을 가져오고

선택한 엘리먼트를 포함해서 처리

자기자신 포함

 

<div id="test">TEST</div>
 
<script type="text/javascript">
alert(document.getElementById('test').innerHTML);
//결과는 TEST
 
alert(document.getElementById('test').outerHTML);
//결과는 <div id="test">TEST</div>

</script>
</body>



출처: https://na27.tistory.com/226 [na27]

'JavaScript' 카테고리의 다른 글

변수 선언 방법  (0) 2020.01.12
정규표현식의 개념과 기초 문법  (4) 2019.09.18
자바스크립트에서 replace를 replaceAll 처럼 사용하기  (0) 2019.09.18
모듈  (0) 2019.09.08
객체  (0) 2019.09.08
And