Developer's_til/스프링 프레임워크 26

[Spring] Server to Server 연동을 위한 여정

🙋‍♂️ 개요Spring 환경에서 서버 간의 연동을 위해 구글링하다보면, 아래와 같이 3가지의 기술들이 나열된다.ㅇ RestTemplateㅇ WebClientㅇ FeignClient  ✅ RestTemplate이란?Http 요청을 보내기 위해 Spring에서 제공하는 동기식 클라이언트 라이브러리. - Http 프로토콜에 맞게 다양한 메서드 제공- RESTful 형식을 갖춘 템플릿- HttpClient를 추상화해서 응답 형식으로 JSON, XML 등 다양한 형식을 지원- 동기식, Blocking I/O- 동시성이 높은 시나리오에는 부적합- Connection Pool(소켓 풀) 기능 제공 [ 동기식(Synchronous)이란? ]요청한 작업에 대해 완료 여부를 신경쓰면서 작업을 순차적으로 수행하는 방식말..

[Spring] API 속도 개선을 위한 여정

[ 📢 세줄 요약 ] 특정 테이블의 데이터를 대량으로 삭제할 수 있는 API 개발 API 속도 개선을 위해 비즈니스 로직을 단계적으로 접근 각 단계별로 속도 개선을 위한 코드 리팩토링 ✅ 배경과 상황 사업팀으로부터 하나의 요청사항을 받았다. 관리자 포탈에서 발신번호를 대량으로 삭제할 수 있는 기능을 만들어주세요. 기존에는 발신번호의 상세 조회 페이지에서 한 건씩 삭제할 수 있는 기능이 있었기에, 대량으로 삭제하는 건 크게 어렵지 않을 거라고 생각했다. 단순히 DB에서 삭제하는게 아니라 타 시스템의 발신번호 삭제 API를 호출하는 방식이였고, 삭제 대상들을 엑셀 파일로 업로드받아서 삭제 프로세스를 진행했을 때, 약 20초안에 200건까지 삭제가 가능했다. 관리자 포탈에서 WAS의 응답값을 기다리는 시간이 ..

[Spring] Static 변수와 스프링 빈

