728x90
외부 API 연동하기우테코에서 방탈출 미션을 수행하면서, 방탈출 예약 결제 처리에 Toss 결제 API 를 연동하게 되었다. 방탈출 미션은 방탈출 예약 웹 서비스를 만드는 미션으로 JS/CSS/HTTP 기반 웹 클라이언트 와 Springboot/Java 기반 백엔드를 함께 개발한다. 하지만 백엔드에서 고려할 부분에 대한 흐름을 기록하고싶기 때문에 이번 내용은 클라이언트 측이 아닌 백엔드 측의 기준으로 설명한다. 또한 Toss API 연결이라는 하나의 작업보다는 외부 API 연결이라는 큰 틀에 집중해보았다는 점을 참고해서 글을 읽으면 도움이 될 것이다. 또한 이번에 다루는 내용은 실제 결제까지의 과정이 아니라 학습을 위한 과정이기 때문에 토스에서 지원하는 '테스트'용 키값 등을 사용했다는 점도 참고바란다...
🤔 적용을 고려한 이유“우리집 반려동물의 AI 프로필 사진관” 펫튜디오 프로젝트를 개발하는 과정에서 반려동물 AI 프로필 사진을 만들기 위해 Stable Diffusion 모델에 학습시킬 10~12장의 이미지를 S3에 저장해야하는 상황이 발생하였다. 일반적으로 이러한 경우에 클라이언트→서버 방향으로 이미지 파일을 전송하고 서버→S3 방향으로 이미지를 저장시키는 구조를 대체적으로 많이 봐왔을 것이다. 하지만 10장~12장이나 되는 이미지를 서버로 전송하는 일은 일반적은 요청과는 다르게 서버에 가하는 부하가 컷고, 금전적인 이슈로 AWS 프리티어의 t2.micro를 사용 중인 현재 인프라 환경에서 최대한 부하를 줄이는 작업은 불가피했다.때문에 이미지 저장의 책임을 클라이언트 측에 위임하여 서버에 가해지는 ..
내 테스트 코드는 제대로 작성되었을까? 🤔우테코 프리코스를 진행하면서 요구사항에 의해 테스트 코드를 작성하였다.실수를 방지하기 위해 정말 꼼꼼하게 테스트 코드를 작성하며, 엣지 케이스를 찾기 위해 열심히 노력하였다.하지만 미션 코드가 길어지다보니 "모든 로직에 대한 테스트가 되어있는가?"라는 스스로에 대한 의구심이 들기 시작했다.때문에 이 의구심을 해결하기 위한 방법을 찾아보았고, 인텔리제이에서 플러그인 설치없이 코드 커버리지를 측정을 할 수 있다는 것을 알 수 있었다. 나는 이를 활용해 최대한 모든 로직을 테스트 할 수 있었고, 몇 번의 클릭만으로 많은 장점을 얻을 수 있다고 생각했기 때문에 이를 공유하고자 간단히나마 글을 작성해보고자 한다. 💭 코드 커버리지란?코드 커버리지는 내 프로젝트의 코드들..
트래픽 제한을 고려하게 된 이유트래픽 제한에 대한 고민은 gpt-3.5-turbo 모델을 Fine-Tuning하여 사용하는 졸업작품 코리를 개발하면서 시작되었다.코리는 초기 유저들을 모으기 위해 한동안은 유료인 GPT API 사용 비용을 운영측에서 부담하는 구조로 운영하게 되었고, 아직은 BM(Business Model)이 딱히 존재하지 않았기 때문에 당장은 손해로 지어질 수 밖에 없는 구조였다.결론적으로 사용자들의 GPT 모델 사용 비용을 운영 측에서 부담하게 되었으니, 유저들의 요청 횟수에 제한을 두어야한다는 생각이 들게 되었다. Java/SpringBoot 환경에서 트래픽 제한 구현하기 토큰 형태의 트래픽 제한 라이브러리 Bucket4j회원들의 트래픽을 제한할 수 있는 방법을 찾던 와중에 Buc..
자바 스프링 기술로 개발을 해봤다면 @PostConstruct 과 Static block, Instance block 을 사용해본 경험이 있을 것이다.이는 객체 초기화를 위한 콜백(callback) 함수를 선언하기 위한 기술이다. 콜백(Callback) 함수란?콜백 함수는 다음과 같은 의미를 가진다.다른 함수 인자로서 사용되는 함수어떠한 이벤트에 의해 호출되는 함수이 글에서의 설명은 2번째 의미인 '어떠한 이벤트에 의해 호출되는 함수' 에 가깝다. 본인또한 이 3가지를 종종 다루긴 했지만,@PostConstruct 와 Static block 중 어떤 것을 사용할 지 고민하던 중이 두 가지의 초기화 시점 차이에 대해 정확히 인지하지 못한 채로 사용하고 있었다는 것을 깨닫게 되었다. 때문에 이를 공부하며..
우리는 스프링을 사용할 때, 생성자 주입을 통해 의존성을 주입하곤 한다. 그런데 의존성을 주입하는 경우, 2개의 의존성 중 하나를 주입해야하는 경우가 있을 것이다. public interface DiscountPolicy {}@Componentpublic class FixDiscountPolicy implements DiscountPolicy {}@Componentpublic class RateDiscountPolicy implements DiscountPolicy {} @Autowiredprivate DiscountPolicy discountPolicy 만약 위와 같이 FixDiscountPolicy와 RateDiscountPolicy가 스프링 빈으로 존재할 때,다음과 같이 @Autowired를 수..