BackEnd/Spring

BackEnd/Spring

스프링 MVC 내부 동작 원리 (with. 핸들러 매핑, 어뎁터 매핑, Filter, Interceptor.. etc)

이 글은 김영한님의 스프링 MVC 강의 영상을 참조하여 작성되었습니다.   Spring MVC 동작 과정 🍃 0. HTTP 요청 💭Client로부터 요청이 들어오면 Front Controller인 Dispatcher Sevlet이 요청을 받는다. Dispatcher Sevlet은 받은 요청을 처리할 수 있는 Handler 객체를 가져온다. 0번 과정에서 Dispatcher Servlet에 요청이 들어오기 직전이 Filter의 동작 시점이다.Dispatcher Servlet 이후에 동작하는 ControllerAdvice는 이러한 동작 시점에 의해 Filter 측에서 발생하는 예외까진 잡지 못한다는 특징이 있다.     1. 핸들러 조회 💭핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조..

BackEnd/Spring

Spring @Sql 애노테이션의 동작 원리와 트러블슈팅 기록

우아한테크코스 레벨2에서 스프링부트를 활용한 미션을 수행하면서, 테스트 코드를 어느때보다 열심히 작성하고 있는 것 같다.하지만 테스트 코드에서 @Sql 을 사용하는 과정에서 문제를 마주하게 되었고,이를 @Sql 애노테이션의 동작 원리를 살펴보는 좋은 기회로 여겨 문제 상황과 학습 내용을 기록해보고자 한다.   @Sql 애노테이션이란?마주한 문제에 대해 알아보기 전에우선 Sql 애노테이션이 무엇인지부터 알아보자.  정확한 설명을 위해 공식문서의 말을 빌려보자면, ‘@Sql 애노테이션은 통합 테스트 환경에서 주어진 데이터베이스에 실행시키기 위한 SQL의 scripts 또는 statements를 구성하기 위한 목적으로 테스트 클래스 또는 테스트 메서드에 붙여주는 애노테이션’ 이라고 한다. 간단히 @Sql 애노..

BackEnd/Spring

Springboot Toss 결제 API 연동

외부 API 연동하기우테코에서 방탈출 미션을 수행하면서, 방탈출 예약 결제 처리에 Toss 결제 API 를 연동하게 되었다. 방탈출 미션은 방탈출 예약 웹 서비스를 만드는 미션으로 JS/CSS/HTTP 기반 웹 클라이언트 와 Springboot/Java 기반 백엔드를 함께 개발한다. 하지만 백엔드에서 고려할 부분에 대한 흐름을 기록하고싶기 때문에 이번 내용은 클라이언트 측이 아닌 백엔드 측의 기준으로 설명한다. 또한 Toss API 연결이라는 하나의 작업보다는 외부 API 연결이라는 큰 틀에 집중해보았다는 점을 참고해서 글을 읽으면 도움이 될 것이다. 또한 이번에 다루는 내용은 실제 결제까지의 과정이 아니라 학습을 위한 과정이기 때문에 토스에서 지원하는 '테스트'용 키값 등을 사용했다는 점도 참고바란다...

BackEnd/Spring

스프링부트 S3 PreSignedURL을 통한 이미지 저장

🤔 적용을 고려한 이유“우리집 반려동물의 AI 프로필 사진관” 펫튜디오 프로젝트를 개발하는 과정에서 반려동물 AI 프로필 사진을 만들기 위해 Stable Diffusion 모델에 학습시킬 10~12장의 이미지를 S3에 저장해야하는 상황이 발생하였다. 일반적으로 이러한 경우에 클라이언트→서버 방향으로 이미지 파일을 전송하고 서버→S3 방향으로 이미지를 저장시키는 구조를 대체적으로 많이 봐왔을 것이다. 하지만 10장~12장이나 되는 이미지를 서버로 전송하는 일은 일반적은 요청과는 다르게 서버에 가하는 부하가 컷고, 금전적인 이슈로 AWS 프리티어의 t2.micro를 사용 중인 현재 인프라 환경에서 최대한 부하를 줄이는 작업은 불가피했다.때문에 이미지 저장의 책임을 클라이언트 측에 위임하여 서버에 가해지는 ..

