구현 기술에 덜 의존하는 서비스 코드 만들기 (feat. 인터페이스 분리 원칙)
·
spring
최근 내부 타 부서에 CSV 파일을 생성하고 이를 제공하는 기능을 만들어야 하는 일이 생겼습니다. 이 과정에서 두 가지 접근 방식을 떠올릴 수 있었습니다.서버 로컬 파일 시스템에 임시 파일을 생성한 뒤 다운로드할 수 있도록 제공한다.S3 같은 외부 스토리지에 업로드하고, 링크(URL)를 발급해 제공한다.어떤 방식을 택하든 특정 기술에 종속적으로 코드를 작성한다면 확장성과 유연성이 떨어질 것 입니다.실제로 요구사항에 따라 두 방식을 모두 구현하게 되면서, 처음에는 서버 파일 시스템을 사용했다가 이후 S3 같은 외부 스토리지로 전환하면서 많은 수정 작업을 겪기도 했습니다. 이런 시행착오를 줄이고 기술 변경에 유연하게 대처하려면, 구체적인 구현 기술에 종속되지 않는 추상화된 인터페이스 설계가 필요합니다.이번 ..
[Spring] 프로젝트에 DDD 도입하기 (Feat. 도메인 모델 설계)
·
spring
오늘은 프로젝트에 DDD를 도입하며 고민하고 공부했던 적용기를 다뤄보려 한다. 도메인 주도 개발이란DDD(Domain-Driven Design) 또는 도메인 주도 설계라고 부르며 도메인 모델을 중심에 놓고 설계하는 방식을 일컫는다. 도메인이란 무엇일까도메인은 특정 문제 영역을 의미하며, 소프트웨어가 해결하려는 비즈니스 영역을 의미한다. 예를 들어, 이커머스 플랫폼을 개발한다면 이커머스 플랫폼은 개발해야하는 대상이 되고 이를 도메인이라고 한다. 도메인은 또 하위 도메인으로 나눠질수 있는데, 주문, 결제, 배송, 고객 관리 등이 해당 도메인에 포함될 수 있다.   각 하위 도메인은 독립적으로 기능을 제공할 수도 있고, 다른 하위 도메인과 연동하여 기능을 제공하기도 한다. 예를 들어, 카탈로그 도메인은 상품 ..
[SpringBoot] Sentry On-premise 구축기
·
spring
Sentry는 on premise로 직접 sentry를 띄우면 무료로 팀 계정을 사용할 수 있게 해주는데 이 구축기를 공유해보려한다.도입 배경뽀각 서비스를 운영하면서 기존 에러 추적을 위해서 Sentry를 개발 계정으로 한 명이서 관리를 하고 있었다.무료 계정이다보니 팀원 모두가 사용할 수 없어 불편함이 있어 이를 on premise로 옮기기로 결정! 최소 권장 사양4 CPU Cores16 GB RAM20 GB Free Disk SpaceAWS에서 제공하는 프리티어 사양으로는 돌릴 수 없기 때문에 리눅스 컴에 직접 돌리기로 결정하였다.설치 방법git clone https://github.com/getsentry/self-hosted.gitcd self-hostedsudo ./install.shsudo ..
Java reflection을 통해 RestDocs 생성 테스트 코드 작성 시간 1/2로 줄이기
·
spring
취준 관리 서비스 뽀각을 개발하면서 Spring REST Docs를 도입해 API 문서 생성을 하고 있었다. REST Docs의 장단점은 명확하다.장점 : 프로덕션 코드에 어노테이션 등이 침투하지 않는다.단점 : 테스트 코드가 성공해야만 문서 생성이 가능하다. 테스트 코드도 강제로 짜고 좋지 뭐.. 하며 호기롭게 시작한 REST Docs 적용은 테스트 코드 지옥에 우리를 빠트렸다..문제점 뽀각에는 노션의 페이지처럼 마크다운 문법으로 글을 작성할 수 있는 카드라는 아이템이 있는데 이를 단건조회하는 테스트 코드이다.API 하나에 미친 듯한 코드 줄의 양이 보이는가..? 이는 JSON 상하차를 해야하는 서비스 초반 우리 개발 속도에 발목을 잡았다. 팩토리 클래스 생성이를 REST Docs 문법에 맞는 테스트 ..
[스프링] service 인터페이스 도입과 접근제한자
·
spring
고민의 시작백기선님의 이펙티브 자바 완벽 공략의 “아이템 15. 클래스와 멤버의 접근 권한을 최소화하라”에는😄 : “public, protected 접근 제한자를 가지는 API는 하위호환성을 지키고 싶다면 영원히 관리해야하는 코드가 된다” 라는 말이 나옵니다. 응? 나는 스프링에서 지금까지 모든 클래스를 거의 public으로 박아놨는데…. 라는 생각이 들었습니다.여기서 하위호환성을 지킨다는 것은 버전이 올라갈 수록 이전 jar 파일로 배포해두었던 public으로 노출시킨 나의 코드를 누가 언제 어디서 쓰고 있는지 모르기 때문에 다음버전에서도 쉽게 바꾸지 못한다는 것을 의미합니다. 만약 바꾼다면 클라이언트에서 해당 코드에 해당하는 부분을 모두 바꾸어야하는 문제가 생깁니다. 그리고 말하시길😄 : “정답은..
[spring security] 왜 500번 에러도 401(Unauthorized)에러가 될까?
·
spring
문제상황spring security에서 filterChain을 설정하면서 "/member/signUp" url에 대한 request는 permitAll()을 해주고 싶었다. 이 과정에서 분명 permitAll()를 해주었지만 401 error가 발생하였고 이를 해결하는 과정을 포스팅한다. 본문String[] allowUrls = {"/", "/swagger-ui/**", "/member/signUp"};@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(AbstractHttpConfigurer::disable) .cors(Abstra..
이미지 저장/조회 서버 만들기(3) - AWS Presigned URL 이미지 업로드
·
spring
https://preparingfor.tistory.com/7 [일주일 프로젝트] 이미지 저장/조회 서버 만들기(2) - 이미지 파일 어떻게 받아오지?https://preparingfor.tistory.com/6 [일주일 프로젝트] 이미지 저장/조회 서버 만들기(1) - 저장 어디에..? 공지사항 기능을 만들던 중 이미지를 저장해야하는 상황이 생겼습니다. 그 김에 첫번째 일주일 프preparingfor.tistory.com저번 글에 이어서 서버를 거쳐 이미지를 aws s3에 저장하는 방식이 아닌 presigned-url을 통해 프론트에서 직접 s3 업로드 하는 방식을 알아보겠습니다. Presigned-URLPresigned-url은 AWS의 S3(Simple Storage Serivce)가 지원하는 기능..
이미지 저장/조회 서버 만들기(2) - 이미지 파일 어떻게 받아오지?
·
spring
https://preparingfor.tistory.com/6 [일주일 프로젝트] 이미지 저장/조회 서버 만들기(1) - 저장 어디에..? 공지사항 기능을 만들던 중 이미지를 저장해야하는 상황이 생겼습니다. 그 김에 첫번째 일주일 프로젝트로 이미지 저장/조회 api를 만들어보려고합니다. 일단 이미지 처리 api를 만들려고하니 받 preparingfor.tistory.com 저번 글에 이어서 이제는 구상하였던 이미지 저장/조회 서버를 코드로 옮겨보려고 합니다. 이미지를 Controller로 받아오기 위해서 이미지는 무슨 데이터 타입으로 받아와야하는지 알아봐야했습니다. 찾아보니 Spring에서는 MultipartFile 타입으로 이미지를 받아온다고 합니다. MultipartFile type Multipart..