diff --git a/src/application-core/src/main/java/dev/caskeleton/application/techlog/studio/service/ImageDimensions.java b/src/application-core/src/main/java/dev/caskeleton/application/techlog/studio/service/ImageDimensions.java
index 3ad3551..116ecae 100644
--- a/src/application-core/src/main/java/dev/caskeleton/application/techlog/studio/service/ImageDimensions.java
+++ b/src/application-core/src/main/java/dev/caskeleton/application/techlog/studio/service/ImageDimensions.java
@@ -5,15 +5,13 @@ import java.util.Optional;
/**
* 업로드한 그림의 픽셀 크기를 헤더에서 읽는다.
*
- *
업로드가 이 값을 기록하지 않아 모든 그림이 화면에서 사라졌다. 렌더러는 치수를 모르면 자리를
- * 잡을 수 없고, 그때 쓰던 대체값 1×1 이 {@code loading="lazy"} 와 만나 브라우저가 영영 가져오지
- * 않는 상자가 됐다. 화면 쪽은 모르는 치수를 정직하게 비우도록 고쳤고, 이쪽은 애초에 알 수 있는
- * 값을 기록한다.
+ *
업로드가 이 값을 기록하지 않아 모든 그림이 화면에서 사라졌다. 렌더러는 치수를 모르면 자리를 잡을 수 없고, 그때 쓰던 대체값 1×1 이 {@code
+ * loading="lazy"} 와 만나 브라우저가 영영 가져오지 않는 상자가 됐다. 화면 쪽은 모르는 치수를 정직하게 비우도록 고쳤고, 이쪽은 애초에 알 수 있는 값을
+ * 기록한다.
*
- *
디코딩하지 않고 헤더만 읽는다. {@code ImageIO} 는 {@code java.desktop} 모듈을 끌어오고
- * 런타임 이미지가 그것을 담고 있으리라는 보장이 없다 — 없는 배포에서 업로드가 통째로 실패하는
- * 것보다, 아는 형식의 헤더 몇 바이트를 직접 읽는 편이 낫다. 모르는 형식은 비운다: 크기를 모르는
- * 것과 크기가 0 인 것은 다르고, 화면은 그 둘을 구분한다.
+ *
디코딩하지 않고 헤더만 읽는다. {@code ImageIO} 는 {@code java.desktop} 모듈을 끌어오고 런타임 이미지가 그것을 담고 있으리라는 보장이 없다
+ * — 없는 배포에서 업로드가 통째로 실패하는 것보다, 아는 형식의 헤더 몇 바이트를 직접 읽는 편이 낫다. 모르는 형식은 비운다: 크기를 모르는 것과 크기가 0 인 것은
+ * 다르고, 화면은 그 둘을 구분한다.
*/
public final class ImageDimensions {
@@ -52,10 +50,7 @@ public final class ImageDimensions {
return size((c[6] & 0xFF) | ((c[7] & 0xFF) << 8), (c[8] & 0xFF) | ((c[9] & 0xFF) << 8));
}
- /**
- * SOF 마커까지 세그먼트를 건너뛴다. 어느 SOF 인지는 상관없다 — 어떤 것이든 그 안의 높이·폭이
- * 그림의 크기다.
- */
+ /** SOF 마커까지 세그먼트를 건너뛴다. 어느 SOF 인지는 상관없다 — 어떤 것이든 그 안의 높이·폭이 그림의 크기다. */
private static Optional jpeg(byte[] c) {
int i = 2;
while (i + 9 < c.length) {
@@ -66,7 +61,8 @@ public final class ImageDimensions {
int marker = c[i + 1] & 0xFF;
// SOF0..SOF15, 단 DHT(C4)·JPG(C8)·DAC(CC) 는 SOF 가 아니다.
if (marker >= 0xC0 && marker <= 0xCF && marker != 0xC4 && marker != 0xC8 && marker != 0xCC) {
- return size((c[i + 7] & 0xFF) << 8 | (c[i + 8] & 0xFF), (c[i + 5] & 0xFF) << 8 | (c[i + 6] & 0xFF));
+ return size(
+ (c[i + 7] & 0xFF) << 8 | (c[i + 8] & 0xFF), (c[i + 5] & 0xFF) << 8 | (c[i + 6] & 0xFF));
}
int length = (c[i + 2] & 0xFF) << 8 | (c[i + 3] & 0xFF);
if (length < 2) {
@@ -78,7 +74,10 @@ public final class ImageDimensions {
}
private static int int32(byte[] c, int at) {
- return ((c[at] & 0xFF) << 24) | ((c[at + 1] & 0xFF) << 16) | ((c[at + 2] & 0xFF) << 8) | (c[at + 3] & 0xFF);
+ return ((c[at] & 0xFF) << 24)
+ | ((c[at + 1] & 0xFF) << 16)
+ | ((c[at + 2] & 0xFF) << 8)
+ | (c[at + 3] & 0xFF);
}
private static Optional size(int width, int height) {
diff --git a/src/application-core/src/main/java/dev/caskeleton/application/techlog/studio/service/UploadStudioAssetUseCase.java b/src/application-core/src/main/java/dev/caskeleton/application/techlog/studio/service/UploadStudioAssetUseCase.java
index bc258d2..243cbdb 100644
--- a/src/application-core/src/main/java/dev/caskeleton/application/techlog/studio/service/UploadStudioAssetUseCase.java
+++ b/src/application-core/src/main/java/dev/caskeleton/application/techlog/studio/service/UploadStudioAssetUseCase.java
@@ -84,8 +84,7 @@ public class UploadStudioAssetUseCase implements CommandUseCase dimensions =
- ImageDimensions.of(mediaType, content);
+ java.util.Optional dimensions = ImageDimensions.of(mediaType, content);
UUID assetId = idGenerator.get();
String assetKey = assetKeyFor(input.originalFilename(), assetId);
diff --git a/src/application-core/src/test/java/dev/caskeleton/application/techlog/studio/service/ImageDimensionsTest.java b/src/application-core/src/test/java/dev/caskeleton/application/techlog/studio/service/ImageDimensionsTest.java
index c2c77b8..7485b8e 100644
--- a/src/application-core/src/test/java/dev/caskeleton/application/techlog/studio/service/ImageDimensionsTest.java
+++ b/src/application-core/src/test/java/dev/caskeleton/application/techlog/studio/service/ImageDimensionsTest.java
@@ -5,10 +5,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import java.util.Optional;
import org.junit.jupiter.api.Test;
-/**
- * 헤더 오프셋은 눈으로 맞는지 알 수 없다. 업로드가 치수를 기록하지 않아 모든 그림이 화면에서
- * 사라진 적이 있으므로, 이 값을 읽는 코드는 실제 바이트로 확인한다.
- */
+/** 헤더 오프셋은 눈으로 맞는지 알 수 없다. 업로드가 치수를 기록하지 않아 모든 그림이 화면에서 사라진 적이 있으므로, 이 값을 읽는 코드는 실제 바이트로 확인한다. */
class ImageDimensionsTest {
private static byte[] png(int width, int height) {
@@ -90,7 +87,10 @@ class ImageDimensionsTest {
void answersEmptyForFormatsItDoesNotRead() {
// 모르는 것과 0 은 다르다. 화면이 그 둘을 구분하므로 여기서 섞으면 안 된다.
assertThat(ImageDimensions.of("image/webp", new byte[64])).isEqualTo(Optional.empty());
- assertThat(ImageDimensions.of("image/svg+xml", "".getBytes(java.nio.charset.StandardCharsets.UTF_8))).isEqualTo(Optional.empty());
+ assertThat(
+ ImageDimensions.of(
+ "image/svg+xml", "".getBytes(java.nio.charset.StandardCharsets.UTF_8)))
+ .isEqualTo(Optional.empty());
}
@Test