728x90

API 문서를 번역하면 

지정된 형식 문자열과 인수를 사용하여 형식이 지정된 문자열을 반환합니다.

반환한 로케일 항상 Locale.getDefault() 입니다.

[실행결과]

[첨부파일]

StringFormat.java
0.00MB

 

 

더 자세한 내용은 아래 링크를 참고하세요.

 

https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax

 

Formatter (Java Platform SE 8 )

'e' '\u0065' Requires the output to be formatted using computerized scientific notation. The localization algorithm is applied. The formatting of the magnitude m depends upon its value. If m is NaN or infinite, the literal strings "NaN" or "Infinity", resp

docs.oracle.com

 

728x90
반응형

'IT 인터넷 > Java' 카테고리의 다른 글

공통 프로젝트 참조설정 방법  (0) 2022.10.31
728x90

[오류내용]

아래 오류 5가지 케이스에 모두 해당하는 동일한 해결방안으로 간다.

 

1. Rename this field "GET_TOKEN_URL" to match the regular expression '^[a-z][a-zA-Z0-9]*$'.

2. Make this final field static too.

3. Field names should comply with a naming convention.

4. Class variable fields should not have public accessibility.

5. Make target a static final constant or non-public and provide accessors if needed.

[해결방법]

private final String GET_TOKEN_URL = "/auth/v1";

 

위 멤버변수의 선언은 변수를 값을 재할당(값변경)하지 않으면서 클래스 내부적으로 쓰겠다는 의미이다.

그리고 Method 에서 변수를 사용할때마다 값이 새로 할당이 되는게 문제이다. 메모리 낭비인 셈이죠.

변수의 용도로 보았을때는 

private static final String GET_TOKEN_URL = "/auth/v1";  으로 변경하는게 맞다.

 

만약 다른 클래스에서 참조가 된다면

public static final String GET_TOKEN_URL = "/auth/v1"; 으로 변경하는 방안도 생긴다.

 

즉. 용도에 맞게 변경해야된다는 건데..

 

이러한 구문으로도 변경될 수도 있을 것 같다.

 

private String getTokenUrl = "/auth/v1";

 

public String getTokenUrl(){

    return getTokenUrl;

}

 

변수의 용도를 생각해보고 각자 위 방식중 하나를 택해서 하면 될 듯하다.

 

728x90
반응형
728x90

[오류내용]

Define a constant instead of duplicating this literal "sndRqRspCd" 7 times.

String literals should not be duplicated.

[해결방안]

문자열이 중복되어 사용이 되는게 문제이며 해결방안으로는 멤버변수를 두고 재사용해야된다.

아래 샘플 소스코드는 해결방안으로만 참고하길 바란다.

package deploy;

public class Deploy3Controller {

    private static final String RETURN_ERR_CODE = "returnErrCd";    // 멤버변수
    private static final String RETURN_MESSAGE  = "returnMessage";  // 멤버변수
    
    @PostMapping ~~~~~~~~~
    public @ResponseBody Object sendMsg(@RequestBody Map<String, Object> paramMap) {
    
        Map<String, Object> retMap = new HashMap<>();
        
        if(StringUtil.isEmpty(paramMap.get("telNo"))) {
            retMap.put(RETURN_ERR_CODE, "-1");
            retMap.put(RETURN_MESSAGE, "전화번호가 없습니다.");	
        } else if(StringUtil.isEmpty(paramMap.get("addr"))) {
            retMap.put(RETURN_ERR_CODE, "-1");
            retMap.put(RETURN_MESSAGE, "주소가 없습니다.");
        } else {
            retMap.put(RETURN_ERR_CODE, "0000");
            retMap.put(RETURN_MESSAGE, "정상 처리되었습니다.");        
        }
        
        return retMap;
    }
    
}

 

소나큐브에서 개발 언어별 Rules 를 공유한게 있는거 같은데 아래 사이트를 참고하자.

 

https://rules.sonarsource.com/java/RSPEC-6437

 

Java static code analysis: Credentials should not be hard-coded

A hard-coded secret has been found in your code. You should quickly list where this secret is used, revoke it, and then change it in every system that uses it. Passwords, secrets, and any type of credentials should only be used to authenticate a single ent

rules.sonarsource.com

 

728x90
반응형
728x90

[오류내용]

Refactor this method to reduce its Cognitive Complexity from 37 to the 15 allowed.

Cognitive Complexity of methods should not be too high.

[해결방안]

오류내용을 해석하면

너무 많은 if 문 사용으로 로직의 복잡성을 높이는데 한계와 유지의 어려움이 있어 수정을 하라는 말씀.

if 문의 사용빈도와 switch 문을 사용하여 로직을 변경해주면 되겠다.

 

 

728x90
반응형
728x90

[오류내용]

 

Why is this an issue? 클릭하면 해결 답안을 직접적으로 볼 수 있다. 아래 참고..

[수정전 코드]

@RequestMapping(path = "/greeting", method = RequestMethod.GET) // Noncompliant

