전체 글 154

한가지 Pointcut으로 여러 Aspect를 사용하기, 프록시 적용순서. 2021-06-09

우린 앞전에 @Pointcut 설정을 하면서, excution 명시자에 대해서 쓴 적이 있다. 간단히 설명하자면, excution 명시자는 Adivce를 적용할 메서드를 지정할때 사용한다. 간단히 말해서 Pointcut은 "where" 이고, Advice는 "when"이다. 그런데 Advice를 Aspect의 실질적인 적용이라 해도 무방하다. 이유는 애초에 @Around 가 붙은 메서드에서 공통의 기능을 실행하고, 대상객체의 메서드도 호출하여서, 앞/뒤, 익셉션 유무등에 따라 코드를 짤수 있기 때문이다. 즉, Advice의 적용은 Aspect 의 적용이다. @Around 애너테이션에 공통의 기능과 "when" 그것을 실행할지 구현하기 때문이다. 그래서 Pointcut이 정하는 범위는 그냥 Advice의 ..

스프링의 프록시 생성방식과 적용 실제 main 함수 사례. 2021-06-08

우선 이전 포스트의 빈 설정 클래스를 보자. @Configuration @EnableAspectJAutoProxy public class Appctx { @Bean public ExeTimeAspect exeTimeAspect() { return new ExeTimeAspect(); } @Bean public Calculator calculator() { return new RecCalculator(); } } 이렇게 빈 객체 설정을 완료한 후, 대상객체를 calculator(), 프록시를 exeTimeAspect()로 하는 스프링 AOP를 실제로 main 메서드에 적용해서 함수의 작동시간을 알아보는 코드를 보자. public class MainAspect { public static void main(..

스프링 AOP의 기본 개념: Advice, joinpoint,Pointcut,Aspect 2021-06-07

우선 이전 포스트에서 AOP(Aspect oriented programing)이란 공통의 기능과 핵심기능의 분리를 통해 재사용성을 높여주는 프로그래밍 기법이라고 설명하였고, 스프링은 AOP를 프록시를 통해 구현한다고 설명하였다. 일반적인 AOP구현 방식은 총 3가지 방법이 있다. 1.컴파일 시점에 공통의 기능을 구현한 코드를 넣어준다. 2.클래스 로딩 시점에 바이트 코드에 공통의 기능을 구현한 코드를 넣어준다. 3.런타임 중 프록시 객체를 생성해서 공통의 기능을 삽입한다. 이 3가지 방법중 스프링에서 사용하는 방식은 3번이다. 스프링 AOP는 프록시 객체를 자동으로 만들어서 필요한 시점(PointCut)에 실행해준다. 그래서 공통기능을 구현한 클래스만 알맞게 구현하면 된다. 우선 스프링의 AOP의 용어들..

프록시와 AOP 프로그래밍 [최범균 스프링 5] 2021-06-04

우선 스프링 공식 래퍼런스에는, AOP를 설명하기 위해 '프록시'라는 단어를 사용하고 있다. 프록시란, 간단히 추상적으로 설명하자면, 핵심기능을 제외한 공동의 기능을 한데 묶어서 코드의 변경 없이 사용할수 있도록 만든 클래스이다. 이런 말로하면 이해가 잘 되지 않을테니, 코드로서 설명하겠다. 우선, 정수 num이 주어졌을때, num의 팩토리얼을 를 구하는 기능을 가진 클래스를 2개 만들어 보자. 그런데 다형성을 사용하여 프록시를 통한 공통의 기능을 구현해야 하니, Calculator라는 인터페이스를 만들어서 상속시키자. public interface Calculator { public long factorial(long num); } 다형성 사용을 위해서 인터페이스를 만들어줌. public class I..

빈 라이프사이클과 범위,[최범균 스프링5] 2021-06-03

우선 자바 빈은 AnnotationConfigApplicatonContext 클래스로 대표되는 스프링 컨테이너에 등록되고, 사라지는데 특정한 주기를 갖는다. 쉽게 설명하자면, 객체생성->의존설정->초기화->소멸 인데, 각 단계별로 설명하자면, 1. 객체생성: AnnotationConfigApplicationContext 의 생성자로, 자바 설정클래스가 들어갔을때, 설정클래스에 구현된 자바빈 들의 객체를 생성하고 컨테이너에 등록한다. 2.객체를 생성해서 컨테이너에 등록하는 과정에서 만약 @Autowired에 의한 자동의존 주입이 필요하다면, 기존에 등록된 자바빈 객체들중 해당 타입과 같은 빈을 주입한다. 여기까지는 앞서 포스트에서 설명했고, 우리도 다 알고 있는 내용이다. 그러나 다음 두 내용은 새로운 내..

빈 객체 등록의 자동화: 컴포넌트 스캔( @Autowired 과는 별개의 개념임. 혼동X) 2021-06-02

우선적으로 내가 헷갈린 부분은 컴포넌트 스캔이 마치 @Autowired의 대체재같은 느낌을 받은 것이다. 무언가 자동화...주입..스프링 이런 말을 보고 내가 오해한 것 같다. 하지만 확실하게 구별해야 한다. @Component : 자바 빈 객체를 @Configuration에서 @Bean 이렇게 설정메서드를 통한 수동 등록이 아닌, 스프링이 편하게 @ComponentScan 애너테이션을 통해 자바 빈에 등록해줄 클래스를 지정하는 애너테이션. @Autowired: 이미 등록된 자바 빈 객체를 의존주입을 위해 기존에는 세터나, 생성자 주입방식으로 DI를 했다면, 이젠 스프링에서 @Autowired가 붙여진 클래스와 같은 타입의 빈 객체를 찾아서 DI 해주기 위해 필드나, 메서드 앞에 붙이는 애너테이션. 요약..

자동의존의 대상이 되는 클래스가 자손클래스일때, @Autowired 사용시 에러 처리법. 2021-06-01

우선 만약 이전 포스트에서는 @Autowired를 붙여서 자동의존주입을 하고자 하는 클래스의 타입이 빈 객체에 등록된 타입을 스프링이 탐색했을때, 1개로 특정지어지지 않을 경우 스프링은 에러를 낸다고 배웠다. 이번엔 쫌 다른 경우인데, 만약 스프링 빈에 등록할 객체가 이미 등록되어있는 빈 객체를 상속받은 클래스타입이라면 어떻게 될까? 예를 들어보자. public class MemberSummaryPrinter extends MemberPrinter { @Override public void print(Member member) { System.out.printf( "회원 정보: 이메일=%s, 이름=%s\n", member.getEmail(), member.getName()); } } 만약 이렇게 이미 빈..

스프링 의존 자동 주입 @Autowired와 @Qualifier, 2021-05-31

이전 포스트에서 설정클래스의 의존이 필요한 필드에 @Autowired 애너테이션을 붙이면 스프링에서 @Autowired 가 붙여진 클래스와 타입이 같은 빈 객체를 찾아서 필드에 할당한다. 오늘 공부한 부분은 이 @Autowired를 위치시킬수 있는 곳이다. 1. 필드 우선 가장 기본적인 형태로 의존이 필요한 클래스에서 의존의 대상이 되는 클래스의 참조변수에다가(인스턴스변수) @Autowired를 붙이는 것이다. public class ChangePasswordService { @Autowired private MemberDao memberDao; public void changePassword(String email, String oldPwd, String newPwd) { Member member = ..

DI의 두가지 방식: 생성자 방식, 세터 메서드 방식, @Configuration 설정클래스의 @Bean 설정은 항상 스프링에서 싱글톤객체로 등록함. [최범균 스프링 5] 2021-05-29

우선 빈 객체를 등록할때 설정클래스에서(@Configuration) 어떤 빈 객체의 의존 주입하는 방식은 2가지가 있다. 1.첫번째는, 앞 포스트에서 설명했던 것 처럼 생성자의 파라미터로 의존의 대상이되는 객체를 넣어주는 것이다.[ 실제@Configuration 클래스에서는 객체설정메서드(@Bean) 를 파라미터로 넘겨줌] 장점: 빈 객체를 설정할때 이미 그 클래스가 의존하는 모든 객체를 주입받기 때문에, 완벽한 상태(그 클래스가 의존하는 모든 클래스의 메서드 들을 사용가능) 에서 빈 객체를 사용 가능하다. 단점: 생성자의 파라미터 개수가 많을 경우, 어떤 객체가 들어가야할지 모를 수 있어서 생성자 코드를 직접 확인해 봐야한다....라고 책에서 주장하는데 나는 그렇게 생각하지 않는다.IntelliJ는 애..

스프링의 근원적 역할= 객체조립기, [최범균 스프링5 책] 2021-05-28

이전 포스트 들에서 DI와 의존주입하는 방법을 객체조립기에 대한 내용으로 설명했다. 그런데 난 이런 의문이 들었다. 이 책은 스프링에 대한 본격적인 기능을 바로 설명해주지 않고, DI, 객체조립기 같은 것을 알려주지? 이번 장을 공부하면서 바로 이유를 알게 되었다. 바로 스프링의 툴의 기능이 DI를 지원하는 객체 조립기 이기 때문이다. 즉, 앞선 포스트에서 자바 코드를 통해 구현한, Assembler클래스를 스프링의 힘을 빌리면 훨씬 더 표준적으로 구성할 수있어서, 유지보수성이 뛰어나다. 차이를 비교해 보기 바란다. 1. 일반 자바코드로 작성한 객체조립기. import spring.ChangePasswordService; import spring.MemberDao; import spring.MemberR..