본문 바로가기

Programing

(365)
[eclipse] Runnable JAR File 구현은? 자바 카페에서 아래와 같은 질문이 올라왔다. 질문 이클립스에서는 아래와 같이 프로젝트에서 Export로 Runnable JAR 파일을 만들수가 있습니다. 이것을 CMD 창에서 만드려면 어떤 명령어를 입력해야 하나요? 라이브러리 JAR도 포함시킬 때 추가 명령어 입력하는 부분도 궁금합니다. 생성된 JAR 파일에는 META-INF가 자동으로 포함되어 있는데요, CMD 상에서 JAR 파일 만들때에는 MAINFEST.MF 파일이 반드시 있어야 하나요? 느낌은... 일단 질문 자체를 듣고 느낀 점은 IDE의 장점이자 단점을 느낄 수 있었다. 통합개발도구(IDE)는 개발시에 코드입력 뿐만 아니라 컴파일 등의 반복적으로 하는 것과 디버깅, 리팩토링 등 여러가지를 도와준다. 만약 자바를 명령어부터 시작했더라면 컴파일 ..
[Java] var는 키워드가 아니다. "개발하자" 라는 슬랙에서 이석민(닉네임 lee_maru)님이 "var는 키워드가 아닙니다."라는 이야기를 해서 찾아보게 되었다. 자바언어 규약(JLS)를 찾아보니 var는 키워드가 아니라고 한다. var is not a keyword, but rather an identifier with special meaning as the type of a local variable declaration reference: docs.oracle.com/javase/specs/jls/se12/html/jls-3.html#jls-3.9 국내 출판된 책들 중에는 var 이 키워드라고 되어 있는 책도 있었다. - 장윤기 님의 Practical 모던 자바
[Lombok & Spring (Jackson)] @Getter(lazy=true)를 쓸 때 주의해야 할 점 효진님이 getter 에서 매번 객체를 만드는 것에 대해 이유를 물어봐서 한 번만 만들어지게 하기 위해서 아래와 같이 lazy 를 true로 했다. import lombok.Getter; public class TistoryIssueParams { @Getter(lazy = true) private final TistoryNumber tistoryNumber = TistoryNumber.of(tistoryNumberType, tistoryNumberValue); 이런 식으로 annotation을 달면 lombok은 AtomicReference 로 필드를 만들고 늦은 초기화를 하는 코드를 만든다. 늦은 초기화를 Double-checked locking idiom을 사용하는 것을 알 수 있다. public ..
[tomcat] 적어도 하나의 JAR가 TLD들을 찾기 위해 스캔되었으나 아무 것도 찾지 못했습니다. 증상 org.apache.jasper.servlet.TldScanner.scanJars 13-Nov-2020 13:26:40.105 정보 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars 적어도 하나의 JAR가 TLD들을 찾기 위해 스캔되었으나 아무 것도 찾지 못했습니다. 스캔했으나 TLD가 없는 JAR들의 전체 목록을 보시려면, 로그 레벨을 디버그 레벨로 설정하십시오. 스캔 과정에서 불필요한 JAR들을 건너뛰면, 시스템 시작 시간과 JSP 컴파일 시간을 단축시킬 수 있습니다. 아래 블로그를 참고한다. javacan.tistory.com/entry/decrease-tomcat-startup-time-by-skip..
[tomcat] ARP 경고 해결하기 tomcat 으로 가동되는 프로젝트를 로컬에서 사용하게 되었다. 아래와 같은 문구가 계속 마음속에 걸렸다. 정보 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 프로덕션 환경들에서 최적의 성능을 제공하는, APR 기반 Apache Tomcat Native 라이브러리가, 다음 java.library.path에서 발견되지 않습니다: [/Users/namo/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.] 결국 java.library.path 상 APR 라..
[spring] JSR-303 과 @Valid 과 @Validated Controller 에서는 요청바디에 대해서는 @Valid 라는 annotation을 붙이면 Bean Validation(JSR-303)기능을 수행해준다. 하지만 @PathVariable 에 대해서는 적용이 불가능하다. 만약 bean validation 을 통해 하고자 한다면 @Validated 을 Controller 클래스(타입)에 붙여주면 동작을 한다. @Valid의 경우 바인딩이 실패가되면 MethodArgumentNotValidException 을 발생시킨다. 하지만 @Validated 로 바인딩 validation 실패가 발생하면 ConstraintViolationException 예외가 발생하였다. javax.validation.ConstraintViolationException: null a..
[spring] URL path template에서 매핑된 값 구하기 인터셉터를 구현하다보니 URL 요청에서 template로 매핑된 부분의 값을 구할 필요가 있었다. 아래 코드에서 thisValue에 해당하는 부분이다. @GetMapping("/i/wanna/{thisValue}/really") public SomeResponse getSomeHanlder(@PathVariable String thisValue) { // ... 어떻게 구할까 고민을 하다가 @PathVariable 를 처리하는 PathVariableMethodArgumentResolver 에서 힌트를 얻을 수 있었다. package org.springframework.web.servlet.mvc.method.annotation; public class PathVariableMethodArgumentRes..
[spring] ServletWebRequest 생성 package org.springframework.web.servlet.mvc.method.annotation; public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter implements BeanFactoryAware, InitializingBean { @Nullable protected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception { ServletWebRequest webRequest = new ServletWebRequ..