이글루 냠냠

namelessja.egloos.com

포토로그



크롬에서 Applet 실행시키기

크롬의 보안 정책상 이유로 크롬 버전 42부터는 기본 설정으로 Applet같은 프로그램이 실행되지 않도록 설정된다.

앞으로 영영 안되는건 아니지만, 언젠가는 아예 안되도록 막는다는 이야기도 있는 듯 하다.

설정 방법은 크롬 내부의 NPAPI를 활성화 하면 되는 것.

크롬 주소창에 chrome://flags/#enable-npapi 를 입력 활성화하고, 재시작하면 Applet같은 프로그램을 사용할 수 있다.

참조 : https://java.com/en/download/faq/chrome.xml

[Spring][JSP] Spring Bean을 JSP에서 접근하기 Spring/MyBatis

Spring View에서 Business-logic의 Bean 접근하기
최근들어 쓸일이 없었는데 갑자기 또 쓸일이 급 늘어나기 시작해서 다시 정리정리!
Java 1.7, Spring 3.2, Servlet3 에서 사용한 코드이다. (Servlet2.5에서는 에러가 발생)
import 부분은 너무 길어져서 다 빼버렸다.

* 사용 대상이 될 객체 (Bean)
package com.egloos.namelessja.accesibleObjects;

@Component("beanCalculator")
public class BeanCalculator {
public int sum(int a, int b) {
return a + b;
}

public int multiply(int a, int b) {
return a * b;
}
}


1. EL, JSTL을 사용하는 방법
jsp:useBean을 사용해서 Bean을 특정 변수로 등록한 후에 JSTL로 바로 사용한다.
<jsp:useBean id="myCalculator" class="com.egloos.namelessja.accesibleObjects.BeanCalculator"/>
<c:out value="myCalculator.sum(10, 20)"/>


2. servletContext를 사용하는 방법
Spring에 의해 servletContext에 등록된 Bean은 JSP에서도 접근이 가능한 Bean으로 처리된다.
servletContext에 등록하기 위해서는 ServletContextAware를 상속받아 구현해야 하며,
구현된 클래스는 Component나 Service로 등록되어 Spring에 의해 관리될 수 있도록 한다.

2-1. ServletContext에 등록할 loader 클래스를 만들고, JSP에서 접근하고자 하는 Bean 등록
package com.egloos.namelessja.accessibleObjects;

@Component
public class BeanLoader implements ServletContextAware {
@Autowired
BeanCalculator beanCalculator

private ServletContext servletContext;

@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;

}

@PostConstruct
public void init() {
servletContext.setAttribute("beanCalculator", beanCalculator);
}
}


2-2. JSP에서 JSTL로 등록된 객체를 직접 접근해서 사용하기
<c:out value="${beanCalculator.sum(10, 20)}"/>

[Javascript] HTML Form을 루프돌면서 처리하기 Javascript

HTML은 Form 테그와 input, select, textarea 등의 테그를 사용하여 하나의 양식을 만들 수 있다.

Javascript에서는 이들 dom을 직접 접근하여 제어할 수도 있지만,
form에서 제공하는 프로퍼티를 사용하여 양식을 제어할 수도 있다.
form은 length와 elements 프로퍼티를 제공하여, 현재 form의 항목 수와, 각 항목에 대한 dom을 배열로 제공해준다.

언제나 그렇듯 이쯤에서 예제를 하나 만들어볼까 한다.
먼저, 간단하게 사용할 양식은 다음과 같다.
<form id="myForm">
<input type="text" name="account" value="person001"/>
<input type="text" name="name" value="Hans"/>
<form>

그리고, 지정된 양식의 모든 데이터를 출력하는 printForm 함수는 다음과 같다.
물론이지만, 위에 사용된 양식을 그대로 사용할 것이다.
var printForm = function(form) {
if ( undefined === form )
return;

var len = form.length;
if ( 0 === len ) {
console.log('No elements');
return;
}

var fe = form.elements;
for ( var i=0; i<len; i++ ) {
console.log(fe[i].name + ' : ' + fe[i].value);
}
}

printForm ( document.getElementById('myForm') );

함수를 실행하면 myForm의 엘리먼트인 account와 name을 각각 획득하고,
획득한 정보를 console.log를 사용하여 출력하게 된다.
account : person001
name : Hans


[MYSQL] hexadecimal literal, MySQL에서 16진수 처리하기 DBMS

요즘에 flag 처리를 DB에서 많이 하기 시작해서 발견한 mysql의 새로운 기능!!
mysql에서 16진수 포멧으로 이루어진 문자열을 처리하는 방법에 대한 부분이다.
mysql에서는 16진수 포멧을 가진 문자열을 hexadecimal literal이라고 부르며 별도의 처리 기능을 지원하고 있고,
이를 이용해서 문자열 형태의 flag 처리도 가능하다.
자세한 이론은 맨 마지막의 링크를 참조하는 쪽이 나을지도..?

먼저 예제를 위해 다음 테이블을 만든다.
CREATE TABLE test.arrt (
v1 VARCHAR(16),
v2 IN T
);

INSERT INTO test.arrt(v1, v2) VALUES (16, 16);


이렇게 하면 다음과 같이 나타날 수 있다.
mysql> SELECT * FROM test.arrt;
+------+------+
| v1 | v2 |
+------+------+
| 16 | 16 |
+------+------+
1 rows in set (0.00 sec)