BackEnd/Spring

내 테스트 코드는 제대로 작성되었을까? (with. 코드 커버리지)

내 테스트 코드는 제대로 작성되었을까? 🤔우테코 프리코스를 진행하면서 요구사항에 의해 테스트 코드를 작성하였다.실수를 방지하기 위해 정말 꼼꼼하게 테스트 코드를 작성하며, 엣지 케이스를 찾기 위해 열심히 노력하였다.하지만 미션 코드가 길어지다보니 "모든 로직에 대한 테스트가 되어있는가?"라는 스스로에 대한 의구심이 들기 시작했다.때문에 이 의구심을 해결하기 위한 방법을 찾아보았고, 인텔리제이에서 플러그인 설치없이 코드 커버리지를 측정을 할 수 있다는 것을 알 수 있었다. 나는 이를 활용해 최대한 모든 로직을 테스트 할 수 있었고, 몇 번의 클릭만으로 많은 장점을 얻을 수 있다고 생각했기 때문에 이를 공유하고자 간단히나마 글을 작성해보고자 한다. 💭 코드 커버리지란?코드 커버리지는 내 프로젝트의 코드들..

BackEnd/Spring

Bucket4j를 사용해서 스프링부트 트래픽 제한하기

트래픽 제한을 고려하게 된 이유트래픽 제한에 대한 고민은 gpt-3.5-turbo 모델을 Fine-Tuning하여 사용하는 졸업작품 코리를 개발하면서 시작되었다.코리는 초기 유저들을 모으기 위해 한동안은 유료인 GPT API 사용 비용을 운영측에서 부담하는 구조로 운영하게 되었고, 아직은 BM(Business Model)이 딱히 존재하지 않았기 때문에 당장은 손해로 지어질 수 밖에 없는 구조였다.결론적으로 사용자들의 GPT 모델 사용 비용을 운영 측에서 부담하게 되었으니, 유저들의 요청 횟수에 제한을 두어야한다는 생각이 들게 되었다.   Java/SpringBoot 환경에서 트래픽 제한 구현하기 토큰 형태의 트래픽 제한 라이브러리 Bucket4j회원들의 트래픽을 제한할 수 있는 방법을 찾던 와중에 Buc..

BackEnd/Spring

@PostConstruct, Static Block, Instance Block 초기화 시점 차이

자바 스프링 기술로 개발을 해봤다면 @PostConstruct 과 Static block, Instance block 을 사용해본 경험이 있을 것이다.이는 객체 초기화를 위한 콜백(callback) 함수를 선언하기 위한 기술이다.  콜백(Callback) 함수란?콜백 함수는 다음과 같은 의미를 가진다.다른 함수 인자로서 사용되는 함수어떠한 이벤트에 의해 호출되는 함수이 글에서의 설명은 2번째 의미인 '어떠한 이벤트에 의해 호출되는 함수' 에 가깝다.  본인또한 이 3가지를 종종 다루긴 했지만,@PostConstruct 와 Static block 중 어떤 것을 사용할 지 고민하던 중이 두 가지의 초기화 시점 차이에 대해 정확히 인지하지 못한 채로 사용하고 있었다는 것을 깨닫게 되었다. 때문에 이를 공부하며..

BackEnd/Spring

의존성 주입 시, 같은 Type의 빈이 2개 이상일 경우

우리는 스프링을 사용할 때, 생성자 주입을 통해 의존성을 주입하곤 한다.   그런데 의존성을 주입하는 경우, 2개의 의존성 중 하나를 주입해야하는 경우가 있을 것이다. public interface DiscountPolicy {}@Componentpublic class FixDiscountPolicy implements DiscountPolicy {}@Componentpublic class RateDiscountPolicy implements DiscountPolicy {} @Autowiredprivate DiscountPolicy discountPolicy 만약 위와 같이 FixDiscountPolicy와 RateDiscountPolicy가 스프링 빈으로 존재할 때,다음과 같이 @Autowired를 수..

PgmJUN
'BackEnd/Spring' 카테고리의 글 목록