왜 기본으로 HikariCP를 선택할까? 어떤 옵션이 있을까?
·
Spring
스프링 공식 문서에서 데이터 소스 연결에 관한 문서의 내용을 발췌해 보면 이런 문구가 있다참고: https://docs.spring.io/spring-boot/reference/data/sql.html#data.sql.datasource.connection-pool SQL Databases :: Spring BootThe Reactive Relational Database Connectivity (R2DBC) project brings reactive programming APIs to relational databases. R2DBC’s Connection provides a standard method of working with non-blocking database connections. Conn..
ObjectMapper는 꼭 try-catch로 써야 하는걸까?
·
Spring
try { objectMapper.readValue(request, A::class.java) } catch (e: JsonProcessingException) { throw CoreException(InMemoryExceptionCode.FAILED_PARSE_JSON) } catch (e: JsonMappingException) { throw CoreException(InMemoryExceptionCode.FAILED_MAP_TO_SCHEMA)} 웹 백엔드 개발을 하다 보면 ObjectMapper를 사용하는 경우가 꽤 많다는 걸 깨닫는다. Controller에서 Request를 처리하는 부분에서도 JSON 형태의 Request를 Jackson 라이브러리의 ObjectMapper가 우리가 원하는 형..
Spring Boot 배포 시 스레드 개수에 대한 궁금증 정리
·
Spring
Jar 파일을 리눅스에서 실행하면 스레드 수는?OS 스레드와 JVM 스레드가 매핑되어서 생성된다이를 Native Thread Implementation 또는 1:1 Threading Model이라고 한다Spring Boot의 스레드 풀기본적으로 내장 Tomcat을 사용할 경우 Thread Pool이 생성된다Default로 최대 200개의 스레드를 가질 수 있다각 요청은 이 스레드 풀의 워커 스레드에 의해 처리된다질문 1.Docker Image로 Container를 띄우면 이 Container는 실행되는 OS의 프로세스와 스레드를 할당받는 걸로 아는데 맞아?컨테이너와 프로세스 관계Docker 컨테이너는 호스트 OS의 격리된 프로세스 그룹으로 실행된다Linux의 namespaces와 cgroups를 사용해 ..
TDD, 학습에서 배운점
·
회고
TDD가 필요해졌다테스트 코드 첫 만남이전 직장에 처음 입사했을 당시에, 솔루션 회사임에도 제대로 구축되어있는 솔루션이 없는 상태였다. 느리지만 한 개 고객사에 납품한 솔루션이 있었는데, 그 소스 코드를 보니 짧은 기간 작성한 이유 때문인지 컨벤션도 지켜지지 않았고, 여러 고칠 부분들과 얽혀있는 코드들의 검증이 꼭 필요한 프로젝트임을 직감했다 새로운 버전의 솔루션을 구축하게 되었고, 동료들에게 테스트 코드 도입을 먼저 얘기했다. 동료들이 테스트 코드 경험이 거의 없었고, 나 또한 실무에서 테스트 코드를 많이 작성해보지 않았기 때문에 걱정되었지만, 필요성에 대해서는 모두 공감하던 상태였기 때문에 도입을 결정했다 TDD 필요성을 느끼게 되었다어찌저찌 순탄하지만은 않았지만, 구글에 존재하는 수많은 선배 개발자..
LocalDateTime 어이없는 실수
·
회고
항상 고정된 시간이 출력된다?? nano 초도 아예 똑같이??문제 상황유저의 활동 스트림을 최근 3일로 요약해서 보여주는 탭에서 날짜가 도커 컨테이너가 시동되는 시점에 고정되는 버그를 발견했습니다해결 시도컨테이너 시간 서버 로컬 시간과 일치 시키기원래 컨테이너 내부의 localtime과 서버의 localtime을 일치 시켜서 컨테이너 내부의 시간을 맞추도록 했었습니다. 이번 이슈가 발생하고 서버에서 date 명령어를 찍었을 땐 KST로 설정대로 잘 나오고 있었습니다. 그런데 컨테이너 내부의 시간은 UTC로 출력이 되고 있었습니다. Docker Compose의 설정은 /etc/localtime:/etc/localtime 이었습니다. Timezone으로 일치 시키기구글링을 좀 해보니 컨테이너 내부의 시간을 ..
회사 솔루션 구조를 분리한 이유
·
회고
기존 솔루션의 구조기존 고객사에 배포했던 솔루션의 구조입니다. 주로 고객사가 대학교였고(간혹 대학원이 있었지만 큰 차이는 없으므로), 고객사들의 종류가 서버를 관리하는 외주 업체가 따로 있는 경우, 학교 전산팀에서 서버를 관리하는 경우, 그리고 외주도 없고 전산팀도 없고 서버도 없는 경우 이렇게 크게 세 가지로 분류됩니다.분류는 세 가지로 나눠볼 수 있지만 공통적인 특징은 서버를 마음대로 스케일 아웃할 수 없는 환경이었습니다. 당연히 비용적인 문제가 가장 큰 이슈였습니다. 이런 환경이다 보니 최초로 솔루션을 납품할 때 학교에서 줄 수 있는 최고 스펙의 서버를 요청한 후에 그 서버에 모든 서비스를 배포해서 납품을 했었습니다. 당연히 이렇게 배포하다보니 모든 비지니스 로직이 백엔드 서버 한 곳에 집중된 상태..
생각하면서 개발해야 하는 이유
·
회고
배경안녕하세요 저는 대학에 LMS 솔루션을 구축하는 업무를 하고 있는 백엔드 개발자입니다. 저는 운이 좋게도(?) 회사에 입사한 후 기존 인력들이 퇴사함으로 현재 프로젝트들을 주도적으로 리드하고 있고, 이 글은 다시 반복해서 실수를 저지르지 않기 위해서 스스로를 혼내는 글입니다. 우선 저희 팀의 기술 스택은- Java 17- Spring Boot 3.x- QueryDSL- JPA- MySQL- Redis- PostgreSQL- Docker- Ubuntu 20.04 or 22.04- Nginx등을 사용중에 있습니다.겪게 됐던 이슈우선 저희 팀이 겪게 된 이슈는 이렇습니다.문제 상황여기서 문제가 된 부분은 강의실 정보를 SAML 인증 정보에 담아서 Canvas LMS에 넘겨주는 부분에서 발생했습니다. 유저가..