개발/Spring Boot
-
[수정 예정] (OCP)개방 폐쇄 원칙 위배를 극복한 전략 패턴 적용 사례개발/Spring Boot 2024. 7. 12. 14:39
public interface PhotoProvider { String crawlingImageURL(String page_url); byte[] getImageBytes(String image_url); String getHostname();}public abstract class AbstractPhotoProvider implements PhotoProvider { @Override public byte[] getImageBytes(String image_url) { return ConnectionAction.getImage(getHostname(), image_url); }}@Componentpublic class HaruFilm extends Abstr..
-
[수정 예정] 사진을 더 안전하게 저장하기 - AES 알고리즘 적용개발/Spring Boot 2024. 5. 27. 10:35
암호화를 하게 된 배경우리 서버 애플리케이션이 동아리 공용 서버에서 작동하게 될 예정이다. 동아리 공용 서버는 여러 동아리원들이 공유하는 서버로 다양한 사용자와 관리자들이 접근할 수 있다. 이러한 환경에서는 여러 사람이 서버에 접근할 수 있어, 보안에 취약할 가능성이 높다.특히, 서버의 파일 시스템은 여러 프로젝트의 파일을 저장하고 관리하기 때문에 제3자가 파일에 접근할 위험이 존재한다.이와 같은 이유로, 중요한 사용자 데이터인 사진 파일을 보호하기 위해서는 암호화가 필수적이라고 판단했다. 암호화를 통해 파일을 안전하게 보호하면, 설령 제3자가 서버에 접근하더라도 암호화된 파일을 해독하지 못해 데이터의 기밀성을 유지할 수 있을 것이라 생각했다.AES 알고리즘이란?AES(Advanced Encryption..
-
Redis Cache를 통해 이미지 조회 성능 개선하기개발/Spring Boot 2024. 5. 24. 23:52
기존의 이미지 조회 방식에서는 DB에 직접 접근하여 이미지를 가져오는 방식이었다. 우리 서버는 이미지를 조회할 때 항상 Snappy를 통해 압축 해제를 해야 했는데, Snappy의 성능이 아무리 좋아도 항상 일정한 오버헤드를 가진다는 문제가 있었다. 이로 인해 일반 DB 조회보다 더 많은 리소스를 소모하게 되어 성능 저하가 발생했다. 이러한 문제를 해결하기 위해 Image Cache를 구현해야 했다. 캐시를 통해 빈번하게 조회되는 이미지를 메모리에 저장하면, 데이터베이스에 직접 접근하는 빈도를 줄 일 수 있어 조회 성능이 크게 향상될 수 있다. 특히, Redis는 인 메모리 데이터 저장소로 매우 빠른 조회 속도를 제공하여 이미지 조회 성능을 극대화시킬 수 있다. Redis를 이용하여 Image Cache..
-
이미지 압축, 해제 성능 개선하기 - Snappy 도입을 통하여개발/Spring Boot 2024. 5. 24. 17:10
nGrinder를 사용하여 이미지 로드 API를 테스트하는 동안 서버가 다운되는 문제가 발생했다.초기에는 서버가 정상적으로 응답했지만, 가상 사용자가 점차 증가하면서 서버의 응답 속도가 느려지기 시작했다. 결국 사용자가 일정 수를 넘어서자 서버가 더 이상 요청에 응답하지 않고 다운되었다. 서버 로그를 확인해 보니 이미지 로드 API를 호출하는 중 문제가 발생하는 것을 확인할 수 있었고, 문제의 원인이 ImageUtil 클래스 내의 decompressImage 메서드를 호출하면서 발생함을 알게 되었다. 문제를 찾기 위해서는 먼저, 원래 서버에서 이미지 압축과 해제가 어떻게 이루어졌는지 다시 확인하는 과정이 필요하다. 서버에서는 Deflater와 Inflater를 사용하여 이미지 압축 및 해제를 수행한다. ..
-
유지보수가 용이하도록 아키텍처 구성하기개발/Spring Boot 2024. 5. 24. 10:35
여러 게시판을 만들어야 하는 프로젝트를 진행하면서, 유지보수가 용이한 구성에 대해 고민하게 되었다.여러 게시판을 효과적으로 관리하고 향후 발생할 수 있는 문제들을 최소화하기 위해어떤 방법을 사용했는지 블로그에 공유하겠다.모든 게시판 엔티티의 공통 부모 클래스인 추상 Board 클래스를 정의하여, 모든 Board Entity가 이 추상클래스를 상속받도록 했다. Board를 굳이 추상 클래스로 정의한 이유는 Board 자체를 인스턴스화할 수 없도록 하기 위해서이다. Board들을 위와 같이 구성함으로써 제네릭을 사용해 Repository 코드를 아래와 같이 단순화할 수 있었다.public interface BoardRepository extends JpaRepository {} BoardService에서 ..
-
아키텍처 개선에 대한 고민개발/Spring Boot 2024. 5. 23. 17:30
원래 아키텍처는 위와 같은 모습이었다.첫번째 개선에서는 다음과 같은 일을 했다. 서비스 간 의존 결합도를 줄이기 위해 인터페이스 도입각 서비스가 인터페이스를 통해 상호 참조될 수 있도록 하여 결합도를 낮췄다. 이를 통해 서비스 간의 결합도를 낮추고 유연성을 높였다.PhotoService의 재사용성을 높이기 위해 역할 분리PhotoService의 재사용성을 높이기 위해 EncryptionService에 의존적이었던 메소드를 삭제하고, Encryption 관련 역할과 책임을 PhotoService에서 분리했다. 이를 통해 PhotoService는 더욱 독립적이고 재사용 가능하게 만들었다.EncryptionService의 역할 재정의암호화 역할을 명확히 하기 위해 Encryption을 Service에서 Com..
-
Spring Boot 3.X 에 Swagger3를 추가하기개발/Spring Boot 2023. 7. 16. 22:24
스프링 프로젝트에 의존성을 추가해준다. Maven org.springdoc springdoc-openapi-starter-webmvc-ui 2.1.0 Gradle // https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui implementation group: 'org.springdoc', name: 'springdoc-openapi-starter-webmvc-ui', version: '2.1.0' Swagger Configuration을 위한 클래스를 만들어준다. @Configuration public class SwaggerConfig { @Bean public OpenAPI springOpenAPI()..
-
Swagger에 대해개발/Spring Boot 2023. 7. 16. 21:18
Swagger UI 스웨거 UI는 OAS(OpenAI Specification; REST API 명세 포맷)을 통해 프로젝트의 API 문서를 만들어주는 프레임워크다. Springfox와 Springdoc은 스웨거 UI를 Spring Framework에서 사용할 수 있게 만들어주는 프로젝트이다. Springfox Swagger Spring Framework를 사용하는 프로젝트에서 Swagger를 이용할 수 있게 도와주는 라이브러리다. Springdoc Swagger Springfox Swagger와 마찬가지로 Swagger를 이용할 수 있게 도와주는 라이브러리다. Springfox가 업데이트를 중단한 사이 새로 시작된 프로젝트다. + Springdoc은 Webflux를 지원해 비동기방식의 웹개발을 지원한다..