반응형

프로젝트 중에 사용하던 Thymeleaf문법들을 정리해서 포스팅해볼게요. 중간중간 나오는 데로 여기 계속 업데이트할게요

Thymeleaf IF절
<th:block th:if="${#strings.isEmpty(list.rjctCode)}">
								
</th:block>
<th:block th:unless="${#strings.isEmpty(list.rjctCode)}">

</th:block>

 

Thymeleaf Switch절
<th:block th:switch="${list.status}">
	<th:block th:case="1">
    
    </th:block>
    <th:block th:case="2">
    
    </th:block>
    <th:block th:case="*">
    	
    </th:block>    
</th:block>

 

th:object form태그
<form action="list" name="searchForm" method="get" th:object="${reqFund}">
	
    object에 사용된 model값을 input,radio,select등 여러 태그들 value로 뽑아낼수가 있습니다.
    reqFund에 name이라는 변수가 있다고하면
    
    <input type="text" th:field="*{name}" />    
    <input type="text" name="name" th:value="${reqFund.name}" id="name" />
    
    첫번째 input이랑 두번째 input 소스보기로하면 같은 결과로 나오는걸 확인 할 수가 있어요
    
    field를 이용하여 selectbox radio checkbox등 checked,selected이 필요한 태그들은 field를 사용하면
    편히 값 설정을 할 수 있어요. 단 field를 사용할려면 th:object가 선언한 태그 안에서 사용이 가능해요
</form>

 

Thymeleaf List size 구하기
<tr th:if="${#lists.size(reqFundList) == 0}">
	<td colspan="7">검색된 결과가 없습니다.</td>
</tr>

 

List size체크
<div th:if="${#lists.size(reqfabsFarmlandPredlstInfo.mlsfcCodeList) > 0}">

</div>

 

String equals
<div th:if="${#strings.equals('a','b')}">

</div>

 

html주석을하면 소스보기로 주석이 보이는데 thymeleaf에서 해당주석을 하면 소스보기에서
안보이기때문에 민감한 주석은 해당 언어 주석을 사용하서 안보이게하는게 좋습니다

<!--/* 주석 */-->

몇몇 util설 문법을 적다 보니 org.thymeleaf.util 패키지 밑에 여러 util class들이 있어요. 사용 중에 웬만한 util들은 저기 패키지 밑에 있는 거 같아요. 하나씩 적다 보니 너무 많아질 거 같아서 계속 업데이트 해야되는지 고민이네요

반응형

'개발 > Web' 카테고리의 다른 글

카카오톡 인앱브라우저 닫기  (1) 2024.03.25
Thymeleaf each value sum  (2) 2020.12.15
Thymeleaf Layout구성  (2) 2020.12.06
Thymeleaf spring security 사용하기  (5) 2020.12.02
반응형

진행 중인 프로젝트에서 Model객체 안에 값들을 비교하여 다른 값을 보여줘야 하는 상황이 나와서 검색 중에 Javers라는 패키지를 사용하여 쉽게 적용을 하여 포스팅을 해보려고 해요

javers.org/

 

JaVers — Object auditing and diff framework for Java

With JaVers you can forget about troublesome data versioning. Let the changes in your data be managed by JaVers.

javers.org

여기를 들어가서 찾았어요.

mvnrepository.com/artifact/org.javers/javers-core

 

Maven Repository: org.javers » javers-core

JaVers - object auditing and diff framework for Java VersionRepositoryUsagesDate5.14.x5.14.0Central4Nov, 20205.13.x5.13.2Central4Oct, 20205.13.1Central3Oct, 20205.13.0Central3Oct, 20205.12.x5.12.0Central3Sep, 20205.11.x5.11.2Central3Aug, 20205.11.1Central3

mvnrepository.com

maven을 통해서 jar를 받을 수가 있어요.

 

Javers javers = JaversBuilder.javers().build();

Diff diff = javers.compare(Model1, Model2);
System.out.println(diff);
HashMap<String, Object> reqFundMapperHistMap = objectMapper.readValue(javers.getJsonConverter().toJson(reqFundHisttDiff), HashMap.class);

