어느새 시간이 흘러 벌써 4월 4주째를 넘어 5주차에 들어섰다. 시간이 참 빠른 것 같다. 꾸준한 학습을 더불어서 또 짧으면 짧지만 긴 2주동안 많은 일들이 있었다. 우선 저번주 토요일에는 팀 네이버 공채 코딩테스트를 봤다. 좋은 성적은 아니였지만 정말 뿌듯했던 부분은 내가 성장했다는 부분을 크게 느낄 수 있었다. 처음 시작하자마자 문제들을 빠르게 훑어봤는데, 2시간이라는 시간 안에서 각 문제들을 어떻게 풀어나가야겠다 라는 방향성을 문제당 2 ~ 3 분 안에 빠르게 파악할 수 있었던 부분이다. 그로 인해서 문제를 푸는 순서도 적절하게 정할 수 있었던 것 같다. 이전에 봤던 코딩테스트 경험 중에서 몇 문제는 아예 무슨 알고리즘을 이용해서 문제를 풀어야 되는지 이해조차 못했던 것에 비해서 분명 많은 부분이 ..
빈 후처리기라고 얘기를 하면 먼저 떠오르는 것은 @PostConstruct가 떠오를 것이다. 빈을 초기화하는데에 있어서, 초기화 이후 어떠한 작업을 추가해서 하기 위한 애노테이션인데 이 또한 빈 후처리기에 속한다. 오늘은 스프링의 빈 후처리기가 무엇인지 살펴보자. Bean PostProcessor(빈 후처리기) 빈 후처리기란 빈 저장소에 사용될 목적으로 생성할 객체를 빈 저장소에 등록되기 직전에 조작하는 것이다. 따라서, 빈 객체가 스프링 컨테이너에 등록되기 전에 저장 될 객체를 다른 객체로 바꾼다거나, 프록시를 적용한다거나 여러가지가 가능하다. 빈 후처리기 적용 과정 빈 후처리기의 적용 과정은 크게 4가지로 구분 할 수 있다. 1. 생성 : 스프링 빈 대상이 되는 객체를 생성한다. 2. 전달 : 생성된..
일단 컴퓨터를 조작하는 것이 추상화를 구축하고, 조작하고, 추론하는 것에 관한 모든 것이라는 것을 깨닫고 나면 훌륭한 컴퓨터 프로그램을 작성하기 위한 중요한 전제 조건은 추상화를 정확하게 다루는 능력이라는 것이 명확해진다. - 키스 데블린(Keith Devlin) - 이전에 현실에 존재하는 객체들의 특징을 간추리고 요약해서 소프트웨어 객체로 추상화 할 수 있는 능력이 중요하다는 생각이 잘 못 자리잡게 된 것이라는 저자의 말을 볼 수 있었다. 결국 이 인용을 통해 분명한 저자의 의도를 알 수 있다. 현실에 존재하는 객체들의 특징을 추상화 하는 것이 아닌, 컴퓨터 소프트웨어 세계에서 하나의 객체를 창조해서 그 객체를 의인화하여 추상화하는 능력 이를 강조하는 것이라고 생각한다. 예시로 지하철 노선도가 나오는데..
객체지향 패러다임은 지식을 추상화하고 추상화한 지식을 객체 안에 캡슐화함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다. 객체를 발견하고 창조하는 것은 지식과 행동을 구조화하는 문제다. - 레베카 워프스브록(Rebecca wirts-Brock)- 이번 장에서는 객체를 상태와 행동으로 구분함으로써 은유를 이용해 객체를 의인화함으로써 객체를 쳐다보는 관점에 대한 이야기가 주를 이루고 있다. 처음에는 아기가 가림막에 가려진 막대기를 바라보는 관점의 예시로 시작한다. 가림막 뒤에 막대기가 위 아래로 2부분이 보일 때, 대부분의 사람이라면 긴 막대기 1개가 뒤에 있구나. 라고 생각하는 것이 일반적이다. 하지만, 가림막 뒤에 있던 막대기가 알고보니 2개였다면? 당황스러울 것이다. 나 또한 읽으면서 그랬을 것 ..
Toy 프로젝트의 테스트를 진행하려고 하는데 다음과 같은 오류가 발생했다. 무엇때문인가... 해서 해결방법을 찾아보니 제일 먼저 볼 수 있는 것은 build 에서 test build 옵션을 바꿔주는 것이었다. 하지만 이는 뭔가가 깨름칙했다. 야매로 해결한 기분이랄까... 이어서 찾아보니 여러가지 이유를 찾을 수 있었다. 1. Junit4 에서 Junit5로 넘어오면서 org.Junit.Test 이 아닌 org.Junit.Test.api.Test 를 사용해야 한다. 2. Junit4 에서 Junit5로 넘어오면서 test { useJUnitPlatform() } 를 build.gradle 에 입력해야 한다는 것이었다. 하지만 현재 Spring 2.7.2, Intellij IDEA 2022.3 에서는 제대로..
JVM의 Execution 영역에 있는 가비지 콜렉터와 가비지 콜렉션에 대해서 알아보자. C나 C++을 해본 사람들은 다음과 같은 명령어가 낯이 익을 것이다. ~(), mallac(), free() 이 들은 모두 프로그래머가 직접 메모리를 할당해주거나 해제하는 역할을 하는 메서드이다. 하지만 자바는 이와 달리 프로그래머가 직접 메모리를 할당 해제해주는 것이 아닌 GC(Garbage Collector)가 메모리를 자동으로 할당하거나 해제해주는 작업을 해준다. C나 C++ 처럼 어떠한 가비지 콜렉터가 없이 프로그래머가 직접 메모리를 관리를 해줘야 하는 언어를 비관리형 언어(Unmanaged Language) Java, GO, C#, Python 같이 가비지 콜렉터가 직접 메모리를 관리해주는 언어를 관리형 언..
JVM JVM은 Java Virtual Machine의 약자이다. 직역하면 자바를 실행하기 위한 가상 기계라는 뜻인데, 실제로 그 의미와 크게 다르지 않다. 우선 JAVA의 가장 큰 특징은 OS에 종속적이지 않다는 것이다. OS별로 각기 다르게 동작할 수 있는데, OS 종속되지 않는 다는 말은 OS위에 어떤 프로그램을 이용해 실행이 가능하다는 것이다. 즉, JVM이란 OS에 종속받지 않고 CPU가 JAVA를 인식하거나 실행할 수 있게 해주는 가상 머신이다. JAVA 컴파일러 Java가 컴파일되는 과정을 이해하기 전에 컴퓨터가 명령어를 인식하는 과정부터 이해를 해야한다. 컴퓨터는 0과 1밖에 이해하지 못한다. 즉, 이러한 컴퓨터가 이해할 수 있는 명령어를 저급언어(Low-level Language)라고 부..
기존 데코레이터 패턴과 프록시 패턴의 문제 JDK 동적 프록시와 CGLIB 둘 다 데코레이터 패턴 혹은 프록시 패턴을 사용하는데 있어서 동적으로 수행해주는 도구입니다. 기존에 데코레이터 패턴과 프록시 패턴의 가장 큰 문제는 해당 패턴을 적용하기 위해서는 해당 패턴이 사용되어야 할 코드를 재사용하지 않고, 또 해당 템플릿을 사용하기 위해 패턴을 사용해야 할 클래스들을 생성해주어야 한다는 큰 문제가 있었습니다. 예를 들어서, 해당 패턴을 적용할 클래스가 100개라면 패턴을 적용하기 위한 클래스를 100개를 만들어주어야 한다는 것이지요. 만약 프록시 체인으로 구성되어 있다면, 200개, 300개 몇 개 까지 늘어날 지 알 수가 없습니다. 이를 해결하기 위해서 자바에서 제공해주는 JDK 동적 프록시와 외부 라이..