오늘 처리한 이슈는 사용자의 입력 내용과 출력 내용이 다른 부분에 관한 것이었다. 원인은 입력 내용을 text로 화면에 뿌리다 보니 개행문자가 무시되어서 한 줄로 표기 된 부분이다. 간단히 개행문자를 태그로 바꿔서 해결할 수가 있었다. 이렇게 코드를 바꾸면 문제없이 개행문자를 처리할 수 있다. 그런데 문제가 있다. 만약 사용자가 임의로 태그를 입력하게 된다면 어떻게 될까? 경우에 따라서는 페이지가 깨지거나 심각한 오류를 발생시키기도 할 것이다. 만약 스크립트를 삽입하게 된다면 이를통해 다른 사용자를 방해하거나 개인정보 등을 탈취하는 경우도 있을 수 있다. 이렇게 악의적인 스크립트에 의해 페이지가 깨지거나 다른 사용자의 사용을 방해하거나 쿠키 혹은 다른 개인정보를 빼 가는 공격을 Cross Site Scr..
프론트엔드에서 '만' 유효성 검사를 하는 것이 좋지 않다. 이에대해 자세하게 설명한 블로그가 있다. 내용을 요약하면 클라이언트의 개발자 도구로 유효성 검사 부분을 무력화 하는 것이 충분히 가능하기 때문에 반드시 서버에서 유효성 검사를 해 줘야 한다는 것이다. 그래서 유효성 검사를 하는 안전한 방법은 두 가지다. 프론트와 백엔드 양쪽에 모두 검증 코드를 작성한다. 백엔드에 검증 코드를 작성 후, 백엔드 결과에 따라 프론트는 메세지만 노출한다. 이런 사실은 미리 알고 있었기 때문에 나는 항상 백엔드에서 검증코드를 만들어 왔는데 실무에서 직접 유효성 검사 코드를 작성하다보니 역시 프론트단에서도 유효성 검사는 필요하다. 사실 개발자 도구를 통한 회피는 쉽게 발생하는 일이 아닌데 프론트엔드에서 쉽게 처리할 수 있..
DBMS를 잘 모르다 보니 테이블 스키마를 제대로 못 읽어서 날짜 데이터가 varchar 타입인 것으로 오해하로 코딩을 하고 있었다. 진작 물어봤어야 하는데 쩝.. 어쨌든 datetime 이었기 때문에 ValueObject 역시 String 이 아니라 Date 타입으로 받을 수 있다. 그런데 문제는 날짜 포맷을 맞추기 위해 사용하던 코드였다. SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd"); examVO.setRegDttm(formater.format((formater.parse(examVO.getRegDttm())))); String으로 들어온 날짜를 포맷에 맞춰서 Date로 바꾼 다음 다시 format에 맞춰서 String으로 바꿔서 넣..
코드에 상수를 남기는 것은 좋지 않다. 그 상수가 무엇을 의미하는지 쉽게 이해하기 힘들 뿐더러 그 상수 값 하나를 바꾸기 위해 수천라인의 코드를 한 줄 한 줄 다 뒤져야 할 수도 있다. 이것은 HTML 안에서도 마찬가지이다. 아래와 같은 코드가 있다고 해 보자. make popup 버튼 태그 onclick 속성을 보면 클릭했을 때 makeNewPopup이라는 함수를 호출하고 있다. 그런데 파라미터로 전달되는 상수 1이 의미하는 것은 무엇일까? 이 코드만 봐서는 도무지 알 수가 없다. 이 상수를 생성되는 popup의 타입이라고 생각해보자. 이 상수를 조금 더 가독성 있게 표현할 수 있는 한 가지 방법은 자바스크립트의 전역변수로 선언을 해 놓고 사용하는 것이다. ... make popup 이렇게 하면 생성되..
서블릿 컨테이너를 만드는 토이프로젝트를 진행하던 도중 내가 파일 입출력에 관해 상당히 모르고 있다는 것을 알게 되었다. 고작해야 바이트 단위로 데이터를 읽어서 내보내는 정도의 이해도 였던 것 같다. 실제로 내가 쓴 코드는 다음과 같다. public void sendFile() throws IOException { writeHeader(); List fileBytes = getFileBytes(); int writeCount = 0; byte[] bufferByte = new byte[fileBytes.size()]; for (byte fileByte : fileBytes) { bufferByte[writeCount] = fileByte; writeCount++; } outputStream.write(bu..
프론트앤드에서 자바스크립트를 사용하다 보면 DOM에 접근해 사용하는 경우가 많다. 문서 객체 모델은 직관적이고 편리하지만 무분별하게 접근해서 사용하다 보면 나중에 유지보수에 문제가 생긴다. 가령 다음과 같은 코드를 보자. (JQuery가 사용되었다) if ($('#fileName').parents('div').prev().val() == '') { ... return false; } fileName 이라는 id를 가진 노드를 찾아서 상위에 있는 div 태그 노드의 바로 이전 노드의 value 값이 비어있는지를 판단하고 있다. 그냥 눈으로 보기만 해도 복잡하다. 만약 fileName 이라는 id를 가진 노드와 상위 div 노드 사이에 다른 div 태그가 삽입되거나, 상위 div 태그와 그 이전 태그 사이에..
웹서버는 클라이언트로 부터 요청받은 자원을 클라이언트로 전달해 줘야 합니다. 이 때 클라이언트가 어떤 종류의 정적파일, 그러니까 HTML 파일이나, 이미지, 혹은 PDF 같은 파일을 요청했다면 웹서버는 그 파일을 다시 클라이언트로 전송해 줘야 합니다. 물론 HTTP 응답의 형태를 따라야 합니다. HTTP Response 가 어떤 모습인지 잠깐 살펴 보겠습니다. 가장 첫번째 줄에는 상태 라인(status line)이 위치하고 있습니다. 상태 라인에는 순서대로 현재 HTTP 버전 정보, 상태 코드, 상태 텍스트가 포함되어 있습니다. 상태코드는 현재 응답의 상태를 나타냅니다. 100번 대는 조건부 응답, 200번 대는 성공, 300번 대는 리 다이렉션, 400번 대는 요청 오류, 500번 대는 서버 오류를 나..
- Total
- Today
- Yesterday
- 코딩의 기술
- 로그
- java
- 자바스크립트 개론
- RESTful
- 문장 생성기
- 유지보수
- CONVENTIONS
- Markov
- 자바스크립트개론
- Spring in Action
- html
- 경고
- 야근
- DP
- 동적계획법
- markov chain
- 몰라서망신
- 클린코드
- Count
- 전략패턴
- restful api
- was
- 디자인패턴
- 마르코프 연쇄
- 크롬
- 마르코프
- GROUP BY
- REST API
- Warning
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |