반응형

기본적으로 객체 비교시 == 연산자를 쓴게 잘못이다. --;;; ㅠ

그래도 덕분에 하나 배웠다.ㅋ



Integer i = 10;  ==> Integer i = Integer.valueOf(10);

Converting a primitive value (an int, for example) into an object of the corresponding wrapper class (Integer) is called autoboxing.

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html



Integer객체 안에서 속도를 높이기 위해서 -128~127까지는 cache 된 데이터를 사용.

http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#valueOf%28int%29

https://blogs.oracle.com/darcy/entry/boxing_and_caches_integer_valueof



# Integer vs int 비교 테스트.

private static void compareInt() {

int pInt = 127;

Integer oInt = 127;

Integer cInt = new Integer(127);

Integer oInt2 = 127;

Integer cInt2 = new Integer(127);


System.out.println("====================== compare 127");

System.out.println("int vs Integer             : " + (pInt == oInt));

System.out.println("int vs new Integer         : " + (pInt == cInt));

System.out.println("Integer vs new Integer     : " + (oInt == cInt));

System.out.println("Integer vs Integer         : " + (oInt == oInt2));

System.out.println("new Integer vs new Integer : " + (cInt == cInt2));


pInt = 128;

oInt = 128;

cInt = new Integer(128);

oInt2 = 128;

cInt2 = new Integer(128);

System.out.println("\n====================== compare 128");

System.out.println("int vs Integer             : " + (pInt == oInt));

System.out.println("int vs new Integer         : " + (pInt == cInt));

System.out.println("Integer vs new Integer     : " + (oInt == cInt));

System.out.println("Integer vs Integer         : " + (oInt == oInt2));

System.out.println("new Integer vs new Integer : " + (cInt == cInt2));

}


결과..

====================== compare 127

int vs Integer             : true

int vs new Integer         : true

Integer vs new Integer     : false

Integer vs Integer         : true

new Integer vs new Integer : false


====================== compare 128

int vs Integer             : true

int vs new Integer         : true

Integer vs new Integer     : false

Integer vs Integer         : false

new Integer vs new Integer : false




반응형

'프로그래밍 > Java' 카테고리의 다른 글

buffer 사용법.  (3) 2015.05.20
[LINK] zero copy  (0) 2014.11.27
[Spring] MappingJacksonHttpMessageConverter 를 이용한 object <-> json 테스트.  (1) 2014.04.07
[spring] request life cycle  (0) 2014.03.24
이클립스 단축키  (0) 2014.03.24
반응형


import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;



    public static void main(String[] args) throws IOException {

        String test = "{\"id\":123, \"name\":\"httpmessage\"}";

        MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();

    

         // String -> Object(1)

         TestMessage msg = converter.getObjectMapper().readValue(test, TestMessage.class);  


         // Object -> String

         System.out.println("String : " + converter.getObjectMapper().writeValueAsString(msg));



         // String -> Object(2)

         // TestMessage msg = (TestMessage) converter.read(TestMessage.classnew ImplHttpInputMessage());

    }


    public class TestMessage {

        private int id;

        private String name;


        // getter, setter

    }



    public static class ImplHttpInputMessage implements HttpInputMessage {

         String test = "{\"id\":123, \"name\":\"httpmessage\"}";

    

        @Override

        public InputStream getBody() {

            return new ByteArrayInputStream(test.getBytes());

        }

    

        @Override

        public HttpHeaders getHeaders() {

            return null;

        }

    }


반응형

'프로그래밍 > Java' 카테고리의 다른 글

[LINK] zero copy  (0) 2014.11.27
Integer 객체 == 연산자에서 128 이상일 경우만 에러.  (0) 2014.05.15
[spring] request life cycle  (0) 2014.03.24
이클립스 단축키  (0) 2014.03.24
[이클립스] tptp  (1) 2014.03.24
반응형






DispatcherServlet : 클라이언트의 요청을 전달받음. 컨트롤러에게 클라이언트의 요청을 전달하고 컨트롤러가 리턴한 결과 값을 view에 전달하여 알맞은 응답을 생성하도록 한다.


HandlerMapping : 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할 지를 결정

 - SimpleUrlHandlerMapping

 - BeanNameUrlHandlerMapping

 - ControllerClassNameHandlerMapping

 - DefaultAnnotationHandlerMapping


Controller : 클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServlet에 알려줌.

 - Controller

 - AbstractController

 - AbstractCommandController

 - SimpleFormController

 - AbstractWizardFormController

 - ParameterizableViewController

 - UrlFilenameViewController

 - MultiActionController


ModelAndView : 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다.


ViewResolver : 컨트롤러의 처리 결과를 생성할 뷰를 결정


View : 컨트롤러의 처리 결과 화면을 생성


반응형
반응형



ctrl + s: 저장 및 컴파일

ctrl + i: 소스 깔끔 정리(인덴트 중심의 자동구문정리)

ctrl + space : 어휘의 자동완성(Content Assistance)

ctrl + E : 열린파일 옮겨다니기

ctrl + shift + E : 열린파일 띄우기

ctrl + M : 에디터화면 넓게

ctrl + 1 : Quick Fix(Rename에 주로 사용)

ctrl + shift + M : 캐럿이 위치한 대상에 필요한 특정클래스 import

ctrl + shift + O : 소스에 필요한 패키지의 자동 임포트

ctrl + /: 한줄 또는 선택영역 주석처리/제거

ctrl + Q : 마지막 편집위치로 가기

ctrl + L : 특정줄번호로 가기

ctrl + D : 한줄삭제

ctrl + H : Find 및 Replace

ctrl + K : 다음찾기(또는, 찾고자 하는 문자열을 블럭으로 설정한 후 키를 누른다.)

ctrl + shift + K : 이전찾기(또는, 찾고자 하는 문자열을 블럭으로 설정한 후 역으로 찾고자 하는 문자열을 찾아감.)

alt + shift + j : 설정해 둔 기본주석 달기

Ctrl + 객체클릭(혹은 F3) : 클래스나 메소드 혹은 멤버를 정의한 곳으로 이동(Open Declaration)


ctrl + shift + f : 소스 깔끔 정리

ctrl + 2 + R : Rename(리팩토링)

ctrl + shift + / : 선택영역 block comment 설정

ctrl + shift + \ : 선택영역 block comment 제거

alt + shift + up: Enclosing Element 선택(괄호의 열고 닫기 쌍 확인에 유용함)

ctrl + O : Outline창열기

ctrl + T : 상속구조 보기, 한번더 누르면 수퍼타입/서브타입 구조가 토글된다

Alt + ->, Alt + <-: 이후, 이전

해당프로젝트에서 alt + enter : Project 속성

sysout > Ctrl + Space: System.out.println();

try > Ctrl + Space : 기본 try-catch문 완성

for > Ctrl + Space : 기본 for문 완성

템플릿을 수정,추가: Preferences > java > editor > Templates

블럭 씌운상태에서 alt + shift + z : try/catch, do/while, if, for, runnable.... 등 블럭씌우기


ctrl + N : 새로운 파일 및 프로젝트 생성

ctrl + shift + s : 열려진 모든파일 저장 및 컴파일

alt + / : Word Completion

alt + shift + R : Rename

ctrl + shift + G : 특정 메써드나 필드를 참조하고 있는 곳을 찾는다.

ctrl + shift + B : 현재커서위치에 Break point설정/해제

ctrl + alt + R

ctrl + f11 : 실행

f11 : 디버깅 시작

f4 : 상속구조 클래스 보기(메소드, 멤버)

f5 : step into

f6 : step over

f8 : 디버깅 계속

ctrl + . : 다음오류부분으로 가기

ctrl + , : 이전오류부분으로 가기

f12 : 에디터로 커서이동

ALT + UP,DOWN : 현재 줄 위치 이동

Ctrl + j : 검색할 단어를 입력하면서 실시간으로 검색

Ctrl + Shift + j : 검색할 단어를 입력하면서 실시간으로 거꾸로 검색

F4 : 클래스명을 선택하고 누르면 해당 클래스의 Hierarchy 를 볼 수 있다.

ctrl + alt + up/down : 한줄 duplicate

alt + shift + 방향 : 선택

ctrl + shift + g : 객체(변수)가 참조 되는 곳을 찾아 준다

alt + shift + m : 코드 중복 해결(중복부분을 블록선택한 다음 단축키를 누르면 이부분을 별도의 메서드로 뽑아내줌)

ctrl + alt + h : 메서드 호출구조 보기



반응형
반응형


http://antop.tistory.com/135



Eclipse 3.6 (Helios) 이상.

Installing TPTP prerequisites

TPTP 설치 전에 필요로 하는 플러그인들이 있습니다.


1. WTP (Web Tools Platform) - http://eclipse.org/webtools/

이클립스를 J2EE 버전으로 설치했다면 포함되어 있습니다.


2. EMF (Eclipse Modeling Framework) - http://www.eclipse.org/modeling/emf/

help -> Install New Software

 : http://download.eclipse.org/releases/helios

 : Modeling -> EMF - Eclipse Modeling Framework SDK 2.6.1


3. GEF (Graphical Editing Frame work) - http://www.eclipse.org/gef/

help -> Install New Software

 : http://download.eclipse.org/releases/helios

 : Modeling -> Graphical Editing Framework GEF SDK 3.6.2


4. Installing TPTP

이클립스를 이용하여 다운로드 하면 다운로드 진행이 안되서 전 플러그인을 다운로드 받아서 설치했습니다.

 - http://www.eclipse.org/downloads/download.php?file=/tptp/4.7.2/TPTP-4.7.2/tptp.sdk-TPTP-4.7.2.zip


5. Downloading and installing the Agent Controller

TPTP 를 사용하기 위해선 AC(Agent Controller)라는 것을 심어놔야 하는데 로컬 서버는 필요 없습니다.

그냥 톰켓 7.0 으로 테스트 하겠습니다.

서버(WAS)를 시작할 때 프로파일 모드(?)로 실행하면 됩니다.

팝업이 뜹니다

 - Profile on Server


실행시간(Execuion Time), 메모리(Memory), 쓰래드(Thread)를 분석Analysis할 수 있습니다.

3개중 하나를 선택 하고 "Finish" 버튼을 클릭 하면 WAS 가 기동됩니다.

기동된 후 아래와 같이 창이 뜹니다.

 - Confirm Perspective Switch -> Yes



D:\javadev\programs\agntctrl.win_ia32-TPTP-4.7.2\plugins\org.eclipse.tptp.javaprofiler:D:\javadev\programs\agntctrl.win_ia32-TPTP-4.7.2\bin


%JAVA_HOME%

%JAVA_PROFILER_HOME%;%TPTP_AC_HOME%\lib;

JAVA_PROFILER_HOME=%TPTP_AC_HOME%\plugins\org.eclipse.tptp.javaprofiler


./SampleClient: error while loading shared libraries: libtptpClient.so.4: cannot open shared object file: No such file or directory


export TEMP="/home/tmp"

export TMP="/home/tmp"


export TPTP_AC_HOME="/home/install/tptp"

export JAVA_PROFILER_HOME="${TPTP_AC_HOME}/plugins/org.eclipse.tptp.javaprofiler"

export PATH="${JAVA_PROFILER_HOME}:${TPTP_AC_HOME}/bin:${PATH}"

export LD_LIBRARY_PATH="${JAVA_PROFILER_HOME}:${TPTP_AC_HOME}/lib:${LD_LIBRARY_PATH}"


/usr/local/tomcat/5.5.23/bin/Tomcat5.sh

 - CATALINA_OPTS="-Xms128m -Xmx384m -XX:MaxPermSize=128m -agentlib:JPIBootLoader=JPIAgent:server=enabled;HeapProf"



반응형

'프로그래밍 > Java' 카테고리의 다른 글

[spring] request life cycle  (0) 2014.03.24
이클립스 단축키  (0) 2014.03.24
spring exception handler  (0) 2014.03.24
[java 7] copy file, delete file/directory  (0) 2014.03.21
[MyBatis] null parameter 에러.  (0) 2014.03.19
반응형



컨트롤러나 그 뒤의 계층에서 던져진 예외는 DispatcherServlet 이 일단 전달받은 뒤에 다시 서블릿 밖으로 뎐져서 서블릿 컨테이너가 처리

다른 설정을 하지 않았다면 브라우저에 'HTTP Status 500 내부 서버 오류' 와 같은 메시지가 출력

web.xml 에 <error-page> 를 저정해서 예외가 발생했을 때 JSP 안내 페이지 등을 보여줄 수도 있다

만약 스프링과 서블릿 컨테이너에서 같이 java.lang.Exception 을 처리한다면 스프링 처리가 더 우선시 된다.


HandlerExceptionResolver 는 컨트롤러의 작업 중에 발생한 예외를 어떻게 처리할지 결정하는 전략

DispatcherServlet 은 먼저 핸들러 예외 리졸버에게 해당 예외를 처리할 수 있는지 확인

예외를 처리해주는 핸들러 예외 리졸버가 있으면 예외는 DispatcherServlet 밖으로 던지지 않고 해당 핸들러 예외 리졸버가 처리

핸들러 예외 리졸버는 HandlerExceptionResovler 인터페이스를 구현

 - resolveException() 메소드의 리턴 타입은 ModelAndView

 - 사용할 뷰와  그 안에 들어갈 내용을 담은 모델을 돌려주도록 되어 있다.만약 처리 불가능한 예외라면 null 을 리턴

 

스프링은 총 4개의 HandlerExceptionResolver 구현 전략을 제공하고 있다. 그중 3개는 디폴트로 등록

AnnotationMethodHandlerExceptionResolver

 - 디폴트 핸들러 예외 리졸버

 - 예외가 발생한 컨트롤러 내의 메소드 중에서 @ExceptionHandler 애노테이션이 붙은 메소드를 찾아 예외처리

 - 특정 컨트롤러의 작업 중에 발생하는 예외만 처리하는 예외 핸들러를 만들고 싶다면 이 방법이 가장 편리하다.

 - @ResponseBody 사용시 convert 정의 : AnnotationMethodHandlerExceptionResolver

 - 예외처리용 메소드는 모델과 뷰를 리턴할 수 있는데, 모델과 뷰가 정상적으로 리턴되면 DispatcherServlet 은 마치 컨트롤러에서 ModelAndView 가 돌려진 것처럼 뷰를 통해 결과를 만들어 준다

 

ResponseStatusExceptionResolver

 - 특정 예외가 발생했을 때 단순한 HTTP 500 에러 대신 의미 있는 HTTP 응답 상태를 돌려주는 방법

 - 예외 클래스에 @ResponseStatus 를 붙이고, HttpStatus 에 정의되어 있는 HTTP 응답 상태 값을 value 엘리먼트에 지정한다. 필요하면 reason 에 자세한 설명을 넣을 수도 있다.

 - ex ) 애노테이션을 이용해 HTTP 503 응답 상태를 지정해둔 예외클래스

