[Back-end] 9

람다식과 외부 변수 참조

모던 Practical 자바 5장 스트림 API를 읽다 흥미로운 코드를 발견했다. (설명을 위해 약간 변형했습니다.) List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); int sum = 0; intList.stream().forEach(n -> sum+=n); System.out.println("sum : " + sum); 문제가 전혀 없어보이는 코드지만, 다음과 같은 메시지와 함께 컴파일 에러가 발생한다. java: local variables referenced from a lambda expression must be final or effectively final 해석하자면 '람다식에서 참조되는 변수는 final 이어야 한다.'이다. 진짜 흥미로..

[Back-end]/[Java] 2021.12.18

[Java] 인터페이스의 문제점과 발전 방향

자바를 공부해본 경험이 있는 사람이라면 객체지향 프로그래밍에서 인터페이스가 얼마나 큰 비중을 차지하는지 알고 계실 거라 생각합니다. 이번 포스팅에서는 객체지향의 핵심 개념인 인터페이스의 문제점과 이를 해결하기 위해 자바에서 제공하는 기능에 대해 이야기해보고자 합니다. 인터페이스의 문제점 인터페이스는 동일한 목적의 동작을 수행하도록 구격을 정의하는 명세서의 역할을 하며, 이를 구현한 클래스에서는 구격에 맞춰 세부적인 동작을 작성합니다. 좀더 구체적으로 표현하면, 자바는 다형성을 사용하여 코드의 유연성을 확보하기 위해 인터페이스에서는 추상 메서드를 선언하고 implements 하는 구현체에서는 override 하여 구격에 맞춰 코드를 작성합니다. 객체지향 개발을 가능하게 해주는 인터페이스는 장점도 많았지만 ..

[Back-end]/[Java] 2021.12.18

[Spring] @Aspect

이전 포스팅에서는 스프링의 빈 후처리기인 AnnotationAwareAspectJAutoProxyCreator에 대해 알아보았습니다. [Spring] 스프링의 빈후처리기(AnnotationAwareAspectJAutoProxyCreator) 이전 프록시에서는 직접 빈 후처리기를 구현하였고 빈으로 등록되는 객체들을 프록시로 대체하는 작업을 진행해보았습니다. [Spring] 빈 후처리기(BeanPostProcessor) 이전 글에서는 프록시 팩토리의 yejun-the-developer.tistory.com 스프링 컨테이너의 빈 저장소에 실제 타깃 객체 대신 프록시를 등록하려면 대상 타깃 클래스들과 어드바이저(advisor)를 빈으로 등록하면 됩니다. 그러면 AnnotationAwareAspectJAutoPr..

[Back-end]/[Spring] 2021.12.10

[Spring] 스프링의 빈후처리기(AnnotationAwareAspectJAutoProxyCreator)

이전 프록시에서는 직접 빈 후처리기를 구현하였고 빈으로 등록되는 객체들을 프록시로 대체하는 작업을 진행해보았습니다. [Spring] 빈 후처리기(BeanPostProcessor) 이전 글에서는 프록시 팩토리의 장점과 한계점에 대해 알아보았습니다. [Spring] 프록시 팩토리(ProxyFactory) 한계점을 다시 정리해보자면 다음과 같습니다. 프록시를 적용할 스프링 빈의 갯수만큼 yejun-the-developer.tistory.com 이번 포스팅에서는 수동으로 진행한 과정을 모두 자동으로 바꿔주는 스프링과 스프링 부트의 편리한 기능에 대해 자세히 알아보겠습니다. 우선, 스프링이 제공하는 빈 후처리기를 사용하기 위해선 aop 라이브러리를 추가해야 합니다. Gradle을 사용하는 경우, build.gra..

[Back-end]/[Spring] 2021.12.07

[Spring] 빈 후처리기(BeanPostProcessor)

