본문 바로가기

Programing

(393)
[Spring] 특정 타입의 객체를 Request 스코프로 받기 방법1.빈에 @Scope 어노테이션을 이용한다.예) 로그인 정보를 어디선가(예. 인터셉터)에서 넣어준다고 할 때 아래와 같이 로그인 정보를 담는 요청 스코프의 빈을 만들 수 있다.@Component @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) public class LoginHolder { private Login login; protected void setLogin(Login login) { this.login = login; } public Login getLogin() { return login; } }실제로 스프링에서는 해당 구현을 ThreadLocal등에 map의 형태로 관리한다.자세한 것은 아래 소스코드 참고.htt..
[Spring] afterCompletion 에서 annotation으로 로그 찍기 특정 컨트롤러 클래스에서만 User-Agent를 찍고 싶었다. 그래서 어노테이션을 만들고.. import java.lang.annotation.*; /** * Indicates that an annotated class or method for logging the User-Agent information. */ @Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface UserAgentLogging { }afterCompletion에서 세 번째 파라메터를 통해@Override public void afterCompletion(HttpServletRequest request, H..
[Spring] 스프링에서 정적리소스 설정하기 이클립스 플러그인으로 제공하는 spring mvc 템플릿에서는 기본적으로 정적 리소스는 resources로 설정이 되어 있다. 하지만 가끔 루트로 요청이 들어오는 /robots.txt이나 /favicon.ico 같은 요청이 있다. xml 방식의 설정을 사용한다면ref. No mapping found for HTTP request with URI [/favicon.ico] Java Configuration으로 사용한다면org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport 를 상속받는 @Configuration에 addResourceHandlers 메서드를 오버라이드 해서 추가해주면 된다.@Override protected ..
[lombok] mutable 변수에 대한 PMD 에러 lombok으로 참조 데이터 타입중 가변(mutable) 데이터 타입의 경우 발생하는 문제.String이나 Long인 경우에는 객체의 값을 바꿀 수 없는 불변(immutable) 데이터 타입이다. 문제는 Date나 일반 객체의 경우는 mutable이다. 그런 경우 FindBugs에서는 EI_EXPOSE_REP2, Priority: Low 에러를 낸다.This code stores a reference to an externally mutable object into the internal representation of the object. If instances are accessed by untrusted code, and unchecked changes to the mutable object wou..
[Java] enum find static 헬퍼 메서드 enum에 가끔 코드와 같은 값을 같이 넣을일이 있다.문제는 enum 코드 간에 데이터 변환이 필요하다. enum -> 코드로 가는 것은 getter를 제공하면 되는데, 반대는 열거에서 찾아야 한다.enum의 values()를 이용하면 iteration이 가능하기 때문이다. enum 타입이 많은 경우에 최악의 경우 O(n)의 복잡도를 가지게 된다.따라서 정적으로 map을 넣어두었다가 key에 해당하는 enum을 반환하게 헬퍼 메서드를 종종 만들게 된다. 그런데 키튼님에게 코드 리뷰를 받다 보니 Hashmap을 사용할 경우 CPU가 높이 치솟는 일이 발생할 수 있다고java.util.concurrent.ConcurrentMap 를 사용하라고 권장하셨다. 대중 템플릿은 아래와 같은 형태가 된다.public ..
[Spring] @Controller에서 @RequestParam로 Date 타입 받기. 특정 기간을 조회한다거나 할 때 HTTP GET으로 요청 파라메터를 받을 때 날짜로 받을 경우가 있다.이런경우에 날짜 포맷 자체는 문자열이나 이것을 Date로 변환을 해야 한다. 스프링에서는 파라메터에 대한 정보를 어노테이션으로 정보를 줄 수 있다. org.springframework.format.annotation.DateTimeFormat 예)@RequestParam(required = false) @DateTimeFormat(pattern = "yyyyMMdd") Date startDate, 주의 할 점은 파라메터가 해당 패턴과 일치하지 않으면 404에러로 빠질 수 있다는 것이다.그런 것을 화면에 표시한다고 하면 String으로 받아서 Date로 변환하는 것을 수동으로 해줘야 할 것이다. 또한, j..
[Handlebars] 공백 문자 trim하기 핸들바에서 문자를 합치다 보면, 마크업의 줄바꿈 때문에 문자열이 줄이 바뀌는 경우가 있다.이전 포스트인 http://namocom.tistory.com/475 가 그 예중에 하나이다. 예를 들어 a 엘리먼트로 하이퍼텍스트 링크를 건다고 했을 때 공백문자가 들어가 버리면 URL이 깨져버리는 일이 발생할 수 있다. 다행히 핸들바에서는 이러한 공백문자 제거하는 방법을 제공하고 있다.틸드(~)기호를 이용하면 된다. 관련된 깃랩 머지요청은 아래이다.{{~#each collection}} - trims whitespace before{{#each collection~}} - trims whitespace after{{~#each collection~}} - trims whitespace before and afte..
[Handlebars] each에서 마지막 원소의 조건 만들기(예. 콤마 빼기) 리스트로 값을 받는 것을 나의 문자열로 붙이는 것을 하던 중에 마지막 원소에는 콤마가 필요없었다.핸들바 코드 상에는 이랬다.{{#each items}} {{itemPackageId}}:{{itemId}}:{{quantity}}, {{/each}} 그런데 마지막에 콤마가 있으니 보기가 싫었다. 찾아보니 마지막 엘리먼트인지 판단할 수 있는 로직이 있었다.stackoverflow: conditional on last item in array using handlebars.js template{{#each items}} {{itemPackageId}}:{{itemId}}:{{quantity}}{{#unless @last}},{{/unless}} {{/each}}