FRAMEWORK

    [Spring] @Controller vs @RestController

    들어가기 전에 @Controller는 전통적인 Spring controller로써 오래 사용되어졌습니다. Spring 4.0에서는 @RestController라는 좀 더 RESTful한 웹서비스를 간단히 만들 수 있는 어노테이션이 소개되었습니다. 이번 포스팅을 통해 간단히 두 가지 어노테이션의 차이를 살펴보겠습니다. Spring MVC @Controller @Controller 어노테이션은 @Component 어노테이션을 가지고 있어 classpath 스캔을 통해 자동으로 구현체를 감지할 수 있습니다. 일반적으로 @Controller는 @RequestMapping 어노테이션과 함께 많이 쓰입니다. @Controller @RequestMapping("books") public class SimpleBoo..

    [SpringBoot] SpringBoot를 이용한 email 전송하기(첨부파일 포함)

    들어가기 전에 하기 포스팅은 일반적으로 많이 사용하는 Google SMTP나 Naver SMTP 서버가 아닌 따로 구성된 SMTP 서버를 통해 email을 전송하는 법에 대해 다룹니다. 사내 SMTP 서버의 경우 relay server이기 때문에, postfix의 mynetworks 변수로 관리되는 IP를 통해 email이 전송된다면 따로 username/password가 필요하지 않습니다. 이로 인해, Google SMTP 또는 Naver SMTP를 통해 email을 전송하기 위해서는 application.yml과 같은 설정 파일 내 추가 설정이 필요할 수 있습니다. 이 점 고려하시고 봐주시길 바랍니다. SpringBoot를 이용한 Email 전송하기 Dependencies 추가하기 먼저, Spring..

    [SpringBoot 2.5↑] 빌드 시 2가지 jar가 생성되는 현상 (executable jar & plain jar)

    들어가기 전에 기존에 쓰던 springboot 2.4.11 버전을 빌드할 때에는 문제가 없었지만, springboot 2.5 버전 이후를 사용하니 빌드 시 jar가 2개 생겨 github action을 통해 진행하는 CD 프로세스가 제대로 작동하지 않았습니다. 이번 포스팅에서는 빌드 시 jar가 2가지 생겼던 원인과 실제로 작동해야 할 jar만 빌드되도록 하는 방법에 대해 알아보도록 하겠습니다. SpringBoot 2.4.11과 SpringBoot 2.5.0 차이 SpringBoot 2.4.11 Document를 보면, 하기 사진과 같이 jar or war tasks are disabled라고 적혀있습니다. 즉, 따로 설정을 변경하지 않는 한 jar task가 SKIP됩니다. 반면, SpringBoot ..

    [SpringBoot] SpringBoot를 이용한 AWS S3에 resizing 이미지 업로드하기(Marvin 활용)

    들어가기 전에 기존에는 원본 이미지를 S3에 바로 업로드하고, 프론트엔드에서 해당 원본 이미지를 사용하도록 하였습니다. 이렇게 진행하다보니, 사실상 모바일 디바이스에서 보여지는 사진 대비 너무 큰 이미지를 호출하게 되었습니다. 이에, 기존 SpringBoot를 이용한 S3에 이미지 업로드 하는 코드를 수정하여 이미지를 리사이징(768px * 768px로 크기를 조절)하여 올리고자 합니다. 사실 SpringBoot에서 직접 이미지를 리사이징하려면, MultipartFile로 받은 파일들에 대해 BufferedImage 형태로 변경하여 진행이 필요합니다. 이 경우 IO가 발생하는터라 리소스를 좀 더 사용할 것이라는 판단은 들었지만, AWS CloudFront와 Lambda@Edge를 통해 resizing을 ..

    [SpringBoot] SpringBoot를 이용한 AWS S3에 여러 파일 업로드 및 삭제 구현하기

    들어가기 전에 원래는 AWS API Gateway + AWS lambda + AWS S3 방식으로 이미지 업로드 및 삭제를 구현하고자 했습니다. 이때, 일반적으로 javascript나 python을 사용하는 것으로 보았는데 해당 언어로 구현하게 되면 정확히 알지 못하는 언어라 유지보수 측면에서 좋지 않을 것 같아 우선 백엔드단에서 java로 구현하되 추후 여유가 되면 Lambda 방식으로 변경하기로 했습니다. 따라서, 이번 포스팅에서는 SpringBoot를 통해 S3에 파일 업로드 및 삭제하는 방법에 대해 알아보겠습니다. SpringBoot를 통한 S3에 파일 업로드하기(Rest API) build.gradle AWS에 접근하기 위해 먼저 build.gradle에 하기와 같이 의존성을 추가해줍니다. im..

    [Querydsl, pageable] slice를 이용한 무한 스크롤

    들어가기 전에 프로젝트를 진행하면서, 빵집의 상세 페이지에서 메뉴 더보기 클릭 시, 해당 빵집에 존재하는 모든 메뉴를 순차적으로 보여주어야 했습니다. 이때, 아래로 쭉 내렸을 때 메뉴가 더 존재한다면 화면에 더 뿌려주고자 무한 스크롤을 구현하였습니다. 참고 사항 하기 예시는 모두 page index가 1부터 시작한다고 가정하고 진행한 것이기 때문에, 만약 page를 0부터 시작하고자 한다면, 변경이 필요할 수 있습니다. 페이징 기법 종류 진행하기 앞서, 간단하게 페이징 기법 종류에 대해 알아보고자 합니다. 먼저 아래 왼쪽 사진의 경우는, 일반적인 paging 기법입니다. 각 index를 눌러 페이지를 호출하고 해당 페이지에 해당하는 데이터를 뿌려줍니다. 반면, 오른쪽 사진의 경우는 더보기 버튼을 클릭하여..

    [Enum] enum에 연결된 값을 통해 enum값 알아내기

    들어가기 전에 enum값을 지칭하는 다른 단어를 통해 enum을 알아내고자 할 때 사용하는 방법입니다. 필자의 경우, 프로젝트를 진행하며 enum을 지칭하는 다른 단어를 통해 들어온 string을 enum으로 변환해야 해서 사용했습니다. 다른 작업을 할 때에도 쓰일 수 있을 것 같아 추후에 보기 위해 간단하게 작성했습니다. enum에 연결된 값을 통해 enum값 알아내기 아래 코드의 fromString(String name) 메소드는 enum값과 연결된 값(A)이 따로 있을 때 A를 통해 enum값을 알아내기 위한 메소드입니다. 해당 메소드를 사용하면 손쉽게 enum값을 반환할 수 있습니다. @Getter @AllArgsConstructor public enum BreadCategoryType { 식사빵..

    [Swagger 2] java.lang.NumberFormatException:For input string: "" exception 해결법

    들어가기 전에 프로젝트를 진행하다가 오랜만에 Swagger2를 접근했더니, 로그에 WARN 에러가 잔뜩 쌓인 것을 발견했습니다. 오로지 한 것이라곤 swagger2 접속 뿐이었던터라, swagger2에 의한 exception임을 인지하고 관련하여서 구글링을 하여 찾은 해결법에 대한 포스팅입니다. 해결법 위 현상이 발생한 이유는 swagger2에서 던지는 에러에 대한 핸들링이 제대로 이루어지지 않아서라고 볼 수 있습니다. 이에 따라, swagger 버전은 2.9.2를 쓰되, swagger-models와 swagger-annotation에 대한 버전은 downgrade하여 사용해야 합니다. 아래 항목들 중, swagger-annotation은 따로 지정하지 않아도 위 에러가 발생하지 않는 것을 확인하였으나,..