위 diff를 찍어보면

- 'areaCode' value changed from '' to '222'
- 'corporateName' value changed from '20201123113139' to '20201123111107'
- 'farmingWorkPeriodYy' value changed from '9' to '11'
- 'frmerSn' value changed from '' to '111'
- 'histId' value changed from '1015' to '1014'
- 'juminNo' value changed from '' to '31312312312'
- 'lagHistId' value changed from '1014' to ''
- 'modDtm' value changed from '' to '12312312313'
- 'modReason' value changed from '128' to ''
- 'regDtm' value changed from '20201123113139' to '20201123111107'
- 'status' value changed from '' to '149'
- 'userName' value changed from 'admin' to ''

변경된 값만 나오고 있어요 변수명 - value1 to value2 이런 식으로 요 이걸 다시 java에서 바로 사용을 하려고 JSON으로 변환하여 MAP으로 담았어요. List를 넘겨서 비교를 해봤는데 List는 안되는 거 같네요. 가끔 프로젝트하면서 비교할 일이 생기는데 그때 편하게 사용할 수 있는 패키지인 거 같아요.

반응형
반응형

2020/11/12 - [개발] - MariaDB Sequence(10.3)이상

 

MariaDB Sequence(10.3)이상

MariaDB 시퀀스 지원을 하여 사용하게 되었어요. 이전 프로젝트에서는 시퀀스 테이블을 이용하던지 했는데 이번에 10.3 이상에서는 정식으로 지원을 하게 되어 사용하게 되었어요. mariadb.com/kb/en/cre

fknd12.tistory.com

를 이용하여 시퀀스를 사용 중에 조건에 따라 시퀀스 또는 일반 값을 리턴해야하는 경우가 생겨 사용중에 버그? 같이 값이 리턴이 안 된 경우가 있어 포스팅해볼게요

<selectKey resultType="int" keyProperty="predlstNo" order="BEFORE">
	SELECT NEXTVAL(seq)    
</selectKey>

 

사용했을 때는 insert시 사용이 잘되었는데 

<selectKey resultType="int" keyProperty="predlstNo" order="BEFORE">
	SELECT NEXTVAL(seq)    
</selectKey>
를
<selectKey resultType="int" keyProperty="predlstNo" order="BEFORE">
	<choose>
      <when test="predlstNo != null and predlstNo > 0">
        SELECT PREDLST_NO FROM  INFO WHERE PREDLST_NO = #{predlstNo, jdbcType=INTEGER}
      </when>
      <otherwise>
        SELECT NEXTVAL(seq)
      </otherwise>
  </choose> 
</selectKey>
 

변경하여 실행을 하였는데 sql log에도 값이 리턴이 안되어 한참 이것저것 알아보는 중에

<selectKey resultType="int" keyProperty="predlstNo" order="BEFORE">
	<choose>
      <when test="predlstNo != null and predlstNo > 0">
       SELECT #{predlstNo, jdbcType=INTEGER}
      </when>
      <otherwise>
        SELECT NEXTVAL(seq)
      </otherwise>
  </choose> 
</selectKey>
 

이렇게 변경을 하였더니 값이 전달이 되었어요 일반 select로 SELECT PREDLST_NO FROM  FABS_LIVESTOCK_STALL_INFO WHERE PREDLST_NO = #{predlstNo, jdbcType=INTEGER}이렇게는 왜 값이 전달이 안되었는지 모르지만 2번째 방법으로 하니 잘 동작이 되었어요.

DB는 MYRIADB을 사용하고 있어요

반응형
반응형

요즘 전자정부프레임워크를 사용하는데... 몇 번 사용은 해보지만 적응이 잘 안되네요.

이번에 3.9버전을 사용하게 되었어요.

전자정부프레임워크 버전확인

 

표준프레임워크 버전별 구성 - eGovFrame Portal 온라인 지원 포털

