전체 글

우아한테크코스 5기 테오입니다.
기타

Pull Request와 Merge branch(feat. CI)

들어가면서 하루스터디 팀은 Github Actions를 사용해 CI 환경을 구축하고 있습니다. 즉, Pull Request가 발생할 때마다 자동으로 빌드와 테스트를 진행해 코드가 병합되어도 되는지를 판단해줍니다. 이를 통해 코드가 병합되었을 때의 파급효과를 최소화할 수 있습니다. 그런데 이런 기능은 어떻게 동작하는 걸까요? 아직 merge도 하지 않았고, Pull Request만 보냈을 뿐인데 어떻게 통합된 코드를 빌드하고 테스트할 수 있는 것일까요? 그 해답은 Pull Request에 있습니다. Pull Request는 단순한 merge 요청 이라고 생각하기 쉽상이지만, 사실 숨겨진 원리가 존재하기 때문입니다. 그리고 이 숨겨진 원리를 안다면 Pull Request를 활용한 CI 파이프라인을 보다 쉽게..

회고

경희대학교 개발자 커뮤니티 '링쿠' 개설 회고

동기는 무엇이었을까 우테코 수료 이후, 학교로 돌아가게 되면서 '내가 무엇을 할 수 있을지'에 대한 고민이 많았다. 주변 크루들은 대부분 졸업을 하고 온 터라 취업 준비를 하는데, 나는 아직 1년이라는 시간이 남았기 때문이다. 그런 상황에서 포비와의 상담을 통해 '스터디를 직접 만들어보는게 어떻겠느냐' 라는 피드백을 들었고, 바로 실행에 옮기기로 했다. 그렇게 고민하지 않았던 배경에는 5기 주노와 같이 벌써 비슷한 계획을 진행중인 크루도 있었기 때문이다. 늘 학교를 다니면서 프론트엔드나 백엔드에 대해 학습할 기회가 없다는 느낌을 많이 받았었다. 컴퓨터공학과 정규 과정에서는 당연히 포함되어 있지 않고, 결국은 대외동아리 활동으로 배우는 친구들이 많았다. 우테코를 수료한 지금은 어느정도 웹에 대한 지식은 있..

우테코 5기

우아한테크코스 5기 회고

우아한테크코스 과정이 종료되었다! 벌써 시간이 이렇게 빠르게 흐르다니..🥲 약 10개월간의 여정이 처음에는 길게 느껴졌었는데, 지금 와서 돌이켜보니 그렇게 길지만은 않았던 것 같기도 하다. 이 과정에서 많은 것들을 느꼈고, 배웠고, 성장했다. 단순히 기술적인 성장을 넘어서서 인격적인 성장, 그리고 내 삶에 대해 고민을 많이 했던 계기였다. 그리고 부족했던 점들에 대해서도 느끼는 순간이 많았다. 우아한테크코스의 마지막 회고라는 사실이 아쉽기는 하지만, 담백하게 지난 1년을 되돌아보려고 한다! ㅎㅎ기술적 성장우테코에 합류하기 전까지는 백엔드 개발자의 'ㅂ'자도 몰랐다. 정확히 어떤 업무를 담당하는 건지도 잘 몰랐다. 프리코스를 시작할 때에는 자바조차도 알지 못해서 고생했던 기억이 난다. 지금 되돌아보면 어느..

인프라

도커에서 데이터를 관리하는 방법

