일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- nodejs
- Java
- docker
- Windows
- JPA
- springboot
- database
- mybatis
- log4j2
- Kubernetes
- VSCode
- kubectl
- Spring
- nginx
- MySQL
- dbeaver
- LOG4J
- intellijIDEA
- useEffect
- Git
- react
- jetbrains
- tibero
- JavaScript
- gradle
- BPMN
- wildfly
- NCP
- IntelliJ
- gson
- Today
- Total
목록프로그래밍언어/Java (28)
두 손끝의 창조자
모듈 A, B, C가 있을 때 B는 C모듈을 의존해서 구현하고 A는 B모듈을 사용한다. A가 B모듈 중 C에 존재하는 예외 클래스를 상속받아 재구현한 예외를 사용하려고 하면 참조 오류가 발생한다. throw 로 예외를 올렸을 때 오류가 발생하는데 일반 클래스 생성 및 사용은 문제가 없다. 그 이유를 모르겠어서 기록해놓는다. module c code package c; public class BaseException extends RuntimeException{ }module b gradle implementation project(':module-c')code package b; import c.BaseException; public class SubBaseException extends ..
org.springframework.boot.context.annotation.ImportCandidates /* * Copyright 2012-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in w..
private List splitSql(String sqlChunk) { StringBuilder sb = new StringBuilder(); List sqlList = new ArrayList(); boolean openQuote = false; for (int i = 0; i < sqlChunk.length(); i++) { char c = sqlChunk.charAt(i); if (c == '\'') { openQuote = !openQuote; } if (c == ';' && !openQuote) { sqlList.add(sb.toString().trim()); sb = new StringBuilder(); } else { sb.append(c); } } re..
Map에 Key가 abc01 이고 Object 필드의 필드명이 abc_01 일 때 서로 매핑 가능하도록 하려면 매핑전략을 정의해야한다. Gson gson = new GsonBuilder() .setFieldNamingStrategy(f -> concatUnderscoredIndex(f.getName())) .create(); String concatUnderscoredIndex(String str) { if (str == null) return null; if (!str.contains("_")) return str; int i = str.lastIndexOf("_"); if (i == 0) return str; String prefix = str.substring(0, i); String suffix ..
SMTP 서버 설정정보로 세션을 흭득하고 MimeMessage에 세션을 가지고 메시지를 만들고 Transport 로 메시지를 전송한다. 세션을 만들때 default세션으로 가져오면 다른 계정에 대한 정보를 인지하지 않고 기본세션정보만 가져오기 때문에 유의해야한다. import org.springframework.util.StringUtils; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Propertie..
스프링부트 등 jar 로 말려있는 자원 내부에서 특정 리소스를 참조할 때 로컬에서 테스트할 때는 잘되나 서버에서 실행하면 오류가 발생할 수 있다. 리소스에서 읽을 때 File을 받아오지말고 스트림으로 받아 와서 처리. 왜 그런지는 확인 필요. Spring Boot에서 src/main/resource 파일 접근 방법 및 주의사항. — wedul
mockito로 mock을 만들면 해당 메소드의 파라미터 이름을 지운다. 그래서 리플렉션으로 메소드 파라미터의 이름을 사용해야 할 경우 사용할 수 없으므로 유의할 것.
String date = "20220615052111"; LocalDateTime parse = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); System.out.println(parse); Instant instant = parse.atZone(ZoneId.systemDefault()).toInstant(); System.out.println(instant); System.out.println(LocalDateTime.ofInstant(instant, ZoneId.systemDefault())); System.out.println(ZoneId.systemDefault());
ObjectMapper objectMapper = new ObjectMapper(); //noinspection deprecation objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 위 코드는 오브젝트를 컨버팅 할 때 타깃과 소스의 이름의 케이스를 무시하고 없는 경우도 오류내지 않고 가능한 것만 매핑하라는 옵션이다.
https://en.wikipedia.org/wiki/ISO_8601
JAVA Instant와 LocalDateTime Instant Instant는 1.8 java.time package에 들어가있으며 UTC의 타임 라인에있는 순간으로, 1970년 1월 1일 UTC의 첫 번째 순간 이후의 현재 시간까지의 나노초를 나타낸 값이다. 애플리케이션에서 이벤트 타임스탬프를 기록하는 데 사용될 수 있습니다. 순간의 범위는 long보다 큰 숫자의 저장공간이 필요하다. 이를 달성하기 epoch-seconds를 나타내는 long과 nanosecond-of-second를 나타내는 int를 저장한다. 이는 항상 0에서 999,999,999 사이이다. epoch-seconds는 1970-01-01T00:00:00Z의 표준 Java epoch에서 측정되며, Epoch 이후의 순간은 양수 값이고..
Map x; Map y = x.entrySet().stream() .collect(Collectors.toMap( e -> Map.Entry::getKey, e -> Integer.parseInt(e.getValue()) ));
jar 파일 내 resource가 있을 때, 예를 들면 스프링부트로 말아서 서비스를 돌리는데 그 안에 리소스를 참조해야하는 경우 리소스를 stream으로 가져오면 사용할 수 있다. getClass().getResourceAsStream("리소스이름"); 문제는 classpath에 서브 디렉토리가 있고 그 안에 리소스가 있는데 정확한 경로를 모르는 경우이다. 스트림이 아니라 파일로 가져올 수 있다면 파일 객체에서 isDirectory() 로 디렉토리를 확인 한 후에 서브 디렉토리를 다시 뒤지는 형태로 Walk가 가능한데 스트림은 그렇게 할 수 없다. 스프링에서는 여러가지 형태로 저장된 리소스를 패턴으로만 찾아서 가져올 수 있도록 도구를 제공한다. Resource[] resources = ResourcePa..
Class.getResource() 클래스 기준으로 상대적인 위치의 리소스를 가져올 수 있다. a.b.C 클래스가 있다면 C.class.getResouce("xxx.txt") 로 C 클래스와 같은 패키지에 있는 자원을 가져 올 수 있다. 절대 위치로도 지정이 가능한데 맨 앞에 /로 시작하면 된다. C.class.getResouce("/a/b/xxx.txt") 은 같은 의미이다. ClassLoader.getResource() 항상 절대 경로 기준으로 리소스를 가져온다. C.getClassLoader().getResource("a/b/xxx.txt"); 는 같은 자원을 가져 온다.
elements = (E[]) Array.newInstance(clazz, capacity); (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size); https://www.baeldung.com/java-generic-array
java.lang.reflect.Type Type은 Java 프로그래밍 언어의 모든 Type에 대한 공통 수퍼 인터페이스입니다. 여기에는 Raw types, Parameterized types, Array types, Type variables, Primitive types이 포함됩니다. GenericArrayType ParameterizedType WildcardType TypeVariable Class
CheckStyle로 자바 코드의 스타일을 강제할 수 있다. 하지만 test 코드는 이 강제에서 좀 벗어나게 할 수 있는데 그걸 구현할 수 있는 모듈이 SuppressionFilter이다. checkStyle.xml 설정 파일에서 Checker 모듈 바로 밑에 모듈을 추가한다. config_loc 은 기본값으로 프로젝트 루트 기준으로 config/checkstyle 이 된다. 상대 경로로 지정이 안되니 이런 변수값을 활용해서 지정하는 수밖에 없다. checkStyle-suppressions.xml 파일에 무시할 파일의 패턴과 어떤 Check를 그냥 통과시킬지 정의하면 된다. 위 xml은 src/text 밑에 있는 모든 java 파일들에 대해서 JavadocPackage, FileLength, Missin..
wildfly는 VFS 를 사용한다. getClass().getResource() 를 하면 url을 가져오지만 실제로 존재하는 경로가 아니기 때문에 그 경로로 파일을 가져온다던지 하는 것은 안된다. getClass().getResourceAsStream() 메소드로 스트림을 바로 가져오던지 해야한다. 이렇기 때문에 클래스 패스 리소스 안에 어떤 파일들이 있는지 파일 목록을 가져오는데 문제가 있다. jboss에서 제공하는 라이브러리를 활용해서 처리해야한다.
오브젝트는 instanceof 로 간단하게 여부를 알 수 있다. 클래스끼리 관계를 알고 싶을 때는 isAssignableFrom 메소드를 이용하자. 예를 들어 A 인터페이스를 구현한 AA 클래스가 있다면 AA 클래스가 A 인터페이스의 서브타입인지 확인 하고자 할 때 A.class.isAssignableFrom(AA.class) 하면 됨
대용량 파일을 읽어 라인별 처리를 하는 것을 시도하였다. DirectByteBuffer를 사용한 이유는 대용량 데이터를 시스템에서 읽어서 jvm에 올리는 비용을 줄이고자 함이었다. 내가 필요한 작업은 파일을 일어서 행별로 읽어들이는 거였는데 DirectByteBuffer는 행단위 Reader를 제공하지 않는다. 그래서 별도로 구현을 했는데 구현 과정에 byte배열에 복사하고 하는 과정이 제법 있어서그런지 이렇다할 성능개선은 보이지 았았고 오히려 느려졌다. DirectByteBuffer는 데이터를 읽어 별도로 다른 buffer에 넣지 않고 즉시처리, 예를 들어서 다른 socket으로 보낸다던지 하는 경우 성능개선에 도움이 될 것같다. import sun.nio.ch.DirectBuffer; import j..