> 표준프레임워크 소개 > 구성 > 버전별 구성 버전별 구성 버전별 구성 표준프레임워크 3.9 구성 표준프레임워크 3.9은 다음과 같은 변경을 통해 '20년 2월 공개되었습니다. 실행환경 적용 오픈소스

www.egovframe.go.kr

링크 보시면 버전별로 각 jar버전이 표시가 되었어요.

 

<resultMap type="user" id="getUserResultMap" autoMapping="true">
        <association property="attachments" column="PROFILE_FILE_ID" select="com.cms.mapper.com.AttachmentsMapper.findById"></association>
</resultMap>

 

예전 소스를 참고하면서 개발 중에 Mybatis association사용 중에 org.apache.ibatis.javassist.util.proxy.SecurityActions.setAccessible 에러가 발생하여 이것저것 찾아보는중에 mybatis버전을 올려보라는 글을 찾게되어서 버전을 올렸더니 에러없이 동작이 되었어요. 전자정부에서는 3.4.6이 최신인데 3.5.1로 올려서 사용하니 에러가 해결이 되었어요.

혹시 association 사용중에 위처럼 에러가 발생하면 버전업을 한번 해보세요.

반응형
반응형

MariaDB 시퀀스 지원을 하여 사용하게 되었어요.

이전 프로젝트에서는 시퀀스 테이블을 이용하던지 했는데 이번에 10.3 이상에서는 정식으로 지원을 하게 되어 사용하게 되었어요.

create-sequence

 

CREATE SEQUENCE

Creates a sequence that generates new values when called with NEXT VALUE FOR.

mariadb.com

//버전확인방법
SELECT version();

CREATE SEQUENCE SQ_FABS_BZOB_INFO START WITH 1 INCREMENT BY 1;

만드는 방법은 간단해요 시퀀스명, 시작 시점, 증가 값

NEXT VALUE FOR sequence
또는
NEXTVAL(sequence_name)
방법이있어요. 
Oracle에서 sequence_name.nextval 처럼 사용도 가능하다는데 Oracle mode (SQL_MODE=ORACLE)를 사용하면 
가능하다고 하는데 여기에는 적용이 안되어 위 두가지 방법중에 하나를 사용하고있어요

next-value-for-sequence_name

 

NEXT VALUE for sequence_name

Generate next value for a SEQUENCE. Same as NEXTVAL().

mariadb.com

 

반응형

'개발 > DB' 카테고리의 다른 글

오라클 연속된 값 찾기  (1) 2024.02.06
Mysql 컬럼 예약어 사용  (0) 2021.01.18
반응형

오늘 개발하면서 $(document).on을 사용하였는데 동적으로 늘어나는 태그만큼 이벤트가 발생하여 해결방법을 찾고 포스팅해볼께요.

$(document).on("change","select[name='predlstLclas']",function(){

});

selectbox가 동적으로 늘어나는데 늘어나는 수 만큼 change가 발생하는 현상을 발견하였어요.

해결 방법은 간단해요.

 

$(document).off().on("change","select[name='predlstLclas']",function(){

});

off를 적용을하면 해당 이벤트만 발생하네요.

이게 이벤트가 대체되는게 아니라 중복이 되어서 생성된 이벤트 만큼 반복을 하게되었네요.

반응형

'개발 > Javascript' 카테고리의 다른 글

Jquery Datepicker 동적생성  (0) 2021.03.03
Jquery each break,continue  (0) 2021.02.17
Jquery sort 사용하기  (0) 2021.02.15
Javascript delete Json  (0) 2021.01.22
Jquery UI selectmenu trigger  (0) 2020.09.14
반응형

현재 프로젝트 서버가 윈도를 사용하고있어 톰켓에 링크 거는 법을 포스팅해볼게요

업로드 폴더가 톰캣 외부에 있어 리눅스 Symbolic link방식처럼 윈도 mklink를 사용하여 동일하게 구성을 하였습니다.

D:\>mklink /d "./upload2" "D:\upload"

