트랜잭션 경계 여러 작업을 하나의 논리적인 단위로 묶고 싶을 때 트랜잭션을 사용합니다. 트랜잭션은 시작하는 방법은 하나이지만 끝나는 방법은 두 개가 존재합니다. 하나는 롤백(rollback)이며, 다른 하나는 커밋(commit)입니다. Connection connection = dataSource.getConnection(); connection.setAutoCommit(false); // 트랜잭션 경계 시작점 doSomeThing(); connection.commit(); // 트랜잭션 경계 끝점 그리고 트랜잭션을 시작하고 끝내는 작업을 설정하는 걸 '트랜잭션 경계설정'이라고 하고, 트랜잭션 경계 내에서 논리적으로 묶이길 원하는 로직들이 실행되게 됩니다. 물리 트랜잭션과 논리 트랜잭션 스프링에서는 트랜..
스프링을 공부하면서 DispatcherServlet에 대한 이야기는 많이 들었음에도 불구하고 이해가 쉽게 되지 않았던 적이 많았습니다. 이름 자체부터 추상적이기도 하고, HandlerMapping, HandlerAdapter 등 낯선 용어들이 너무 많았기 때문입니다. 따라서 이번 아티클에서는 누구나 쉽게 이해할 수 있도록 DispatcherServlet의 역할에 대해 작성해보고자 합니다. 저만의 언어로 풀어쓴 것이기에 많은 부분을 추상화했다는 점 참고해 주시면 감사하겠습니다. DispatcherServlet 모든 클래스에는 해당 클래스의 역할을 기술하는 네이밍이 주어집니다. 그렇다면 DispatcherServlet이라는 이름을 잘 해석하면 해당 클래스의 역할을 유추해 볼 수 있지 않을까요? Dispatc..
사용자 유치를 시작한 지 이제 2주 정도 지난 것 같습니다. 마찬가지로 사용자 유치 과정에서 어떤 시도를 했고 어떤 결과를 얻었는지를 기록하고자 합니다! 하루스터디, 제휴 맺다! 저번 회고에서도 언급했다시피 하루스터디를 교육 프로그램에서 사용하고 싶다는 제안을 주신 분이 계셨는데요, 외부 서비스와의 연동은 나름 민감한 사항이라고 여겨질 수 있었기에 코치님들께 문의를 드렸었습니다. 그리고 얼마 전에 코치님께서 '하루스터디 팀이 원한다면 사용을 허가해도 된다'라고 말씀해 주셨습니다 👏 따라서 제안을 주신 분과 함께 게더에서 미팅을 진행했는데요, 하루스터디의 백그라운드를 소개하고 간단한 질의응답 시간을 가졌습니다. 마코가 대표로 발언을 하고 나머지 팀원들은 경청을 하는 자리였는데 좋은 분위기로 미팅이 잘 진행..
스프링부트의 공식 문서를 보면 다음과 같은 문구가 있습니다. We prefer HikariCP for its performance and concurrency. If HikariCP is available, we always choose it. 성능과 동시성의 이유로 선택할 수 있다면 항상 HikariCP를 선택한다고 합니다. 데이터베이스 커넥션 풀은 종류가 HikariCP만 있는 것은 아닙니다. Tomcat JDBC Pool, Apache Commons DBCP2 등 다양한 커넥션 풀들이 존재합니다. HikariCP는 다른 커넥션 풀들과 비교해 얼마나 빠르고, 얼마나 동시성 처리가 뛰어나길래 스프링 부트가 기본 커넥션 풀로 선택하게 되었을까요? 성능 테스트 HikariCP가 얼마나 빠른지 직접 체감해 ..
현재는 데이터 조회를 위해 매번 데이터베이스에 접근해야 하는 구조입니다. 또한 데이터베이스는 인바운드 네트워크 설정으로 인해서 우테코 캠퍼스에서만 접근이 가능한 상태입니다. 따라서 어드민 페이지에서 데이터 조회를 지원한다면 어디에서든지 쉽게 데이터를 확인할 수 있을 것입니다. Spring Data의 Pageable 사용하기 Spring Data의 Pageable을 활용하면 페이징 기반의 조회를 손쉽게 구성할 수 있습니다. @GetMapping("/members") public ResponseEntity findMembers(Pageable pageable) { List members = adminService.findMembers(pageable); return ResponseEntity.ok(membe..
메인 어드민 기능을 개발하기에 앞서 로그인을 구현해보고자 합니다. 어드민 페이지에 접근할 수 있는 사용자는 하루스터디 개발자들로 제한되어야 하기 때문에 로그인 기능은 필수적이라 할 수 있겠습니다. 기존 인증 시스템 재사용하기? 하루스터디는 Oauth2 기반의 인증 시스템을 사용합니다. 사용자가 소셜 로그인을 진행하면 해당 정보를 기반으로 인가용 access token을 발급하는 구조입니다. 이런 기존 인증 시스템을 사용할 순 없을지 고민이 되었습니다. 투자하는 리소스를 최소화 시킬 수 있으면서 구현 방식또한 간단하리라 예측했기 때문입니다. 하루스터디 서비스에 소셜 로그인을 하게 되면 사용자는 ID를 갖게 됩니다. 그리고 이는 Member 테이블의 Primay Key입니다. 예를 들어 구글 로그인을 진행하..
본격적인 사용자 유치에 들어서면서 모니터링 및 분석 도구의 필요성이 대두되었고 어드민 페이지를 개발하게 되었습니다. 실제 개발에 들어가기 앞서, 어떤 기능이 필요할지 대략적으로 분석하고자 합니다. 브레인스토밍 브레인스토밍을 할 때 주의 깊게 생각한 부분은 다음과 같습니다. 어드민 기능을 사용하는 고객은 사용자들이 아닌 하루스터디 개발자들이다. 어드민에서 제공하는 통계 정보는 유의미한 분석 결과를 만들어내는데 도움이 될 수 있어야 한다. 최근 하루스터디는 사용자 통계 정보를 기반으로 기능을 개선하고 있기에 어드민에서 중점적으로 다뤄야 할 내용도 일단은 통계 정보라고 생각했습니다. 따라서 브레인스토밍 내용은 '어떤 통계 자료를 뽑을 것인지'가 주가 되었습니다. 외부로 드러나는 정보, 예를 들어 어떤 페이지에..
5차 데모데이를 마친 직후부터 하루스터디는 사용자 유치에 많이 집중하게 되었는데요, 이 과정을 기록하고 싶어 앞으로는 매주 사용자 유치에 과정과 결과를 회고 형식으로 작성할 예정입니다 😌 공식 오픈카톡방 운영하기 첫번째로 했던 사용자 유치 방법은 오픈카톡방을 운영하는 것이었습니다. 하루스터디는 혼자서도 진행할 수 있지만 기본적으로 여러 명이 진행하는 것을 전제로 만든 서비스이기 때문에 사용자 풀을 유지시킬 수 있는 수단이 필요하다고 생각했습니다. 그래서 공식 오픈카톡방을 개설하고, 하루스터디 사이트에서 쉽게 접근이 가능하도록 구성했습니다. 하루스터디 사이트에 들어가게 되면 우측 하단의 카카오톡 버튼을 통해 쉽게 오픈카톡방으로 이동할 수 있습니다. 오픈카톡방에서는 각자 자유롭게 스터디 참여코드를 올리고, ..
협업 프로젝트 과정에서 새로운 버전을 배포하기 위한 작업을 하던 도중이었습니다. MySQL 이벤트를 통해 스키마 변경 및 데이터 조작을 진행하고자 하였고, 다음과 같은 스크립트를 작성했습니다. delimiter && create event if not exists v_1_1_1 ON SCHEDULE AT '2023-09-21 04:00:00' DO BEGIN set autocommit = false; # DDL rename table pomodoro_room to pomodoro_study; alter table participant_code add column pomodoro_study_id bigint not null; update participant_code join pomodoro_study o..
현재 스프링 구조에 대한 학습을 진행하고 있습니다. 백엔드 개발을 하면서 다양한 스프링 지원기술들을 사용해왔지만, 정작 이 기술들이 왜 생겨나게 되었는지, 스프링은 왜 등장했는지에 대해 명확히 이해하지 못했던 것 같습니다. 따라서 이번 아티클을 통해 스프링의 등장 배경을 정리해보도록 하겠습니다. 들어가면서 사실 스프링이 등장하기까지는 많은 발전 과정이 존재했습니다. 초기 WWW 모델을 거쳐 CGI, Servlet, JSP 기술이 등장한 뒤에서야 스프링이 등장하게 되었습니다. 그렇다면 스프링은 어떤 문제를 해결하기 위해 등장한걸까요? CGI, Servlet, JSP의 특징을 알아보면서 스프링이 등장하게 되었던 당위성을 이해해보고자 합니다. CGI WWW이 발전함에 따라, 정적 웹페이지가 아닌 동적 웹페이지..