style: apply the formatter to the image dimension reader

Spotless normalization only; no behaviour change.
This commit is contained in:
donghyeon-ka
2026-08-21 18:10:35 +09:00
parent e65b9e2c33
commit 8d228255e9
3 changed files with 19 additions and 21 deletions
@@ -5,15 +5,13 @@ import java.util.Optional;
/**
* 업로드한 그림의 픽셀 크기를 헤더에서 읽는다.
*
* <p>업로드가 이 값을 기록하지 않아 모든 그림이 화면에서 사라졌다. 렌더러는 치수를 모르면 자리를
* 잡을 수 없고, 그때 쓰던 대체값 1×1 이 {@code loading="lazy"} 와 만나 브라우저가 영영 가져오지
* 않는 상자가 됐다. 화면 쪽은 모르는 치수를 정직하게 비우도록 고쳤고, 이쪽은 애초에 알 수 있는
* 값을 기록한다.
* <p>업로드가 이 값을 기록하지 않아 모든 그림이 화면에서 사라졌다. 렌더러는 치수를 모르면 자리를 잡을 수 없고, 그때 쓰던 대체값 1×1 이 {@code
* loading="lazy"} 와 만나 브라우저가 영영 가져오지 않는 상자가 됐다. 화면 쪽은 모르는 치수를 정직하게 비우도록 고쳤고, 이쪽은 애초에 알 수 있는 값을
* 기록한다.
*
* <p>디코딩하지 않고 헤더만 읽는다. {@code ImageIO} 는 {@code java.desktop} 모듈을 끌어오고
* 런타임 이미지가 그것을 담고 있으리라는 보장이 없다 — 없는 배포에서 업로드가 통째로 실패하는
* 것보다, 아는 형식의 헤더 몇 바이트를 직접 읽는 편이 낫다. 모르는 형식은 비운다: 크기를 모르는
* 것과 크기가 0 인 것은 다르고, 화면은 그 둘을 구분한다.
* <p>디코딩하지 않고 헤더만 읽는다. {@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<Size> 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> size(int width, int height) {
@@ -84,8 +84,7 @@ public class UploadStudioAssetUseCase implements CommandUseCase<UploadAssetComma
// 저장하기 전에 읽는다. 바이트는 여기 이미 있고, 나중에 다시 받아 오면 저장소 왕복이 한 번
// 더 생긴다.
java.util.Optional<ImageDimensions.Size> dimensions =
ImageDimensions.of(mediaType, content);
java.util.Optional<ImageDimensions.Size> dimensions = ImageDimensions.of(mediaType, content);
UUID assetId = idGenerator.get();
String assetKey = assetKeyFor(input.originalFilename(), assetId);
@@ -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", "<svg/>".getBytes(java.nio.charset.StandardCharsets.UTF_8))).isEqualTo(Optional.empty());
assertThat(
ImageDimensions.of(
"image/svg+xml", "<svg/>".getBytes(java.nio.charset.StandardCharsets.UTF_8)))
.isEqualTo(Optional.empty());
}
@Test