자 그럼 흔히 쓰는 플래그 형태로 검색을 해볼까 한다.
먼저 VARCHAR형태로 저장된 v1에 where절을 사용한 경우이다.
mysql> SELECT * FROM test.arrt WHERE v1 = 0x10;
Empty set (0.00 sec)
16진수 0x10은 10진수로 16인데도 불구하고 결과가 나타나지 않는다!!

그렇다면 이번에는 int형으로 저장된 v2에 where절을 사용해보자.
mysql> SELECT * FROM test.arrt WHERE v2 = 0x10;
+------+------+
| v1 | v2 |
+------+------+
| 16 | 16 |
+------+------+
1 row in set (0.00 sec)
아까와는 다르게 검색이 되었다.

이러한 차이가 나타나는 이유는 mysql의 hexadecimal literal때문이다.
mysql에서는 X'val', x'val', or 0xval의 데이터 형태를 (0..9, A..F)으로 처리한다고 한다.
때문에 검색을 할 때에는 적절한 캐스팅이 필요하다.
v1의 경우에는 자료형이 varchar, 즉 문자열 형태라서 변환 작업이 필요하고,
v2의 경우에는 int형이므로, 이러한 변환 작업이 필요없다.

사용 방법은 2가지가 있는데, 다음과 같다.
mysql> SELECT 0x10, 0x10+0, CAST(0x10 AS UNSIGNED);
+------+--------+------------------------+
| 0x10 | 0x10+0 | CAST(0x10 AS UNSIGNED) |
+------+--------+------------------------+
|  | 16 | 16 |
+------+--------+------------------------+
1 row in set (0.00 sec)
첫 번째에는 이상한 기호가 출력되지만, 두 번째와 세 번째는 제대로 원하는 데이터가 출력된다.

마지막으로 위의 방법으로 v1에 다시금 where조건절을 사용해보자.
mysql> SELECT * FROM test.arrt WHERE v1 = 0x10+0;
+------+------+
| v1 | v2 |
+------+------+
| 16 | 16 |
+------+------+
1 row in set (0.00 sec)


처음으로 mysql 결과를 그대로 붙여넣기 했는데 모양새가 다 깨지는구나...
이글루스에서 이쁘게 보일 방법은 다음 포스팅에 찾......긴 하려나..?

추신. hexadecimal literal과 switch-case문
insert/update 시에 case문을 쓸 경우가 있는데, 이럴 경우 case문의 결과는 문자열로 처리된다.
재미있는점은 다음을 보면 될듯도?
mysql> CREATE TABLE test.arrt(
-> v1 int,
-> v2 int,
-> v3 int
-> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO test.arrt(v1) VALUES(1), (258), (513);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> UPDATE test.arrt
-> SET
-> v2 = CASE
-> WHEN v1 = 1 then 0x100
-> WHEN v1 = 0x102 then 0x200
-> ELSE 0x300
-> END,
-> v3 = CASE
-> WHEN v1 = 1 then 0x100+0
-> WHEN v1 = 0x102 then 0x200+0
-> ELSE 0x300+0
-> END;
Query OK, 3 rows affected, 3 warnings (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0

mysql> SELECT * FROM test.arrt;
+------+------+------+
| v1 | v2 | v3 |
+------+------+------+
| 1 | 0 | 256 |
| 258 | 0 | 512 |
| 513 | 0 | 768 |
+------+------+------+
3 rows in set (0.00 sec)
먼저, v2와 v3 컬럼을 int형으로 추가한 후에 각각 case문을 사용하여 데이터를 넣었다.
v2는 아무런 처리를 하지 않았고, v3은 int형으로 별도의 변환 작업을 거쳐주었다.
결과는 v2에는 모두 0 (문자열이 처리되지 않아 0으로 입력)되었고,
v3에는 정상적으로 숫자형태의 데이터가 들어갔다.
이와같이 hexadecimal literal을 사용할 때에는 자료형 뿐 아니라 구문에도 주의를 해야 한다.

출처 : https://dev.mysql.com/doc/refman/5.0/en/hexadecimal-literals.html

[Spring][Test] MultipartFile Test Spring/MyBatis

파일 업로드에 사용되는 테스트 클래스.
내가 주로 사용하는 경우는 엑셀 파일이나 CSV파일을 읽어서 DB에 넣을 때 사용한다.

JUnit으로 테스트 할 때는 MockMultipartFile을 사용하면 테스트 클래스를 작성할 수 있다.

@Autowired
TestSo testSo;

public void imporTest() {
String fileDir = "/tmp";
String fileName = "import_target.xls";
String fileFullPath = String.format("%s/%s", fileDir, fileName);

MultipartFile multipartFile = new MockMultipartFile(fileFullPath, fileName, null, new FileInputStream(file));
// Do any works.
// testSo.parseXLS(multipartFile);
}


첫 번째 파라메터에서는 경로 + 파일명까지 전부 해서 넣어주고,
fileName 부분을 null로 주게 되면 업로드된 파일을 따로 기록하는 경우에는 파일명을 가져오지 못하므로 꼭 입력해준다.
context 타입은 필요에 따라 입력을 해주면 되며,
마지막 파라메터는 inputStream을 만들어 넘겨주면 된다. 이 경우에는 파일 관련이니 FileInputStream을 만들어 넘겨주었다.

1 2 3 4 5 6 7 8 9 10 다음