본문 바로가기

전체 글29

[서평] - 그림과 실습으로 배우는 쿠버네티스 입문 개요컴퓨터공학을 졸업하고 개발자로서 취업을 한다면 분야가 어떻게 될까?내 경험 상 다음과 같이 나눌 수 있을 것 같다. 1. 웹 프론트엔드2. 앱 프론트엔드3. 백엔드 (DB 포함)4. 인프라, 운영 (클라우드 포함)5. 임베디드 개발자6. AI 개발자 (데이터 사이언스 포함)7. 보안8. 핀테크 (블록체인 포함)그외 QA 엔지니어나 PM 등도 있다. 그 밖에도 굉장히 많은 분야가 있겠지만 내 주변 학생들을 보면 이 범주를 크게 벗어나지 않는다. 이중 백엔드, 프론트엔드 개발자가 가장 많다. 진입장벽이 낮은 탓도 있고, IT 기업의 대다수가 웹, 앱 서비스 기반인 이유도 한 몫할 것이다. 그럼 인프라, 운영 엔지니어는 어떤가?서비스를 만들면 배포, 운영은 필수이기에 인프라 엔지니어에 대한 수요는 많.. 2025. 12. 2.
[서평] - 그림으로 이해하는 도커와 쿠버네티스 개요Docker를 처음 알게된 건 큐시즘 세션을 통해서였다.EC2에 jar 파일을 실행하는 방식을 고수해오던 나에게 컨테이너라는 개념은 생소했고, 이해하기가 쉽지 않았다.특히나 컨테이너, 볼륨, 컴포즈 등 처음 듣는 단어들이 많았고, 그 때문에 혼란을 겪었던 것 같다. Docker는 내게 두려운 존재였다. Docker의 존재만 알고 애써 외면해왔는데, 작년 12월에 진행했던 프로젝트에서 무중단 서비스에 대한 요구사항을 받게 되었다...!!무중단 서비스를 구현함과 동시에 클라우드 환경에서 베어메탈 서버로 마이그레이션 해야할 가능성도 염두해두어야 했다. 맞다. Docker를 사용해야 한다. 맨 땅에 헤딩하며 진행했던 자세한 과정은 다음 포스팅에 정리해두었다. https://sinabroit53.tis.. 2025. 11. 30.
Naive한 HTTP 요청/응답을 parsing 할 때 주의점 개요현대 소프티어 백엔드 1주차 과제로 spring을 쓰지 않고 tcp socket 연결을 통해 웹 서버를 구현하는 실습을 진행 중이다.이전에 KUIT 3주차 과제에서 진행했던 경험이 있고, '네트워크 프로그래밍'이라는 과목에서 java로 멀티 스레드, socket 통신을 구현한 바 있기에 크게 어렵진 않았다고 생각했다. 구현을 마치고 의기양양해 있었는데 1주차 피드백에서 대차게 까였다.까인 이유 중 하나는 HTTP 프로토콜에 대한 이해 부족이었다. HTTP/1.1과 HTTP/2, HTTP/3 의 차이를 잘 알고 있는가?method, http-version, Header에서 대소문자 구분을 허용하는가?OWS를 허용하는 부분은 어디까지인가?header에서 key와 콜론 사이에 공백은 허용하는가?유니코드로 .. 2025. 7. 13.
바람직한 Exception 처리 (토비의 스프링 Chapter 4) 개요이전 포스팅에서 말했듯이 마크다운 파일에서 바로 업로드 하는거라 형식 오류가 있을 수 있다.내용279p ~ 315p4.1 사라진 SQLException3장에서 만들었던 JdbcContext 클래스를 JdbcTemplate으로 바꾸는 과정에서 SQLException 을 throw 하는 로직이 없어졌다.public void deleteAll() throws SQLException{ this.jdbcContext.executeSql("delete from users");}public void deleteAll(){ this.jdbcTemplate.update("delete from users");}4.1.1 초난감 예외처리예외 블랙홀try{}catch(SQLException e){ // 아무것도.. 2025. 5. 17.
템플릿/콜백 패턴 이해하기 with JdbcTemplate (토비의 스프링 Chapter 3) 개요이전 포스팅에서 말했듯이 마크다운 파일에서 바로 업로드 하는거라 형식 오류가 있을 수 있다. 내용209p ~ 278p 템플릿이란변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜주는 기능을 말한다. 계속 개선 해오던 UserDao 코드를 통해 템플릿을 소개한다. 3.1 다시 보는 초난감 DAO3.1.1 예외처리 기능을 갖춘 DAO 기존 UserDao도 많은 부분이 개선되었지만 예외 상황에 대한 처리가 아쉬웠다.특히나 deleteAll() 이라는 메서드를 보면 예외처리가 전혀 안되어 있음을 확인 할 수 있다. public void deleteAll() throws SQLExcpetion{ Connection c = data.. 2025. 5. 10.
Spring Test 동작원리 이해하기 (토비의 스프링 Chapter 2) 개요이전 포스팅에서 말했듯이 마크다운 파일에서 바로 업로드 하는거라 형식 오류가 있을 수 있다.내용145p ~ 207p 토비는 스프링이 개발자에게 제공하는 가장 중요한 가치는 객체지향과 테스트 라고 한다.1장에서 객체지향 좀 배웠으니까 2장에선 테스트에 대해서 살펴본다. 스프링으로 개발하면서 테스트를 만들지 않는 것은 스프링의 가치를 절반 포기하는 것이라고 한다.😱 스프링에서의 테스트는 작은 단위의 테스트가 가능하도록 해준다. --> 단위 테스트 초기에는 테스트 코드를 작성하는 것의 장점에 대해서 줄줄 설명한다. UserDaoTest 코드 개선여기서도 1장에서처럼 코드를 개선해나가며 테스트의 개념을 설명한다.1장에서 UserDao 클래스의 동작을 검증하기 위해 만들었던 UserDaoTest 라는 코드를.. 2025. 5. 10.
IoC/DI를 이용한 객체지향 설계 (토비의 스프링 Chapter 1) 개요재연이 형이랑 주언이 형이랑 항상 하는 스터디에서 새로운 책을 공부하기로 했다. 처음엔 집콕 서버 리팩토링두 번째는 모던 자바 인 액션 책이번에는 토비의 스프링 책 공부다. 이미 chapter 3까지 공부했는데,그동안 나는 공부한 내용을 옵시디언 툴을 사용해서 마크다운 파일로 정리하고, 이를 깃헙에 WIL 레포에 올렸다. 근데 이렇게만 하니 뭔가 허전해서 블로그에도 포스팅을 하려고 한다.사실 블로그 포스팅할게 없어서 이걸로 때우는... 그리고 책 공부 포스팅은 아마 마크다운으로 정리한 걸 그대로 올리는 식으로 쓸 예정이라글 형식이 이쁘지 않을 것 같긴하다. 내용 53p ~ 144p스프링은 자바의 객체지향 프로그래밍을 지향하는 프레임워크 (강제는 x)오브젝트의 관리를 적극적으로 도와준다.[!note].. 2025. 5. 10.
[Network] 분산 시스템을 위한 네트워크 설정 (VMware Fusion / Ubuntu 22.04) 개요최근 OpenStack 스터디도 하고, Hadoop 실습을 진행하고 있어서 VM에서 network 설정을 해줘야하는 경우가 많았다. 하지만 나는 network 라고는 학과 수업 하나를 들은게 다라서 실습에 있어서는 사실상 처음이다. 이번 기회에 network 기본 개념을 익히며, vm과 ubuntu 에서 network 설정을 하는 법을 공부했다.그 과정을 정리하려고 한다. 기본개념network 설정하기에 앞서서 network에 대한 기본 개념을 알아야 한다.network 개념을 전부 다룰 순 없고, 이 포스팅을 이해할 수 있을 정도만 정리 한 번 하고 가자. network를 생성한다는 것network를 생성한다는 것이 의미하는 바가 뭘까? 나는 이렇게 이해했다. '컴퓨터 간 통신할 수 있는.. 2025. 3. 30.
[백엔드] 도메인 간 의존성을 완전 분리시킬 수 있나? 개요집콕 프로젝트 쿼리 최적화를 했던 스터디를 계속 진행중이다. 집콕 프로젝트 쿼리 개선이 만족할만한 결과를 내었다고 판단해서 현재는 '모던 자바 인 액션' 이라는 책을 통해 자바 8,9,10 개념을 공부 중이다. 스터디에서는 책에 대한 내용 뿐만 아니라 각자 공부, 프로젝트 활동하면서 겪었던 이슈들을 공유하곤 하는데,어느날에 도메인 간 의존성 분리에 대한 내용이 나왔고, 당시에 토론한 것을 정리해보고자 한다. 상황상황은 다음과 같다. 전체 시스템을 여러 도메인으로 분리해서 다루고 싶었다.spring boot 프로젝트에서 패키지를 분리하고 각 패키지의 클래스 간 호출(의존성)을 없앤다. 그리고 DB에서도 도메인 간 연관관계를 다 끊는다.  즉, 각 도메인을 별도의 VM에 올려도 의존관계에서 전혀 문제가 .. 2025. 3. 30.
[ToHero 백엔드 개발일지] NGINX로 웹 프론트, WAS 요청 분리하기 && 웹 프론트 CICD 환경 구축하기 (근데 저장공간 관련 트러블 슈팅을 곁들인) 개요Tohero 서비스의 프론트는 웹이다. 그래서 서비스 배포를 할 때 정적 파일을 반환하는 웹 서버가 필요했다. 서비스를 한창 개발할 때는, 편의를 위해서 프론트 배포, 백엔드 배포 환경을 따로 해서 각자 진행했었다.  서비스를 배포할 때가 되어서 어떤 식으로 배포를 진행할지 고민을 하다가 2가지 방법을 떠올렸다. 도메인 주소를 하나 더 사서 기존 프론트 배포 서버(WAS랑은 분리된)를 Record로 등록하기현재 WAS가 연결된 도메인 주소에서 NGINX로 요청에 따른 응답 분리하기 현재 DNS 주소가 https://tohero.co.kr 인데 (.com 이름은 이미 누가 사용중이었다...) 새로운 DNS 주소를 또 사는 건 비용적으로나 개발적으로나 안 좋은 것 같아서 하나의 서버로 합치기로 결정했다... 2025. 3. 10.
[ToHero 백엔드 개발일지] 확장성 있는 계층적 데이터 구조에 대한 고찰 개요작년 이맘 때, 나는 내 첫 프로젝트인 집콕을 한창 개발하고 있었다. 백엔드가 처음이기도 했고, 많은 기능들을 한달 조금 넘는 시간동안 개발해야 했기에 성능이나 확장성에 대한 고려를 크게 하지 못했다.   그리고 나서 호기롭게 도전했던 리팩토링... 집콕 서비스를 완성했을 당시, 우매함의 봉우리에 있던 나는 리팩토링 스터디를 하면서 다시 겸손함을 배웠다. 그리고 동시에 큐시즘을 하면서 만난 고수 분들을 통해, '세상은 넓고 천재들은 많다' 라는 진리를 다시금 상기시킬 수 있었다.  잘하는 형들, 멘토분들과 함께 프로젝트를 하면서 나는 백엔드적인 고민을 하는 법을 배웠다. 단순 기능 개발이 전부인줄 알았던 내가 효율적인 설계, 더 나은 코드에 대한 고민을 하기 시작한 것이다. 3-1 학기를 기점으로 나.. 2025. 1. 25.
[ToHero 백엔드 개발일지] Blue-Green 무중단 배포 with Docker 개요큐시즘에서 만난 좋은 인연 중 한 명인 기획자 형이 같이 서비스 하나 개발해보자고 좋은 제안을 주었다. 근 1년 간 준비했던 우테코 7기에 떨어지고 계획했던 일정들이 날라가면서 공허함을 느끼고 있던 찰나에 다시 열정을 불태워 볼 수 있는 좋은 기회였다. 형 주변에 잘하시는 개발자 분들이 많았던터라 내가 제안을 받았음이 의아하면서도 굉장히 감사했다. 뭔가 위로를 받는 기분이라 카톡 화면을 캡쳐해두었다. (대헌이형, 건우형, 굿머닝.. 큐시즘을 통해 알게된 좋은 인연이 진짜 많은 것 같다) 제안을 받고 한다고 결정했을 때에는 설렘 반, 걱정 반이었다. 나에게 제안을 준 형의 기대를 저버리고 싶지 않았기도 하고 같이 하시는 기획, 디자인, 프론트 분들이 잘하시는 분들이라 내가 민폐를 끼치진 않을까 싶었다... 2024. 12. 26.
우당탕탕 Bulk INSERT 도입기 1. 개요집콕 프로젝트를 리팩토링 하면서 쿼리 최적화를 진행했다.기존 코드에서 쿼리는 stream 내부에서 발생되는 등 무분별하게 사용되었다. 그래서 초창기 집콕 서버를 nGrinder로 성능 측정 해보면 TPS가 엄청 낮게 나오는 것을 확인했었다. 집콕 서버 리팩토링 스터디를 하면서 손꼽은 문제 중 하나가 쿼리 최적화였고 상반기-여름방학 동안 리팩토링을 진행했다. (리팩토링에 대한 자세한 내용은 따로 포스팅으로 다루었다.) RealEstate 도메인 리팩토링Kok 도메인 리팩토링User 도메인 리팩토링쿼리 최적화를 하면서 가장 큰 골칫덩어리는 무분별하게 발생되는 INSERT/UPDATE/DELETE 쿼리들이었다. 집콕에서는 User마다 Kok의 내부 설정을 변경할 수 있는 기능이 있는데, 처음 User.. 2024. 9. 14.
User 도메인 API 코드 개선 및 쿼리 최적화 - 집콕 서버 리팩토링(3) 7주 차 스터디에서는 User 도메인에 있는 API들에 대해서 코드 리팩토링과 쿼리 최적화를 진행했다. 집콕 서비스는 카카오 로그인을 하기 때문에 내부적으로 아이디/비번을 다루지 않는다. 카카오에서 인증을 마치고 이메일과 회원가입 형식을 입력하면 JWT token을 발급해 주는 형식으로 이루어져 있다.  User 도메인에 있는 API는 총 10개로, 다음과 같다.    프로젝트를 한차례 진행해보고 나니 API를 이렇게 많이 만들 필요가 없었다는 것을 이제 느낀다. 당시에 만들었던 API 들을 보면, 마이페이지 API, 마이페이지 수정 페이지 API 등 (둘 다 user의 정보를 불러오는 API이다.) 이렇게 비슷한 기능을 하는 API를 분리시킬 필요가 없었다. 둘 다 프론트 경험이 없다 보니 정보를 캐싱.. 2024. 9. 11.
Kok 도메인 API 코드 개선 및 쿼리 최적화 - 집콕 서버 리팩토링(2) 저번에 이어서 계속 코드 리팩토링과 쿼리 최적화에 대한 내용이다. 저번에는 RealEstate 도메인에서 가장 중요한 GET /realEstate 라는 API 에 대해서 리팩토링을 진행했었다. 저번과 마찬가지로 최우선적으로 수정하고자한 부분은 코드의 객체지향화와 발생 쿼리를 최소한으로 유지시키는 것이 목표였다. 이번에는 우리 집콕의 핵심 기능이라고 할 수 있는 Kok 도메인에 대한 API이다.Kok은 사용자가 발품을 팔면서 느낀점, 사진, 별점, 후기, 체크리스트 등을 등록해두어서, 나중에 다시 보더라도 그때 겪은 느낌을 생생히 다시 전달하여 매물에 대한 비교분석이 쉬워지도록 하는 기능이다. 체크리스트는 사용자 별로 커스텀이 가능하지만 디폴트로 제공되는 항목들이 있어서 매물을 볼 때 어떤 점을 확인해야 .. 2024. 8. 18.
Docker 와 Kubernetes 적응하기 컴퓨터를 공부하다보면 정말 다양한 프레임워크와 툴들이 존재한다. 그런 것들을 잘 활용하면 많은 이점이 있지만 적응하기까지 조금 시간이 걸린다. Git과 GitHub도 그랬고, Spring Boot 도 그랬다. 이번 2024 오픈소스 컨트리뷰션 아카데미를 하면서 나는 ArgoCD에 대한 컨트리뷰션을 해볼 수 있게 되었다. ArgoCD를 이해하기 위해선 배경지식이 필요한데 그것이 Docker 와 Kubernetes 이다. 계속 공부해야지 해야지 하면서 미루다가 2주차 과제로 'Helm을 이용해서 k8s에 이미지 배포해보기' 가 나오면서 더이상 미룰 수 없게 되었다. Docker 는 큐시즘 29기 백엔드로 활동하면서 사용해본적 있다. 하지만 개념도 모르고 그냥 Dockerfile 복붙해서 GitHub .. 2024. 8. 13.
RealEstate 도메인 API 코드 개선 및 쿼리 최적화 - 집콕 서버 리팩토링(1) 서론이건 2024 상반기 학기 중에 진행했던 내용이다. 저번 포스팅에 정리했듯이 학기 중에는 각자 할 일이 많아서 크게 진도 나가지 못했다. 학기 중에는 nGrinder 환경 세팅을 좀 하고 RealEstate 도메인 API 개선을 좀 했다. 3개의 큰 도메인 중 (RealEstate, User, Kok) 왜 RealEstate를 먼저 했냐면 메인 화면의 지도에서 보여지는 매물을 조회하는 API 가 있어서 중요하다고 판단했고, 해당 API 에서 발생되는 쿼리가 302개나 되어서 가장 먼저 해보기로 했다. (요청 하나 당 쿼리가 302개면 이 API는 쓸모없게 되는거 아닌가...??) 개선 전 우리가 살펴본 API는 메인 화면 지도에서 보여질 매물을 반환하는 API이다. 메인화면 지도가 줌 인/아웃.. 2024. 7. 28.
집콕 서버 리팩토링 작년 하반기에 백엔드 서버를 처음 배웠다.KUIT이라는 교내 IT 동아리에서 한 학기 동안 10주차 강의를 듣고(파트장님이 해주시는), 종강 후 기획자-디자이너-개발자가 팀을 꾸려서 프로젝트를 해볼 수 있었다. 시작이 좋았다.군대를 전역하고 열정으로 가득 차 있던 나에게 KUIT은 기회였고, 좋은 파트장님과 좋은 스터디원들을 만나서 많이 배우고 공부했다. 그리고 프로젝트도 정말 잊을 수 없는 좋은 경험이었다. 겨울방학 2달 간 난 집콕이라는 프로젝트를 했다. 집콕은 자취방 발품 서비스로 다방, 직방처럼 직접 매물을 등록/확인하는 서비스와는 달리, 자취방을 구하는 사람들이 발품다니며 조사한 정보를 쉽게 저장하고 꺼내어 비교해볼 수 있는 서비스이다. 즉 자취 초보자가 전문가처럼 자취방을 알아볼 수 있도.. 2024. 7. 27.