현재 위치에서 upload2 폴더 생성하면서 링크는 D:/upload 폴더로 생성을 시켰습니다. 실제 upload2라는 폴더를 클릭을 하면 D:/upload경로로 이동하는 걸 확인할 수 있습니다.

연결되는 걸 확인이 되었으면 이제 톰켓 Server.xml수정을 해야 해요

 <Context docBase="order_web" path="/" reloadable="true" allowLinking="true" />

allallowLinking="true"를 추가하고 restart를 하시면 적용을 할 수 있습니다.

반응형

'개발' 카테고리의 다른 글

이클립스에서 한글이 깨질경우  (3) 2020.12.20
티스토리 소스코드 넣기  (0) 2020.08.13
spring security 중복 로그인 방지  (3) 2020.08.12
반응형
SELECT * FROM DUAL
WHERE GUBUN = 'A'
AND CATEGORY IN (1,2,3)

현재 프로젝트에서 JPA를 사용하고 있어서 몇몇 기능을 추가하면서 JAP를 사용해봤습니다.

기존에는 ExampleMatcher를 사용하여 단순한 where을 만들고 있었는데 IN을 추가하려고 하니 방법을 못 찾아서 Specifications를 사용하게 되었어요 혹시라도 ExampleMatcher를 사용해 구현하신 분.. 댓글로 알려주시면 감사하겠습니다.

ExampleMatcher.matching().withIgnoreNullValues().withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING);

기존에는 단순히 title,name등 일치하는 거만 사용을 하여 ExampleMatcher 적용을 한거같아요.

SELECT * FROM DUAL
WHERE CATEGORY IN (1,2)
AND TITLE = 'A'

이런 결과를 을 얻으려고 Specifications를 사용하게 되었어요.

public static Specification<Document> category(String... categorys) {
		
	return new Specification<Document>() {

		@Override
		public Predicate toPredicate(Root<Document> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            	
			return root.get("categoryCd").in(categorys);

		}

	};
        
}
	
public static Specification<Document> fieldEquals(String searchField,String searchData) {
		
	return new Specification<Document>() {

		@Override
		public Predicate toPredicate(Root<Document> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            	
			return cb.equal(root.get(searchField), searchData);

		}

	};
        
}
	
public static Specification<Document> fieldLike(String searchField,String searchData) {
		
	return new Specification<Document>() {

		@Override
		public Predicate toPredicate(Root<Document> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            	
			return cb.like(root.get(searchField), "%" + searchData + "%");

		}

	};
        
}

category는 배열로 받아서 in을 사용하게 하였어요.

fieldEquals는 단순히 = 비교반 하기 위해 만들었어요 Column = Value로 실행하게 하였어요.

지금은 사용하지는 않지만 like절도 만들었어요 Column like '% value%'로 실행하게 하였어요.

사용하는 Service에서는

Specifications<Document> spec = Specifications.where(DocumentWhere.category(documentCategoryCds));
spec.and(DocumentWhere.fieldLike("title", document.getTitle()));

이런 식으로 where 첫 문장을 만들고 and로 title = value를 만들어서 findAll로 실행을 하였어요.

실행 로그로 위 SQL처럼 원하는 방식으로 실행이 되었어요. 위 Method처럼 원하는 게 있으면 구현을 하여 직접 적용을 해야 할 거 같아요. 사용하면서 아직 적응이 안되어서 Mybatis보다는 어렵네요.... Insert, Update에서는 간단히 사용이 가능한 거 같은데 복잡한 Query일 경우 @Query를 사용하여 결과를 가져오는 것도 나쁘지 않은 거 같아요

반응형
반응형