@ResponseStatus(value=HttpStatus.SERVICE_UNAVAILABLE, reason="서비스 일시 중지"

public class NotInServiceException extends RuntimeException {

}

 - 발생한 예외 클래스에 @ResponseStatus 가 있는지 확인하고, 만약 있다면 애노테이션에 지정해둔 HTTP 응답 상태 코드를 클라이언트에 전달.

 - HttPStatus 클래스 안에는 40여 개의 사용 가능한 HTTP 응답 상태 상수가 정의

 - 단점은 적접 @ResponseStatus 를 붙여줄 수 있는 예외 클래스를 만들어 사용해야 한다는 것이다. 따라서 기존에 정의된 예외 클래스에는 바로 적용할 수 없다.

 - @ResponseStatus 를 직접 부여할 수 없는 기존의 예외가 발생했을 때 HTTP 응답 상태를 지정해 주려면 @ExceptionHandler 방식의 핸들러 메소드를 사용하면 된다. 

   기존의 예외를 처리하는 @ExceptionHandler 메소드를 만들고 리턴 타입은 void 로 해둔다. 

   그리고 HttpServletResponse 를 파라미터로 전달 받아서 setStatus() 메소드를 이용해 응답 상태와 에러 메시지 등을 설정

   

   

DefaultHandlerExceptionResolver

 - 디폴트로 등록된 것 중에서 위의 두 가지 예외 리졸버에서 처리하지 못한 예외를 다루는 마지막 핸들러 예외 리졸버

 - 스프링에서 내부적으로 발생하는 주요 예외를 처리해주는 표준 예외처리 로직을 담고 있다.

 - 예를 들어 컨트롤러 메소드를 찾을 수 없는 경우에는 NoSuchRequestHandlingMethodException 예외가 발생한다. 

   이 예외에 대해서는 HTTP 404 - Not Found 로 응답 상태를 지정해준다. 

   또, 요청 파라미터를 파싱하다가 타입이 일치하지 않을 때 발생하는 TypeMismatchException 은 HTTP 400 - Bad Request 응답 상태로 돌려주는 식이다.

 -  다른 핸들러 예외 리졸버를 빈으로 등록해서 디폴트 예외 리졸버가 자동으로 적용되지 않은 경우에는 DefaultHandlerExceptionResolver 를 함께 등록해 주는게 좋다.


SimpleMappingExceptionResolver

 - SimpleMappingExceptionResolver 는 web.xml 의 <error-page> 와 비슷하게 예외를 처리할 뷰를 지정할 수 있게 해준다.

 - mappedHandlers 에서는 예외와 그에 대응하는 뷰 이름을 프로퍼티로 등록해주면 된다.

 - defaultErrorView 프로퍼티는 mappedHandlers 에서 찾을 수 없는 예외에 매핑해주는 디폴트 예외처리 뷰 이름.

 - SimpleMappingExceptionResolver 는 디폴트 전략이 아니므로 직접 빈으로 등록해줘야 한다. xml 또는 @Bean 으로.

 - 모든 컨트롤러에서 발생하는 예외에 일괄적용된다는 장점

 - 예외가 발생했을 때 로그를 남기거나 관리자에게 통보하는 등의 작업을 필요로 하는 경우도 있다. 이런 작업은 핸들러 인터셉터의 afterCompletion() 메소드가 담당하는 것이 좋다.



반응형

'프로그래밍 > Java' 카테고리의 다른 글

이클립스 단축키  (0) 2014.03.24
[이클립스] tptp  (1) 2014.03.24
[java 7] copy file, delete file/directory  (0) 2014.03.21
[MyBatis] null parameter 에러.  (0) 2014.03.19
[iBatis/myBatis] #와 $의 차이점  (1) 2014.01.02
반응형


java 7 에서 파일 복사, 삭제, 디렉토리 삭제.




private final static CopyOption[] options = new CopyOption[] {

      StandardCopyOption.REPLACE_EXISTING, // 복사대상파일이 존재하면 덮어쓰기를 함.

      StandardCopyOption.COPY_ATTRIBUTES // 원본파일의 속성까지 모두 복사.

    };


// 파일 복사.

private boolean copyFile(String from, String to) {

try {

    Path fromFile = Paths.get(from);

    Path toFile = Paths.get(to);

   

    if(!toFile.getParent().toFile().exists()) {

        toFile.getParent().toFile().mkdirs();

    }

   

    Files.copy(fromFile, toFile, options);

    logger.info("success : " + from + " >> " + to);

   

    return true;

} catch(Exception e) {

logger.error("Exception : " + from + " >> " + to + ", message : " + e.getMessage());

return false;

}

}


// 파일 삭제.

private boolean deleteFile(String path) {

try {

Path filePath = Paths.get(path);

    Files.delete(filePath);

    logger.info("success file delete : " + path);

   

    return true;

} catch(Exception e) {

   logger.error("Exception delete file : " + path + ", message : " + e.getMessage());

   return false;

}

}



// 디렉토리 삭제.

private boolean deleteDir(String path) {

try {

Path dirPath = Paths.get(path);

Files.walkFileTree(dirPath, new SimpleFileVisitor<Path>() {

  @Override

  public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {

  Files.delete(dir);

  return FileVisitResult.CONTINUE;

  }

  @Override

  public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {

  Files.delete(file);

  return FileVisitResult.CONTINUE;

  }

});

logger.info("success delete : " + path);

 

return true;

} catch(Exception e) {

logger.error("Exception delete file : " + path + ", message : " + e.getMessage());

return false;

}

}



반응형

'프로그래밍 > Java' 카테고리의 다른 글

[이클립스] tptp  (1) 2014.03.24
spring exception handler  (0) 2014.03.24
[MyBatis] null parameter 에러.  (0) 2014.03.19
[iBatis/myBatis] #와 $의 차이점  (1) 2014.01.02
[이클립스] generate jaxb classes 한글깨짐.  (0) 2013.09.16
반응형


MyBatis 사용시 에러 발생.


Error setting null for parameter #2 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLFeatureNotSupportedException: The data type 'OTHER' is not supported.

; SQL []; The data type 'OTHER' is not supported.; nested exception is java.sql.SQLFeatureNotSupportedException: The data type 'OTHER' is not supported.


2번째 파라미터값이 null 이라서 문제가 생김.


해결 방안.

query 문에 jdbcType 추가.

ex) ADDRESS = #{address, jdbcType=VARCHAR}




반응형
반응형



http://marobiana.tistory.com/60


${} 사용시 주의사항.

 - parameterType 을 string 으로 하면 에러 발생.

 - http://marobiana.tistory.com/24 와 같은 현상.


 - map 등의 형태로 넘겨야 함(getter 를 사용할 수 있는 객체)



반응형
반응형


이클립스에서 xsd to java class

 - xsd 파일 -> 마우스 우클릭 -> Generate -> JAXB classes ...


문제점 발생.

 - 위 방법으로 생성된 java 파일의 상단에 주석이 달리는데 생성시간이 KST 기준으로 쓰여진다.

 - 이 부분에서 "오전", "오후"등의 한글이 깨지는 현상 발생.

 - 파일은 utf-8 인코딩인데 generate 시에 ms949 로(이클립스 기본 설정) 인코딩해서 한글이 깨짐.


해결 방법.

 - 이클립스 Window 메뉴 -> Preferences -> General -> Workspace 의 Text file encoding 항목을 UTF-8 로 설정.



반응형

+ Recent posts