전체 글

반응형

개념


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)

 결과

반응형
반응형

문법


문법에 들어가기 앞서, 공통 테이블 예시

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] ALTER TABLE.sql
0.00MB

반응형
반응형

개념


숫자(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] varchar ORDER BY.sql
0.00MB

반응형
반응형

개념


한 번에 여러 테이블의 값을 추출할 수 있다.

 

 

문법


문법에 들어가기 앞서, 공통 테이블 예시

기본 문법

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

 

이와 같이 별칭을 중복으로 쓰셔서 그렇습니다.

 

반응형
반응형

원인


통계 기능 개발 중 기간 범위를 넓게 잡으면 예외가 발생했다.

 

 

브라우저(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 방식으로 변경

반응형
반응형

정말 문법을 확인하고 또 확인해도 정확히 썼는데 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 Interceptor(혹은 Servlet Filter)에서 POST 방식으로 전달된 JSON 데이터 처리하기 : TOAST Meetup

Spring Interceptor(혹은 Servlet Filter)에서 POST 방식으로 전달된 JSON 데이터 처리하기

meetup.toast.com

 

반응형
반응형

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;

결과

 

반응형
반응형

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]기본형(primitive type)과 참조형(reference type) (feat.Integer와 int 차이점)

오늘은 Java 기본형(primitive type)과 참조형(reference type) 종류 및 특징,사용 이유에 대해 시작하겠습니다. 자바는 크게 기본형(primitive type), Wrapper Class 참조형(reference type)으로 나눠진다. Primi..

java119.tistory.com

 

반응형

+ Recent posts