[Spring] DB connection Pool 끊김 문제
·
Dev Tool/Spring boot
한창 레거시 코드 수정을 진행하던 와중 DB 커넥션이 끊기면서 에러가 발생했다. 기존에 stream으로 짜여있던 코드를 병렬처리되게끔 변경하다 발생한 문제였기 때문에 해당 코드 위주로 문제를 살펴보았다. 아래는 해당 문제상황 파악 및 해결 과정에 대해 정리한 글이다. HikariCP 커넥션 풀 고갈 com.mysql.cj.jdbc.exceptions.CommunicationsException: The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.당시 발생한 로그를 살펴보 MySQL과의 커넥션 중 가용한것이 없어서 ..
[Spring] 리팩토링 - 객체 생성 방식
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :) Ver.1서비스 계층에서 생성자를 통해 인스턴스 생성서비스 계층에서 비즈니스 로직 뿐만아니라 객체 생성 역할까지 수행또한 여러 메서드에서 동일한 객체를 생성해야 하는 경우, 코드가 불필요하게 중복됨객체 생성 로직이 변경되는 경우, 작성된 모든 코드를 찾아서 변경해야함CartItemEntity cartItem = new CartItem(targetType, targetId, amount); Ver.2엔티티 내부에 정적 팩토리 메서드를 작성하여 객체 생성의 책임을 엔티티에 둠Entity가 Dto의 구조를 알고있어서 의존하게 됨(결합도 증가)// Entitypublic static CartItemEntity create(CartItemDto c..
[Spring] @Scheduled와 JavaMailSender를 이용한 자동 메일 발송 기능
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :) 기능 구현 요구 사항사용자는 로또 예상 번호를 입력할 수 있다.이미 당첨 번호가 공개된 로또 회차는 입력 불가하다.매주 토요일 저녁 예상 번호와 당첨 번호를 비교한다.이메일 알림을 허락한 사용자에 한해서 이메일 발송을 진행한다.유저 테이블에 저장된 이메일 정보는 이미 검증이 완료 된 상태라고 가정한다.이메일에는 당첨 여부, 일치하는 개수 등의 정보를 기재한다.  Entity와 Dto, Repository 코드는 더 이상 보여줄 필요가 없을 것이라 생각되어서 사용한 주요 Spring 기능 소개와 적용한 로직의 일부만을 포스팅할 예정이다. JavaMailSender스프링 프레임워크에는 이메일을 쉽게 보낼 수 있는 모듈인 Spring Boot ..
[Spring] 장바구니 기능 구현
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :) 구현하려는 장바구니 기능의 요구사항은 다음과 같다.사용자는 두 종류의 장바구니를 가진다. IsLotto(true : 금액 제한 장바구니, false :  무제한 장바구니)장바구니 사용자는 현재 인증된 토큰을 기반으로 찾는다.장바구니 상품 추가 시엔 상품 id, 상품 수량, IsLotto 값, 상품 종류(enum) 값이 필요하다.장바구니 물품 id를 반환해준다.isLotto가 true 일 경우, 담은 금액이 제한 금액(최신 회차 로또 실수령액)을 넘길 경우 에러를 반환한다.장바구니 조회 시엔 IsLotto 값이 필요하다. (default : true)조회할 장바구니가 없다면 새로 생성한다.장바구니 상품 제거 시엔 장바구니 물품 id 값이 필..
[Spring] 로또 API 단위 테스트 코드 작성
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :)  일반적으로 테스트 케이스를 작성한다고 하는건 거의 단위 테스트를 의미하는 것이다.통합 테스트는 여러 컴포넌트들 간의 상호작용과 호환성을 검증하는 테스트이기 때문에 테스트를 위한 비용이 많이 소모된다. Java를 테스트 할 때 가장  흔히 사용되는 프레임워크인 JUnit을 사용해서 단위 테스트를 진행할 예정이다. 단위 테스트 : 하나의 모듈을 기준으로 독립적으로 검증하는 테스트 (controller, service, repository, ...)테스트 코드 실행 시간이 빠름하나의 테스트가 곧 하나의 문서로 역할독립적인 검증이기 때문에 다른 객체와의 상호작용 필요시 가짜 객체를 정의해 주어야 함가짜 객체의 답변을 직접 작성해주는 것이기 때문..
[Spring] 테스트 코드 기본 개념
·
Dev Tool/Spring boot
테스트 코드 개념API를 개발하면서 swagger나 postman을 통해 개발 사항에 대한 테스트를 진행해 볼 수 있다. 하지만 이렇게 수동적인 테스트는 관리해야할 api가 늘어나고, 요구사항이 변경되게 될수록  커버하지 못하는 영역이 늘어나게 된다. 이를 위해 필요한게 테스트 코드이다. 테스트 코드를 통해 개발자는 빠른 피드백을 얻을 수 있으며, 테스트 케이스 수행을 자동화할 수 있다. 이에 따라 코드의 안정성이 높아져 소프트웨어 품질 유지에 도움이 되는 것이다. 테스트 코드 규칙이러한 테스트 코드는 다음과 같은 규칙들을 지키며 작성할수록 좋은 테스트 코드라 불려진다FIRST 원칙Fast :  빠르게 실행Isolated : 테스트 코드 성공 유무가 다른 테스트에 영향을 끼치지 않음Repeatable :..
[Spring] 로또 API 구현(2) & 예외 처리(@validate)
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :) 이번 API는 각 년도별로 누적된 로또 번호의 통계치를 제공해주는 api이다. 크게 보면 Lotto정보에 속하는 것이기 때문에 service와 controller 코드를 같은 클래스에 작성하였었으나, 단일 책임 원칙에 따라 분리하여 작성하였다. 코드를 작성하면서 팀원이 작성해둔 예외처리메서드를 사용하여 예외처리를 진행해주었다. try-catch 사용은 최대한 지양하는게 좋다는 말을 들어왔기에 throw하여 @RestControllerAdvice에서 받게끔하였다. Entity & DTO@Getter@Setter@Mapping(mappingPath = "statnum-mapping.json")@Setting(settingPath = "elas..
[Spring] Swagger 연동
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :)Swagger를 사용하면 개발한 API들을 한 곳에 모아볼 수 있고, 테스트도 가능하다. 현재 spring-fox, spring-doc 두가지의 swagger 라이브러리가 존재하는데 이 중 spring-doc을 사용하여 연동을 진행하였다. 구글링을 해보면 Swagger와 Springboot를 연결한 많은 사례가 존재하는데 하나의 사례만 따라하면 계속 에러가 떠서 여기저기 짜집기를 해가며 연동을 했다. 이후 다시 연동을 할 때 다시 시간 잡아먹히긴 싫으니까 기록!!  build.gradleimplementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0'application.yml..
[Spring] 엘라스틱 서치 연동 & API 구현
·
Dev Tool/Spring boot
코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :) 현재 개발하고자 하는 서비스는 흔히들 하는 상상인 '로또 당첨되면 뭐하지?'를 실제로 체험해볼 수 있는 로또 시뮬레이션 웹이다. 이에 필요한 api명세는 다음과 같다. 나는 로또와 장바구니 관련된 API 구현 & 서버 배포 및 CICD 구현을 담당하였다. 이에 대한 개발 과정을 포스팅할 예정이다.엘라스틱 서치 연동 ES 사용 이유와 대략적인 개념 정리구현하고자 하는 서비스는 조회가 대부분의 기능을 이루는 서비스이다. 이 때문에 당연히 검색 성능을 높이는 방법에 가장 집중을 많이 했다. 인덱싱과 반정규화 등등 여러 방안에 대해 얘기를 하다가 결정하게 된 것이 엘라스틱 서치였다. 엘라스틱 서치는 분산형 RESTful 검색 및 분석 엔진이다. ..
[Spring] 프로젝트 생성 기초
·
Dev Tool/Spring boot
Spring 프로젝트 생성spring boot 프로젝트는 보통 다음 사이트에서 생성하는게 일반적이다.  https://start.spring.io/다음과 같은 값으로 지정하여 프로젝트를 생성하였다. 의존성들은 필요하다고 생각되는 것들은 모두 추가해놓았는데 추후 더 필요하게 되면 추가 가능하니 많이 신경쓰지 않아도 될 듯 하다. 주요 라이브러리스프링 부트 라이브러리spring-boot-starter-web :  웹 애플리케이션 개발을 위한 필수 라이브러리 모음으로 내장 톰캣 서버와 스프링 mvc 설정이 포함됨spring-boot-starter-tomcat : 스프링 부트 내장 웹 서버spring-webmvc : 스프링 웹 MVC를 구성하는 라이브러리spring-boot-thymeleaf : 타임리프 템플릿..