자바 라이브러리에는 close 메서드를 직접 호출해서 닫아줘야 하는 자원이 많다. 전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. 예외가 발생하거나 메서드에서 반환되는 경우를 포함해서 말이다.static void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(src); OutputStream out = new FileOutPutStream(dst); try { byte[] buf = new byte[BUFFER_SIZE]; int n; while ((n=in.read(buf)) >= 0) out.write(buf, 0, n); } ..
Locale DispatcherServlet을 사용하면 클라이언트의 Locale을 사용하여 메시지를 자동으로 확인할 수 있다. 이는 LocalResolver 객체를 사용한다. request가 들어오면 DispatcherServlet이 LocalResolver를 찾아 이를 설정해준다. RequestContext.getLocale()을 사용하면 LocalResolver를 통해 찾아진 Locale을 찾을 수 있다. 또한 특정 상황에 따라 Locale을 변경할 수 있는 Interceptor도 등록 가능하다. AcceptHeaderLocaleContextResolver : 요청 헤더의 accept-launguage 이용 Cookie Resolver @Bean public LocaleResolver localeRe..
cron 명령어는 Unix 기반 시스템에서 잡 스케쥴러이다. 잡을 주기적으로 실행시키기 위해 cron을 사용한다. 크론 표현식 UNIX 기반 # ┌───────────── minute (0–59) # │ ┌───────────── hour (0–23) # │ │ ┌───────────── day of the month (1–31) # │ │ │ ┌───────────── month (1–12) # │ │ │ │ ┌───────────── day of the week (0–6) (Sunday to Saturday; # │ │ │ │ │ 7 is also Sunday on some systems) # │ │ │ │ │ # │ │ │ │ │ # * * * * * Spring cron expressions ┌─..
소스는 간단한게 좋다. 단순하게 설계 경우의 수를 줄여라. java assert 예약어 assert를 사용하면 코드를 작성하는 과정의 생각, 가정 등을 명시할 수 있다. 다른사람이 코드를 읽기 쉬워진다. 잘못 된 가정을 했을 경우, 다른 개발자가 보고 피드백해줄 수 있다.
의도 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 합니다. 객체 생성을 Creator 인터페이스를 통해 캡슐화하여 구체클래스가 생성을 대신하게 하는 패턴이다. 객체를 new 연산자를 사용하여 직접 생성하는 것이 아닌 구체 Creator 클래스에서 객체를 생성하는 메서드(팩토리 메서드)를 통해서 객체를 생성하는 것이다. 활용성 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으면 할 때 객체 생성의 책임을 몇 개의 보조 서브클래스 가운데 하나에게 위임하고, 어떤 서브클래스가 위임자인지에 대한 정보를 국소화시키고 시을 때
추상 팩토리 상세화된 서브클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 제공 활용성 객체가 생성되거나 구성·표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때 여러 제품군 중 하나를 선택해서 시스템을 설정해야 하고 한번 구성한 제품을 다른 것으로 대체할 수 있을 때 관련된 제품 객체들이 함께 사용되도록 설계되었고, 이 부분에 대한 제약이 외부에도 지켜지도록 하고 싶을 때 제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출시키고 싶을 때 public interface AbstractProductA { } class ProductA1 implements AbstractProductA { } class ProductA2..
다중 파일 업로드를 구현하면서 헤맨 기록 이렇게 FormData를 만들어서 보내면 [Object object] 문자열만 전송된다. document.querytSelector('#files').files 는 단순 File 객체가 담긴 배열이 아닌, FileList를 반환한다. 해결법 FormData에 File객체를 계속해서 append시키면 정상 작동한다. 이렇게 동일한 key로 append하면 단순 Array 로 넘어가서 되는 것 같다. @Controller public class FileController { @RequestMapping("/uploadFile") public void uploadFile(@RequestPart List files) { ... } }