-
Notifications
You must be signed in to change notification settings - Fork 3
Open
3 / 43 of 4 issues completedLabels
♻️ refactor리팩토링 제안/작업리팩토링 제안/작업
Description
♻️ 리팩토링 목적
NexERP 프로젝트의 최우수상 수상 이후, 기술진으로부터 전달받은 피드백을 바탕으로 코드 가독성, 성능, 그리고 유지보수성을 개선하기 위한 리팩토링을 제안합니다.
서로 원하는 부분들을 선택하여 탐구해서 해결한 후에 공유하면 좋을 것 같습니다.
기술진의 피드백을 다음과 같이 정리해보았습니다.
7가지 리팩토링 제안
-
인증 및 보안 (JwtCookieHeaderUtil)
- 현황:
String.format과 매직 리터럴을 사용하여 직접 쿠키 문자열을 생성하고 있음. - 개선: Spring에서 지원하는
ResponseCookie빌더를 도입하여 타입 안정성을 확보
- 현황:
-
API 문서화 가이드라인 (Controller & Swagger)
- 현황: 컨트롤러 클래스에 Swagger 어노테이션이 밀집되어 비즈니스 로직의 가독성이 저하되는 상황
- 개선: Swagger 설정을 별도의 인터페이스로 분리하고 컨트롤러가 이를 구현하게 하여, 구현체인 컨트로롤러 코드를 간결하게 유지함.
-
어노테이션 컨벤션 확립 (@PreAuthorize)
- 현황:
@Operation,@Mapping,@PreAuthorize등의 순서가 일정하지 않아 코드 파악이 어려움 - 개선: 팀 내 어노테이션 순서 컨벤션을 확립합. (추천 순서:
@Operation->@XXXMapping->@PreAuthorize)
- 현황:
-
트랜잭션 최적화 (@transactional)
- 현황: 모든 읽기 작업에 의시적으로
readOnly = true를 사용했음. - 개선: 특정 DB 드라이버 환경에서 발생하는 불필요한 세션 상태 제어 쿼리 (약 6개) 발생 여부를 검토하고, 성능 이득이 확실한 경우에만 선택적으로 사용하자.
- 참고 자료: 카카오페이 테크 로그
- 현황: 모든 읽기 작업에 의시적으로
-
비동기 처리 성능 튜닝 (Executor)
- 현황: 스케줄러 및 비동기 작업의 기본/최대 스레가 임의의 숫자 (6, 8)로 설정됨.
- 개선: CPU 코어 수와 I/O 대기 시간을 고려한 공식(Nthreads8 = N CPU8 * (1 + Wait/Service)을 적용하여 서버 사양에 최적화된 스레드 풀을 재설정하자. (리틀의 법칙 찾아보기)
-
도메인 모델 관계 개선 (@onetomany)
- 현황: 일대다(@onetomany) 단방향 연관관계 사용 중.
- 개선: 불필요한
UPDATE쿼리 발생을 방지하기 위해 다대일(@ManyToOne) 단방향 또는 양방향 연관관계로 변경을 검토 - 참고 자료: JPA Entity 연관관계 어떻게 걸까요?
-
객체 생성 책임 분리 (Static Factory Method)
- 현황: 서비스 계층에서 엔티티의 필드를 하나씩 꺼내 생성하는 경우가 일부 존재함. (ProjectService)
- 개선: 엔티티 내부의 create(Dto dto)와 같은 정적 팩토리 메서드로 구현하여 서비스 계층이 객체 생성의 상세 과정을 알 필요가 없도록 캡슐화.
변경 절차와 관련해서는 따로 작성한 서브 이슈 -> #136 를 참고해주세요.
위 작업을 수행하기 위한 비용 최적화 SSL 구조 변경 제안 (ALB -> Nginx)
리팩토링 기간 동안은 서비스 이용의 질이나, EC2의 성능보다는 비용을 낮추고 작업의 부담을 줄이는 것이 더 중요하다고 생각했습니다. 따라서 ALB를 Nginx + Lets Encrypt 기반으로 다시 대체하고자 합니다.
현재 ALB의 대상(Target)인 EC2는 하나만 두긴 했지만, ALB는 기본적으로 고가용성을 위해 최소 2개의 가용 영역에 배치되기 때문에 2개의 공인 IP를 강제로 점유합니다.
ALB를 제거하고, EC2에 Nginx를 직접 붙이면, ALB가 쓰던 약 2개의 IP 비용(약 $7.44/월)을 즉시 아낄 수 있다고 생각합니다.
리펙터링 체크리스트
- 인증 및 보안 (ResponseCookie 개선)
- API 문서화 가이드라인 (Swagger 문서 분리)
- 어노테이션 순서 정규화
- 트랜잭션 최적화에 대한 학습 및 적절한 활용
- 비동기 처리 성능에 대한 학습과 튜닝 개선
- 도메인 모델 관계에 대한 명확한 정립 및 개선
- 객체 생성 책임 분리 (캡슐화)
- 리팩토링 기간 비용 감소를 위한 ALB를 Nginx로 변경
이슈 체크 리스트
- Assignees를 설정했나요?
- Lables를 설정했나요?
Reactions are currently unavailable
Sub-issues
Metadata
Metadata
Assignees
Labels
♻️ refactor리팩토링 제안/작업리팩토링 제안/작업