CSE(58)
-
[자바 객체 지향] 스프링이 사랑한 디자인 패턴 1
- 디자인 패턴은 객체 지향의 특성 중 상속, 인터페이스, 합성 (객체를 속성으로 사용)을 이용한다. 1. 어댑터 패턴(Adpater Pattern) - 어댑터 (Adapter) : 변환기. 즉, 서로 다른 인터페이스 사이에 통신이 가능하게 하는 것이다. - 어댑터 패턴은 개방 폐쇄 원칙을 활용한 설계 패턴이라고 할 수 있다. (1) ServiceA.java public class ServiceA { void runServiceA(){ System.out.println("ServiceA"); } } (2) ServiceB.java public class ServiceB { void runServiceB(){ System.out.println("ServiceB"); } } (3) AdapterService..
2021.08.16 -
[Spring5입문] 프록시 생성 방식
- 스프링은 AOP를 위한 프록시 객체를 생성할 때, 실제 생성할 빈 객체가 인터페이스를 상속하면 인터페이스를 이용해서 프록시를 생성한다. => 따라서 아래 코드처럼 빈의 실제 타입이 RecCalculator라고 하더라도, 빈 객체는 Calculator 인터페이스를 상속받은 프록시 타입이 된다. //설정 클래스 @Bean public Calculator calculator(){ return new RecCalculator(); } //자바 코드 RecCalculator cal = ctx.getBean("calculator", RecCalculator.class); //calculator 빈의 실제 타입은 Calculator을 상속한 프록시 타입이므로 //RecCalculator로 타입 변환을 할 수 없기..
2021.08.11 -
[Spring5입문] 스프링 AOP
- 스프링 AOP를 이용하는 방법은 다음과 같다. Aspect로 사용할 클래스에 @Aspect 애노테이션을 붙인다. @Pointcut 애노테이션으로 공통 기능을 적용할 Pointcut을 정의한다. 공통 기능을 구현한 메서드에 @Around 애노테이션을 적용한다. - 개발자는 공통 기능을 제공하는 Aspect 구현 클래스를 만들고 자바 설정을 이용해서 Aspect를 어디에 적용할지 설정하면 된다. - 프록시는 스프링 프레임워크가 알아서 만들어준다. @Aspect public class ExeTimeAspect { //@Pointcut은 공통 기능을 적용할 대상을 설정한다. @Pointcut("execution(public * chap07..*(..))") private void publicTarget(){..
2021.08.11 -
[자바 객체 지향] 객체 지향 설계 5원칙 : ISP, DIP
1. ISP - 인터페이스 분리 원칙 => 다음과 같이 인터페이스로 역할에 따라 인터페이스로 나누는 것 - SRP와 ISP는 같은 문제에 대한 두 가지 다른 해결책이다. => 하지만 특별한 경우가 아니라면 단일 책임 원칙을 적용하는 것이 더 좋은 해결책이다. - 인터페이스 최소주의 원칙 : 인터페이스를 통해 메서드를 외부에 제공할 때는 최소한의 메서드만 제공하라는 것 => 상속의 혜택을 제대로 누리기 위해, 상위 클래스는 풍성할수록 좋고, 인터페이스는 작을수록 좋다. 2. DIP - 의존 역전 원칙 - 위와 같이 자동차와 스노우타이어 사이에 의존관계가 있다고 하자. => 하지만 자동차의 수명이 스노우타이어의 수명보다 길고, 이 경우, 자동차의 타이어를 일반 타이어로 교체할 때, 문제가 생긴다. => 따라..
2021.08.09 -
[Spring5입문] AOP 프로그래밍 기초
1. 프록시와 AOP - RecCalculator 클래스 : Calculator 인터페이스를 상속하고 팩토리얼 메소드를 재귀 방법으로 오버라이딩 한 클래스 - ImpeCalculator 클래스 : Calculator 인터페이스를 상속하고 팩토리얼 메소드를 for 문을 통해 오버라이딩 한 클래스 => 이 두 클래스의 수정 없이, 코드 중복도 없이, 팩토리얼 메소드의 실행 시간을 구하려면? public class ExeTimeCalculator implements Calculator{ private Calculator delegate; public ExeTimeCalculator(Calculator delegate){ this.delegate = delegate; } @Override public long ..
2021.08.09 -
[Spring5입문] 빈 라이프사이클과 범위
1. 컨테이너 초기화와 종료 - 스프링 컨테이너는 초기화와 종료라는 라이프사이클을 갖는다. public class Example{ public static void main(String[] args){ //1. 컨테이너 초기화 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class); //2. 컨테이너에서 빈 객체를 구해서 사용 Greeter g = ctx.getBean("greater", Greeter.class); String.msg = g.greet("스프링"); System.out.println(msg); //3.컨테이너 종료 ctx.close(); } } (1) 컨테이너 초기화 ..
2021.08.09