Dev 91

Spring 의 AOP - 공통 소스 파일을 분리하여 관리할 수 있는 방법

java OOP 관련 게시글을 작성하다가 Spring POJO 에서 필수적으로 알아야 하는 AOP/IoC/DI/PSA에 대해 정리한 글을 공유하면 좋을 것 같아 글을 남겨 본다.  그중에서도 이번 게시글은 AOP에 관련된 내용이다.  2024.05.01 - [개발/java] - Garbage Collection과 JVM 메모리 구조 ( OOP를 제대로 알기 ) Garbage Collection 과JVM 메모리 구조 ( OOP를 제대로 알기 )자바를 사용해서 프로그램 코드를 작성하다 보면 간혹 코드 내용에는 문제가 없는 것 같은데 의도와 다르게 실행될 때가 있다. 경험상 이것은 변수가 JVM에서 어떻게 적재되고 읽히는지 제대로zigo-autumn.tistory.com  AOP 란? AOP는 Aspect O..

Dev/Springboot 2024.05.06

Garbage Collector 과JVM 메모리 구조 ( OOP를 제대로 알기 )

자바를 사용해서 프로그램 코드를 작성하다 보면 간혹 코드 내용에는 문제가 없는 것 같은데 의도와 다르게 실행될 때가 있다. 경험상 이것은 변수가 JVM에서 어떻게 적재되고 읽히는지 제대로 알지 못하고 작성한 경우가 많았다. 가장 기초적이지만, 실무를 하다보면 나도 모르게 놓칠 수 있는 JVM 구조의 기초와 OOP에 대한 개념을 정리하고자 한다. OOP 란 ? ( cf. OOPS )객체지향의 기본 개념은 '실제 세계는 사물로 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용이다'라는 것이다.실제 사물의 속성과 기능을 분석한 다음, 데이터와 함수로 정의함으로써 데이터와 실제 세계를 컴퓨터 속에 옮겨 놓은 것과 같은 가상 세계를 구현하고 이 가상세계에서 모의실험을 함으로써 많은 시간과 비용을 절약할..

Dev/Java 2024.05.01

직렬화(Serialization) - 객체를 주고 받는 방법

예제 소스 링크 직렬화란? 객체를 데이터 스트림으로 만드는 것을 뜻한다. 다시 얘기하면 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터로 변환하는 것을 의미한다. 반대로 스트림으로부터 데이터를 읽어와서 객체를 만드는 것을 역직렬화(deserialization)라고 한다. 객체는 클래스에 정의된 인스턴스변수의 집합이다. 객체에는 클래스변수나 메서드가 포함되지 않는다. 객체는 오직 인스턴스변수들로 구성되어 있다. 인스턴스변수는 인스턴스마다 다른 값을 가질 수 있어야하기 때문에 별도의 메모리 공간이 필요하지만, 메서드는 변하는 것이 아니라서 메모리를 낭비해 가면서 인스턴스마다 같은 내용의 코드(메서드)를 포함시킬 이유는 없다. 그래서 객체를 저장한다는 것은 바로 객체의 모든 인스턴스변수의 값을 저장..

Dev/Java 2024.04.15

Thread 를 알아보자 - Synchronized, Lock과 Condition, volatile (3/3)

예제 소스 링크 스레드의 동기화란? 멀티스레드 프로세스의 경우 여러 스레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게 된다. 따라서 한 스레드가 특정 작업을 끝마치기 전까지 다른 스레드에 의해 방해받지 않도록 하는 것이 필요하다. 그래서 도입된 개념이 바로 임계영역과 잠금이다. 공유 데이터를 사용하는 영역을 임계영역으로 지정하고, 공유데이터가 가지고 있는 lock을 획득한 단 하나의 쓰레드만 이 영역 내의 코드를 수행할 수 있게 한다. 이렇게 한 스레드가 진행 중인 작업을 다른 스레드가 간섭하지 못하도록 막는 것이 쓰레드의 동기화, synchronization이라고 한다. 임계 영역은 락을 얻은 단 하나의 쓰레드만 출입이 가능하며, 객체 한개에 하나의 락이 할당된다...

Dev/Java 2024.04.15

Thread 를 알아보자 - mulit vs single, PrioirtyQueue, ThreadGroup, 실행제어( 2 / 3 )

예제 소스 링크 언제 싱글쓰레드가 멀티쓰레드보다 효율적일까? 이전 게시글에도 적었지만, 프로세스는 하나또는 그 이상의 쓰레드를 가질수 있으며 하나의 쓰레드는 하나의 코어에 의해 실행 된다. 어떤 작업을 하나의 쓰레드가 처리하는 것을 싱글 쓰레드, 여러개의 쓰레드가 처리하는 것을 멀티 쓰레드라고 한다. 하나의 일을 여러명이 나누어서 하면 빨리 끝나듯 쓰레드도 여러개면 작업이 빠르게 진행 될 것 같지만 그렇지는 않다. 그 이유는 작업 전환 시간(context switcing)에 시간이 걸리기 때문이다. 작업 전환 시간(context swtiching) 프로세스 또는 쓰레드 간의 작업 전환을 의미한다. 작업 전환을 할 때 현재 진행 중인 작업의 상태나 다음에 실행해야할 위치 같은 정보를 저장하고 읽어오는 시간..

