작년 11월부터 대형 통신사 하이브리드 웹사이트 개발을 진행하고있다.

이번에 조금 다른 프로젝트랑 달랐던점은 프론트앤드만 전문적으로 하는 포지션이다.

여지껏 풀스텍으로만 일하다가 프론트앤드만 하니 일이 좀더 수월할거라 예상했는데. 지금 프로젝트 막바지인데

간단한 리뷰를 하면서 정리할겸 글을 적는다.

 

일단 프론트앤드 전체를 2명이서 개발을 진행했다.

모든 프론트업무는 사원 혼자 도맡아 하고있었으며,

인터페이스 명세서 등 문서작업 및 업무협의 밤11시 까지 야근하면서 하고있었다. 

사용하는 기술은 vue3,composition api,typescript,nuxt3 등 최신기술의 프론트 기술을 사용하고있다.

익숙한 환경이 아니라 처음에 힘들었지만 기술적인 부분은 적응하면 큰 문제없었다.

 

그것보다 가장 문제는 일정이였다. 개발 공수에 비해 무리한 일정이 잡혀있었고

최신 프론트 기술에 대한 이해가 없이  산정한것같다. 피엠이 하는일은

정확히 모르겠지만 프론트개발에 한해서는 기여하는부분이  없고 중간중간에 일정에 대한 푸쉬만 있을뿐,

데브옵스 쪽을 주력으로 하시는것으로 보인다.

 

투입하자마자 이 프로젝트의 문제점 및 체계가 조금 걱정이 됐다.

무리한일정, 체계없는 일하는 방식 등... 하지만 취업시장이 너무 불안해 일단 진행했다.

 

지금 막바지 까지 개발했는데, 프론트앤드 개발자의 고충을 알겠다.

아직 프론트만 개발한 프로젝트는 여기밖에 없지만. 프론트 개발은 백엔드 개발자를 누구를 만나느냐에 

따라 공수가 너무 다르다. 여기는 백엔드 개발자도 체계없이 일한다. 

API 개발이 완료되더라도 검수하는 사람이없으며, 완성도 또한 개발자마다 다르다.

그리고 제일 문제는 책임값없는 태도다. 모든 명세서를 프론트앤드 개발자가 초안을 작성해 백엔드개발자가 

그것을 보고 만드는데, 업무적인 이해도와 영향도를 전혀 고려안한다. 심지어 기획서도 거의 안보며 인아웃값만

맞춰주는 개발자도 있다. 나는 가입 및 개통처리하는 쪽을 개발했는데. 프론트에 딜레이 될만한 부분이 너무많다.

 

서버랑 프론트 둘다 개발해본 입장에서 서버에서 API 내려주는것을 보고있으면 답답한 부분이 많다.

50대 이상 개발자분들 이랑 협업을 했을때 잘하시는분이랑 그렇지 못한 분이랑 갭이 너무 많이 차이난다.

어떻게 개발을 지금까지 해왔을까 의문이드는분도 있다. 정말 답답했다.

 

분명 서버에서 데이터를 만들어줘야하는데. 프론트에서 데이터 지지고 볶고 해서 구현하라는 

어이없는 요청사항도 받아보고 필요한것을 정리해서 문서화해서 정리해서 공유폴더에 넣어놧는데

원본은 지우며 자기가 줄수있는값빼고는 다지우고 문서를 다시 써야하는 상황도 생기고

API 개발을 완료했는데 요청값이 안나온다고 요청드리니 조치가 안되어 직접 자바 설치해서 시큘리티 및 필터쪽

문제지점을 내가 역으로 찾아서 조치해준적도 있다.

 

 

노션사용하다보면 느리게 입력될때 정말 짜증난다.

나도 그것때문에 사용안하다가 간단하게 해결하는 방법을 찾아 공유한다

 

노션 창선택하고 윈도우키2번

 

이렇게 하면 간단하게 해결!!! 

Connected to the target VM, address: '127.0.0.1:57863', transport: 'socket'
FATAL ERROR in native method: processing of -javaagent failed

 

Unexpected error (103) returned by AddToSystemClassLoaderSearch

 

Unable to add C:\Users\�Ӽ���\AppData\Local\JetBrains\IntelliJIdea2022.1\captureAgent\debugger-agent.jar to system class path - the system class loader does not define the appendToClassPathForInstrumentation method or the method failed

 

Disconnected from the target VM, address: '127.0.0.1:57863', transport: 'socket'

Process finished with exit code 1

 

 

 

윈도우 기준 File -> Settings( 쉬프트 + 알트 + S )

 

좌측 경로를 잘확인하고 체크박스가 되어있으면 해제하고 OK 누른후 디버그로 재기동해본다.

그러면 해결!

 

'JAVA' 카테고리의 다른 글

실무에서 사용하는 JSP- JSTL 문법  (0) 2020.07.10
1대다 JSP 파일업로드  (0) 2020.06.28
2025년 SAP ERP 지원중단  (0) 2020.06.26
마이바티스(MyBatis) 실무활용  (0) 2020.06.24
Orange For Oracle PL/SQL Guide  (1) 2020.06.16

