서론 여러 개발 환경에서 테스트를 수행하기 위해 AWS EC2나 기타 자원을 매번 사용하는 것은 시간과 비용적인 측면에서 제약을 느끼게 되어, 이번 시리즈를 작성하게 되었습니다. Spring Boot 프로젝트를 중심으로 진행될 예정이며, 이는 주로 단순한 개발 테스트 목적으로 진행되므로, 실제 운영 환경에서의 활용에는 부족함이 있을 수 있습니다. 테스트 환경 MacOS M3-Pro Docker version 25.0.3 Docker Compose 구성 1. 폴더 구조 최상단에 db 폴더를 생성 후 conf.d, data, initdb.d 폴더를 하위에 생성합니다. 2. 기본 설정 세팅 [client] default-character-set = utf8mb4 [mysql] default-character-..
회사에서 프로젝트를 진행하던 중 계속 DTO에서 NPE가 발생한다고 로그에 기록되었습니다. 아래 코드는 메시지를 발송할 때 필요한 메서드입니다. 하지만 메시지를 발송하지 않는 경우에도 자꾸 이 메서드가 호출되어서 오류가 발생했습니다. 디버깅 결과 @ResponseBody와 연관이 있다는 것을 발견하고 모르던 부분이 있어서 글로 정리하게 되었습니다. public String getAgencyInfo() { try { return this.agencyResDto.getAgencyName() + " / " + this.agencyResDto.getRepresentTel(); } catch (Exception e) { log.warn("[LectureResDto.getAgencyInfo()] ERROR :: "..
'인덱스를 잡아봐라', '쿼리의 실행 계획을 봐라'와 같이 쿼리의 실행 속도가 느리면 듣는 말이 있습니다. 하지만 저와 같은 초보 개발자들은 어디에 인덱스를 걸어야 하는지, 실행 계획을 봐도 뭐가 뭔지 잘 모를 것입니다. 그래서 오늘은 실행 계획에 대해 한 번 학습해보려 합니다. 저의 실습 환경은 MariaDB 11.2.2이며, 개념에 대한 부분은 MySQL과 혼합하여 작성해 보겠습니다. EXPLAIN EXPLAIN은 어떠한 쿼리를 실행할 것인가, 즉 실행 계획이 무엇인지 알고 싶을 때 사용하는 명령어입니다. EXPLAIN SELECT U.*, PH.*, P.*, (SELECT SUM(POINT) FROM POINT_HISTORY H WHERE H.USER_ID = U.ID) FROM USER U INN..
프론트엔드와 백엔드가 따로 분리가 되어 있지 않은 프로젝트에서 자주 사용하는 Model과 ModelMap의 차이점에 대해 알아보겠습니다. Model VS ModelMap 공통점 데이터 전송 : 모두 컨트롤러에서 뷰로 전달되어야 하는 속성을 보유하는 컨테이너 역할을 합니다. 속성 추가 : addAttribute와 같은 메소드를 사용하여 뷰에 표시할 속성을 추가할 수 있습니다. 범위 : Model 혹은 ModelMap에 추가된 속성은 현재 요청 수명 주기에만 사용할 수 있습니다. 차이점 Model은 Spring에서 제공하는 인터페이스입니다. ModelMap은 Model의 구현체이며, LinkedHashMap을 상속받고 있어 추가 기능을 사용할 수 있습니다. 단순히 이런 차이점밖에 없으므로 취향에 따라, 혹은..
이번 글에서는 JSP에서의 예외 처리에 대해 글을 작성해보려고 합니다. 아마 대부분의 사람들은 SpringBoot + Thymeleaf의 조합 혹은 프론트 프레임워크와의 조합으로 개발을 하여 JSP를 잘 사용하지 않을 것이라고 생각합니다. 하지만 아직 많은 레거시들은 JSP를 사용하고 있습니다. 사내 CMS도 레거시 Spring + JSP의 조합을 사용하고 있습니다. 저희 CMS는 JSP가 이미 만들어져 있는 것이 아닌, 각 페이지별로 문자열을 조합해 JSP를 만들고 있습니다. 그렇기 때문에 Controller에서 Model을 사용하는데 제한이 많아 JSP에 많은 자바 코드가 적혀있습니다. 이럴 때 로그인 처리 혹은 여러 가지 예외 상황을 어떻게 처리하는지에 대해 공부해보려고 합니다. 시나리오 Contr..
블로킹 (Blocking)이란? 블로킹은 하나의 트랜잭션이 락을 보유하고 있어서 다른 트랜잭션이 해당 데이터에 접근할 수 없을 때 발생합니다. 이는 데이터베이스 성능에 심각한 영향을 미칠 수 있으며, 때로는 데드락으로 발전할 수도 있습니다. 블로킹의 문제점 성능 저하 : 블로킹으로 인해 트랜잭션이 대기 상태에 빠지면, 시스템의 전체적인 처리량이 감소합니다. 데드락 : 두 개 이상의 트랜잭션이 서로 락을 기다리는 상황이 발생하면, 시스템이 더 이상 진행할 수 없게 됩니다. 블로킹 해결 방법 타임아웃 설정 : 특정 시간 동안만 락을 기다리고, 시간이 초과되면 트랜잭션을 중단시키는 방법입니다. 락의 크기 조정 : 락을 걸 때 가능한 가장 작은 데이터 단위에 걸도록 해서, 필요 이상으로 많은 데이터가 락에 걸리..