현재 프로젝트에서 외부 연결을 SOAP을 이용하여 가져와야 해서 프로젝트에 적용한 ksoap2 적용 모듈을 작성해볼게요.

 

	Map<String,String> map = new HashMap<String,String>();
		
	String SOAP_ACTION_WS_USP_MB_GET_TERM_MISU_SAB  = ""; //SOAP 액션
	String METHOD_NAME_WS_USP_MB_GET_TERM_MISU_SAB  = "";  //메소드 네임
	        
	String NAMESPACE = "http://www.unierp.com/";    
	        
	try {
		SoapObject soapReq = new SoapObject(NAMESPACE, METHOD_NAME_WS_USP_MB_GET_TERM_MISU_SAB);
			 
		soapReq.addProperty("INDEX","1");	//필요한 파라미터
		soapReq.addProperty("HP_TEL", hpTel);
			
		//Soap 버전및 .donet 지원여부 
		SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);        
		soapEnvelope.dotNet = true;
		soapEnvelope.setOutputSoapObject(soapReq);
		        
		HttpTransportSE aht = new HttpTransportSE(erpURL);	//soap URL
		        
		aht.call(SOAP_ACTION_WS_USP_MB_GET_TERM_MISU_SAB, soapEnvelope); 

		SoapObject result  = (SoapObject) soapEnvelope.bodyIn;		//각 넘어온 xml구조에 맞게 property를 가져오시면 되요
		SoapObject nameResult = (SoapObject) result.getProperty(0);  
		SoapObject nameResult2 = (SoapObject) nameResult.getProperty(1);  
		SoapObject nameResult3 = (SoapObject) nameResult2.getProperty(0);          
		int count = nameResult3.getPropertyCount();
	        	
		for (int i = 0; i <= count - 1; i++) { 

			SoapObject simpleSuggestion = (SoapObject) nameResult3.getProperty(i);		    	
			map.put("C_YN", simpleSuggestion.getProperty("C_YN").toString().trim());
			map.put("C_MSG", simpleSuggestion.getProperty("C_MSG").toString().trim());
		}
		        
	} catch (Exception e) {
		e.printStackTrace();
	}

적용을 하면서 한 가지 의문이 생겼어요. obj.getProperty("C_MSG") 보통 없는 값이면 NULL 또는 ""빈 값을 리턴을 하는데 RuntimeException에러가 발생하여 SoapObject.java 소스를 봤어요.

public String getPropertyAsString(String name) {
	Integer index = propertyIndex(name);
	if (index != null) {
		return getProperty(index.intValue()).toString();
	} else {
		throw new RuntimeException("illegal property: " + name);
	}
}

이렇게 throw를 발생을 하고 있네요. 이 부분을 수정하여 프로젝트에 적용을 하면 되는데 그냥

//이렇게 get하기전에 count를 체크하여 가져오도록 했어요
if ( changeReason.getPropertyCount() > 0) {

}

원본 소스 링크

 

simpligility/ksoap2-android

ksoap2-android - SOAP support for Android. Contribute to simpligility/ksoap2-android development by creating an account on GitHub.

github.com

416라인을 보시면 돼요.

반응형
반응형

현재 프로젝트에서 Jquery selectmenu를 사용 중에 있는데 페이지를 로드하면서 onchange이벤트를 걸어야 하는 상황이 나왔어 $("#gdb_cd").trigger("change")를 하면 작동을 할 줄 알았는데 작동이 안 되어 찾아봤습니다.

 

//코드로 실행을하면 trigger가 실행되면서 change이벤트가 발생이되요
$("#gdb_cd").selectmenu("refresh").trigger("selectmenuchange");

덤으로 $("#gdb_cd").val("1") 값을 변경을 하였는데 변화가 없을 때 refresh를 해야 변경이 돼요.

//일반적인 selectbox면 val로 option이 선택이되지만 selectmenu를 사용하게되면 refresh를 해줘야해요
$("#gdb_cd").val("1")
$("#gdb_cd").selectmenu("refresh")

 이런 식으로 selectmenu("refresh")를 해줘야 ui반영이 돼요.

반응형

'개발 > Javascript' 카테고리의 다른 글

Jquery Datepicker 동적생성  (0) 2021.03.03
Jquery each break,continue  (0) 2021.02.17
Jquery sort 사용하기  (0) 2021.02.15
Javascript delete Json  (0) 2021.01.22
Jquery 이벤트 여러번발생  (0) 2020.11.05

+ Recent posts