✅ Static / 스프링 빈 [ 🔑 간단요약 ] 특정 클래스에서 멤버 변수를 선언 및 초기화를 동시에 할 때, static 클래스의 메서드를 호출해서 초기화 하는 상황에서 NPE가 발생 스프링이 빌드되면서 객체들이 메모리에 저장되는 시점과 스프링 컨테이너가 로드되는 시점 등에 따른 차이 이해하기 ✅ 빈 주입이 안되는... WAS 프로젝트에는 공통적으로 보안 시스템에 로그를 적재하는 로직이 존재한다. 해당 로직들을 리팩토링하는 과정에서 빌드 자체가 실패하는 문제가 있었다. public class YamlUtil { @Autowired private Environment env; public String getProperty(String key) { return env.getProperty(key); } ..

[Spring] Mybatis의 동적쿼리와 변수

✅ Mybatis Spring 웹 어플리케이션에서 쿼리 기반으로 데이터베이스에 접근하는 SQL Mapper 프레임워크 [ 🔑 간단 요약 ] Mybatis의 쿼리가 작성되는 XML 문서에서 요청 파라미터와 동적 쿼리 기반으로 변수를 작성하는 2가지 케이스 쿼리가 작동하지않는 이슈를 접하고, 각 케이스를 비교 ✅ 배경과 상황 새로운 API를 개발하고 있던 팀원에게 질문을 받았다. 똑같은 쿼리인데 WAS에서는 조회 결과가 안나오고, DB 툴에서는 결과가 나옵니다. 실제로 WAS에서는 조회 결과가 0이 나오고, DBeaver에서는 정확한 조회결과가 나왔다. 이런 경우는 처음 접해서 원인을 어떻게 찾아야할지 고민이었다. WAS와 DB간의 연동, 회사내 방화벽, 반환 타입 등 다각도로 보던 중 동적쿼리가 눈에 들어..

[Spring] XSS필터와 Surrogate pair

✅ 세줄 요약 🛠 특정 조건에서만 조회 기능이 동작하지 않는 이슈 확인. 🛠 기능 동작 과정을 거슬러 올라간 결과, Emoji 데이터가 포함된 경우와 클라이언트로 반환하기 직전에 지나가는 XSS 필터에서 문제 원인을 발견. 🛠 UTF-16의 특별한 인코딩 방식인 Surrogate pair를 기반으로 문제 해결. ✅ 배경과 상황 [ 에러 상황 ] 담당하고 있는 고객 포탈 사이트에서 특정 조건에만 조회 기능이 동작하지 않는 이슈가 있었다. 가장 먼저, 서버 로그를 살펴보니 아래와 유사한 내용이 남겨져 있었다. 2023-11-10 20:08:17.435 WARN 16980 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [or..

[Spring] 완전한 AOP 솔루션을 제공하는 AspectJ

✅ 배경 실무에서는 로깅, 파일 처리 등 비즈니스 로직 외에 다양한 코드를 접할 수 있다. 현업에서 API에 녹아있는 코드를 보면 회사 정책에서 요구하는 로그를 객체에 담아 파일로 보관하는 로직을 접했는데 메서드마다 비슷한 코드가 반복됐다. 이러한 상황을 AspectJ 기반으로 리팩토링하여 유지보수성을 높이기로 계획했다. ✅ AspectJ AspectJ는 스프링 AOP와는 다르게 모든 도메인 객체에 적용할 수 있다는 장점이 있다. 다만, 둘은 다른 목표와 특징을 갖고 있다. [ 기능 및 목표 ] Simply put, Spring AOP and AspectJ have different goals. Spring AOP는 프로그래머가 직면하는 가장 흔한 문제를 해결하기 위해 Spring IoC 전반에 걸쳐 간..

[inflearn] 스프링 MVC 2편 review

✅ 강의 소개 웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있습니다. ✅ 강의별 후기 [ 메시지, 국제화 ] 다양한 메시지를 한 곳에서 관리하는 기능으로 메시지 관리용 파일(ex. messages.properties)에서 화면에 보이는 문구 등을 관리한다. 덧붙여서 메시지들을 나라별 언어로 관리하면 서비스를 국제화 할 수 있다. (ex. messages-ko.properties, messages-en.properties) - 스프링의 경우, 인터페이스인 MessageSource로 메시지 관리 기능을 제공하며, 구현체인 ResourceBundleMessga..

[inflearn] 스프링 MVC 1편 review

✅ 강의 소개 웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다. ✅ 강의별 후기 [ Servlet ] Servlet은 톰캣같은 웹 어플리케이션 서버를 직접 설치하고, 그 위에 서블릿 코드를 클래스 파일로 빌드해서 올린 다음, 톰캣 서버를 실행. Servlet을 생성하여 실제 Http 요청/응답을 수행. HttpServletReqeust / HttpServletResponse를 기반으로 각 객체에 담기는 Parameter에 대한 이해. - Application 클래스 @ServletComponentScan으로 Servlet을 직접 등록해서 사용. - HttpServle..

[inflearn] 스프링 핵심 원리 - 기본편 review

✅ 강의 소개 초급자를 위해 준비한 [웹 개발, 백엔드] 강의 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. ✅ 강의별 후기 [ 객체 지향 설계와 스프링 ] 스프링이 만들어진 역사와 스프링의 생태계, 프레임워크에 대해 학습. 좋은 객체 지향 어플리케이션을 개발하기 위한 개념들을 이해 및 복습 - 추상화, 캡슐화, 상속, 다형성 - 다형성의 본질 (유연한 변경) - 객체를 설계할 때, 역할과 구현을 명확히 분리. - SOLID 원칙 SRP(변경에 따른 파급효과 최소화) OCP(확장에는 열려있고 변경에는 닫혀있음) LSP(프로그램의 정확성, 다형성의 인터페이스 규약) ISP(여러개의 인터페이스) DIP(추상화에 의존) [ 스프링 핵심 원리 이해..

[Spring] 트랜잭션으로 알아보는 스프링 AOP

✅ 트랜잭션 정의 트랜잭션의 기본 개념은 더 이상 쪼갤 수 없는 최소 단위의 작업이다. 앞서 작성했던 TransactionAdvice의 코드를 살펴보면 트랜잭션을 가져올 때 파라미터로 DefaultTransactionDefinition이 있다. DefaultTransactionDefinition이 구현하고 있는 TransactionDefinition 인터페이스는 트랜잭션의 동작방식에 영향을 줄 수 있는 네 가지 속성을 정의하고 있다. [ 트랜잭션 전파 ] 트랜잭션 전파란 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때, 또는 없을 때 어떻게 동작할 것인가를 결정하는 방식을 말한다. 만약, A 트랜잭션이 진행 중인 상태에서 B 트랜잭션이 호출된다면 어떻게 동작할까? B의 코드가 새로운 트랜잭션을 만..