목록Spring (9)
생각해보기

jpa에서 쿼리 등록이 어떻게 되고, 어떻게 관리되는 지 궁금했습니다. jpa 내부를 살펴보겠습니다. JpaRepository가 호출될때 jdkDyamicAopProxy를 통해서 여러개의 interceptor를 체인 형태로 호출하게 됩니다. 체인 형태로 호출 할때 ReflectiveMethodInvocation을 사용합니다. // ReflectiveMethodInvocation @Override @Nullable public Object proceed() throws Throwable { // We start with an index of -1 and increment early. // 사용되는 interceptor는 순차적으로 interceptorsAndDynamicMethodMatchers에 등록됩니..

서블릿과 필터는 Java EE(enterprise edition)을 스펙을 기반으로 합니다. 기존의 filter를 등록하는 표준 방식(ex. web.xml 설정)에서는 서블릿 컨테이너에 의해 직접 관리됩니다. 따라서 서블릿 컨테이너가 직접 관리하는 필터는 스프링 애플리케이션 컨텍스트 내에서 정의하는 빈들을 인식하지 못합니다. 따라서DelegatingFilterProxy를 통해 스프링 빈으로 요청을 위임합니다. DelegatingFilterProxy는 FilterProxy(FilterChainProxy)구현체를 찾아 위임합니다. // DelegatingFilterProxy.java @Override public void doFilter(ServletRequest request, ServletResponse..

스프링 프레임 워크를 공부하면서, 서블릿, 서블릿 컨테이너, 서블릿 컨텍스트 등에 궁금해졌습니다. 각각의 용어를 정리하고, 스프링 부트가 어떻게 실행 되는지 확인을 해보고자 합니다. 서블릿 (Servlet): Java에서 HTTP 요청을 처리하기 위해 사용되는 Java 클래스입니다. HTTP GET, POST, PUT, DELETE 등의 요청을 처리할 수 있습니다. 웹 페이지의 동적 콘텐츠 생성을 위해 사용됩니다. 서블릿 컨텍스트 (ServletContext): 웹 애플리케이션의 전체 범위에 걸쳐 공유되는 정보를 저장하는 객체입니다. 웹 애플리케이션의 전체 생명 주기 동안 유지되며, 모든 서블릿과 JSP는 동일한 ServletContext 객체를 공유합니다. 서블릿 간의 데이터 공유, 애플리케이션 수준의..
현재 회사에서 기존의 레거시를 python fastapi로 전환하는 작업을 진행하고 있습니다. fastapi에서 depency injection(DI)가 spring framework 만큼 편리하지 않았기에, spring boot는 어떻게 DI를 진행하는지 궁금하게 되었습니다. spring boot에서는 주로 @Autowire 어노테이션을 사용하여 DI 진행합니다. @Autowire을 사용하여 주입하는 bean을 주입하는 방식은 대표적으로 3가지가 있습니다 1. 생성자 주입 생성자가 호출되는 시점에 주입이 이루어집니다. 생성자를 통한 주입은 객체가 생성되는 시점에 모든 의존성이 주입되므로, 이후에는 해당 의존성이 변경되지 않는 불변성을 보장합니다. @Service public class MyService..

스프링에서 간단히 @Transactional을 적는 것으로, 쉽게 트랜잭션을 구현할 수 있습니다. 어떻게 이 과정이 수행되는지 궁금했고 코드를 보면서 분석을 해보았습니다. 우선 @Transactional 어노테이션은 AOP 기능을 기반으로 동작을 합니다. Spring에서 AOP는 두가지 방법으로 구현을 합니다. AOP에 대한 자세한 내용은 해당 포스트에 좋은 글이 있어 공유 합니다. ( https://steady-coding.tistory.com/608 ) AOP란? 더보기 AOP는 이러한 교차 관심사를 분리하여 별도의 모듈로 만들고, 이를 필요한 시점에 적용하도록 합니다. 이렇게 함으로써 기능별로 코드를 분리하고 재사용성을 높이며, 유지 보수성을 향상시킬 수 있습니다. AOP(Aspect-Oriente..

스프링에서는 요청에 매칭되는 다양한 매개변수 들이 있습니다. 대표적으로 다음과 같은 매개변수가 존재합니다. @RequestParam: 클라이언트로부터 전송된 파라미터 값을 Handler(Method)의 파라미터로 사용할 수 있게 매핑해주는 어노테이션입니다. 예를 들어, GET 방식의 요청에 ?name=example이라는 쿼리 문자열이 있다면, @RequestParam("name") String name으로 해당 값을 받을 수 있습니다. 필수 여부를 설정할 수 있으며, 기본값은 true입니다. 필수가 아닌 경우 @RequestParam(required = false)를 사용할 수 있습니다. @RequestBody: 클라이언트로부터 전송된 JSON 혹은 XML 등의 데이터를 Java Object로 변환해서 ..