전체 글 120

2024 정보보안기사 1회차 실기 후기 ( 불합격 )

하하 지옥의 4월을 끝내고 정보보안기사 후기를 들고 돌아왔다.     간단한 시험후기는 '오 욕 좀 먹더니 정신 차렸나?'로 압축할 수 있겠다. 일단 단답형에서 보기가 나왔다. 보기없이 적어야 해서 사실상 운빨게임에 가까웠던 부분이 많이 개선되었다고 느꼈다. 물론 100% 다 준건 아니고 서너 문 제정도 보기가 있어서 보기가 없었다면 못 썼을 것 같은 내용에 대해 두 개나 쓸 수 있었다. 두 번째로는 실무형이 저번시험보다 훨씬 쉬웠다. 저번에는 무슨 데몬 설정파일이랑 OS별 로그 설정파일명을 쓰는 단순암기문제가 나왔는데 이번에는 스니핑 공격기법에 대해서 나와서 쓸만했다. 간단한 후기는 이쯤 하고, 어떻게 공부했는가에 대해 알아보자  시험 준비 기간  및 공부 교재 시험공부는 알기사 2023 실기편을 참고..

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

정보보안기사 - 01. 시스템

하핫, 정보처리기사랑 정보보안기사가 실기 시험 날짜가 겹치는 탓에 어떤걸 볼까 고민하다가, 정처리는 산업기사가 있기도 하고 시험장 오픈런에 실패하여... 보안기사를 보기로 결정 했다. 하루에 두세시간씩 짬내서 책을 보고있는데, 나중에 회독할 때 1400페이지 가까이 되는 책을 다시 보기가 겁이 나서 요약정리를 했다. 교재는 알기사를 대상으로 작성 했고, 내가 볼거라 ㅎㅎ; 예쁘게 정리하진 않았지만 혹시 필요한 사람이 있을 수도 있으니까 공유해본다. 책 기준 120 페이지에서 44페이지로 줄었다.

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

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

Dev/Java 2024.04.01

[프랑스여행] 리옹에서 안시(Annecy)가기/안시호수(Annecy Lake)후기/blarblarCar Bus예매

이전 포스팅은 여기로 2024.02.17 - [여행정보/2023 프랑스] - [프랑스여행] 안탈리아에서 리옹가기/튀르키에SAW공항/리옹시청수영장후기/리옹볼거리 [프랑스여행] 안탈리아에서 리옹가기/튀르키에SAW공항/리옹시청수영장후기/리옹볼거리 이전 포스팅은 여기로 2024.02.14 - [여행정보/2023 터키] - [터키여행] 데니즐리에서 파묵칼레가기/7월파묵칼레후기/안탈리아양고기맛집추천 [터키여행] 데니즐리에서 파묵칼레가기/7월파묵칼레후 zigo-autumn.tistory.com 꾸준히 쓴다고 했는데 개발관련 글을 쓰다 보니 여행기가 뒷전이 되었다. 구글 노출설정 이후 여행 관련글로 유입이 매일매일 갱신 되는걸보면서 더 미룰 수 없어 지하철안에서 써보는 안시여행기...ㅎ 나도 이전에 어디까지 적었는지 ..

Trip/2023 프랑스 2024.03.26

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

Java Stream ( feat. Optional 과 collect )

이전 포스팅은 여기로 2024.03.11 - [개발/java] - 람다식 ( Lamda expression ) / @FunctionalInterface 예제 소스 링크 본 게시글의 예제 코드를 이해하기 위해서는 람다식과 메서드 참조 ( 더블 콜론 )에 대한 이해가 있어야 하므로, 해당 내용에 대해 모른다면 위에 있는 이전 포스팅을 읽어보는 것을 추천한다. 왜 스트림이 등장했을까? for, Iterator 를 이용해서 코드를 짜게 되면, 재사용성과 가독성이 떨어진다는 단점이 있다. Collection 이나 Iterator 만 봐도 같은 기능의 메서드들이 중복되어 있고, List와 배열 정렬 시에도 동일한 sort() 함수를 사용하지만 각각 Collections.sort(), Array.sort()를 사용해..

Dev/Java 2024.03.18

OSIV 를 통한 성능 최적화 ( Connection 관리 관점 )

OSIV 란 뭘까? OSIV는 Open Session In View의 약자로 spring.kpa.open-in-view 옵션을 통해 application.properties 또는 yml 파일에서 On / Off 설정을 할 수 있다. OSIV의 기본값은 true 이다. ( on 상태를 의미한다. ) 기본적으로, 트랜잭션을 시작할 때 JPA의 영속성 콘텍스트는 데이터베이스 커넥션을 가져온다. OSIV는 트랜잭션이 끝나도 사용자에게 Response 가 반환 될 때까지 영속성 콘텍스트와 데이터베이스 커넥션을 끝까지 살려주는 역할을 한다. OSIV - On OSIV 가 On 이면 위 그림과 같이 요청에서 응답까지 이르는 모든 범위에서 영속성 콘텍스트와 데이터베이스 커넥션이 살아 있다. 이렇게 모든 범위에서 영속성..

Dev/JPA 2024.03.15

JPA 에서 Collection 조회시 주의점 및 성능 튜닝 방법

Entity -> Dto 변환 시 Collection 도 잊지 말고 변환해야 한다 Collection을 dto 로 변환하여 리턴할 경우에도 엔티티에 대한 의존도를 끊어야 한다. 예시 코드를 보자. 흐름도 Order 엔티티 정보 @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) // 지연로딩 @JoinColumn(name = "member_id") private Me..

Dev/JPA 2024.03.15