Java19 스프링 핵심원리( 심화 ) - 프록시 팩토리(ProxyFactory, Advisor, Advice , Pointcut) 이전 글에서는 스프링의 ProxyFactory를 사용하면JDK 동적 프록시와 CGLIB를 직접 구분해서 다루지 않아도 된다는 점을 정리했다.정리해보면 프록시 팩토리는 다음 문제를 꽤 깔끔하게 해결해줬다. 인터페이스가 있으면 JDK 동적 프록시 사용구체 클래스만 있으면 CGLIB 사용개발자는 구체 기술보다 Advice 중심으로 부가 기능을 작성하면 됨여기까지 보면 프록시를 적용하는 방식 자체는 꽤 편리해진다.그런데 여기서 또 다음 질문이 생긴다. 부가 기능은 알겠는데, 어디에 적용할지는 어떻게 정할까?모든 메서드에 다 적용하지 않고 특정 메서드에만 적용할 수는 없을까?그리고 Advice, Pointcut, Advisor는 서로 뭐가 다른 걸까?이번 글에서는 바로 이 부분을 정리해보려고 한다. Advisor.. Spring/SpringCore - advance 2026. 3. 25. 스프링 핵심원리( 심화 ) - 동적 프록시(JDK 동적 프록시 1) JDK 동적 프록시 및 CGLIB 기술을 활용하여, 프록시 기술을 적용하는 방법에 대해서 학습한 내용을 정리해보겠다. 지금부터 다루는 내용에 대해서 정리하자면, 프록시가 필요한 대상마다 직접적으로 각각의 프록시 클래스를 만드는 것이 아닌 하나의 프록시 객체를 통해 적용 대상에 필요한 부가적인기능을 일괄적으로 적용하는 것이다. JDK 동적 프록시 및 CGLIB 기술에 대해서 이해해보자. JDK 동적 프록시 JDK 동적 프록시는 JAVA가 기본적으로 제공해주는 기능이다.Interface를 기반에 두고 동적으로 프록시 객체를 런타임에 생성하며 필요한 실행 로직을 수행해주는 기술이다.( JDK 동적 프록시 기술을 사용하여면, Interface가 필수이다. ) 기본 예제 JDK 동적 프록시를 적용하기 위.. Spring/SpringCore - advance 2026. 3. 15. [Spring MVC] 요청 파라미터 HTML 엔티티 디코딩 문제 해결 (ArgumentResolver 활용) 문제 상황회사에서 담당하고 있는 프로젝트에서 특정 데이터가 조회되는 않는 문제가 발생했다. 해당 문제를 해결하기 위해서 출력되는 로그를 살펴보니, 요청에서 DB의 특정 칼럼에 '·' (특수기호)가 포함되어 있었는데화면에서 서버로 넘어올 때, '·' 문자가 디코딩되지 않은 상태인 ' · '의 형태로 넘어오고 있었다.예시🟢 DB에 저장된 값 - A · B 🟢 넘어오는 값의 형태 - A · B 원인 분석문제의 핵심은 요청 파라미터에 포함된 특수문자가 HTML 엔티티 형태로 전달되고 있었다는 점이었다.이 값이 별도의 디코딩 없이 그대로 조회 조건으로 사용되어 DB의 실제 값과 문자열이 달라지기 때문에 조회 실패가 발생했던 것이다. 즉, 표현 계층(HTML)에서 인코딩된 값이 애.. Troubleshooting 2026. 3. 11. Optional 기초 사용법 Optional 이란?개발을 진행하다 보면, Primitive Type(원시 타입)과 더불어 Reference Type(참조 타입)을 사용한다. 원시 타입과 달리 참조 타입은 Null 값을 발생시키고 이로 가장 많이 발생하는 예외 중 하나인 바로 NPE(NullPointerException)을 유발한다. 이를 피하려면, null 여부를 검사하고 처리하는 로직이 필요한데 이를 모든 코드에서 사용하는 것을 상상해보면,꽤나 번거롭고 코드 가독성을 더럽힐 것이다. 따라서 Java는 8버전부터 Optional 클래스를 사용해서 NPE를 방지할 수 있도록 도와준다.이는 Null이 올 수 있는 값을 감쌀 수 있는 Wrapper 클래스이다. 이번 글에서는 Optional의 사용법에 대해 공부하고 정리해보겠다. .. Java/자바개념 2025. 1. 18. 리액티브 프로그래밍( reactive streams ) reactive streams 표준 라이브 러리에 대한 이해와 실습reactive streams은 데이터 스트림을 Non-Blocking하면서, 비동기적 방식으로 처리하기 위한 리액티브 라이브러리 표준 사양이다.즉, 리액티브한 코드를 작성하기 위한 라이브러리로 개발자는 보다 쉽게 리액티브 어플리케이션을 구성할 수 있게 만든다. 이를 실습하기 위해서 우선, java 프로젝트를 생성한 후에 해당 라이브러리를 사용하기 위한 빌드를 해준다. Gradle을 기준으로 아래와 같은 의존성을 주입해준다.// https://mvnrepository.com/artifact/org.reactivestreams/reactive-streams implementation group: 'org.reactivestreams'.. Spring/WebFlux 2025. 1. 3. 스프링 핵심 원리 - 싱글톤 컨테이너(stateless 코드 작성의 필요성과 @Configuration의 바이트 조작(CGLIB)을 통한 싱글톤 작동원리) Repeat is the best medicine for memory 스프링의 싱글톤스프링 컨테이너는 싱글톤이 적용되었다. 그 이유는 어플리케이션의 목적과 특수성을 생각해보면, 아래와 같은 고려 사항들이 있기 때문이다. 위의 내용처럼 웹 어플리케이션은 다수의 고객이 동시에 요청하는 경우가 빈번하게 발생한다.만약, 요청마다 새로운 인스턴스를 만들어 고객의 요청에 대응하는 어플리케이션이라면, 메모리 사용 관점에서 매우 비효율적이다. 이와 같은 상황을 스프링이 적용되지 않은 순수한 DI 환경으로 구성한다면, 아래와 같은 테스트 코드로 표현할 수 있을 것이다. public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void .. Spring/SpringCore - basic 2024. 12. 28. 스프링 핵심원리 - 스프링 컨테이너 설계 이해, 스프링의 다양한 설정 형식 지원(JAVA/Xml), 스프링 빈 메타 정보(BeanDefinition) Repeat is the best medicine for memory 앞서, 스프링으로 전환과 더불어 스프링 컨테이너의 작동 원리에 대해서 알아보고 있었다.그리고 컨테이너 생성에 있어 ApplicationiContext 부모 타입을 사용해왔고, 구현체로는 AnnotationConfigApplicationContext을 사용하였다. 이번에는 이러한 컨테이너가 어떻게 설계되었는 가에 대해서 살펴보며, 동시에 다양한 설정 형식을 지원해주는 구조를 지닌 스프링의 설계적 측면을 파악하며 알 수 있는 BeanDefinition의 역할을 알아보자. 스프링 컨테이너의 설계 ( 1 ) - BeanFactory지금까지 사용해온 ApplicationiContext는 사실 BeanFactory라는 부모타입을 상속한 인터페이.. Spring/SpringCore - basic 2024. 12. 28. 스프링 핵심 원리 - 스프링 컨테이너와 스프링 빈(컨테이너 생성 원리 및 다양한 Bean 조회 방법들) Repeat is the best medicine for memory 지금까지 다뤘던 내용들은 객체 지향적인 관점을 기준으로 스프링이 하는 역할과 핵심 원리을 이해하기 위한 과정이었다.이제, 스프링 자체에 대한 이해와 학습을 위한 내용들을 정리해보겠다.스프링 컨테이너 생성 방법과 작동 원리 먼저, 스프링 컨테이너가 생성되는 과정에 대해서 알아보자. ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Appconfig.class); 위의 코드 부분이 이전 포스팅에서 스프링 컨테이너를 만드는 로직에 해당한다.코드의 내용은 ApplicationContext 타입의 변수에 사용할 구현체로 어노테이션 기반의 자바 설정을 .. Spring/SpringCore - basic 2024. 12. 27. 객체 지향과 디자인 패턴 Chapter 05 - 의존 역전 원칙(SOLID) 더보기'개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴'을 읽고 학습합니다. ( 최범균 저 ) SOLID의 마지막 원칙인 의존 역전 원칙은' 고수준 모듈은 저수준 모듈의 구현에 의존하면 안 된다. 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다. ' 이다. 말이 어렵다.. 먼저 고수준 모듈과 저수준 모듈이 무엇인지 정의부터 해보자.고수준 모듈은 어떤 단일 기능을 제공하는 모듈이라고 정의할 수 있으며, 저수준 모듈은 고수준 모듈의 기능을 구현하기 위해 필요한 하위 기능의 실제 구현으로 정의 가능하다. 아래의 예제를 보며 쉽게 이해해보자. 위의 예시는 바이트 데이터를 암호화하는 것이 이 프로그램의 의미 있는 단일 기능으로 고수준 모듈에 해당한다.이 고수준 모듈은 데이터 읽기, 함호.. Java/객체지향 2024. 11. 15. 객체 지향과 디자인 패턴 Chapter 05 - 인터페이스 분리 원칙(SOLID) 더보기'개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴'을 읽고 학습합니다. ( 최범균 저 ) 이번 장에서 다룰 인터페이스 분리 원칙(ISP)을 표현하자면 다음과 같다.' 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다. ' 본래 원칙 정의는 ' 클라이언트는 자신이 사용하는 메서드에만 의존해야 한다 '지만, 저자는 이해와 기억을 위해 나름 문장을 바꿔서 표현하였다. 해당, 내용에서 저자는 C++ 언어를 사용하여 인터페이스 분리 원칙을 설명하였다. 하지만, 필자는 C++에 능숙하지 않고 책에 적힌 내용만으로 이해되지 않는 부분이 있어, 자료 조사를 더하여 정리해보겠다. 인터페이스 분리 원칙을 다루기에 앞서 인터페이스와 클래스( 특히, 추상 클래스 )는 설계와 관련이 깊다.인.. Java/객체지향 2024. 11. 14. 객체 지향과 디자인 패턴 Chapter 05 - 리스코프 치환 원칙(SOLID) 더보기'개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴'을 읽고 학습합니다. ( 최범균 저 ) 이전의 개발 폐쇄 원칙은 추상화와 더불어 다형성을 이용하여 구현했는데, 리스코프 치환 원칙은 개방 폐쇄 원칙을 받쳐 주는 다형성에 관한 원칙을 제공한다. 리스코프 치환 원칙→ ' 상위 타입의 객체를 하위 타입 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다. ' 이 말의 의미를 코스 수준에서 살펴보자면 상위 타입 클래스와 하위 타입 클래스를 통해 파악할 수 있다.아래의 코드로 예시를 살펴보자.public void somMethod(SuperClass sc) { sc.someMethod();} someMethod()는 상위 타입인 sc 객체를 사용하는 메서드이다. 그리고 만약 이 .. Java/객체지향 2024. 11. 13. 스프링 핵심 원리 - 스프링이란? Repeat is the best medicine for memory 스프링 생태계 스프링으로 개발한다는 것은 위의 그림과 같이 스프링 프레임워크 또는 스프링 부트 사용이 필수적이다. 이외의 오른쪽에 있는 기술들도 제공하는데, 각 용도에 맞춰 필요한 경우 스프링과 함께 편리하게 개발할 수 있도록 도와준다. 이외에도 스프링은 많은 기능들을 제공한다. ( 필요하다면 공식 사이트에 들어가서 확인해보자 ) 이들 중에서 가장 중요한 것은 ' 스프링 프레임워크 ' 자체이며 아래와 같은 사항들이 모두 스프링 프레임워크 안에 들어간 기능이다. 여기에서는 스프링 프레임워크의 핵심 기술들에 대해서 정리하며 학습을 진행하겠다. 단, 스프링 부트를 사용하며 정리할 것인데, 스프링 부트는 스프링 프레임워크의 사용과 관.. Spring/SpringCore - basic 2024. 11. 4. 이전 1 2 다음