인덱스에 포함되지 않은 칼럼에 대한 옵션조건은 어차피 테이블에서 필터링

할수 밖에 없으므로 그럴 때는 OR조건을 사용해도 무방하다. OR조건을 활용한 옵션 조건 처리를 정리하면 

컬럼이면, 18c부터

(Page 213). 
(Page 213). 

1.인덱스 엑세스 조건으로 사용불가.

2.인덱스 필터 조건으로도 사용불가

3.테이블 필터 조건으로만 사용가능

4.단, 인덱스 구성 컬럼 중 하나 이상이 Not Null 컬럼이면, 18c부터 인덱스 필터 조건 으로 사용 가능

WINDOW FUNATION 에서 OVER랑 같이쓰는 구문

1.RANGE UNBOUNDED PRECEDING

2.ROWS BETWEEN 1 PRECEDING AND 1  FOLLOWING

3.RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING

 

 

일단 이기능은 SQL전문가가이드 2과목에서 다루고있어서 알게된 기능인데. 그룹별로 누적된 값을 구할수 있고

여러 옵션값들로 범위에 제한을 둘수도 있다.

 

범위지정옵션으로는 RANGE , ROWS 가 있는데

둘의차이는 RANGE는 ORDER로 정렬된 칼럼중 같은값을 가지는 로우가 있다면 

묶어서 한번에 연산하지만 ROWS는 각로우마다 계산하여 준다.

 

 

1.RANGE UNBOUNDED PRECEDING : 현재 행을 기준으로 해서 파티션 내의 첫번째 행까지 범위를 지정한다.

 

 

위세가지 쿼리는 같은 결과값을 반환한다.

두번째쿼리는 오라클에서 동일하게 해석하고

세번째쿼리는 디폴트값이 적용되어 RANGE UNBOUNDED PRECEDING 가 적용된것이다.

 

쿼리 결과값을 보면 MGR로 파티션을 나눈것을 볼수있는데. 3번째행 JAMES부터 값들이 누적된것을 

볼수있다. WARDM,MARTIN을 보면 누적이 안되고 3450이 출력되었는데 이것은 같은

ORDER로 취급되어 같이 더해버려서 같은값이 출력된것이다. 

 

 

ORDER를 ENAME으로 바꿔서 쿼리를 작성했을때 정상적으로 누계가 되는것을 확인할수있다.

 

 

2.ROWS BETWEEN 1 PRECEDING AND 1  FOLLOWING : 현재 행을 기준으로 파티션내 앞뒤 한건씩을 범위로 지정

쿼리를 보면 MGR로 칼럼을 나누었다. 결과값을 보면 알수있듯이 

첫번째행(앞행) 마지막행(뒷행) 없어서 앞행or뒷행 만 포함되어 나누기 2를 하여 나온 결과값이다. 

 

 

위에것에서 비트윈 값을 바꾸어서 하면 어떻게될까?

동일하게 적용되지만 레코드를 다르게 가지고와 계산값이 달라진다.

TURNER 을 보면 앞행3(2까지밖에없음) 뒷행2인데  전체 평균값이 나온다.

MARTIN도 마찬가지다

 

3.RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING: 같은 파티션내 현재행부터 마지막행까지

 

 

몇가지 포인트를 정리하자면 

 

디폴트값 : RANGE UNBOUNDED PRECEDING 

 

시작어: RANGE or ROWS 

 

*BETWEEN에서 사용하는 구문 ( BETWEEN 을 지정하면 Start AND End 까지 범위지정 )

: CURRENT ROW : 현재 진행로우

: ROW PRECEDING : ROW에 입력된 개수 전 레코드 까지(BETWEEN 앞부분)

: ROW FOLLOWING : ROW에 입력된 개수 후 레코드 까지(BETWEEN 뒷부분)

 

JSTL -> JSP Standard Tag Library



JSTL 종류.

<%@ taglib prefix="c" 	 uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn"   uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

실무에서 많이 사용하는 JSTL이다.

<%@ taglib prefix="daum"	tagdir="/WEB-INF/tags/daum" %>

이런식으로 WEB-INF 밑에 외부파일을 태그 라이브러리로 사용하는경우도 많다.

 

 

fn 태그

#contains
	<a href="${fn:contains(featuredTypeUri,'-mobile') ? '/sp' : ''}/pages/
    	${list.featuredUrl}" target="_blank">

#replace
	<td>${fn:replace(fn:replace(list.displayListFlag,'Y','공개'),'N','비공개')}</td>

#substring
	<td>${fn:substring(board.creationDate, 0, 4)}-${fn:substring(board.creationDate, 4, 6)}
    	-${fn:substring(board.creationDate, 6, 8)}</td>

#indexOf
	<c:if test="${fn:indexOf(requestContext.httpHost, 'www.url.com') > -1 || 
    	fn:indexOf(requestContext.httpHost, '111.111.111.11') > -1}">

#length
	<td rowspan="${fn:length(category.conditions)}">

