전체 글

초보 개발자의 지식 공유의 장
로그 정보를 이용해서 데이터 분석 및 여러가지로 활용할 수 있지만 로그 활용은 그렇게 간단하지만은 않다. 로그 형태가 표준화되어 있지 않기 때문인데, 로그는 반정형 데이터이며 세상의 모든 것이 로그가될 수 있기 때문에 로그 형태를 강제할 방법도 없다. 결국 로그를 수집하는 쪽에서 로그 형태를 분석하고 시스템에서 인식할 수 있도록 로그를 정제하는 작업이 필요한데, 로그스태시는 이 과정을 쉽고 편하게 할 수 있도록 지원한다. 로그스태시를 한페이지로 정리해보자. 로그스태시란? 플러그인 기반의 오픈소스 데이터 처리 파이프라인 도구 복잡하고 귀찮은 데이터 전처리 과정을 별도 애플리케이션 작성 없이 비교적 간단한 설정만으로 수행할 수 있음(데이터를 저장하기 전 사용자가 원하는 형태로 변경할 수 있음) 장애 대응 로..
tar(Tape Archive)는 다수의 파일을 하나로 묶을 때 사용한다. gz은 파일을 압축해 준다. tar가 압축의 일종으로 간주되지만 압축은 전혀 되지 않고 단순히 다수의 파일을 하나로 묶을 때사용되며, 압축이 필요한 경우 다양한 압축 유틸리티를 통해 압축한다. 압축하기 // tar로 묶기 $ tar -cvf [파일명.tar] [폴더명] // tar.gz 압축 $ tar -zcvf [파일명.tar.gz] [폴더명] 압축풀기 // tar 풀기 $ tar -xvf [파일명.tar] // tar.gz 압축 풀기 $ tar -zxvf [파일명.tar.gz] 역할 옵션 -c : 지정한 파일을 tar로 묶는다. (create) -x : tar를 압축 해제한다. (extract) -r : 묶인 tar에 새 파일..
개발 환경 ㄴ springBoot : 2.4.13 ㄴ spock : 1.2 ㄴ groovy : 2.4.1 ㄴ gradle : 3.7 PR을 올리면 CI 서버에서 자동으로 테스트 코드를 수행하게 되는데, 어느날 배포나간 테스트 코드를 IDE에서 실행해보니 깨지는 것을 발견했다. 애초에 테스트가 통과되지 않는 코드인 것인데 CI 서버에서는 어찌 통과를 했던 것일까? 한참을 삽질을 하던 나는 IDE 에서의 직접 테스트코드 실행이 아닌 그래들 래퍼로 test task를 실행하였을 때 재현이 되는 것을 발견했다. ./gradlew test 실행시 테스트코드가 실행되지 않고 SUCCESS가 되는 것...! $ ./gradlw test BUILD SUCCESSFUL in 10s 테스트할 클래스를 명시적으로 지정을 하..
그래들, 메이븐과 같은 빌드툴이 나오게 된 이유는 무엇일까? 빌드툴에 대한 역사를 찍먹해보고 그래들의 장점을 알아보도록 하자아. 빌드툴이란 무엇인가? 자바 애플리케이션 개발과정을 살펴보면, 반복된 작업들이 있다는 것을 볼 수 있다. 이런 반복된 작업들 (정형화된 작업)을 자동화하기 위한 소프트웨어를 빌드툴 이라 한다. 소스코드(.java)를 컴파일하여 클래스 파일(.class) 파일 생성 코딩 규약에 맞게 작성했는지 확인 코드를 정적으로 해석 테스트를 하고 테스트 결과나 커버리지 측정 결과를 리포트로 출력 Javadoc과 같은 문서를 작성 클래스 파일과 리소스 파일을 패키징하여 압축파일을 만듬(.jar 혹은 .war) 압축 파일을 테스트 혹은 스테이징 환경에 배포 압축 파일을 저장소에 등록 으잉? 이클립..
Homebrew 설치 https://brew.sh 에서 Install Homebrew 설치 명령 복사 % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" % echo 'export PATH=/opt/homebrew/bin:$PATH' >> ~/.zshrc # PATH 등록 % source ~/.zshrc homebrew 명령어 모음 참고 https://sukvvon.tistory.com/7 Telnet 설치 % brew install telnet git 설치 % brew install git % brew info git Java 11 설치 % brew tap adopt..
트랜잭션은 가장 작은 작업의 단위로, 우리는 여러개의 SQL이 사용되는 작업을 하나의 트랜잭션으로 취급해야하는 경우가 존재한다. 대표적인 예가 우리가 모두 알고 있는 계좌이체 같은 경우이다. 스프링에서 트랜잭션을 위해 여러가지 기술들을 제공하고 있는데 관련해서 알아보자. 트랜잭션 경계설정 JDBC를 이용하게되면 아래와 같이 트랜잭션 경계를 설정하여 2개의 작업을 한 트랜잭션으로 묶을 수 있게 된다. Connection c = dataSource.getConnection(); c.setAutoCommit(false); // 트랜잭션 시작 (자동 커밋 옵션 false) try { // 하나의 트랜잭션으로 묶인 단위 작업 ProparedStatement st1 = c.prepareStatement("출금계좌에..
2022.03.23 - [데이터베이스 노트/데이터베이스] - Database의 레플리케이션(Replication) (Master/Slave DB) 앞에서 Master/Slave DB 환경을 구축하였을 때의 이점을 살펴보았으니 애플리케이션단에서 구현하는 방법을 살펴보자. 개발환경 : MyBatis 일단 각 DB 별 DataSource가 필요하므로 DataSoruce를 정의해 준다. ... // Master DataSource @Bean(name = MASTER_DATASOURCE) public HikariDataSource masterDataSource() throws SQLException { return new HikariDataSource(getHikariConfig(getOracleDataSourc..
Database를 Master/Slave 구성해야 하는 이유, Application에서는 어떻게 활용해야하는지에 관하여 정리해보려 한다. Database Replication의 동작원리나 Database의 구성형태에 대해서는 다루지 않는다. (사실 잘 모른다.) 왜 Database를 Master/Slave로 나누었을까? Application에서는 Master/Slave DB을 활용하기 위해 어떻게 구현을 했으며 어떤 고민들이 있었을까? Master Database만 구성하였을 때의 한계점 나의 첫번째 회사는 B2B서비스를 제공하는 회사였다. 그러다보니 시스템 사용자수는 한정되어(국내/해외 법인)있었고 트래픽이 증가할일이 거의 없었다. 그렇기 때문에 Application 구성도가 굉장히 단순했다. (극단적..
connections 현재사용 중인 sessions, processes 수 SELECT * FROM v$resource_limit WHERE resource_name in ('processes', 'sessions', 'transactions') 현재 접속중인 세션 정보 SELECT username, program FROM v$session;
Spock을 이용하여 MockBean을 생성하였는데, 정의한 행위대로 동작하지 않는 이슈를 발견했다. 간단히 작성해보자면 아래와 비스무리한 코드였다. @Autowired private SimpleMapper simpleMapper; ... @TestConfiguration def setup() { def factory = new DetachedMockFactory() @Bean SimpleMapper simpleMapper() { return factory.Mock(SimpleMapper) } } def "test"() { given: simpleService.selectSomething(_) >> "SUCCESS" expect: "SUCCESS" == simpleService.selectSomethin..
깡냉쓰
평범한 개발자 노트