이전 글에서는 프록시 팩토리의 장점과 한계점에 대해 알아보았습니다. [Spring] 프록시 팩토리(ProxyFactory) 이전 포스팅에서 다이내믹 프록시의 단점을 정리하며 마무리하였습니다. [Spring] 다이내믹 프록시(DynamicProxy) (프록시에 대한 이해가 부족하신 분들은 이전 포스팅을 참고하세요!!) [Spring] 프록시 yejun-the-developer.tistory.com 한계점을 다시 정리해보자면 다음과 같습니다. 프록시를 적용할 스프링 빈의 갯수만큼 프록시를 생성하여 빈으로 등록해주어야 한다. (설정 파일이 관리가 힘들다.) 컴포넌트 스캔으로 등록된 스프링 빈에는 적용할 수 없다. 이러한 문제들을 해결하기 위해 실무에서는 빈 후처리기(BeanPostProcessor)를 사용합니..

[Back-end]/[Spring] 2021.12.05

[Spring] 다이내믹 프록시(DynamicProxy)

(프록시에 대한 이해가 부족하신 분들은 이전 포스팅을 참고하세요!!) [Spring] 프록시와 디자인패턴 프록시와 디자인 패턴 스프링의 3대 기반기술 중 AOP를 공부하던 중 관심사 분리를 위한 다이내믹 프록시와 팩토리 빈이라는 개념의 등장에 당황했습니다. 평소 객체지향과 디자인 패턴을 공부 yejun-the-developer.tistory.com 프록시를 사용하여 기존코드를 수정하지 않고, 타깃의 기능을 추가하거나 접근을 제한할 수 있었습니다. 그러나 이런 프록시에도 아직 여러 단점이 존재합니다. 프록시가 멤버변수로 타깃 오브젝트를 가지고 있기 때문에 타깃오브젝트에 종속적입니다. 똑같은 기능을 수행하는 프록시라 하더라도, 여러 타깃에 적용하려면 타깃의 갯수만큼 프록시를 생성해야합니다. 이때 프록시는 똑..

[Back-end]/[Spring] 2021.11.30

[Spring] 프록시와 디자인패턴

프록시와 디자인 패턴 스프링의 3대 기반기술 중 AOP를 공부하던 중 관심사 분리를 위한 다이내믹 프록시와 팩토리 빈이라는 개념의 등장에 당황했습니다. 평소 객체지향과 디자인 패턴을 공부할 때 프록시라는 단어를 들어본 적은 있었지만 실제 동작 원리에 대해 이해가 부족해 포스팅을 하게 되었습니다. 프록시란? 프록시(Proxy)는 대리자 라는 뜻으로, 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 역할을 합니다. 프록시는 실제 대상인 것처럼 위장함으로서 이를 사용하는 클라이언트는 구체 클래스를 알 필요가 없어집니다. 또한 프록시는 클라이언트의 요청을 받아서 원래 요청 대상에게 바로 넘겨주는 게 아닌, 다양한 부가기능을 지원할 수 있습니다. 여기서 원래 요청하려는 대상,..

[Back-end]/[Spring] 2021.11.30

[Spring] DispatcherServlet이란?

스프링 웹 MVC 프레임워크의 레퍼런스의 첫 문장은 다음과 같습니다. The Spring Web model-view-controller (MVC) framework is designed around a DispatcherServlet that dispatches requests to handlers, with configurable handler mappings, view resolution, locale and theme resolution as well as support for uploading files. 스프링 웹 MVC 프레임워크는 디스패처서블릿(DispatcherServlet)을 중심으로 설계되었다. [Spring] DispatcherServlet이란? 디스패처서블릿은 HTTP 요청들을 매핑..

[Back-end]/[Spring] 2021.09.18

[Spring Boot] @SpringBootApplication이란?

스프링부트 프로젝트를 생성하면 [projectName]Application.java에는 다음과 같이 '@SpringBootApplication'이 있는 걸 확인할 수 있습니다. 지금부터 @SpringBootApplication의 역할과 내부 구현에 대해서 알아보겠습니다. [Spring Boot] @SpringBootApplication이란? '/spring-boot-autoconfigure-2.5.4.jar/org/springframework/boot/autoconfigure/SpringBootApplication.java'에 해당 어노테이션이 다음과 같이 정의되어있습니다. 위 어노테이션의 구현을 보면 다음과 같이 3가지 어노테이션이 명시되어 있습니다. @SpringBootConfiguration @En..

[Back-end]/[Spring] 2021.09.14