#split
    <td class="label">휴대폰번호<span class="require">*</span></td>
    <td>
      <div class="input_wrap">
        <c:set var="phone_arr" value="${fn:split(seller.phoneNumber, '-') }"/>
        <select name="phoneNumber1"  style="width:100px;">
          <c:forEach items="${phoneCodes}" var="code">
          <option value="${code.value}" ${code.value == phone_arr[0] 
          	? 'selected="selected"' : '' }>${code.label}</option>
          </c:forEach>
        </select> -
        <input type="text" name="phoneNumber2" value="${phone_arr[1]}" maxlength="4" 
        	title="휴대폰번호 가운데자리"/> -
        <input type="text" name="phoneNumber3" value="${phone_arr[2]}" maxlength="4"
        	title="휴대폰번호 마지막자리"/>
      </div>
    </td>

 

#contains

  -문자열 포함여부 :   Parameter(Target String , Matched String)    Return -> true / false를 반환

 

#replace

  -문자열 재정의  Parameter(Target String , Matched String, Change String) Return -> Change String


#substring

  -문자열 자르기 Parameter(Target String , StartIndex , EndIndex)


#indexOf
-문자열 포함여부 : Parameter(Target String , Matched StringReturn -> 일치하는 시작열 반환 / 미일치시 -1 반환

                                                                                  EX) ('ABCDE' , 'E') -> 4반환. index는 0부터 시작. 



#length
-문자열 길이 : 길이반환

#split
  -문자열 나누기 : (Target String ,Matched String

  -Return -> Matched String을 기준으로 배열반환  

 

 

 

 

C 태그

<c:forEach items="${list}" var="list" varStatus="i">
  <c:choose>
      <c:when test="${list.statusCd == '1'}">
          <td class="fc-waiting">접수대기</td>
      </c:when>
      <c:when test="${list.statusCd == '2'}">
          <td class="fc-cancel">접수취소</td>
      </c:when>
      <c:when test="${list.statusCd == '3'}">
          <td class="fc-waiting">상담대기</td>
      </c:when>
          <c:when test="${list.statusCd == '4'}">
      <td class="fc-waiting">사전점검대기</td>
      </c:when>
      <c:when test="${list.statusCd == '5'}">
        <td class="fc-waiting">설치대기</td>
       </c:when>
      <c:when test="${list.statusCd == '6'}">
         <td class="fc-complete">설치완료</td>
      </c:when>
      <c:when test="${list.statusCd == '7'}">
         <td class="fc-cancel">상담취소</td>
      </c:when>
      <c:otherwise>
         <td class="fc-cancel">미분류</td>
      </c:otherwise>
  </c:choose>
</c:forEach>
<c:if test="${empty list}">
  <tr>
    <td colspan="5">
  	  <div class="coupon_not">등록된게 없습니다.</div>
    </td>
  </tr>
</c:if>
<a href="<c:url value='/m/event/spot' />" class="btn_more">핫딜 바로가기</a>

 

 

다양한 예문.

 

#전화번호 

<span class="label">전화번호</span>
<c:choose>
    <c:when test="${fn:startsWith(cicAfterService.telNo2, '02')}">
        <c:if test="${fn:length(fn:replace(cicAfterService.telNo2,' ','')) == 9}">
          <span>${fn:substring(cicAfterService.telNo2, 0, 2)}-${fn:substring(cicAfterService.telNo2, 2, 5)}-${fn:substring(cicAfterService.telNo2, 5, 9)}</span>
        </c:if>
        <c:if test="${fn:length(fn:replace(cicAfterService.telNo2,' ','')) > 9}">
          <span>${fn:substring(cicAfterService.telNo2, 0, 2)}-${fn:substring(cicAfterService.telNo2, 2, 6)}-${fn:substring(cicAfterService.telNo2, 6,fn:length(fn:replace(cicAfterService.telNo2,' ','')))}</span>
        </c:if>
        <c:if test="${empty cicAfterService.telNo2}">
          <span></span>
        </c:if>
    </c:when>
  <c:otherwise>
      <c:if test="${fn:length(fn:replace(cicAfterService.telNo2,' ','')) == 10}">
      	<span>${fn:substring(cicAfterService.telNo2, 0, 3)}-${fn:substring(cicAfterService.telNo2, 3, 6)}-${fn:substring(cicAfterService.telNo2, 6, 10)}</span>
      </c:if>
      <c:if test="${fn:length(fn:replace(cicAfterService.telNo2,' ','')) > 10}">
      	<span>${fn:substring(cicAfterService.telNo2, 0, 3)}-${fn:substring(cicAfterService.telNo2, 3, 7)}-${fn:substring(cicAfterService.telNo2, 7, fn:length(fn:replace(cicAfterService.telNo2,' ','')))}</span>
      </c:if>
      <c:if test="${empty cicAfterService.telNo2}">
      	<span></span>
      </c:if>
  </c:otherwise>
</c:choose>	

 

 

<fmt태그>

 

할인가격 구하기

<fmt:formatNumber value="${(item.itemPrice+item.salePrice) / item.itemPrice}"
 pattern="#" var="seleProcent"/>
	<b>${seleProcent}%</b>	
<strong>${op:numberFormat(item.salePrice)}</strong>원

 

 

 

+ Recent posts