본문 바로가기

분류 전체보기

(14)
삶의 지도 글또 10기에 지원하기 위해 작성한 글입니다. [공대와 거리가 먼 문과생] 고등학생 때 문과생이였고 자연스래 문과 학과로 진학했다. 국제 정치에 대해 배우는 학과로 수업은 나름 재밌었다. 어릴 때부터 호기심이 많아 대학에서 새로운 것을 배운다는 것만으로도 즐거웠었다. 하지만 당시 '문송합니다'가 유행했고, 졸업 후 취업을 생각하면 막막함한 있었다. 그래서 반수를 통해 조금이라도 취업이 잘된다는 경영학이나 경제학을 가고자 했다. 하지만 열심히 하지 않았으니 당연히 반수는 실패했다. [특별한 21살 ✨] 성인이 되는 나이인 20살은 특별한 나이다. 나에게 20살은 그리 특별하지 않았다. 반수한다고 학점 관리에 소홀히 했고, 휴학도 했고, 친구랑 어울리지도 않았다. 그렇다고 수능 공부를 열심히 한 것도 아니었..
2024 스프링 캠프 다녀온 후기 지난 5월 25일 토요일 2024 스프링 캠프에 다녀왔다. 인프런에서 참여자를 모집했는데 1분만에 마감될 정도로 치열했다. 치열했지만.. 나는 성공해서 다녀오고 이렇게 후기까지 작성하고 있다😁 올해 1월에 개발자 컨퍼런스를 다녀온 이후로 두 번째 컨퍼런스이다. 같이 듣는 데브코스 사람들과 근처에서 간단하게 점심을 먹고 컨퍼런스장으로 향했다. 들어서자마자 등록을 한 뒤 키트를 나눠주셨는데, 손 선풍기, 키캡, 리무버 스티커였다. 부모님이 손 선풍기를 사용해보시더니 바람이 세다고 좋아하셨다. 컨퍼런스에서 들은 세션은 총 다섯 개로 동시성의 미래 - 코루틴의 버츄얼 스레드, Spring AI : LLM에도 봄이 찾아오다, 왜 나는 테스트를 작성하기 싫을까?, 실전! MSA 개발 가이드, AutoParams를..
2024 DND 해커톤 참여 후기 개발자 오픈 채팅방을 통해 IT 연합 동아리인 DND에서 해커톤이 열린다는 소식을 들었다. 개발자를 지망했을 때부터 해커톤을 참여하고 싶었기에 지원서를 작성했다. (컴퓨터를 전공했으면 해커톤은 해봐야지라고 생각했던것 같기도...) 지원서에는 경험을 바탕으로 사이드 프로젝트의 열정과 협업을 통한 성장을 지향함을 드러냈다. 합격 발표 시간이 되었을 때 두근거리는 마음으로 메일함을 열어보니 기쁘게도 선발이 되었다는 메일을 도착해있었다.  해커톤 시작 일주일 전부터 디스코드에 참여해서 팀 빌딩을 했다. 나는 감사하게도 데브코스에서 인연을 맺은 분이 컨택을 해주셨고 팀 빌딩을 마칠 수 있었다. 우리 팀은 온라인 미팅을 통해 미리 공개된 키워드, 일상과 지역에 부합하는 주제를 생각해봤다. 그리고 백엔드끼리 따로 모..
[아키텍처] 사용자 수에 따라 시스템 설계하기 한 명의 사용자를 지원하는 시스템에서 시작하여 몇 백만 사용자를 지원하는 시스템을 설계하자.단일 서버와 데이터베이스모든 컴포넌트가 단 한 대의 서버에서 실행되는 간단한 시스템을 설계하면 아래 그림과 같다. 웹 앱, 데이터베이스 캐시 등이 전부 서버 한 대에서 실행된다.  사용자가 늘면 서버 하나로는 충분하지 않아서 여러 서버를 두어야 한다. 웹과 모바일 트래픽을 처리하는 서버(웹 계층)와 데이터베이스 서버(데이터 계층)을 분리하면 각각을 독립적으로 확장해 나갈 수 있다.  관계형 데이터베이스는 자료를 테이블과 열, 칼럼으로 표현한다. SQL을 사용하면 여러 테이블에 있는 데이터를 그 관계에 따라 join하여 합칠 수 있다. 반대로 비 관계형 데이터베이스인 NoSQL은 일반적으로 join 연산은 지원하지 ..
[DB] MySQL 엔진 아키텍처 파헤쳐보기 MySQL 전체 구조4MySQL의 전체 구조는 MySQL 엔진, 스토리지 엔진, 핸들러 API으로 나뉜다.MySQL 스레딩 구조MySQL 서버는 프로세스 기반이 아닌 스레드 기반으로 동작한다. MySQL 서버에서 동작하는 스레드는 포그라운드(Foreground) 스레드와 백그라운드(Background) 스레드로 구분된다. 포그라운드(Foreground) 스레드는 최소 MySQL 서버에 접속된 클라이언트의 수만큼 존재한다. 그리고 커넥션 종료 후 스레드 캐시(Thread cache)로 돌아간다. 포그라운드 스레드는 MySQL의 데이터 버퍼나 캐시로부터 가져오고 없으면 직접 디스크의 데이터나 인덱스 파일로부터 데이터 읽어오는 역할을 한다. 다만 InnoDB는 데이터 버퍼나 캐시까지만 포그라운드 스레드가 처리..
[트러블 슈팅] 인덱스 컨디션 푸시다운, 인덱스를 이용한 정렬, 커버링 인덱스로 슬로우 쿼리 튜닝하기 도입지난 글에서 단건 반복 쿼리를 벌크 SELECT 쿼리로 변경함으로써 n + 1문제를 해결했다. 더 나아가 JMeter로 성능 테스트를 진행하여 얼만큼 성능이 높아졌는지 비교해보았다. 이번 글에서 실행 계획을 분석하고 쿼리를 튜닝한 뒤 다시 JMeter로 성능 테스트를 진행한 경험을 소개한다. 인덱스 생성과 인덱스 컨디션 푸시다운n + 1 문제를 해결한 /api/v1/missions/matching 엔드포인트는 쿼리가 총 3번 전송된다. 아래는 첫 번째로 전송되는 쿼리이다. 미션(missions), 미션 카테고리(m_categories), 지역(regions), 미션 북마크(mission_bookmarks) 총 4개의 테이블을 조인하고 있다. 그리고 미션에 10만개, 미션 카테고리에 8개, 지역에 42..
[트러블 슈팅] n + 1 문제를 IN절로 해결하기 도입원데이히어로 프로젝트에서 이미지 조회 시 n + 1 문제가 발생했다. 그래서 In절로 n + 1 문제를 해결하고 더 나아가 쿼리를 튜닝하여 성능을 개선하였다. 이번 글에서는 In절로 n + 1 문제를 해결한 경험만 이야기해 보겠다. 실행 계획을 통해 슬로우 쿼리를 튜닝한 경험은 다음 글에서 작성해 볼 계획이다. 객체 사이의 관계n + 1 문제 상황을 설명하기 전에 객체 사이의 관계에 대해 설명해 보겠다. 프로젝트 내 미션(Mission)이라는 도메인이 있다. 여기서 미션은 프로젝트 내 도메인 용어로 벌레 잡기, 포장, 청소처럼 소소한 일거리를 뜻한다. 미션은 이미지를 최대 5개 가질 수 있으므로 미션과 미션 이미지는 OneToMany 관계이다.  먼저 객체 참조와 아이디 참조 중 어떤 참조 관계를 선..
제 1회 게으른 개발자 컨퍼런스 다녀온 후기 게으른 개발자 컨퍼런스2024 게으른 개발자 컨퍼런스에 초대합니다.lazyconf.dev 데브코스 멘토님을 통해 알게된 컨퍼런스로 주니어 백엔드 개발자 대상이라 한 번 신청해보았다. 100명 랜덤 추첨이었고 이런 운은 없는 편이라 기대도 안했다. 그런데 메일을 열어보니, 우와! 선정되었다! 주변에 선정되신 분이 딱 한 분이었고 함께 듣기로 했다.   들었던 세션은 분산 트랜잭션 : 과거와 현재, 소비자 관점의 API 설계 패턴, JPA Patterns, 신규 서비스 개발기, 2년차 주니어 개발자의 성능 개선 도전기 순이다. 내 첫 컨퍼런스였기에 꽤 설레는 마음으로 컨퍼런스로 향했다.분산 트랜잭션 : 과거와 현재분산 시스템과 분산 서비스가 왜 등장했는지부터 시작해서 분산 트랜잭션의 발전 과정에 대한 내용이..
[트러블 슈팅] 리팩토링을 통한 복잡했던 모듈 구조를 단순화 도입지난 글, [트러블 슈팅] 레이어별 멀티 모듈 적용 (과도한 모듈 분리로 실패🤪) 에서 레이어 간 단방향 의존 관계를 갖도록 레이어 별로 모듈 분리를 시도했다. 그러나 과도한 분리로 인해 모듈 구조가 복잡해졌고 결국 실패로 이어졌다. 이번 글에서 복잡했던 멀티 모듈 구조를 리팩토링을 통해 단순화한 경험을 이야기하겠다.과도하게 분리된 모듈을 하나의 모듈로계층마다 독립적이고 관심사가 다르므로 모듈화를 통해 응집도를 높이려고 했다. 그리고 레이어드 아키텍처에서 단방향 의존 관계를 가져야 하므로 모듈의 의존 방향을 통해 제약을 걸어주었다. 그러나 아키텍처를 모듈과 일치시키려는 강박 때문에 모듈 구조가 너무 복잡해졌다. 그리고 구현에 대한 깊은 이해도 없이 성급하게 모듈화를 진행시켰다. 결국 과도한 추상화로..
[트러블 슈팅] 레이어별 멀티 모듈 적용 (과도한 모듈 분리로 실패🤪) 도입 원데이 히어로 프로젝트는 멀티 모듈 단일 프로젝트이다. 프로젝트에 멀티 모듈을 적용하면서 트러블슈팅을 겪었다. 이번 글에선 프로젝트 내에서 과도한 모듈 분리로 인한 실패 경험을 소개하고자 한다. 단어 그대로 실패 경험이니 우리처럼 하지 마세요!라는 글이다. 먼저 멀티 모듈을 왜 적용했고 어떻게 모듈을 나눴는지 그리고 발생했던 문제와 해결하긴 했지만 왜 잘못된 설계인지 이야기해보겠다. 멀티모듈이란 멀티 모듈을 왜 사용할까? 멀티 모듈은 역할과 의존성 분리를 통해 시스템의 분리, 통합을 유연하게 만들어 줄 수 있는 좋은 아키텍처를 만들 수 있다. MSA에서 멀티 모듈이 부각되곤 하는데, 멀티 모듈을 활용해 역할과 의존성을 잘 분리한다면 모놀리틱에서 MSA로 용이하게 전환될 수 있다.  잘 설계된 멀티 ..