스프링은 자바 언어 기반의 프레임워크. 객체지향 언어가 가진 강력한 특징을 살려내는 프레임워크. 좋은 객체지향 애플리케이션 개발을 도움.
DI(Dependency Injection), 의존성 주입?
자동 주입 기능을 사용하면 Spring이 알아서 의존 객체를 찾아서 주입한다.의존을 주입할 대상에 @Autowired 애노테이션을 붙이기만 하면 된다.@Autowird를 붙이면 설정 클래스에서 의존을 주입하지 않아도 된다. 필드에 이 애노테이션이 붙어 있으면 스프링이
ApplicationContext를 스프링 컨테이너라고 하며 이는 인터페이스이다.스프링 컨테이너는 XML을 기반으로도, 애노테이션 기반의 자바 설정 클래스로도 만들 수 있다.📌 참고더 정확히는 스프링 컨테이너를 부를 때 BeanFactory, ApplicationCo
스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다. 대부분의 스프링 애플리케이션은 웹 애플리케이션이고 이는 보통 여러 고객이 동시에 요청을 한다. AppConfig.class 코드 쪽에서 이런 동시 요청에 대한 고려가 필요한 시기이다.스프링 없는 순수
이전까지 학습을 진행하며 작성한 코드들에선 스프링 빈을 등록하기 위해 자바코드의 @Bean이나 XML의 <bean> 등을 통해 설정 정보에 직접 등록할 스프링 빈을 나열했다. 예제에선 몇 개 안됐지만, 등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기
의존관계 주입은 크게 4가지 방법이 있다. 생성자 주입, 수정자 주입(setter 주입), 필드 주입, 일반 메서드 주입
데이터베이스 커넥션 풀이나, 네트워크 소켓 연결 등 스프링 프로젝트가 시작될 때 필요한 연결을 미리 해두고, 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요하다.
스프링 빈(Bean): 스프링 컨테이너에서 관리하는 자바 객체. 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때까지 유지된다. 스코프: 빈이 존재할 수 있는 범위 스프링 빈은 기본적으로 싱글톤 스코프로 생성되기 때문에 스프링 컨테이너
싱글톤으로 등록된 스프링 빈은 해당 객체의 인스턴스가 애플리케이션에 딱 1개만 존재한다. 이러한 인스턴스에 여러 쓰레드가 동시에 접근하면 문제가 발생한다. 이러한 문제를 동시성 문제라 한다.
"작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있습니다." [GoF의 디자인 패턴 中]
"동일 계열의 알고리즘군을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만들자. 전략을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다." [GoF의 디자인 패턴 中]
전략 패턴을 학습할 때 보았던 것 처럼, 애플리케이션 의존 관계를 설정하듯 선 조립, 후 실행을 원하는 것이 아니다. 변하는 부분과 변하지 않는 부분을 분리하는 것이 목표이고 이를 위해 코드를 실행할 때 변하지 않는 템플릿이 있고, 그 템플릿 안에서 원하는 부분만 살짝
GoF 디자인 패턴에선 프록시를 사용하는 패턴인 프록시 패턴과 데코레이터 패턴을 의도에 따라 구분한다. 프록시 패턴: 접근 제어가 목적 데코레이터 패턴: 새로운 기능 추가가 목적 둘 다 프록시를 사용하지만, 의도가 다르다는 점이 핵심이다.
이전 포스팅에 정리했던 프록시 패턴을 실제 로그 추적기에 적용해보려 한다.
프록시를 사용해서 기존 코드를 변경하지 않고, 로그 추적기라는 부가 기능을 적용할 수 있었다. 문제는 대상 클래스 수 만큼 로그 추적을 위한 프록시 클래스를 만들어야 한다는 점이다.
인터페이스가 있는 경우 JDK 동적 프록시를 적용하고, 그렇지 않은 경우 CGLIB를 적용하려면 어떻게 해야할까? > 스프링은 유사한 구체적인 기술들이 있을 때, 그것들을 통합해서 일관성 있게 접근할 수 있고, 더욱 편리하게 사용할 수 있는 추상화
포인트컷(PointCut): 어디에 부가 기능을 적용할지, 어디에 부가 기능을 적용하지 않을지 판단하는 필터링 로직이다. 주로 클래스와 메서드 이름으로 필터링한다. 어떤 포인트(Point)에 기능을 적용할지 하지 않을지 잘라서(cut)