[수정후 코드]

@GetMapping(path = "/greeting") // Compliant

 

 

728x90
반응형
728x90

[실행결과]

[소스코드]

<!DOCTYPE html>
<html>
<head>
<title>데모</title>
<style>
	.divTbl     { display: table; width: 100%; }
	.divTblRow  { display: table-row; }
	.divTblCell { display: table-cell; border: 1px solid #999999; padding: 3px 10px; }
	button   { line-height: 17px; margin-top: 10px; }
	textarea { height: 314px; width: 615px; position: fixed; }
</style>
<script src="https://code.jquery.com/jquery-2.1.0.min.js" integrity="sha256-8oQ1OnzE2X9v4gpRVRMb1DWHoPHJilbur1LP9ykQ9H0=" crossorigin="anonymous"></script>
<script>
var com = {
	utils : {}
};

com.utils = {

	/**
	* @description 차량번호 마스킹하는 함수.
	* @param {string} 차량번호 (66나0570) 
	* @param {string} 마스킹 타입(RRN, EMAIL, CARD, ID, NAME, PHONE 기타등등)
	* @return {string} 마스킹 처리된 문자열
	*/
	makeMask: function (t, s) {
	
		var maskedValue = '';

		switch (t) {

			// 차량번호 00나1234
			case 'VRN' :

				if(s.match(/\d{2,3}[가-힣]{1}\d{4}/gi)){
					maskedValue = s.toString().replace(/([0-9]{4})$/gi,'****');
				}
			break;

		}
		
		// Log
		$('#txtLog').append('입력값 : |' + s + '| >> 출력값 : |' + maskedValue + '| \n\n'); 

		return maskedValue;
  },

};
</script>
</head>
<body>
<h1>차량번호 마스킹 처리</h1>
<div class="divTbl" style="height:330px;">
	<div class="divTblRow">
		<div class="divTblCell" style="width:200px;">

			<button onclick="com.utils.makeMask('VRN', '66나0570')">
				차량번호(66나0570)
			</button><br/>
			<button onclick="com.utils.makeMask('VRN', '666다1234')">
				차량번호(666다1234)
			</button><br/>


		</div>
		<div class="divTblCell" style="width:500px">
			<textarea id='txtLog'></textarea>
		</div>
	</div>
<div>
</body>
</html>

[첨부파일]

vrn.html
0.00MB

 

728x90
반응형
728x90

계좌번호 마스킹 샘플을 만들면서 알게된 사실..

은행별로 계좌번호 포멧이 다르다.. 알고는 있었는데 이렇게 다를 줄이야..

링크는 공유할테니 내용참고하고 아래 소스를 참고하길 바란다.

https://sealove3904.tistory.com/22

 

국내은행별 계좌번호 체계

계좌번호 마스킹 처리를 구현하다보니 은행마다 계좌번호 체계가 달라 공유한다. 은행 길이 포멧 BNK부산은행 13 AAA-BBBB-CCCC-DD DGB대구은행 12 AAA-BB-CCCCCC-D IBK기업은행 14 AAA-BBBBBB-CC-DDD KEB하나은..

sealove3904.tistory.com

 

 

[실행결과]

[소스코드]

<!DOCTYPE html>
<html>
<head>
<title>데모</title>
<style>
	.divTbl     { display: table; width: 100%; }
	.divTblRow  { display: table-row; }
	.divTblCell { display: table-cell; border: 1px solid #999999; padding: 3px 10px; }
	button   { line-height: 17px; margin-top: 10px; }
	textarea { height: 314px; width: 615px; position: fixed; }
</style>
<script src="https://code.jquery.com/jquery-2.1.0.min.js" integrity="sha256-8oQ1OnzE2X9v4gpRVRMb1DWHoPHJilbur1LP9ykQ9H0=" crossorigin="anonymous"></script>
<script>
var com = {
	utils : {}
};

com.utils = {

	/**
	* @description 계좌번호 마스킹하는 함수.
	* @param {string} 계좌번호 (800320-1234567) 
	* @param {string} 마스킹 타입(RRN, EMAIL, CARD, ID, NAME, PHONE 기타등등)
	* @return {string} 마스킹 처리된 문자열
	*/
	makeMask: function (t, s) {
	
		var maskedValue = '';

		switch (t) {
			// KEB하나은행 / AAA-BBBBBB-CCCCC
			case 'KEB' :

				if(s.match(/(\d{3}-\d{6}-\d{5})/gi)){
					maskedValue = s.toString().replace(/(\d{3})-(\d{3})(\d{3})-(\d{5})/gi,'$1-$2***-*****');
				}
			break;
			// KB국민은행 / AAA-BB-CCCC-DDD
			case 'KB' :

				if(s.match(/(\d{3}-\d{2}-\d{4}-\d{3})/gi)){
					maskedValue = s.toString().replace(/(\d{3})-(\d{2})-(\d{2})(\d{2})-(\d{3})/gi,'$1-$2-$3**-***');
				}
			break;
			// 카카오뱅크 / AAAA-BB-CCCCCCC
			case 'KKO' :

				if(s.match(/(\d{4}-\d{2}-\d{6})/gi)){
					maskedValue = s.toString().replace(/(\d{4})-(\d{2})-(\d{6})/gi,'$1-$2-******');
				}
			break;

		}
		
		// Log
		$('#txtLog').append('입력값 : |' + s + '| >> 출력값 : |' + maskedValue + '| \n\n'); 

		return maskedValue;
  },

};
</script>
</head>
<body>
<h1>계좌번호(은행별) 마스킹 처리</h1>
<div class="divTbl" style="height:330px;">
	<div class="divTblRow">
		<div class="divTblCell" style="width:200px;">

			<button onclick="com.utils.makeMask('KEB', '320-198003-12345')">
				KEB하나은행(320-198003-12345)
			</button><br/>
			<button onclick="com.utils.makeMask('KB', '198-03-2019-123')">
				KB국민은행(198-03-2019-123)
			</button><br/>
			<button onclick="com.utils.makeMask('KKO', '1234-12-123456')">
				카카오뱅크(1234-12-123456)
			</button>


		</div>
		<div class="divTblCell" style="width:500px">
			<textarea id='txtLog'></textarea>
		</div>
	</div>
<div>
</body>
</html>

[첨부파일]

account.html
0.00MB

 

 

 

 

 

 

 

728x90
반응형
728x90

계좌번호 마스킹 처리를 구현하다보니 은행마다 계좌번호 체계가 달라 공유한다.

은행 길이 포멧
BNK부산은행 13 AAA-BBBB-CCCC-DD
DGB대구은행 12 AAA-BB-CCCCCC-D
IBK기업은행 14 AAA-BBBBBB-CC-DDD
KEB하나은행 14 AAA-BBBBBB-CCCCC
(구)KB국민은행 12 AAA-BB-CCCC-DDD
(신)KB국민은행 14 AAAAAA-BB-CCCCCC
NH농협은행 13 AAA-BBBB-CCCC-DD
SC제일은행 11 AAA-BB-CCCCCC
(구)신한은행 11 AAA-BB-CCCCCC
(신)신한은행 12 AAA-BBB-CCCCCC
씨티은행 12 AAA-BBBBBB-CCC
(구)외환은행 12 AAA-BBBBBB-CCC
우리은행 13 AAAA-BBB-CCCCCC
카카오뱅크 13 AAAA-BB-CCCCCCC
케이뱅크 12 AAA-BBB-CCCCCC

 

728x90
반응형
728x90

[실행결과]

[소스코드]

<!DOCTYPE html>
<html>
<head>
<title>데모</title>
<style>
	.divTbl     { display: table; width: 100%; }
	.divTblRow  { display: table-row; }
	.divTblCell { display: table-cell; border: 1px solid #999999; padding: 3px 10px; }
	button   { line-height: 17px; margin-top: 10px; }
	textarea { height: 314px; width: 615px; position: fixed; }
</style>
<script src="https://code.jquery.com/jquery-2.1.0.min.js" integrity="sha256-8oQ1OnzE2X9v4gpRVRMb1DWHoPHJilbur1LP9ykQ9H0=" crossorigin="anonymous"></script>
<script>
var com = {
	utils : {}
};

com.utils = {

	/**
	* @description 주민등록번호 마스킹하는 함수.
	* @param {string} 주민등록번호 (800320-1234567) 
	* @param {string} 마스킹 타입(RRN, EMAIL, CARD, ID, NAME, PHONE 기타등등)
	* @return {string} 마스킹 처리된 문자열
	*/
	makeMask: function (t, s) {
	
		var maskedValue = '';

		switch (t) {

			case 'RRN' :
				if( s.match(/(?:[0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[1,2][0-9]|3[0,1]))-[1-4]{1}[0-9]{6}\b/gi) ){
					maskedValue = s.toString().replace(/(-?)([1-4]{1})([0-9]{6})\b/gi,"$1$2******");
				}
			break;

		}
		
		// Log
		$('#txtLog').append('입력값 : |' + s + '| >> 출력값 : |' + maskedValue + '| \n\n'); 

		return maskedValue;
  },

};
</script>
</head>
<body>
<h1>주민등록번호 마스킹 처리</h1>
<div class="divTbl" style="height:330px;">
	<div class="divTblRow">
		<div class="divTblCell" style="width:200px;">

			<button onclick="com.utils.makeMask('RRN', '111111-1234567')">
				주민번호 앞 7자리 표시
			</button>
			<button onclick="com.utils.makeMask('RRN', '800320-1234567')">
				주민번호 앞 7자리 표시
			</button>

		</div>
		<div class="divTblCell" style="width:500px">
			<textarea id='txtLog'></textarea>
		</div>
	</div>
<div>
</body>
</html>

 

[첨부파일]

rrn.html
0.00MB

 

 

728x90
반응형

+ Recent posts