자바

Language

gradle build vs Intellij IDEA build

개발바닥 오픈채팅방에서 호돌님이 인프런에서 질문자의 문제를 해결하는 과정에 있어서 Build Tools를 Gradle로 설정해야만 오류가 발생하지 않고 Intellij로 설정하면 오류가 발생한다는 원인을 발견하였다. 평상시에도 빌드의 속도를 높이기 위해서 Intellij IDEA를 사용한다던가 혹은 TEST 코드에서 @Slf4j가 제대로 동작하지 않을 때, Intellij IDEA로 변경하면 해결이 된다는 해결책들도 더러 있었지만 도대체 둘의 차이가 무엇인지 궁금해하다가 이젠 더이상 참을 수가 없었다. 둘의 차이가 무엇인지 알아봤다. Intellij IDEA build를 사용하다가 발생한 에러에 대해서 정리해놓은 포스팅을 찾아 볼 수 있었다. 해당 포스팅의 오류 상황은 다음과 같다.기존의 프로젝트에서 D..

Backend/Spring

Spring AOP

Aspect의 등장 이유 스프링 AOP는 부가 기능 추가시 횡단 관심사로 인한 문제 때문에 등장하게 되었다. 만약 횡단 관심사를 객체 지향적으로 해결하기 위해서는 많은 문제들이 발생한다. 부가 기능을 적용할 때, 부가 기능을 적용하기 위한 코드를 작성해주어야 한다.(템플릿 적용 전) 부가 기능이 여러곳에 퍼져서 중복 코드를 만들어 낸다. (적용 이후에도 동일) 부가기능 변경 시 많은 부분을 수정해야 한다. (제대로 된 캡슐화가 되지 않음) 부가기능 적용대상 변경 시 많은 수정이 필요하다. (적용하지 않을 대상들을 직접 찾아야 함.) 이러한 문제점을 해결하기 위해 핵심 로직과 부가 기능 로직을 나누고, 부가 기능을 어디에 적용하고 어떤 부가 기능을 적용할 지 선택하는 기능을 합한 하나의 모듈로서 등장한 것..

Backend/JPA

영속성 컨텍스트

영속성 컨텍스트란? 영속성 컨텍스트란 엔티티를 영구 저장하는 환경을 의미하고, 애플리케이션과 DB 사이에서 캐시를 이용해 데이터를 보관하는 역할을 한다. 이때 영속성 컨텍스트는 엔티티 매니저를 통해서만 접근이 가능하다. 영속성 컨텍스트에 데이터를 저장하기 위해서는 다음과 같이 저장할 수 있다. EntityManager em = emf.createEntityManager(); em.persist(entity); 영속성 컨텍스트는 환경에 따라 달리 구성될 수 있다. 스프링 같은 멀티 쓰레드 환경에서는 EntityManager : PersistenceContext 관계는 N : 1 관계이고, 단일 쓰레드 환경에서는 1 : 1 관계이다. 이어서 영속성 컨텍스트 내부에서 엔티티의 생명주기에 대해서 살펴보자. 영속..

Backend/Spring

스프링의 빈 후처리기

빈 후처리기라고 얘기를 하면 먼저 떠오르는 것은 @PostConstruct가 떠오를 것이다. 빈을 초기화하는데에 있어서, 초기화 이후 어떠한 작업을 추가해서 하기 위한 애노테이션인데 이 또한 빈 후처리기에 속한다. 오늘은 스프링의 빈 후처리기가 무엇인지 살펴보자. Bean PostProcessor(빈 후처리기) 빈 후처리기란 빈 저장소에 사용될 목적으로 생성할 객체를 빈 저장소에 등록되기 직전에 조작하는 것이다. 따라서, 빈 객체가 스프링 컨테이너에 등록되기 전에 저장 될 객체를 다른 객체로 바꾼다거나, 프록시를 적용한다거나 여러가지가 가능하다. 빈 후처리기 적용 과정 빈 후처리기의 적용 과정은 크게 4가지로 구분 할 수 있다. 1. 생성 : 스프링 빈 대상이 되는 객체를 생성한다. 2. 전달 : 생성된..

Language/Java

가비지 콜렉션(Garbage Collection)

