전체 글(118)
-
[품질분석] SonarCloud+Jacoco기반의 CI-based analysis 구축
Static Analysis vs Dynamic Analysis 정적분석과 동적분석은 모두 코드의 취약점을 발견하는데 목표를 두고 있다. 두 분석의 차이점은 분석기가 개발 주기에서 어느 시점에 수행되느냐에 있다. 동적분석은 애플리케이션의 실행 이후 시점에 수행되고 정적분석은 애플리케이션의 실행 이전 시점에 수행된다. 동적분석의 경우 애플리케이션을 실행시켜 애플리케이션 내 결함 및 취약점 분석, 메모리 및 쓰레드 결함 등을 분석할 수 있다. 이와 반대로 정적분석은 애플리케이션을 실행하지 않고 코드의 취약점을 분석하는데 목적이 있다. 정적분석과 동적분석의 목적에 대한 차이는 다음과 같다. - 정적분석: 개발 중 하면 안 될 것을 했는지 검사 - 동적분석: 개발 중 하려고 한 것을 잘했는지 검사 대표적인 분석..
2022.07.18 -
[CI/CD] Github Actions 기본개념과 사용법 정리
Github Actions Github Actions는 Microsoft에서 Github을 인수한 뒤 출시된 CI 솔루션이다. Github과 연동하여 PR 이벤트뿐만 아니라 다양한 이벤트에 trigger 될 수 있는 다양한 작업을 정의할 수 있다. 또한 다양한 action들이 마켓플레이스에 공개되어 있어서 쉽게 workflow를 작성할 수 있다는 점과 CI 서버를 따로 설치하지 않고도 Github에서 제공하는 클라우드 호스팅을 통해 빠르게 CI파이프라인을 구축할 수 있다는 장점이 있다. 이번 포스팅에서는 Github Actions에 대해 넓고 얕게 핵심 개념과 기본 사용법에 대해 작성했다. Github Actions 주요 개념 5개 Github Actions을 사용하기 전에 알아야 할 주요 키워드는 총 ..
2022.06.30 -
[ubuntu] apt의 이해
윈도우에서 프로그램 설치 절차 1. 홈페이지 접속 후 설치 파일 또는 실행 파일 다운로드 2. 설치 파일(실행 파일) 실행 후 설치 - 프로그램이 하드디스크에 특정 위치에 복사 - 윈도우 시작 프로그램에 등록 - 해당 프로그램이 사용할 네트워크 포트 설정(방화벽 open 등) - OS 시작 시 자동으로 시작되도록 설정 - 필요한 환경변수 설정 우분투(wget)에서 프로그램 설치 절차 1) 홈페이지 접속 후 실행파일 다운로드 (wget) 2) tar 아카이브 해제 또는 압축파일 해제 3) .deb 확장자 파일 설치 (설치 명령어 필요) 4) 필요한 환경변수 설정 우분투에서는 이러한 설치 파일을 wget으로 다운로드할 수도 있지만 우분투 repository라는 저장소를 제공하기도 한다. 대부분의 프로그램이 ..
2022.06.30 -
[DB] Lock 기반으로 트랜잭션 격리수준 이해하기
트랜잭션의 특징 : ACID - Atomicity(원자성) : All Or Nothing - Consistency(일관성) : 일관성 있는 DB 상태를 유지해야 함(정해진 DB컬럼에 대한 일관성, 제약조건에 대한 일관성 등) - Isolation(격리성) : 트랜잭션 간 얼마나 영향을 주고받냐를 설명함(4가지 격리수준 참고) - Durability(지속성) : 트랜잭션 결과는 항상 DB에 기록되어야 하며 문제가 발생하더라도 복구할 수 있어야 함 트랜잭션은 위 4가지 성질을 모두 만족해야 한다. 하지만 Isolation의 경우 완벽한 격리를 하게 될 경우 트랜잭션들 간에 완전히 순차적으로 실행되어야 하기 때문에 성능상 이슈가 발생할 수 있다. 따라서 Isolation의 경우는 4가지 수준으로 구분하며 "얼..
2022.06.20 -
[DB] DB드라이버, 커넥션 풀, DataSource
애플리케이션에서 데이터베이스와 커넥션을 생성하는 과정 1) 애플리케이션 로직은 DB 드라이버(어떤 DB를 사용할 것이냐에 따라 다름)를 통해 커넥션을 조회한다. 2) DB 드라이버는 DB와 TCP/IP 커넥션을 맺는다. (3-way handshake 발생) 3) TCP/IP 커넥션이 완료되면 DB 접속을 위한 ID 및 Password 등과 같은 정보를 DB에 전달한다. 4) DB는 사용자 인증을 완료하면 DB 내부적으로 세션을 만든다. 5) DB는 커넥션 생성이 완료되었다는 응답을 보낸다. 6) DB 드라이버는 애플리케이션 로직으로 커넥션 객체를 반환한다. 단점 - 커넥션을 생성하는 것은 복잡하고 시간도 오래 소요되는 과정이다. - 시간이 오래 걸리기 때문에 사용자에게 느린 응답을 보일 수밖에 없다. -..
2022.06.19 -
[kafka] Log Segment File 디렉토리
Broker의 설정 파일(server.properties)에 log.dirs 파라미터를 통해 Segment File이 생성되는 위치를 조정할 수 있다. (콤마를 통해 여러 디렉토리 설정 가능) 만약 topic1이라는 이름의 Topic과 Partition 0번이 있다고 가정하면, log.dirs에 명시된 위치 중 하나가 결정되고 그 하위 디렉토리에 "Topic명-Partition번호"(topic1-0) 형태의 하위 디렉토리가 생성되며 해당 디렉토리에 Segement File이 기록된다. Log File들의 확장자와 파일명에는 의미가 있다. 예를들어 위와 같이 00000000000000000217.* 이라는 파일명이 있으면 해당 파일은 00000000000000000217 offset부터 기록하고 있는 S..
2022.06.19 -
[OS] ForkJoinPool
ForkJoinPool은 기본 개념은 큰 업무를 작은 업무 단위로 쪼개고, 그것을 각기 다른 CPU에서 병렬로 실행한 후 결과를 취합하는 방식으로 분할정복 알고리즘과 유사하다. 대표적으로 Java에서는 병렬스트림을 사용할 때 사용된다. ForkJoinPool 동작 방식 1) 큰 task를 작은 단위로 쪼갠다. 2) 부모 쓰레드로 부터 로직을 복사해서 새로운 쓰레드에 쪼개진 업무를 수행한다. - Fork 과정 3) 2번 과정을 수행하다가 특정 쓰레드에서 더 이상 Fork가 발생하지 않고(IDLE CPU의 개수와 작업량에 따라 어디까지 분할할지 내부적으로 결정됨) task 처리가 완료되었다면 그 결과를 부모 쓰레드에서 Join 하여 값을 '취합'한다. - Join 과정 4) 3번 과정을 반복하다가 최초의 F..
2022.06.18 -
[JAVA] 스트림과 병렬스트림 (parallelStream)
최종 연산과 중간 연산 스트림이란 일련의 데이터의 흐름이다. 실질적으로는 스트림은 인스턴스로 존재하고 여러 개의 파이프를 통과함으로써 알련의 작업이 처리된다. 여기서 파이프는 메소드 호출을 통해 이루어진다. 최종 연산을 담당하는 파이프는 가장 마지막에 위치해야 한다. 최종 연산이 아닌 그 외 연산은 모두 중간 연산이라고 부른다. - 최종 연산(Terminal Operation) : 스트림을 연산하기 위한 파이프 중 가장 마지막의 연산을 담당하는 파이프 - 중간 연산(Intermediate Operation) : 최종 연산이 아닌 파이프에서 처리되는 연산들 예를 들어 홀수만 찾아내고 이들의 합을 구하는 연산이 있다고 가정하면 총 2가지 연산(홀수 찾기, 더하기)이 존재하고 이들 간의 순서는 홀수를 찾는 것..
2022.06.08 -
[kafka] Kafka의 주요 구성 요소 (Broker, Zookeeper)
Broker와 Zookeeper Kafka의 주요 구성 요소중 Broker, Zookeeper는 카프카 클러스터를 구성하는 것들이다. Apache Zookeeper는 카프카 클러스터 윗 단에서 역할을 하고 Broker는 카프카 클러스터 내에서 역할을 한다. 1. Broker(Kafka Server) 카프카의 Broker는 Topic과 Partition을 유지 및 관리한다. 즉, Topic과 Partition에 데이터가 Read 및 Write 되도록 관리하는 소프트웨어이다. 카프카 서버라고도 부르며 Topic 내 partition들을 분산(배치)하고 유지 및 관리한다. - 각 Broker들은 숫자로 구성된 ID로 구분되며 카프카 클러스터는 여러 개의 Broker로 구성된다. - Topic 데이터의 일부분(..
2022.06.08 -
[Jenkins] Ubuntu 20.04에서 젠킨스 포트 변경하기
시도했던 방법 /etc/default/jenkins 파일 수정하기 sudo vim /etc/default/jenkins - 해당 파일에서 HTTP_PORT를 수정했으나 포트가 변경되지 않는 문제가 발생했다. 현재 사용중인 버전 정보는 다음과 같다. - Jenkins: 2.346.2 - Ubuntu: 20.04 - Java: 11 해결방법 jenkins.service 파일 수정하기 sudo chmod 777 /usr/lib/systemd/system/jenkins.service sudo vim /usr/lib/systemd/system/jenkins.service sudo chmod 444 /usr/lib/systemd/system/jenkins.service jenkins.service 파일의 권한을 7..
2022.06.02