목록분류 전체보기 (65)
개발그래머
퇴근 시간대에 서버 지연이 발생했지만, 자연적으로 해소되었다는 DBA의 연락을 받았다. 서버 로그를 확인했지만 특별한 이상 징후는 발견되지 않았다. 그런데 다음 날 출근 시간대에도 동일한 서버 지연이 발생했고, 이번에는 특정 쿼리에서 문제가 있었음을 DBA가 확인해주었다. 문제의 원인은 수동 커밋 모드(auto-commit: false)로 실행된 쿼리가 commit 또는 rollback되지 않아 테이블 락이 발생한 것이었다.많은 블로그에서 DB 툴 사용 시 수동 커밋 모드를 추천하는 경우가 많다. 나 역시 한때 수동 커밋 모드를 사용했지만, 익숙하지 않아 불편함을 느꼈다. 쿼리를 실행한 후 commit 또는 rollback을 반드시 수행해야 하지만, 이를 놓치는 경우가 종종 발생했기 때문이다. 이러한 실..

필기필기는 약 1주일 동안 최신 기출문제만 풀었다.따로 문제집을 구매하지 않고, CBT 사이트에 올라온 최신 기출문제 3년 치를 반복해서 풀었다.2~3년 전에 필기시험을 본 적이 있었는데, 그때와 비교했을 때 문제은행 방식으로 변화한 것이 느껴졌다.실제 시험도 컴퓨터로 진행되었고, 합격 여부가 즉시 확인 가능했다.문제은행 방식으로 바뀌면서 난이도가 다소 낮아졌다고 생각한다. 물론, 기본적인 CS 지식이나 업무를 통해 쌓인 경험도 영향을 미쳤을 것이다.실기필기는 많은 사람들이 통과하리라 생각되어 간략히 언급했고, 실기 준비 경험을 더 자세히 적어보았다.실기 준비도 기출문제를 풀면서 시작했지만, 몇 문제를 푸는 중에 "이거, 쉽지 않겠다"라는 생각이 들었다.기출문제를 2~3회 반복해서 풀다 보니, 기출만으로..
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is java.lang.IllegalStateException: Unable to create the directory [/tmp/tomcat.*] to use as the base directory개발 서버 배포 문제 해결 과정개발 서버를 배포하는 과정에서, 배포가 완료되지 않고 애플리케이션이 계속해서 실행 종료를 반복하는 현상이 발생했다.처음에는 소스 코드 수정 과정에서 발생한..
MySQL 공간 데이터 타입(Spatial Data Types)MySQL은 OpenGIS(Simple Features Specification) 표준을 준수하며, 공간 데이터 타입은 크게 두 가지로 나눌 수 있음공간 데이터는 SRID(Spatial Reference System Identifier)를 통해 좌표계를 정의하고 사용 가능함MySQL에서 공간 데이터 타입은 SPATIAL INDEX를 지원하여 성능 향상 가능함기본 공간 데이터 타입기본 공간 데이터 타입은 개별적인 지리적 개체를 표현함데이터 타입설명GEOMETRY모든 공간 데이터 타입의 일반화된 형태로, 모든 공간 객체를 저장할 수 있는 기본 타입입니다.POINTX, Y 좌표로 구성된 한 개의 점(위치)을 표현합니다.LINESTRING두 개 이상..
개요운영 업무를 진행하면 동적으로 설정값들을 구성해야 하는 경우가 있습니다.1번 DB를 사용하여 구성2번 프로퍼티를 사용하여 구성DB를 사용하는 방법은 개발자가 아닌 실질적인 사용자가 UI를 통해 지속적으로 관리를 하는 상황일때 주로 사용하는 편입니다.가벼운 작업은 프로퍼티를 통해 하는 편인데 기본적인 프로퍼티로 설정하게 되면 서버를 재배포해야 하는 번거로움이 생깁니다.그렇기 때문에 외부파일로 프로퍼티를 동적으로 구현하여 관리하는 것을 지향하는 편이며 해당 방법을 구현하는 법을 올리고자 한다.사용법implementation("commons-configuration:commons-configuration:1.10") commons-configuration을 import하여 사용하게 된다2 버전도 있지만 ..
개요운영 업무를 하다 보면 추가해야 될 것들, 변경해야 될 것들, 등록해줘야 할 것들이 생기는데 주로 csv파일(개발자) 혹은 엑셀 파일(업무담당자)로 전달받게 된다.유저 자동 가입 처리라던지, csv 파일에 해당하는 값으로 변경한다던지 소소한 잡일들이 많이 생기는데 생각외로 많은 시간을 할애하게 되고 업무의 흐름을 방해하여 자동화하기로 하였다. WatchService 란?Java NIO(Non-blocking I/O) 패키지의 일부로서 파일 시스템의 변경 사항을 감시하고 관찰하는 데 사용되며 파일 또는 디렉토리의 생성, 수정, 삭제 등의 이벤트를 감지할 때 활용됨파일 시스템의 특정 디렉토리에 대한 변경 사항을 모니터링하기 위해 사용되며 감시 대상 디렉토리에 대한 이벤트가 발생하면 이를 감지하고 애플리케..
개요 서비스를 운영하다 보면 간헐적으로 요청 오는 정보(ex. 코드로 처리하면 편리한 경우) 작업들 또는 암호화 / 복호화 같은 애플리케이션 내부에서만 처리할 수 있는 작업(ex. 유저의 복호화된 전화번호 정보가 담긴 엑셀파일이 필요하다) 해당 유저 혹은 작업에 대한 복합적인 여러 정보들을 쉽게 확인할 수 있도록 하는 작업(ex. 여러 테이블들에 있는 정보들이 필요하다) 위의 운영 작업들을 효율적으로 처리하기 위해 ApplicationRunner와 CommandLineRunner를 활용한 방법들을 소개합니다. ApplicationRunner와 CommandLineRunner 인터페이스란? 스프링부트 애플리케이션을 시작할 때 어떤 동작을 수행하도록 지원하는 인터페이스이며 Runner 인터페이스를 상속받고 ..

개요1차 캐시가 동작하지 않아 생각한 쿼리의 양보다 많은 쿼리가 나가는 경우가 종종있었다.어떠한 경우 어떠한 문제로 발생하는지 한번 알아보자.예제 코드@Entity class Post ( var title: String, var content: String, var subTitle: String ) : BaseEntity() @MappedSuperclass abstract class BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null @CreationTimestamp @Column(updatable = false) val createdAt: LocalDateTime? = null @UpdateTi..