Back-End/Spring
-
Spring AOP가 적용된 커스텀 어노테이션 및 Bean 사용 시 유의점Back-End/Spring 2024. 4. 12. 18:11
개요 현재 진행하는 프로젝트에서, 스케줄러를 사용하고자 하였다. 스케줄러를 사용하기 위해서, 다음과 같은 어노테이션을 사용했다. @Configuration과 @EnableScheduling을 통해 해당 클래스를 빈으로 등록 및 스케줄러로써 사용하도록 하고,@EnableRetry를 통해 스케줄러의 실행에 실패했을 때의 재시도 등을 진행할 수 있도록 하였다. 추가로, 다음과 같이 스케줄과 관련된 구체적인 설정들을 메서드에 적용하였다. 이슈 1 하지만, 여러 개의 스케줄러를 구현하다보니 다음과 같은 이슈(또는 고치고 싶은 부분?)가 생기게 되었다. 1. 스케줄러 클래스에 적용된 어노테이션의 갯수가 너무 많음(가독성이 떨어짐)2. 스케줄러의 시작과 끝에 로그를 찍고자 함 따라서, 2가지 이슈를 어떻게 해..
-
멀티 모듈 구현 시 발생했던 git 관련 이슈Back-End/Spring 2023. 8. 6. 15:38
문제 N-surfer는 단일 모듈 구조로 이루어져있었다. 하지만 프로젝트에 기능이 추가되면서, 유저의 뱃지 획득과 관련하여 batch 작업을 적용해야 할 필요성이 생겼고 결과적으로 프로젝트 간 엔티티의 정합성을 쉽게 맞출 수 있고, 하나의 레포지토리에서 편리하게 두 프로젝트를 관리할 수 있는 멀티 모듈을 사용하기로 했다. (멀티 모듈이란?? -> https://hudi.blog/why-use-multi-module/ ) 멀티 모듈, 그거 왜 쓰는건데? 🤷 멀티 모듈이란 Java에서 모듈이란 패키지의 한 단계 위의 집합체이며, 독립적으로 배포될 수 있는 코드의 단위를 이야기한다. 멀티 모듈 프로젝트는 상호 연결된 여러개의 모듈로 구성된 프로젝 hudi.blog 따라서, 다음과 같이 프로젝트를 구성하였다. ..
-
Stream을 List로 변환하는 2가지의 방법(Collectors.toList(), Stream.toList())Back-End/Spring 2023. 4. 18. 06:46
개요 사이드 프로젝트에서, 작성한 글에 대한 이미지 업로드 로직에서 이슈가 터지게 되었다. 사진 업로드 기능은 이미지를 업로드 창에 올리거나, 기존의 것을 삭제하거나, 업로드 창에 올린 것을 다시 삭제하는 등 다양한 경우의 수가 있어서 이를 잘 고려해서 설계해야한다. 우리는 2개의 배열을 두어 (업로드 할 이미지, 삭제 될 이미지) 서버로 전달받도록 하였고, 삭제할 이미지는 해당 포스트의 기존에 존재하던 이미지인 경우만 삭제하도록 구현하였다. 문제점 문제는 해당 메서드에서 발생했다. 해당 메서드는 List를 받아 element 1개를 제외한 List를 만들어 반환 해 주는 메서드인데 기존에는 주석처리 된 부분으로 코드 로직을 진행하였다. 하지만 java16 부터 등장한 toList() 메서드는 해당 메서..
-
nGrinder를 활용한 어플리케이션 성능테스트Back-End/Spring 2023. 1. 6. 16:59
nGrinder란? 네이버에서 The grinder라는 오픈소스를 참고하여 자바 언어를 기반으로 개발한 성능 측정 오픈소스이다. nGrinder에서 사용되는 용어들 Controller 부하 테스트를 위한 GUI를 제공한다. 부하 테스트를 모니터링 할 수 있다. Agent Controller가 전달한 script를 기반으로 target 서버에 부하를 발생시킨다. 각 Agent마다 사용 할 Process 및 Thread를 선택할 수 있다. 만약 2개의 프로세스와 4개의 스레드를 사용한다면, agent당 vUser의 수는 8이 된다. nGrinder 공식 위키에 따르면, single 4GB 미만의 메모리 및 2개의 CPU core를 사용한다면 프로세스의 개수를 10개 이하로 사용하기를 권장한다고 한다.(쓰레싱..
-
Spring Rest docs를 활용한 API 명세를 openapi3를 활용하여 swagger로 변환하기Back-End/Spring 2022. 12. 13. 17:21
최근 사내 카페 pos기 프로젝트에서 프로젝트의 API 명세를 어떠한 방법으로 사용 할 지를 팀원들과 고민하였고, Spring Rest Docs를 사용하되 해당 정보를 openapi3를 활용하여 swagger로 띄우는 방법을 사용하기로 했다. swagger보다 초기 설정이 어렵지만, 테스트코드를 강제할 수 있고 자동으로 API명세를 작성해주는 편리함이 있어서 사용을 한다. openapi란, Restful한 API 디자인 정의의 표준이다. 즉, Api 스펙을 json 혹은 yml 형식으로 표현한 것이라고 이해하면 된다. 참고로, swagger는 openapi의 실제 실행 툴이라고 생각하면 된다. 먼저, Spring Rest Docs 사용을 위한 설정을 진행한다. // build.gradle plugins ..
-
Spring Security cors 이슈Back-End/Spring 2022. 10. 21. 13:47
사내 오픈마켓 프로젝트를 진행하던 때였다. 나는 인증/인가를 담당하고 있었던 상황이었다 기능 구현을 마치고 프론트 개발자분들과 협업을 진행하던 중, CORS 이슈가 터지고 말았다. GET Method 이외의 HTTP 메서드 요청을 보낼 때 프론트측에서 CORS 오류 메세지를 수신한다는 것을 들었고, 내가 백엔드 서버의 인증/인가 담당을 하고 있었기에(생각해 보니 상관은 없지만) 해결을 시도하였다. 시도한 방안 1. Spring Security filter에 cors 커스텀 설정 적용하기 기존에는 security 필터 체인을 사용 할 때, WebSecurityConfigurerAdapter 추상클래스를 상속받아 구현을 하였는데, 최근에는 deprecated되어 새로운 방법을 적용하는 것을 권장받는다. @B..
-
MapStruct 라이브러리 사용법Back-End/Spring 2022. 8. 29. 12:59
Mastruct 라이브러리는 entityToDto 작업을 편리하게 진행 해 준다. DI 프레임워크를 사용하지 않는 경우에도 사용할 수 있으며, Spring과 같은 DI 프레임워크를 사용하면, 인터페이스만 정의 해 두면 빌드시점에 구현체를 만들어 준다. 해당 구현체는 인터페이스에 정의해 둔 정보를 기반으로 매핑 메서드들이 생성된다. 다음과 같이 매퍼를 작성 해 두면, 빌드 폴더에 구현체가 생성이 된다. 1. 특정 Entity를 받아서 특정 Dto로 변환하고자 할 때 => 가장 기본적인 사용 용도이며, 위 그림에서 아래 2개의 메서드처럼 사용하면 된다. 2. 특정 Entity List를 받아서 특정 Dto List로 변환하고자 할 때 => 첫 번째 메서드 정의와 같다. 자체적으로 Entity to Dto 메..