제한사항
생성 방식
public record Person(
String name,
Integer age,
Job job
) {
public Person{
//Do Something
}
public static int test = 100;
public void testUp() {
test++;
}
public static int getTest() {
return test;
}
private void testDown() {
test--;
}
}
Json으로 만들기
Jackson-databind를 통해 Json만들기 가능.
public record Person2(
@JsonProperty("Name") String name,
@JsonProperty Integer age,
@JsonIgnore Job job
) {}
Main에서
Person person = new Person("Arakene", 25, new Job("Android Developer"));
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(person);
실행 결과
{"Name":"Arakene","age":25}
성능 테스트의 도구 중 하나로 JMH(Java Microbenchmark Harness)란 이름을 있다.
Dependency 설정
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.32</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.32</version>
</dependency>
테스트 코드
@State(Scope.Thread)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class BenchMarkTest {
int max = 999;
List<Integer> testList = new ArrayList<>();
@Setup //테스트 전 준비 과정
public void set(){
for (int i = 0; i < max; i++) {
testList.add(i);
}
}
@BenchmarkMode(Mode.AverageTime)
@Benchmark //테스트할 메소드
public void originLoopWithGetSize() {
int sum = 0;
for (int i = 0; i < max; i++) {
sum += testList.get(i);
}
}
}
public static void main(String[] args) throws IOException, RunnerException {
Options opt = new OptionsBuilder()
.include(BenchMarkTest.class.getSimpleName())
.forks(1)
.build();
new Runner(opt).run();
}
Annotations
Options
Annotation으로 벤치마크의 여러 설정을 할 수 있지만 Option을 통해서도 조정이 가능하다.
Options opt = new OptionsBuilder()
.include(BenchMarkTest.class.getSimpleName())
.warmupIterations(1)
.measurementIterations(1)
.forks(1)
.build();
new Runner(opt).run();
멀티 라인으로 문자열을 작성할 때 매우 좋은 기능이다.
String query = "SELECT \"name\", \"email\" FROM \"users\"\n" +
"WHERE \"username\" = 'kbh';";
String query = """
SELECT "name", "email" FROM "users"
WHERE "username" = 'kbh';
""".stripIndent();
기존의 NPE
기존에는 chain methods에서 npe가 발생할 경우 정확히 어디서 발생한 것이 알 수 없었다.
JDK 14 이후
String name = person.personDetails.name;
를 실행한 경우
Exception in thread "main" java.lang.NullPointerException: Cannot read field "name" because "person.personDetails" is null
at Main.main(Main.java:6)
와 같이 어디서 null이 나온건지 알 수 있다.
사용 방법
Intellij 기준
VM Options에 -XX:+ShowCodeDetailsInExceptionMessages을 추가해주면 된다.
사용 결과
String name = person.personDetails.name;
이 코드를 실행시키면
Exception in thread "main" java.lang.NullPointerException: Cannot read field "name" because "person.personDetails" is null
at Main.test(Main.java:42)
at Main.main(Main.java:24)
peronalDetails가 null 인지 name이 null인지 알 수 있다.