JVM의 Execution 영역에 있는 가비지 콜렉터와 가비지 콜렉션에 대해서 알아보자. C나 C++을 해본 사람들은 다음과 같은 명령어가 낯이 익을 것이다. ~(), mallac(), free() 이 들은 모두 프로그래머가 직접 메모리를 할당해주거나 해제하는 역할을 하는 메서드이다. 하지만 자바는 이와 달리 프로그래머가 직접 메모리를 할당 해제해주는 것이 아닌 GC(Garbage Collector)가 메모리를 자동으로 할당하거나 해제해주는 작업을 해준다. C나 C++ 처럼 어떠한 가비지 콜렉터가 없이 프로그래머가 직접 메모리를 관리를 해줘야 하는 언어를 비관리형 언어(Unmanaged Language) Java, GO, C#, Python 같이 가비지 콜렉터가 직접 메모리를 관리해주는 언어를 관리형 언..

Language/Java

JVM

JVM JVM은 Java Virtual Machine의 약자이다. 직역하면 자바를 실행하기 위한 가상 기계라는 뜻인데, 실제로 그 의미와 크게 다르지 않다. 우선 JAVA의 가장 큰 특징은 OS에 종속적이지 않다는 것이다. OS별로 각기 다르게 동작할 수 있는데, OS 종속되지 않는 다는 말은 OS위에 어떤 프로그램을 이용해 실행이 가능하다는 것이다. 즉, JVM이란 OS에 종속받지 않고 CPU가 JAVA를 인식하거나 실행할 수 있게 해주는 가상 머신이다. JAVA 컴파일러 Java가 컴파일되는 과정을 이해하기 전에 컴퓨터가 명령어를 인식하는 과정부터 이해를 해야한다. 컴퓨터는 0과 1밖에 이해하지 못한다. 즉, 이러한 컴퓨터가 이해할 수 있는 명령어를 저급언어(Low-level Language)라고 부..

Backend/Spring

자바 리플렉션과 이를 이용한 JDK 동적 프록시와 CGLIB

기존 데코레이터 패턴과 프록시 패턴의 문제 JDK 동적 프록시와 CGLIB 둘 다 데코레이터 패턴 혹은 프록시 패턴을 사용하는데 있어서 동적으로 수행해주는 도구입니다. 기존에 데코레이터 패턴과 프록시 패턴의 가장 큰 문제는 해당 패턴을 적용하기 위해서는 해당 패턴이 사용되어야 할 코드를 재사용하지 않고, 또 해당 템플릿을 사용하기 위해 패턴을 사용해야 할 클래스들을 생성해주어야 한다는 큰 문제가 있었습니다. 예를 들어서, 해당 패턴을 적용할 클래스가 100개라면 패턴을 적용하기 위한 클래스를 100개를 만들어주어야 한다는 것이지요. 만약 프록시 체인으로 구성되어 있다면, 200개, 300개 몇 개 까지 늘어날 지 알 수가 없습니다. 이를 해결하기 위해서 자바에서 제공해주는 JDK 동적 프록시와 외부 라이..

Backend/Spring

스프링의 싱글톤 패턴으로 인한 동시성 문제와 그 해결

스프링의 동시성 문제와 해결 스프링은 기본적으로 빈을 등록할 때, 싱글톤 패턴으로 스프링 컨테이너에 하나의 객체만 가지고 있는 형태를 띄고 있다. 하나의 객체만을 가지고 있기 때문에, 톰캣같은 WAS는 멀티 쓰레드를 지원하기 때문에, 하나의 객체에 여러 클라이언트들이 접근을 하게 되었을 때, 데이터의 변경이 발생한다면 동시성 문제가 발생한다. 동시성 문제란 동시성 문제는 임계 영역에 각기 다른 쓰레드가 동일한 데이터에 접근하고 어떠한 쓰레드가 임계 영역의 데이터를 변경하려고 할 때 발생을 하게 되는데, 임계 영역이란 어떠한 자원을 공유할 수 있는 공간을 말한다. 따라서, 우리가 코드를 사용할 때, 임계영역이 발생할 수 있는 부분은 static 변수를 선언하거나 혹은 싱글톤 패턴으로 인해 새로운 객체의 생..

Bombo_
'자바' 태그의 글 목록