Skip to content

Commit 9ca2a59

Browse files
committed
fix: 이미지 회전 방향 조정 로직 수정
1 parent 555498f commit 9ca2a59

File tree

3 files changed

+7
-42
lines changed

3 files changed

+7
-42
lines changed

src/main/java/com/tnt/application/s3/S3Service.java

+4-14
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import javax.imageio.metadata.IIOMetadata;
2222
import javax.imageio.plugins.tiff.TIFFDirectory;
2323
import javax.imageio.plugins.tiff.TIFFField;
24+
import javax.imageio.plugins.tiff.TIFFTag;
2425
import javax.imageio.stream.ImageInputStream;
2526

2627
import org.springframework.lang.Nullable;
@@ -146,8 +147,9 @@ private byte[] processImage(MultipartFile image, String extension) throws IOExce
146147

147148
// 방향에 따라 이미지 회전
148149
if (orientation != null) {
149-
int orientationValue = orientation.getAsInt(0);
150-
originalImage = rotateImageByOrientation(originalImage, orientationValue);
150+
dir.removeTIFFField(274);
151+
dir.addTIFFField(new TIFFField(new TIFFTag("Orientation", 274, TIFFTag.TIFF_SHORT), TIFFTag.TIFF_SHORT, 1,
152+
new int[] {1}));
151153
}
152154

153155
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
@@ -161,16 +163,4 @@ private byte[] processImage(MultipartFile image, String extension) throws IOExce
161163

162164
return outputStream.toByteArray();
163165
}
164-
165-
private BufferedImage rotateImageByOrientation(BufferedImage image, int orientation) throws IOException {
166-
return switch (orientation) {
167-
case 3 -> // 180도 회전
168-
Thumbnails.of(image).scale(1.0).rotate(180).asBufferedImage();
169-
case 6 -> // 90도 시계방향
170-
Thumbnails.of(image).scale(1.0).rotate(90).asBufferedImage();
171-
case 8 -> // 270도 시계방향
172-
Thumbnails.of(image).scale(1.0).rotate(270).asBufferedImage();
173-
default -> image;
174-
};
175-
}
176166
}

src/main/java/com/tnt/gateway/config/SecurityConfig.java

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.fasterxml.jackson.databind.ObjectMapper;
2020
import com.tnt.common.error.model.ErrorResponse;
2121
import com.tnt.gateway.filter.SessionAuthenticationFilter;
22+
import com.tnt.gateway.service.CustomOAuth2UserService;
2223
import com.tnt.gateway.service.SessionService;
2324

2425
import lombok.RequiredArgsConstructor;
@@ -42,6 +43,7 @@ public class SecurityConfig {
4243
};
4344

4445
private final ObjectMapper objectMapper;
46+
private final CustomOAuth2UserService customOAuth2UserService;
4547
private final SessionService sessionService;
4648

4749
@Bean
@@ -55,6 +57,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
5557
.headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin))
5658
.sessionManagement(sessionManagement ->
5759
sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
60+
.oauth2Login(oauth2 -> oauth2.userInfoEndpoint(userInfo -> userInfo.userService(customOAuth2UserService)))
5861
.authorizeHttpRequests(request -> request
5962
.requestMatchers(ALLOWED_URIS).permitAll().anyRequest().authenticated())
6063
.addFilterAfter(sessionAuthenticationFilter(), LogoutFilter.class)

src/test/java/com/tnt/application/s3/S3ServiceTest.java

-28
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,13 @@
33
import static com.tnt.common.constant.ImageConstant.TRAINEE_DEFAULT_IMAGE;
44
import static com.tnt.domain.member.MemberType.TRAINEE;
55
import static com.tnt.domain.member.MemberType.TRAINER;
6-
import static java.util.Objects.requireNonNull;
76
import static org.assertj.core.api.Assertions.assertThat;
87
import static org.junit.jupiter.api.Assertions.assertThrows;
98
import static org.mockito.ArgumentMatchers.anyString;
109
import static org.mockito.BDDMockito.any;
1110
import static org.mockito.BDDMockito.given;
1211
import static org.springframework.http.MediaType.IMAGE_JPEG_VALUE;
1312

14-
import java.awt.Color;
15-
import java.awt.Graphics2D;
1613
import java.awt.image.BufferedImage;
1714
import java.io.ByteArrayOutputStream;
1815
import java.io.IOException;
@@ -26,7 +23,6 @@
2623
import org.mockito.Mock;
2724
import org.mockito.junit.jupiter.MockitoExtension;
2825
import org.springframework.mock.web.MockMultipartFile;
29-
import org.springframework.test.util.ReflectionTestUtils;
3026

3127
import com.tnt.common.error.exception.ImageException;
3228
import com.tnt.infrastructure.s3.S3Adapter;
@@ -83,28 +79,4 @@ void upload_profile_image_unsupported_format_error() throws IOException {
8379
// when & then
8480
assertThrows(ImageException.class, () -> s3Service.uploadProfileImage(image, TRAINER));
8581
}
86-
87-
@Test
88-
@DisplayName("orientation이 3일 때 이미지 180도 회전 성공")
89-
void rotate_image_orientation_3_success() {
90-
// given
91-
BufferedImage originalImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
92-
Graphics2D graphics = originalImage.createGraphics();
93-
94-
// 위쪽은 흰색, 아래쪽은 검은색으로 채워서 회전 확인이 가능하도록 함
95-
graphics.setColor(Color.WHITE);
96-
graphics.fillRect(0, 0, 100, 50);
97-
graphics.setColor(Color.BLACK);
98-
graphics.fillRect(0, 50, 100, 50);
99-
graphics.dispose();
100-
101-
// when
102-
BufferedImage rotatedImage = ReflectionTestUtils.invokeMethod(s3Service, "rotateImageByOrientation",
103-
originalImage, 3);
104-
105-
// then
106-
// 회전 후에는 위쪽이 검은색, 아래쪽이 흰색이어야 함
107-
assertThat(requireNonNull(rotatedImage).getRGB(50, 25)).isEqualTo(Color.BLACK.getRGB()); // 원래 아래쪽 색
108-
assertThat(requireNonNull(rotatedImage).getRGB(50, 75)).isEqualTo(Color.WHITE.getRGB()); // 원래 위쪽 색
109-
}
11082
}

0 commit comments

Comments
 (0)