Dev/Java 2024.04.01

Springboot + ElasticSearch 연동하기 ( feat. RDBMS 에서 Like 를 사용할 때 보다 검색 속도가 얼마나 향상 될까? )

이전 포스팅은 여기로 2024.03.13 - [개발/ELK] - MacOS 에서 ElasticSearch 설치하기 ( homebrew 사용 X ) MacOS 에서 ElasticSearch 설치하기 ( homebrew 사용 X ) Open API 통해서 데이터를 긁어온 뒤 검색 엔진에 ElasticSearch를 연동하는 토이 프로젝트를 해보고 싶어서 사용 방법을 익히기 위해 설치를 진행했다. 새로운 내용을 학습할 때 인프런을 통해 많이 zigo-autumn.tistory.com 개발환경 IDE : intelliJ FrameWork : springboot 3.2.3 Launguage java 17 DB : h2 ElasticSearch : 8.7.1 BuildTool: Gradle Plugin: spring..

Dev/ELK 2024.03.26

Thread 를 알아보자 - 프로세스와 쓰레드, 태스킹과 쓰레딩, start() vs run() ( 1 / 3 )

예제 소스 링크 프로세스와 스레드 프로세스 프로세스는 간단히 말해서 실행 중인 프로그램을 나타낸다. 프로그램을 실행하면, OS로부터 실행에 필요한 자원을 할당받아 프로세스가 된다. 프로세스는 데이터와 메모리등의 자원, 그리고 스레드로 구성되어 있다. 스레드 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 스레드이다. 그래서 모든 프로그램에는 최소한 하나 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스를 '멀티 쓰레드 프로세스'라고 한다. 쉽게 말하면 프로세스는 회사, 스레드는 직원이라고 생각하면 된다. 하나의 프로세스가 가질 수 있는 쓰레드는 제한되어 있지 않지만 스레드가 작업을 수행하는데 개별적인 메모리공간(호출스택)을 필요로 하기 때문에 프로세스의 메모리 한계에 따라 생성할 ..

Dev/Java 2024.03.25

열거형(enums) - 열거형을 통해 사용할 수 있는 방법들

열거형은 열거형이 갖는 값뿐만 아니라 타입까지 관리하기 때문에 보다 논리적인 오류를 줄일 수 있다. 일반적으로 타입이 달라도 값이 같으면 조건식 결과가 true였으나, 자바의 열거형에서는 실제 값이 달라도 타입이 다르면 조건식의 결과가 false 가 된다. // 열거형을 쓰기전 class Card { static final int CLOVER = 0; static final int HEART 1; static final int DIAMOND =2; static final int SPADE = 3; static final int TWO = 0; static final int THREE = 1; static final int FOUR = 2; final int kind; final int num; } // ..

Dev/Java 2024.03.25

지네릭스(Generics) - 지네릭스를 알면 API 문서를 읽기 쉽다!

예제 소스 링크 지네릭스를 왜 사용해야 할까? 지네릭스는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입을 체크해 주는 기능이다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여준다. 즉, 지네릭스를 사용하면 타입의 안정성을 제공받을 수 있고, 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해진다. T(Type), E(Element), K(Key), V(Value)가 의미하는 것은 무엇일까? 이들은 기호의 종류만 다를 뿐 '임의의 참조형 타입'을 의미한다. 기존에는 다양한 종류의 타입을 다루는 메서드의 매개변수나 리턴타입으로 Object 타입의 참조변수를 많이 사용했고, 그로 인해 형변환이 불가피했지만 지네릭을 사용하면 Obje..

Dev/Java 2024.03.25

Comparator 와 Comparable 의 차이 - 객체 내부 비교와 외부 비교 관점

예제 소스 링크 Comparator와 Comparable 이란 뭘까? 둘 다 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다. Comparable Comparable 을 구현하고 있는 클래스들은 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들을 의미하며 주로 Integer와 같은 wrapper 클래스와 String, Date, File과 같은 것들을 말한다. 기본적으로 오름차순으로 구현되어 있다. 아래 소스는 실제로 java.lang 라이브러리에 있는 Integer, String 같은 클래스를 확인해본 것이다. 각각 기준에 맞게 Comparable interface를 구현해서 사용하고 있다. // Integer public final class Integer extends Numbe..

Dev/Java 2024.03.25