본문 바로가기

백엔드/스프링+boot26

MAIL로 첨부파일 JPG를 보내는 과정에서의 문제들 먼저, 로직을 설명하고자 한다 상품 구매 (MEMBER) -> 구매완료 상태로 변경, 검증 (PRODUCT) -> 검증 이후, MEMBER에서 MEMBER의 정보 변경-> 그 이후! 카카오로 로그인 한 대상이 아닌 경우 Mail을 전송한다. 이 'MAIL로 판매자가 GCP에 등록했던 URL의 파일을 첨부파일로 구매자에게 보내는 과정'에서 배운 점들을 정리하고자 한다.  가장 문제가 많이 생긴 부분 . MULTIFILEEXCPETION이 가장 큰 문제가 되었다. 이를 해결위해 CTRL+ENTER(내가 가장 주로 사용하는 방법이다), 그리고 웹을 열심히 활용했다. URL url = new URL(productRepository.findImageRealByProductId(paymentsReqList.get(.. 2024. 5. 16.
Spring에서 동시성 test # 현재 문제가 되었던 부분은, 상품을 조회하는 도중에 상품을 삭제하는 부분(수정도 마찬가지이다)에 대한 부분이었다. 이를 위해, 상품을 조회하는 도중에 상품을 삭제하는 동시성 문제에 대한 test 코드를 작성하도록 하겠다. @Test public void testDeleteProductAndThenFind() throws InterruptedException { // Given Long productId = 1234L; String userEmail = "test@naver.com"; Product product = new Product(productId, "Test Product", 100, "aGVsbG8gd29ybGQ=".getBytes(), "aGVsbG8gd29ybGQ=".getBytes(),.. 2024. 3. 29.
WEBFLUX 프로젝트에서 결제요청(정책상 문제로, 사용 카드 정보를 개인이 저장할 수 없어 open api를 호출해야만 한다) 에 대한 문제로 인하여 , webflux를 자주 사용하게 되었다. 그 과정에서 모르는 내용이 계속 등장하여, 이렇게 정리하게 되었다. WEBCLINET는, REST API를 위한 것으로 , 마치 REQUEST를 보내는 CLIENT처럼 동작할 수 있다. 1. 간단한 생성 webclient.create(String baseurl)로 생성할 수 있다. 2. 기타 다른 정보를 추가하려면, builder.build를 사용하자 private final WebClient webClient = WebClient.builder().baseUrl("https://api.portone.io").build(); .. 2024. 2. 18.
기타 기술 + JPA 기본 설정 1. Rest Repositories Repository부터 , 자동으로 REST API 를 만들어준다. REST라는 구조를 따르는 형태의 API (REST API ) (이런 개념은 나올때 복습하자) 다시 말하자면, 서버와 client가 요청을 보내고 주고 받기 위한 방법이다. 방법은 즉 코드를 의미한다. ex) db에서 웹툰을 뽑는 코드가 있다. 이 코드를 어떻게 client가 동작시킬 것인가? ex) app.get -> 이 url로 get을 요청한다면, 해당 웹툰뽑기 코드를 작동시킬것이다. 즉 api는 어떤 주소(url)로 오면 어떤 행동을 할지. + 그 METHOD는 무엇인지. 그렇다면 어떤 일을 할지 인터페이스는 두 애플리케이션 간의 서비스 계약이라고 할 수 있다. . 출처 - 내블로그. 그래서 .. 2024. 1. 4.
VIew, View template 특정 양식을 따르게 하여, 양식간 충돌 등을 방지하는 개념 자체를 템플릿이라고 한다. Thymeleaf. Html표현을 지향한다. 장점 : HTML5 웹 표준을 준수한다. .THYMELEAF가 아니라 .html이 변경되지 않는다. template code와 , 문법을 분리할 수도 있다 . (굉장히 신기하다 ) 3가지 문법 1. "th" : tag 2. "data-th" attribute (html5는 , 사용자가 정의 atrribute가 있다. 3. decoupled logic 문법을 통해 볼 수있고, 가장 많이 볼 것은 ${...}를 통해 값(variable을 표현한다) literal - Inline한 표현. ex) the name is ${name} if문 등도 가능하다 (if) ? (then) fr.. 2024. 1. 4.
오류 사용자 입력에 대한 오류 검증을, 진행해야 한다. 이를 계속해서 IF X>5 이런식으로 넣다보면, 관심사 분리를 침해하는 행위이다. -> ANNOTATION 기반으로, @Positive ,@SIze(min=2)등을 method 매개변수에 넣는다. (검증에 대한 특별한 코드가 필요없다) -> Validation 의존성을 추가해주어야 추가되는 기능이다. @Validated 를 class level에 -> 해당 class는, validation의 대상이된다. -> ConstraintViolationException 진행 @valid는 @validated 필요없이, MethodArgumentNotValidException 진행 . @Test void GivenException_WhengetMessage_Then.. 2024. 1. 4.
테스트 2 * 코로나 줄서기 프로젝트 활용 @SpringBootTest 기본 에플리케이션 context load(통합 test시 사용) bootstrap with + extendwith value와 properties = {}로 직접 설정. args -> 직접 실행하는 command . WebEnvironment.Mock,None(은 tomcat이 실제로 돌지 않음) .RANDOM_PORT,DEFINED_PORT는 직접 TOMCAT이 돈다. 스프링에서 제공하는 Auto-configured Test 한 가지 예시 @WebMvcTest . mockmvc 빈을 자동 설정하고 사용한다. (복습하자, mock mvc는 마치 http가 request한것처럼 따라하는 역할을 한다.) 일단 perform은, exception을 .. 2024. 1. 3.
ERROR 처리 WHITELABEL ERROR PAGE를 .. 당연히 매우 자주 봤다. server.error.whitelabel.enabled=false 로 WHITELABEL을 제거하고 사용할 수 있고, 그런 경험도 실제로 존재한다. (CONTROLLER를 ERRORCONTROLLER를 IMPLEMENTS 받아, 사용해야한다.) CLIENT가 SERVER에게 REQUEST할떄, ACCEPT라는 헤더가 있다.(나 CLINET는 이런 JSON,XML등으로 보내줬으면 좋겠어 하고 힌트를 주는 헤더 ) BROWSER는 기본이 TEXT.HTML -> 기본적으로 ACCEPT HEADER를 전송할 수 있다. 이러한 기본 WHITELABEL에, PROPERTIES에 MESSGAE,STACKTRACE등을 켜서, WHITELABELP.. 2024. 1. 2.
리팩토링 서비스가 확장되고 , 축소되고, 언어변경되고 , 모바일 지원요청받고 이렇게 여러가지 리팩토링이 필요하다 . 프로젝트의 변화의 복잡성을 감소 시켜준다 주로 품질 떨어진부분,복잡부분, 핵심서비스,향후 변경가능성 부분, 도전적인 부분에 적용하면 좋다. 1. REQUEST에서 PATHVARIABLE의 변수에는 FINAL 달아주기 2. service의 get method에, readonly = true로 하여 값이 변경되지 않게. 3. request앞에 @Nonnull 4. 중복기능 메소드 통합 즉, 코딩을 하다보니 이게 지금 접근이 가능하게 할까(private public) or final 들의 문제가 있었는데, 해당 문제들은 모두 코딩을 진행한 이후에 팀원의 합의 후, 변경하는 구조라는 것을 깨달았다. 2023. 12. 30.
테스트 테스트를 잘하는 방법 예전에는.. 테스트를 직접 하나씩 클릭하고 레코딩해서 팀이 테스트만 하였다 . (진짜 어려웠겠다는 생각을 했다.. 사실 테스트라는게 스스로 테스트 case를 생각하기 떄문에.. 어려운 부분이 많았다. 이런걸 하나하나씩 다 했다는게 진짜 대단하다 ) 다 짰는데 , 그다음에 기획이 바뀌고 코드가 다시 바뀌는 경우가 굉장히 많다. 코딩 -> 리팩터링 -> 테스트 -> 개선의 반복이다. CLASS, METHOD가 SRP를 잘 지켜야 한다. SRP? 단일 책임 원칙으로써, 하나의 객체는 하나의 책임(기능)을 담당해야한다. ENTITY에 사람정보 말고 갑자기 다른 기능이 있거나, 이래선 안된다. 이럴때가 TEST를 사용하기에 굉장히 유리한 상황이다! (또한, 그 크기가 너무 크지 않을때가 테스.. 2023. 12. 29.