도커를 활용한 서비스 마이그레이션을 진행하고 있습니다. 이번 아티클에서는 도커에서 데이터를 관리하는 방법에 대해 알아봅니다. Writable Layer의 휘발성 & 성능 이슈 도커 컨테이너는 실행 중 저장되는 정보를 Writable Layer (혹은 Container Layer라고도 불립니다)에 저장합니다. 그런데 이런 Writable Layer는 컨테이너가 삭제되면 같이 삭제된다는 특징을 갖고 있습니다. 따라서 어떤 데이터가 영구 저장되어야 한다면 컨테이너 내부에 저장하는 것은 좋지 못한 선택입니다. 또한 데이터가 영구적으로 저장될 필요가 없다고 하더라도 컨테이너 내부의 파일 시스템에 데이터를 저장하는 것은 지양되는 경우가 많습니다. 컨테이너 내부의 파일 시스템은 UFS(Union File System..

우테코 5기

[레벨 4 회고] 레벨 4 레거시 코드 리팩토링 미션 회고

레벨 4는 프로젝트로 바빠 미션에 대한 회고는 여태 작성하지 못했었는데, 마지막 미션에서는 얻은게 상당한 것 같아 회고를 작성하게 되었습니다. 레거시 코드 리팩토링 미션은 기존의 절차지향적으로 작성된 코드를 단계적으로 리팩토링 및 보완하는 미션입니다. 비즈니스 요구사항 분석하기 step1 의 요구사항은 비즈니스 요구사항을 분석하고 테스트 코드를 작성하는 것이었습니다. 처음 주어진 코드는 빈약한 도메인 모델을 사용하고 있었을 뿐만 아니라 서비스에 모든 로직이 쏠려 있는 트랜잭션 스크립트 패턴으로 구성되어 있었습니다. 또한 문서라고 할만한 게 전혀 없었기 때문에 오로지 코드로부터 요구사항을 분석해야 했습니다. 얼추 기능목록은 뽑아내긴 했으나 코드만으로 비즈니스를 유추하기에는 모호한 부분도 존재했습니다. 도메..

우테코 5기

데이터베이스 호환성을 고려한 무중단 배포 진행하기

배경현재 하루스터디라는 서비스를 개발하고 있습니다. 하루스터디는 효율적인 학습 사이클을 제공하는 서비스로, 학습 전 후로 계획 및 회고 작성을 권장함으로써 학습 방법에 대한 빠른 피드백을 가능하게 해 줍니다. 이런 학습 사이클은 여럿이서도 진행할 수도 있고, 혼자서도 진행할 수 있습니다. 그런데 사실 이전까지는 여럿이서 하루스터디를 사용하더라도 진행상황이 동기화되지 않았습니다. 누구는 계획 단계, 누구는 회고 단계일 수 있다는 이야기입니다. 그리고 진행상황을 동기화해 달라는 사용자 피드백에 따라 새로운 버전에서는 동기화된 버전을 제공할 예정이었습니다. 하지만 문제가 여럿 발생했습니다. 스터디 중간에 버전이 바뀐다면?우선 이전 버전에서는 '진행도'라는 개념이 사용자마다 존재했습니다. 따라서 누구는 계획을 ..

Spring

물리 트랜잭션과 논리 트랜잭션, 그리고 트랜잭션 전파에 관하여

트랜잭션 경계 여러 작업을 하나의 논리적인 단위로 묶고 싶을 때 트랜잭션을 사용합니다. 트랜잭션은 시작하는 방법은 하나이지만 끝나는 방법은 두 개가 존재합니다. 하나는 롤백(rollback)이며, 다른 하나는 커밋(commit)입니다. Connection connection = dataSource.getConnection(); connection.setAutoCommit(false); // 트랜잭션 경계 시작점 doSomeThing(); connection.commit(); // 트랜잭션 경계 끝점 그리고 트랜잭션을 시작하고 끝내는 작업을 설정하는 걸 '트랜잭션 경계설정'이라고 하고, 트랜잭션 경계 내에서 논리적으로 묶이길 원하는 로직들이 실행되게 됩니다. 물리 트랜잭션과 논리 트랜잭션 스프링에서는 트랜..

Spring

쉽게 이해해보는 DispatcherServlet

스프링을 공부하면서 DispatcherServlet에 대한 이야기는 많이 들었음에도 불구하고 이해가 쉽게 되지 않았던 적이 많았습니다. 이름 자체부터 추상적이기도 하고, HandlerMapping, HandlerAdapter 등 낯선 용어들이 너무 많았기 때문입니다. 따라서 이번 아티클에서는 누구나 쉽게 이해할 수 있도록 DispatcherServlet의 역할에 대해 작성해보고자 합니다. 저만의 언어로 풀어쓴 것이기에 많은 부분을 추상화했다는 점 참고해 주시면 감사하겠습니다. DispatcherServlet 모든 클래스에는 해당 클래스의 역할을 기술하는 네이밍이 주어집니다. 그렇다면 DispatcherServlet이라는 이름을 잘 해석하면 해당 클래스의 역할을 유추해 볼 수 있지 않을까요? Dispatc..

우테코 5기

[레벨 4 회고] 하루스터디 사용자 유치 - 2

사용자 유치를 시작한 지 이제 2주 정도 지난 것 같습니다. 마찬가지로 사용자 유치 과정에서 어떤 시도를 했고 어떤 결과를 얻었는지를 기록하고자 합니다! 하루스터디, 제휴 맺다! 저번 회고에서도 언급했다시피 하루스터디를 교육 프로그램에서 사용하고 싶다는 제안을 주신 분이 계셨는데요, 외부 서비스와의 연동은 나름 민감한 사항이라고 여겨질 수 있었기에 코치님들께 문의를 드렸었습니다. 그리고 얼마 전에 코치님께서 '하루스터디 팀이 원한다면 사용을 허가해도 된다'라고 말씀해 주셨습니다 👏 따라서 제안을 주신 분과 함께 게더에서 미팅을 진행했는데요, 하루스터디의 백그라운드를 소개하고 간단한 질의응답 시간을 가졌습니다. 마코가 대표로 발언을 하고 나머지 팀원들은 경청을 하는 자리였는데 좋은 분위기로 미팅이 잘 진행..

Database

DataSource 별 성능 테스트하기 & HikariCP의 성능은 왜 좋을까?

스프링부트의 공식 문서를 보면 다음과 같은 문구가 있습니다. 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가 얼마나 빠른지 직접 체감해 ..

teo_99
테오의 학습기록