Spring55 스프링 핵심원리(심화) - 하나의 프록시, 여러 어드바이저 그리고 프록시 팩토리 적용 이전 글에서는 Advisor의 개념과 함께, 여러 어드바이저를 하나의 대상에 적용하려면 어떻게 해야 하는지 살펴봤다.가장 먼저 떠오르는 방법은 프록시를 여러 개 겹쳐서 만드는 방식이었다. 즉,target을 감싼 프록시를 하나 만들고그 프록시를 다시 또 다른 프록시로 감싸는 식으로여러 어드바이스를 순차적으로 적용하는 구조였다.이 방식 자체가 틀린 것은 아니지만,어드바이저가 늘어날수록 프록시도 계속 늘어나야 한다는 점에서 구조가 점점 복잡해진다.그렇다면 스프링은 이 문제를 어떻게 해결할까? 이번 글에서는 바로 그 다음 단계인하나의 프록시에 여러 어드바이저를 적용하는 방식을 먼저 보고,이어서 그 구조를 실제 애플리케이션에 적용하는 흐름까지 정리해보려고 한다. 하나의 프록시, 여러 어드바이저스프링은 여러 프록시.. Spring/SpringCore - advance 2026. 3. 26. 스프링 핵심원리( 심화 ) - 프록시 팩토리 앞에서 JDK 동적 프록시와 CGLIB를 각각 살펴봤다.JDK 동적 프록시는 인터페이스가 있을 때 사용할 수 있고, CGLIB는 구체 클래스를 기반으로 프록시를 만들 수 있다는 점도 확인했다. 그런데 마지막에 다음과 같은 의문으로 글을 마무리 하였다. 인터페이스가 있으면 JDK 동적 프록시를 쓰고인터페이스가 없으면 CGLIB를 써야 하는데 이걸 개발자가 매번 직접 구분해서 적용해야 할까? 그리고 부가 기능을 넣기 위해서도JDK 동적 프록시에서는 InvocationHandlerCGLIB에서는 MethodInterceptor를 따로 만들어야 했다.게다가 앞에서 해봤던 것처럼 특정 조건에만 프록시 로직을 적용하는 기능까지 넣으려면 코드가 점점 번거로워진다. 위와 같은 번거로움과 문제점을 해결해주는 스프링이 지.. Spring/SpringCore - advance 2026. 3. 23. [Spring MVC] 요청 파라미터 HTML 엔티티 디코딩 문제 해결 (ArgumentResolver 활용) 문제 상황회사에서 담당하고 있는 프로젝트에서 특정 데이터가 조회되는 않는 문제가 발생했다. 해당 문제를 해결하기 위해서 출력되는 로그를 살펴보니, 요청에서 DB의 특정 칼럼에 '·' (특수기호)가 포함되어 있었는데화면에서 서버로 넘어올 때, '·' 문자가 디코딩되지 않은 상태인 ' · '의 형태로 넘어오고 있었다.예시🟢 DB에 저장된 값 - A · B 🟢 넘어오는 값의 형태 - A · B 원인 분석문제의 핵심은 요청 파라미터에 포함된 특수문자가 HTML 엔티티 형태로 전달되고 있었다는 점이었다.이 값이 별도의 디코딩 없이 그대로 조회 조건으로 사용되어 DB의 실제 값과 문자열이 달라지기 때문에 조회 실패가 발생했던 것이다. 즉, 표현 계층(HTML)에서 인코딩된 값이 애.. Troubleshooting 2026. 3. 11. 스프링 핵심원리( 심화 ) - 동적 프록시(리플렉션) 지금까지 프록시를 통한 원본 코드에 대한 변경 없이 부가 기능을 적용하는 방법에 대해 알아보았다.처음 컨트롤러 - 서비스 - 레포지토리 각 계층 코드의 직접적인 변경을 요구하던 형태에서본 기능의 코드는 부가 기능으로 인하여 더렵혀지지 않는 방법까지 알아보았다.보다 유지보수에 수월한 형태와 방법을 적용한 것이다! 그러나 여전히 로그 추적기라는 부가 기능을 적용하기 위해서 각 계층의 대상 클래스에 모두 프록시 클래스나 인터페이스들을 만들어야하는 작업은 별도로 필요하다. 반복을 줄이기 위한 방법은 없을까?? 이에 대한 방법으로 자바는 기본적으로 JDK 동적 프록시 기술이나 CGLIB 같은 프록시 생성 오픈소스 기술을 활용하여 프록시 객체를 동적으로 만들어낼 수 있도록 제공한다. 그리고 이 JDK 동적 프록시 .. Spring/SpringCore - advance 2026. 1. 26. 스프링 핵심원리( 심화 ) - 구체클래스 기반 프록시 앞서 다룬 인터페이스의 기반의 프록시 뿐만 아니라, 구체클래스 기반의 프록시를 적용하는 방법에 대해 학습을 이어간다.상속을 통한 프록시 적용결론부터 말하자면, 인터페이스가 존재하지 않아도 '상속'을 통해 프록시 적용이 가능하다. 코드 예시를 통해 살펴보자. 상속을 통한 프록시 적용 예시 코드 프록시 적용 이전 예시먼저, ConcreteLogic이며, 인터페이스가 존재하지 않는 구체클래스이다.(ex, 서비스 로직)import lombok.extern.slf4j.Slf4j;@Slf4jpublic class ConcreteLogic { public String operation() { log.info("ConcreteLogic 실행"); return "data"; }} 그리고 이를 사용하는.. Spring/SpringCore - advance 2026. 1. 14. Spring 개발 환경 세팅하기(STS) - DB 연결 세팅하기 / JDBC 드라이버 / JDBC 의존성 / HikariCP 커넥션풀 설정 / properties 생성 및 설정 앞서 Spring 세팅에 있어, 스프링 컨테이너를 실행하고 ComponentScan을 통해 스프링 Bean 관리 하는 내용까지 살펴보았다. 이제 DataBase 연결과 관련한 세팅에 대해 다뤄보겠다. 단, DB 설치와 관련한 내용은 다루지 않으며 Oracle 11g XE가 설치된 상황을 전제로 설명한다. 먼저, Spring MVC 에서 Oracle 데이터베이스에 연결하기 위한 설정 방법을 단계별로 작성해보겠다.[ 사용환경 ]- Spring Framework 5.0.7- Java 11- Oracle 11g XE- HikariCP 4.0.3- Maven 프로젝트 , Oracle 데이터베이스와 통신하기 위해 필요한 드라이버 설치가 필요하다. 이를 위해선 드라이버를 직접 다운받아 설치하거나 혹은 pom... Spring/Spring(legacy) - MVC 2025. 12. 24. Spring 개발 환경 세팅하기(STS) - root-context.xml 설정을 통해 스프링 Bean 관리(ComponentScan), componentscan 사용 관련 xml 설정 내용 지금까지 스프링 legacy project 구성을 위한 기본적인 환경 설정을 다뤘다. 이제 스프링의 핵심 역할인 DI Container로의 기능을 살펴보고, ComponenScan을 활용한 사용법에 대해서 알아보자.DI Container로 스프링의 역할 및 기능을 살펴보기 위해앞서 구성했던, 프로젝트에 아래와 같이 sample 패키지에 클래스를 만들었다. 먼저, Computer.java의 코드이다. package sample;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import lombok.Getter;import lombok.Setter;@Com.. Spring/Spring(legacy) - MVC 2025. 12. 11. Spring 개발 환경 세팅하기(STS) - pom.xml / IDE JRE 라이브러리 설정(Java Build Path) / 스프링, 자바 버젼 변경하기 https://deeep-diver.tistory.com/146 Spring 프레임워크 개발 환경 세팅하기(STS) - 스프링 프로젝트 생성, 라이브러리(.m2 폴더), 프로젝앞서, [File - New - Spring Legacy Project] 메뉴를 이용하여 MVC 프로젝트를 구성했던 것처럼이클립스(STS), 인텔레제이(Ultimate Version) 와 같은 IDE를 사용하여 쉽게 프로젝트를 구성할 수 있다. 프로젝트를deeep-diver.tistory.com이전에 다룬 프로젝트 구조에서 pom.xml은 Maven 관련 환경 설정 파일이다. 구체적으로는 아래와 같은 내용을 설정하는 것이다. '내 프로젝트를 Maven이 어떤 Java 버전으로 컴파일하고, 어떤 라이브러리와 옵션으로 빌드할지' 를 정.. Spring/Spring(legacy) - MVC 2025. 12. 10. Spring 개발 환경 세팅하기(STS) - 스프링 프로젝트 생성, 라이브러리(.m2 폴더), 프로젝트 구조(구조와 작동 원리) 앞서, [File - New - Spring Legacy Project] 메뉴를 이용하여 MVC 프로젝트를 구성했던 것처럼이클립스(STS), 인텔레제이(Ultimate Version) 와 같은 IDE를 사용하여 쉽게 프로젝트를 구성할 수 있다. 프로젝트를 생성하면 필요한 라이브러리 및 코드들을 다운로드 하는데 이는 .m2 폴더 내에 위치하게 된다. 간혹 스프링 관련 프로젝트를 생성하고 온전히 작동되지 않는 경우, Maven 등에서 스프링 관련 jar 파일들을 다운로드하는 중에 문제가 발생하는 경우가 많다. 이런 경우, [ .m2 - repository ] 폴더의 내용물을 삭제하고 재시작하여 해당 라이브러리들이 다시 다운로드 되는 과정을 거치면 해결 되는 경우가 많다. 이후 스프링 프로젝트 생성을.. Spring/Spring(legacy) - MVC 2025. 12. 9. Spring 개발 환경 세팅하기(STS) - STS3, STS.ini 설정을 통한 실행 환경 설정, Spring MVC 구성, 톰캣 설치 현재 다니고 있는 회사에서는 Spring legacy 환경을 사용하고 있다.이전에 학원에서는 스프링부트만 사용했지만, 회사에서 사용하는 환경이니 스프링 레거시 프로젝트 환경을 구축하는 방법과 구조에 대해 학습한 내용을 정리해보겠다. 대게 스프링 레거시 프로젝트를 STS를 사용해서 구성하는 경우가 많은 것으로 보이기에 IDE는 STS를 사용할 것이며,그 중에서도 STS3 버전을 사용할 것이다. (STS4부터는 Spring boot 개발에 적합하다고 한다.) 이를 위해 먼저 아래의 깃헙 링크에서 STS3을 설치해준다. https://github.com/spring-attic/toolsuite-distribution/wiki/Spring-Tool-Suite-3 Spring Tool Suite 3the dist.. Spring/Spring(legacy) - MVC 2025. 12. 4. 스프링 핵심원리( 심화 ) - 인터페이스 기반 프록시 앞서, 프록시의 역할과 기능 및 사용법에 대해서 알아보았다. 이제, 앞서 만들었던 v1(인터페이스가 있는 구현 클래스)에 프록시를 적용하여 LogTrace 기능을 활용하는 방법에 대해서 알아보자.즉, 프록시를 적용하여 기존 코드를 전혀 수정하지 않으면서 로그 추적 기능을 도입하는 방법에 대해서 구체적으로 파악해보자는 것이다. V1 App 의존관계 v1 App의 기본 의존 관계(클래스 의존)와 런타임시 객체 인스턴스의 의존 관계는 아래의 그림과 같다. V1 App 기존 의존관계 V1 기본 클래스 의존관계 V2 런타임 객체 의존 관계 여기에 로그 추적 기능을 담당하는 프록시를 추가하면 다음과 같은 형태를 지닌다. V1 App 프록시 도입 클래스 의존관계V1 프록시 도입 기본 클래스 의존관계 V1 프록시.. Spring/SpringCore - advance 2025. 11. 7. 스프링 핵심원리( 심화 ) - 프록시 패턴과 데코레이터 패턴(2) 앞서, 추가되었던 요구사항과 함께 지금까지 만들어 온 로그 추적기에 대한 내용 역시 정리해보자. 기존 요구사항→ 모든 Public 메서드의 호출과 응답 정보를 로그로 출력 → 애플리케이션의 흐름을 변경하면 안됨 - 로그를 남긴다고 해서 비즈니스 로직의 동작에 영향을 주면 안됨→ 메서드 호출에 걸린 시간 → 정상 흐름과 예외 흐름 구분 - 예외 발생 시 예외 정보가 남아야 함→ 메서드 호출의 깊이 표현 → HTTP 요청을 구분 - HTTP 요청 단위로 특정 ID를 남겨 어떤 HTTP 요청에서 비롯된 것인지 명확하게 구분할 수 있도록 한다. - 트랜잭션ID (DB 트랜잭션 ❎) 예시 하지만, 지금까지 개발한 로그 추적기는 위의 요구사항을 만족하기 위해서 기존 코드를 많이 수정해야 하는 상황이다. .. Spring/SpringCore - advance 2025. 8. 23. 이전 1 2 3 4 5 다음