분류 전체보기
-
[MySQL || MariaDB] ALTER TABLE 문법 총 정리2020.03.22
-
[MySQL || MariaDB] 여러 테이블 한번에 카운터 하기2020.03.15
-
[Spring] GET URL 범위 초과 문제 및 해결(feat.HTTP)2020.03.15
-
[Spring] 갑자기 POST가 안되는 현상(feat.XSSFilter)2020.03.15
-
[Java] split 특수문자 버그 해결,배열 원소 추출,숫자 비교 총 정리2020.02.07
[jQuery || JavaScript] title 속성 다루기 정리 및 버그 해결
개념
title 속성이란?
a, link, img, blockquote 4가지 태그에서 많이 쓰이고, 앞에 태그에 따라 용도와 기능이 조금 달라집니다.
title 속성의 값은 [툴팁]으로 표시할 때 가장 많이 쓰입니다.
예시
<p id="p_tag" title="로그인 정보">환영합니다 ${sessionScope.loginInfo.nickname }님
<a href="/jquery/logout">로그아웃</a></p>
이와 같이 마우스를 p 태그에 갖다대면 툴팁 같은 정보가 나온다.
이것이 바로 title 속성입니다.
(심지어 속성이름이 title이 아니라 tooltip으로 알고 계시는 분들도 있다.)
문법
<태그 title="들어갈 내용"></태그>
공통 예제 JavaScript 함수
function dynamictitleChange(index) {
if (index == 1) {
var titleValue = $("#titleValue").val();
$("#p_tag").attr("title", titleValue);
$("#titleValue").val('');
} else if (index == 2) {
$("#p_tag").attr("title", "대한민국만세");
} else if (index == 3) {
var msg = "dynamic? wow!";
var html = '';
html += '<p title='+day+'>move!</p>';
$("#dynamic_tag").append(html);
}
}
공통 예제 HTML
<div id="dynamic_tag"></div>
<p id="p_tag" title="로그인 정보">환영합니다 ${sessionScope.loginInfo.nickname }님
<a href="/jquery/logout">로그아웃</a></p>
상황 1.input 창에 내용을 title 속성으로 적용하기
소스
<input type="text" id="titleValue">
<button onclick="dynamictitleChange(1)">title input 값으로 변경하기</button>
결과
상황 2.title 속성의 값을 대한민국만세로 변경하기
소스
<button onclick="dynamictitleChange(2)">title 값을 '대한민국만세'로 바꾸기</button>
결과
상황 3.동적으로 title 속성이 담긴 태그 생성하기
<button onclick="dynamictitleChange(3)">동적 title 속성이 담긴 태그 생성하기</button>
결과
끝! 이 아니다. 상황 3의 결과가 조금 이상합니다. 저는 분명히 "dynamic? wow!"라고 했는데
띄어쓰기(공백) 부분부터는 잘려서 나오질 않습니다.
해결
쌍 따옴표(더블 쿼테이션 Double quotation)를 넣어줘야 합니다.
html += '<p title='+day+'>move!</p>'; (X)
//쌍 따옴표(더블 쿼테이션 Double quotation)를 넣어줘야 합니다.
html += '<p title="'+day+'">move!</p>'; (O)
결과
'JavaScript' 카테고리의 다른 글
[jQuery || JavaScript] 동적 생성된 태그에 이벤트 주기(feat.append) (0) | 2020.03.31 |
---|---|
[jQuery || JavaScript] HTML + jQuery Event 총 정리 (0) | 2020.03.31 |
[JavaScript] 날짜 관련 유용 함수 총 정리(feat.String to Date) (0) | 2019.12.28 |
[jQuery] Class 관련 함수,문법 총 정리 (0) | 2019.12.15 |
[jQuery || JavaScript] 비밀번호 유효성 검사 문법 총 정리(feat.정규식) (0) | 2019.12.11 |
[MySQL || MariaDB] ALTER TABLE 문법 총 정리
문법
문법에 들어가기 앞서, 공통 테이블 예시
CREATE TABLE ex_table (
id INT,
sFirst VARCHAR(32),
sThird VARCHAR(32),
nSecond INT,
sFifth VARCHAR(32)
)
컬럼 추가 (Add)
nSixth INT형 컬럼 추가
ALTER TABLE [테이블명] ADD [컬럼명] [타입]
ALTER TABLE ex_table ADD COLUMN nSixth INT;
결과
특정 컬럼 뒤에 추가 (Add)
sThird 컬럼 뒤에 sFourth VARCHAR형 컬럼 추가
ALTER TABLE [테이블명] ADD COLUMN [추가할컬럼명] [컬럼타입] DEFAULT [기본값] [컬럼위치]
ALTER TABLE ex_table ADD COLUMN sFourth varchar(32) DEFAULT NULL AFTER sThird;
결과
컬럼 타입 변경 (Modify)
sFifth 컬럼 VARCHAR(32) -> VARCHAR(55)로 변경
ALTER TABLE [테이블명] MODIFY [컬럼명] [타입]
ALTER TABLE ex_table MODIFY COLUMN sFifth VARCHAR(55);
결과
여러 개 컬럼 한번에 변경 (Modify)
nSixth 컬럼 INT(11) -> INT(6) , sFirst 컬럼 VARCHAR(32) -> VARCHAR(11)
ALTER TABLE ex_table
MODIFY COLUMN nSixth INT(6),
MODIFY COLUMN sFirst VARCHAR(11);
결과
컬럼 순서변경 (Modify)
sFirst 컬럼 뒤에 nSecond 컬럼 배치 하기
ALTER TABLE [테이블명] MODIFY [순서변경 할 컬럼명] [컬럼타입] AFTER [컬럼위치];
ALTER TABLE ex_table MODIFY nSecond int AFTER sFirst;
결과
컬럼 이름까지 변경 (Change)
nSecond 컬럼 이름 변경 -> sSecond , 타입 변경 INT -> VARCHAR(22)
ALTER TABLE [테이블명] CHANGE [변경 전 컬럼명] [변경 후 컬럼명] [컬럼타입]
ALTER TABLE ex_table CHANGE COLUMN nSecond sSecond VARCHAR(22);
결과
주의 : 기존 데이터가 유실될수 있으므로, 컬럼의 크기는 늘릴수만 있습니다.
컬럼 삭제 (Drop)
nSixth 컬럼 삭제
ALTER TABLE [테이블명] DROP [컬럼명]
ALTER TABLE ex_table DROP COLUMN nSixth;
결과
Primary Key(PK) 설정
id 컬럼 Primary Key(PK) 추가
ALTER TABLE [테이블명] ADD PRIMARY KEY (Key 설정 컬럼 명01, Key 설정 컬럼 명02)
ALTER TABLE ex_table ADD PRIMARY KEY (id);
결과
Primary Key(PK) 삭제
모든 컬럼 Primary Key(PK) 삭제
ALTER TABLE [테이블명] DROP PRIMARY KEY
ALTER TABLE ex_table DROP PRIMARY KEY;
결과
컬럼 디폴트값 변경
sFirst 컬럼 기본 값을 '첫번째값'으로 설정
ALTER TABLE [테이블명] ALTER COLUMN [컬럼명] SET DEFAULT [기본값]
ALTER TABLE ex_table ALTER COLUMN sFirst SET DEFAULT '첫번째값';
결과
컬럼 디폴트값 삭제
sFirst 컬럼 기본 값을 삭제
ALTER TABLE [테이블명] ALTER [컬럼명] DROP DEFAULT
ALTER TABLE ex_table ALTER sFirst DROP DEFAULT;
결과
컬럼 인덱스 설정
id 컬럼 `pkindex` 인덱스 설정
ALTER TABLE [테이블명] ADD INDEX 인덱스명(인덱스 설정 컬럼01, 인덱스 설정 컬럼02)
ALTER TABLE ex_table ADD INDEX pkindex(id);
결과
컬럼 인덱스 삭제
pkindex 인덱스 삭제
ALTER TABLE [테이블명] DROP INDEX [인덱스명]
ALTER TABLE ex_table DROP INDEX pkindex;
결과
테이블 이름 변경 (RENAME)
테이블 이름 변경 ex_table -> ex_alterTable
ALTER TABLE [테이블명] RENAME [변경 후 테이블명]
ALTER TABLE ex_table RENAME ex_alterTable;
결과
테이블 스토리지 엔진(Storage Engine) 변경
스토리지 엔진 종류 두 가지 : [InnoDB || MyISAM]
ex_alterTable 엔진을 INNODB로 변경
ALTER TABLE [테이블명] ENGINE = [형식]
ALTER TABLE ex_alterTable ENGINE = INNODB
현재 스토리지 엔진 확인 방법
SELECT engine, support FROM information_schema.engines WHERE support='DEFAULT';
예제 파일 제공
'MariaDB' 카테고리의 다른 글
[MySQL || MariaDB] System,SQL ERROR 모음 원인 및 해결 총 정리 (0) | 2020.04.24 |
---|---|
[MySQL || MariaDB] TIMESTAMP와 DATETIME 차이점 총 정리 (0) | 2020.04.19 |
[MySQL || MariaDB] 숫자형 문자 정렬 문제 및 해결(Feat.varchar) (0) | 2020.03.15 |
[MySQL || MariaDB] 여러 테이블 한번에 카운터 하기 (0) | 2020.03.15 |
[MySQL || MariaDB] ORDER BY 특정 값 우선 정렬(feat.FIELD) (2) | 2020.02.29 |
[MySQL || MariaDB] 숫자형 문자 정렬 문제 및 해결(Feat.varchar)
개념
숫자(INT)형 문자(varchar)를 기준으로 정렬하게 되면 원하는 대로 되지 않는다.
바아로~ 해결 해봅시다.
문법
문법에 들어가기 앞서, 공통 테이블 예시
CREATE TABLE orderEx (
id INT PRIMARY KEY AUTO_INCREMENT,
varcharId VARCHAR(64),
textId TEXT(64)
)
INSERT INTO orderex VALUES(1,'col1','1');
INSERT INTO orderex (varcharId,textId) VALUES('col2','2');
INSERT INTO orderex (varcharId,textId) VALUES('col3','3');
INSERT INTO orderex (varcharId,textId) VALUES('col4','4');
INSERT INTO orderex (varcharId,textId) VALUES('col5','5');
INSERT INTO orderex (varcharId,textId) VALUES('col6','6');
INSERT INTO orderex (varcharId,textId) VALUES('col7','7');
INSERT INTO orderex (varcharId,textId) VALUES('col8','8');
INSERT INTO orderex (varcharId,textId) VALUES('col9','9');
INSERT INTO orderex (varcharId,textId) VALUES('col10','10');
INSERT INTO orderex (varcharId,textId) VALUES('col11','11');
INSERT INTO orderex (varcharId,textId) VALUES('col12','12');
예시 테이블 orderex
만약 varcharId 컬럼 기준으로 ORDER BY를 하게 되면 결과는 이렇다.
SELECT * FROM orderex ORDER BY varcharId
결과
이와 같이 개 같은 결과가 나온다.(물론 textId의 ORDER BY 결과도 동일하다)
해결
정렬(오름차순)
SELECT * FROM orderex ORDER BY varcharId*1
결과
만약 역 정렬하고 싶다면?
역 정렬(내림차순)
SELECT * FROM orderex ORDER BY length(varcharId) desc,varcharId desc
결과
예제 파일 제공
'MariaDB' 카테고리의 다른 글
[MySQL || MariaDB] TIMESTAMP와 DATETIME 차이점 총 정리 (0) | 2020.04.19 |
---|---|
[MySQL || MariaDB] ALTER TABLE 문법 총 정리 (0) | 2020.03.22 |
[MySQL || MariaDB] 여러 테이블 한번에 카운터 하기 (0) | 2020.03.15 |
[MySQL || MariaDB] ORDER BY 특정 값 우선 정렬(feat.FIELD) (2) | 2020.02.29 |
[MySQL || MariaDB] InnoDB 총 정리 (1) | 2019.12.28 |
[MySQL || MariaDB] 여러 테이블 한번에 카운터 하기
개념
한 번에 여러 테이블의 값을 추출할 수 있다.
문법
문법에 들어가기 앞서, 공통 테이블 예시
기본 문법
SELECT 테이블별칭.카운트별칭,테이블별칭.카운트별칭,테이블별칭.카운트별칭
FROM
( select count(*) 카운트별칭 from 테이블명 조건(선택) ) 테이블별칭
, ( select count(*) 카운트별칭 from 테이블명) 테이블별칭
, ( select count(*) 카운트별칭 from 테이블명) 테이블별칭
예시 1.board 테이블 중 views(조회수)가 30 이상인 것, members 테이블 중 id가 1인 멤버를 카운트
SELECT a.views, b.beu
FROM (SELECT COUNT(*) views FROM board WHERE views > 30) a ,
(SELECT COUNT(*) beu FROM members WHERE id = 1) b
결과
예시 2.board 테이블의 총 조회수, 총 좋아요 수, members 테이블의 총 유저수를 카운트
SELECT a.views_length,a.likes_length, b.user_length
FROM (SELECT SUM(views) views_length,SUM(likes) likes_length FROM board) a ,
(SELECT COUNT(*) user_length FROM members) b
결과
자주 나는 오류
/* SQL 오류 (1060): Duplicate column name 'spaceAll' */
SELECT `storage`.storageAll, host.hostAll
FROM
( select sum(allca) spaceAll,sum(useca) spaceAll,sum(space) spaceAll from storageInfo) `storage`
, ( select count(*) hostAll from hostInfo) host
이와 같이 별칭을 중복으로 쓰셔서 그렇습니다.
'MariaDB' 카테고리의 다른 글
[MySQL || MariaDB] ALTER TABLE 문법 총 정리 (0) | 2020.03.22 |
---|---|
[MySQL || MariaDB] 숫자형 문자 정렬 문제 및 해결(Feat.varchar) (0) | 2020.03.15 |
[MySQL || MariaDB] ORDER BY 특정 값 우선 정렬(feat.FIELD) (2) | 2020.02.29 |
[MySQL || MariaDB] InnoDB 총 정리 (1) | 2019.12.28 |
[MySQL || MariaDB] 데이터베이스 접근 권한 거부 Host 'IP' is not allowed to connect to this MySQL server (1) | 2019.11.19 |
[Spring] GET URL 범위 초과 문제 및 해결(feat.HTTP)
원인
통계 기능 개발 중 기간 범위를 넓게 잡으면 예외가 발생했다.
브라우저(Chrome) Console Log
Failed to load resource: the server responded with a status of 400 ()
Spring Log
2월 21, 2020 3:32:40 오후 org.apache.coyote.http11.Http11Processor service
정보: Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Request header is too large
at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:718)
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:462)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
분석
RFC 2616 (하이퍼 텍스트 전송 프로토콜-HTTP / 1.1 – 섹션 3.2.1)에 따라 HTTP Get Request의 최대 URL 크기에 대한 제한은 없지만 브라우저와 서버단에서 제한을 적용 시킵니다.
제가 사용했던 브라우저인 크롬의 URL 제한 범위
URL 길이
일반적으로 웹 플랫폼 에는 URL 길이에 대한 제한이 없습니다 (2 ^ 31이 일반적인 제한 임). Chrome 은 실제적인 이유로 프로세스 간 통신에서 서비스 거부 문제가 발생하지 않도록 URL을 최대 2MB로 제한합니다.
VR 플랫폼에서는 1kB 제한이 사용되지만 대부분의 플랫폼에서 Chrome의 검색 주소창은 URL 표시를 32kB ( kMaxURLDisplayChars)로 제한합니다.
URL 길이가 제한을 초과하면 클라이언트가 합리적으로 동작하는지 확인하십시오.
- 원점 정보는 URL의 시작 부분에 나타나므로 끝을 잘라내는 것은 일반적으로 무해합니다.
- 가장자리의 경우 URL을 빈 문자열로 렌더링 하는 것은 이상적이지 않지만 잘리지 않는 (또는 예기치 않게 불안정한 경우) 더 나빠질 수 있습니다.
- 공격자는 긴 URL을 사용하여 시스템의 다른 부분을 악용할 수 있습니다. DNS 구문 은 정규화된 호스트 이름을 253 자로 제한하고 호스트 이름의 각 레이블레이블을 63 자로 제한하지만 Chromium의 GURL 클래스는 이 제한을 적용하지 않습니다.
크로미움 공식 사이트 제공
권장사항
URL을 2000 자 미만으로 유지하면 거의 모든 클라이언트 및 서버 소프트웨어 조합에서 작동합니다.
그리고 모든 클라이언트와 서버는 URL이 작동하는 여부에 관계없이 2048자 미만을 유지해야합니다.
해결책
1.GET URL parameter 줄이기
2.GET -> POST 방식으로 변경
'Spring' 카테고리의 다른 글
[Spring] 절대경로와 상대경로(feat.${pageContext.request.contextPath}) (0) | 2020.04.28 |
---|---|
[Spring] 갑자기 POST가 안되는 현상(feat.XSSFilter) (0) | 2020.03.15 |
[Spring] GET 파라미터(parameter) 데이터 받기 총 정리 (0) | 2019.12.15 |
[Spring] MyBatis 데이터 HashMap으로 받기 (0) | 2019.10.31 |
[Spring] @Scheduled (0) | 2019.10.30 |
[Spring] 갑자기 POST가 안되는 현상(feat.XSSFilter)
정말 문법을 확인하고 또 확인해도 정확히 썼는데 POST 통신이 되지 않는다면?
설정한 XSS 공격 방어 또는 인터셉터를 의심하세요.
네이버에서 만든 lucy-xss-sax.xml 쓸 경우
HttpServletRequest를 가져가 먼저 작업을 하기 때문에 POST로 데이터를 못 받아온다.
POST 방식으로 전달된 "application/json" 타입의 데이터를 Servlet의 Filter나 Spring의 Interceptor에서 모종의 처리를 하기 위해서는 HttpServletRequest의 InputStream을 읽어 들여야 합니다.
그러나 HttpServletRequest의 InputStream은 한 번 읽으면 다시 읽을 수 없습니다.
왜냐하면 톰캣이 그걸 막습니다.
만약 Interceptor나 Filter에서 InputStream을 읽게 되면, 이후 Spring이 Converter를 이용해 Json 데이터를 바인딩 처리할 때 아래와 같은 에러를 만날 수 있습니다. Spring이 이미 읽어버린 InputStream을 다시 읽으려고 시도하다가 슬픈 에러를 뱉어내는 거죠.
바인딩 예외
1.JSON으로 던졌을 때
java.lang.IllegalStateException: getReader() has already been called for this request
org.springframework.http.converter.HttpMessageNotReadableException:
Could not read JSON: Stream closed; nested exception is java.io.IOException: Stream closed
2.FORM으로 던졌을 때
14:46:39.691 [http-nio-80-exec-11] WARN j.l.Exception line:23 method:handlerException -
org.springframework.validation.BindException:
org.springframework.validation.BeanPropertyBindingResult: 1 errors
상황 발생
어느 날 갑자기 POST로 보내는 통신은 싹 다 null이 뜨기 시작함
데이터를 바인딩하지 못하는 현상
@RequestMapping(value="manage/postTest.do",method=RequestMethod.POST)
public String signUp(HttpServletRequest request){
LOG.warn(request);
LOG.warn(request.getParameter("id"));
return "/java119.do";
}
로그 출력
14:41:21.964 [http-nio-80-exec-1] WARN c.k.P.o.c.Java119Controller line:39 method:signUp
-com.pack.project.XSS.RequestWrapper@61d1d9fa
14:41:21.965 [http-nio-80-exec-1] WARN c.k.P.o.c.Java119Controller line:40 method:signUp - null
요청을 Java119Controller에 보냈는데 HttpServletRequest 객체는 뜬금없이 XSS 설정해둔 패키지를 바라보고 있음
XSS 설정 의심 시작
필자가 사용한 XSS는 네이버 선배 형님들이 만든 lucy-xss-servlet-filter입니다.
git 주소 : https://github.com/naver/lucy-xss-servlet-filter
다시 보니
Recommendation
신규로 개발하는 서비스에는 lucy-xss-servlet-filter를 사용하는 것을 추천하지만,
기존 잘 운영되는 시스템에 lucy-xss-servlet-filter를 사용하는 것은 추천하지 않습니다.
입력 파라메터가 전부 필터링 되기 때문에
서비스가 잘 동작하지 않는 의도치 않은 결과가 발생할 수 있기 때문입니다.
라고 써져있었네요.. 죄송합니다 네이버 선배님들
web.xml에 설정해둔 XSS Filter 주석 처리 후 POST 테스트 부분
결과 : 아주 잘 됩니다.
아무리 POST가 안 되는 이유, 갑자기 POST 안됨, POST 통신 먹통, POST 무조건 null 등등
검색해봐도 찾을 수가 없었는데
역시 검색에 너무 의존하는 것도 문제인 거 같습니다.
꼭 XSSFilter 아니더라도 POST가 되지 않는다면 뭔가가 가로채고 있다는 뜻입니다.
그런 것을 잘 확인해보시고 즐 코 하세요~
XSSFilter를 적용하면서 POST를 하시고 싶으신 분들은 참고 자료
'Spring' 카테고리의 다른 글
[Spring] 절대경로와 상대경로(feat.${pageContext.request.contextPath}) (0) | 2020.04.28 |
---|---|
[Spring] GET URL 범위 초과 문제 및 해결(feat.HTTP) (0) | 2020.03.15 |
[Spring] GET 파라미터(parameter) 데이터 받기 총 정리 (0) | 2019.12.15 |
[Spring] MyBatis 데이터 HashMap으로 받기 (0) | 2019.10.31 |
[Spring] @Scheduled (0) | 2019.10.30 |
[MySQL || MariaDB] ORDER BY 특정 값 우선 정렬(feat.FIELD)
FIELD
개념
FIELD 함수를 이용하여 특정한 값을 우선적으로 정렬할 수 있다.
문법
문법에 들어가기 앞서, 공통 테이블 예시
기본 문법
SELECT * FROM 테이블명 ORDER BY FIELD(컬럼명,우선 정렬할 값,두번째 정렬할 값,세번째...);
예시 1.제목(subject) 컬럼에 값이 '제목3'이 제일 먼저,'제목5'가 그다음으로 들어간 row 먼저 정렬
SELECT subject FROM board ORDER BY FIELD(subject,'제목3','제목5'),subject;
결과
'제목3' 값을 가진 row가 첫 번째, '제목5'을 가진 row가 두 번째로 정렬됐고 그다음 subject 컬럼이 정렬됐다.
예시 2.제목(subject) 컬럼에 값이 '제목4'이 들어간 row 먼저 정렬하고, 나머진 제목을 기준으로 역 정렬 하기
SELECT subject FROM board ORDER BY FIELD(subject,'제목4'),subject DESC;
결과
특별 예시. 값의 인덱스 찾기(해당 값이 없을 경우 0 반환)
SELECT FIELD(subject,'제목1','제목2') FROM board;
결과
'MariaDB' 카테고리의 다른 글
[MySQL || MariaDB] 숫자형 문자 정렬 문제 및 해결(Feat.varchar) (0) | 2020.03.15 |
---|---|
[MySQL || MariaDB] 여러 테이블 한번에 카운터 하기 (0) | 2020.03.15 |
[MySQL || MariaDB] InnoDB 총 정리 (1) | 2019.12.28 |
[MySQL || MariaDB] 데이터베이스 접근 권한 거부 Host 'IP' is not allowed to connect to this MySQL server (1) | 2019.11.19 |
[MySQL || MariaDB] 데이터 파일 IMPORT 하기(Feat.LOAD DATA INFILE) (0) | 2019.11.15 |
[Java] split 특수문자 버그 해결,배열 원소 추출,숫자 비교 총 정리
1. 거슬리는 Enumeration Warning
Enumeration를 쓰다 보면 위 사진처럼 노란색 Warning 표시가 뜹니다.
노란색 Warning 표시가 거슬리시죠
Enumeration is a raw type. References to generic type Enumeration<E> should be parameterized
수정 전
Enumeration netInterfaces = null;
수정 후
Enumeration<?> netInterfaces = null;
변경 해주면 됩니다.
2.Java split 특수문자 버그
String str = "172.10.0.100" ;
String[] result = str.split(".");
String str = "사성|엘취" ;
String[] result = str.split("|");
위 예시대로 코드를 작성 할 경우 split 함수가 작동하지 않습니다.
눈에 안약넣고 찾아봐도 틀린 코드가 없습니다.
JDK 1.8 기준 특수문자 스플릿 버그입니다.
해결
String str = "172.10.0.100" ;
String[] result = str.split("\\.");
String str = "사성|엘취" ;
String[] result = str.split("\\|");
split 함수 안에 \(역슬래쉬)를 두 개 추가 해주면 됩니다.
※헷갈림 주의
Java에서만 뜨는 버그입니다
Javascript는 잘 됩니다.
3.Java 배열 원소 뽑기
위 split 버그를 찾으려고 배열 안에 잘 들어갔나 안 들어갔나 디버깅 중
java.lang.ArrayIndexOutOfBoundsException를 뱉어서 배열의 길이를 먼저 체크했는데
0이 나왔길래 원소를 보려 했더니
배열 원소 뽑는 게 순간 헷갈렸다.
그래서 준비했습니다.
String[] result = {"arr1","arr2","arr3"};
LOG.info(result);
결과 값 : [Ljava.lang.String;@주소값
[Ljava.lang.String;@주소 값 말고 arr1, arr2, arr3 즉, 배열의 원소들을 뽑고 싶을 땐 이런 식으로 사용하면 안 됩니다.
해결
import java.util.Arrays;
int[] result = new int[] {1, 2, 3, 4, 5};
System.out.print(Arrays.deepToString(result));
String[] result = {"arr1","arr2","arr3"};
System.out.print(Arrays.toString(result));
깨알 정보
[Ljava.lang.String;@3 db386 ff 맨 앞에 L이 있으면 배열 주소
java.lang.String;@3db386ff 없으면 그냥 String 주소
4.Java의 Integer, int 숫자 비교의 주의사항
java에서 숫자 비교는 ==,!=,>, < 여러 연산자가 있는데
int와 int 끼리 비교할 땐 ==이 값을 비교 하지만
Integer와 Integer를 비교 할 땐 ==는 개념이 조금 다르다.
Integer wr_i = new Integer(100);
Integer wr_j= new Integer(100);
System.out.println(wr_i == wr_j); //false
System.out.println(wr_i.equals(wr_j)); //true
위 코드를 보면 ==로 했을 땐 false가 나온다.
바로 Integer 객체에 주소 값으로 비교했기 때문이다.
해결
System.out.println(wr_i.equals(wr_j)); //true
String 타입도 마찬가지로 ==로 비교하진 않잖아요 equals로 비교하지
똑같은 원리입니다. 자세한 건 이전에 글을 작성했습니다.
깨알 정보
1) int == Integer
int i = 1;
Integer j = 1;
if (i == j) //true
2) int == new Integer
int i = 1;
Integer j = new Integer(1);
if (i == j) //true
3) Integer == Integer
Integer i = 1;
Integer j = new Integer(1);
if (i == j) //false
참고 글
'java' 카테고리의 다른 글
[Java] MD5,SHA-256,AES-128,3DES (4가지 암호화) 문법 총 정리 (0) | 2020.04.30 |
---|---|
[Java] 숫자 양수< - >음수 변환 총 정리 (0) | 2020.04.05 |
[Java] LocalDate,LocalTime,LocalDateTime 총 정리 (10) | 2019.11.13 |
[Java] Error(에러)와 Exception(예외) 그리고 자주 보이는 Exception (0) | 2019.11.06 |
[Java]기본형(primitive type)과 참조형(reference type) (feat.Integer와 int 차이점) (0) | 2019.11.03 |