전체 글
가천대학교 소프트웨어학과에 재학중인 천진우입니다. 좋은 글을 주기적으로 작성하기 위해 노력합니다.
-
어떤 것을 공부했는가? 1. 스프링 전문성을 가져라. 전역 후에 스프링을 공부하는 것으로 목표를 굳혔고, 김영한 선생님의 강의를 열심히 들었습니다. 학교를 다니면서 틈틈히 시간날때마다 듣고는 했는데, 어느새 4개 정도가 남아있네요. 이번 겨울방학에 모두 완강할 예정입니다! 이렇게 명강의가 있을까 싶을 정도로 너무 즐겁게 듣고 있습니다. 꼭 스프링 백엔드 개발을 하는게 아니더라도, 객체지향이 어떻게 실무에서 적용되는지에 대해서 알기 위해서라도 이 강의의 초반은 꽤 괜찮다고 생각됩니다. 이렇게 완강에 다가서고 있지만, 아직 스프링에 대해서 10% 도 모른다는 생각이 들고 있습니다. 제가 공식문서에 있는 기능들을 모두 이해하고 있는 날까지, 꾸준하게 공부하는 것이 답인 것 같습니다. 그리고 내가 사용한 코드가..
회고 2022어떤 것을 공부했는가? 1. 스프링 전문성을 가져라. 전역 후에 스프링을 공부하는 것으로 목표를 굳혔고, 김영한 선생님의 강의를 열심히 들었습니다. 학교를 다니면서 틈틈히 시간날때마다 듣고는 했는데, 어느새 4개 정도가 남아있네요. 이번 겨울방학에 모두 완강할 예정입니다! 이렇게 명강의가 있을까 싶을 정도로 너무 즐겁게 듣고 있습니다. 꼭 스프링 백엔드 개발을 하는게 아니더라도, 객체지향이 어떻게 실무에서 적용되는지에 대해서 알기 위해서라도 이 강의의 초반은 꽤 괜찮다고 생각됩니다. 이렇게 완강에 다가서고 있지만, 아직 스프링에 대해서 10% 도 모른다는 생각이 들고 있습니다. 제가 공식문서에 있는 기능들을 모두 이해하고 있는 날까지, 꾸준하게 공부하는 것이 답인 것 같습니다. 그리고 내가 사용한 코드가..
2022.12.26 -
사이드 프로젝트 개발 팀 Dope를 만들고 운영하며 작성한 회고록입니다. 좌충우돌 3개월간 7인의 여정이 끝났다. 공모전과 학교 일정이 좀 정리가 되어서, 회고록을 써보자. 팀원들의 참여율 매일매일 하루 6시간 이상씩 풀타임 투자를 하는 것은 매우 힘들었지만, 한 명도 빠짐없이 모두 잘 참여해주었다. 앞선 포스트에서 언급했지만, 페이를 받지 않는 팀을 이정도로 이끌어 나온 것에 대해서 매우 뿌듯하다. 어디까지나 약한 규율 위에서 자유롭게 근무했다. 하지만 팀원들은 내가 기대했던 것 이상으로 많은 시간과 노력을 투자해주었다. 근무 시간 (오전10시 ~ 오후 4시)동안 게더타운에 접속하는 것 만으로도, 실제로 옆에 있는 것 같으면서도 관리가 잘 되었던 것 같다. 심지어 지각하는 인원이 있으면 내가 항상 모닝..
사이드 프로젝트 개발팀을 굴려보자 - 회고, 무엇을 배웠나사이드 프로젝트 개발 팀 Dope를 만들고 운영하며 작성한 회고록입니다. 좌충우돌 3개월간 7인의 여정이 끝났다. 공모전과 학교 일정이 좀 정리가 되어서, 회고록을 써보자. 팀원들의 참여율 매일매일 하루 6시간 이상씩 풀타임 투자를 하는 것은 매우 힘들었지만, 한 명도 빠짐없이 모두 잘 참여해주었다. 앞선 포스트에서 언급했지만, 페이를 받지 않는 팀을 이정도로 이끌어 나온 것에 대해서 매우 뿌듯하다. 어디까지나 약한 규율 위에서 자유롭게 근무했다. 하지만 팀원들은 내가 기대했던 것 이상으로 많은 시간과 노력을 투자해주었다. 근무 시간 (오전10시 ~ 오후 4시)동안 게더타운에 접속하는 것 만으로도, 실제로 옆에 있는 것 같으면서도 관리가 잘 되었던 것 같다. 심지어 지각하는 인원이 있으면 내가 항상 모닝..
2022.11.11 -
전편 보러가기 - QueryDSL을 활용하여 SNS 피드 만들기(1) - 동적 쿼리로 pagination 구현하기 이번에는 전편에 이어서, 페이징을 구현하기 위한 쿼리를 작성해보겠습니다. 서비스 특성상 특별하게 '피드에 정렬 옵션이 있다' 라는 조건 때문에 조금 복잡합니다. 그리고 이런 이유 때문에 cursor based 를 사용해도 정확도가 조금 떨어지며, 조금이나마 이 문제를 해결해봅시다. Offset Based Pagination JPA 에서는 offset paging을 pageable이라는 객체를 사용하여 편리하게 지원합니다. 또한 Spring Data JPA 에서는 인터페이스 만으로도 페이징을 사용할 수 있습니다. QueryDSL과 함게 사용하려면 다음과 같이 코드를 작성합니다. .offset(..
[DB] QueryDSL을 활용하여 SNS 피드 만들기(2) - 더 정확한 페이징 쿼리 만들기 offset based, cursor based전편 보러가기 - QueryDSL을 활용하여 SNS 피드 만들기(1) - 동적 쿼리로 pagination 구현하기 이번에는 전편에 이어서, 페이징을 구현하기 위한 쿼리를 작성해보겠습니다. 서비스 특성상 특별하게 '피드에 정렬 옵션이 있다' 라는 조건 때문에 조금 복잡합니다. 그리고 이런 이유 때문에 cursor based 를 사용해도 정확도가 조금 떨어지며, 조금이나마 이 문제를 해결해봅시다. Offset Based Pagination JPA 에서는 offset paging을 pageable이라는 객체를 사용하여 편리하게 지원합니다. 또한 Spring Data JPA 에서는 인터페이스 만으로도 페이징을 사용할 수 있습니다. QueryDSL과 함게 사용하려면 다음과 같이 코드를 작성합니다. .offset(..
2022.10.13 -
브레이킹 SNS github : https://github.com/Breaking-Dope 브레이킹 SNS 서버 github : https://github.com/Breaking-Dope/breaking-backend 도프(Dope) 팀에서 브레이킹 SNS 프로젝트를 하면서 SNS 피드를 구현할 일이 생겼습니다. 처음 기획 했던 형태는 여러가지 문제점들이 많았고, 추가적인 필터나 정렬이 필요했기에 많은 고민을 했었습니다. 이 피드 문제를 해결하기 위해 QueryDSL을 통한 동적 쿼리를 작성했는데, 겪었던 문제들을 공유하고자 합니다. 목차는 다음과 같습니다. - 참고했던 서비스들과 최종 기획 - QueryDSL으로 기본적인 DTO 조회 - 필터 기능을 위한 동적 쿼리 작성 - 피드 정렬 기준 변경을 위한..
[DB] QueryDSL을 활용하여 SNS 피드 만들기(1) - 동적 쿼리로 Pagination 피드를 만들어보자.브레이킹 SNS github : https://github.com/Breaking-Dope 브레이킹 SNS 서버 github : https://github.com/Breaking-Dope/breaking-backend 도프(Dope) 팀에서 브레이킹 SNS 프로젝트를 하면서 SNS 피드를 구현할 일이 생겼습니다. 처음 기획 했던 형태는 여러가지 문제점들이 많았고, 추가적인 필터나 정렬이 필요했기에 많은 고민을 했었습니다. 이 피드 문제를 해결하기 위해 QueryDSL을 통한 동적 쿼리를 작성했는데, 겪었던 문제들을 공유하고자 합니다. 목차는 다음과 같습니다. - 참고했던 서비스들과 최종 기획 - QueryDSL으로 기본적인 DTO 조회 - 필터 기능을 위한 동적 쿼리 작성 - 피드 정렬 기준 변경을 위한..
2022.09.29 -
웹 서버들은 어떻게 동시에 여러개의 요청을 처리할까? 일반적으로 멀티 쓰레드를 이용한 방법을 채택한다. 그런데 동시에 10만개의 요청이 들어왔을때, 쓰레드가 10만개가 생성될까? 멀티 쓰레드는 다음과 같은 단점이 있다. 쓰레드를 생성하는 비용이 크다 CPU level에서 context switching 이 더 자주 일어나게 되면서, 성능 저하가 발생한다. limit 을 걸어놓지 않으면 쓰레드가 무한정 생성되고, 물리적 성능 한계를 넘어서면 서버가 다운될 수 있다. 그래서 Tomcat에서는 Tread Pool 이라는 것을 관리한다. Thread Pool 의 동작 과정은 다음과 같다. 일정 개수의 Thread를 미리 열어놓는다. 새로운 요청이 들어오면, 비어있는 Thread를 할당한다. 서블릿 객체를 통해 ..
[Spring] Apache AB를 활용한 서버 성능테스트와 톰캣 쓰레드(Thread) 확장으로 성능 최적화웹 서버들은 어떻게 동시에 여러개의 요청을 처리할까? 일반적으로 멀티 쓰레드를 이용한 방법을 채택한다. 그런데 동시에 10만개의 요청이 들어왔을때, 쓰레드가 10만개가 생성될까? 멀티 쓰레드는 다음과 같은 단점이 있다. 쓰레드를 생성하는 비용이 크다 CPU level에서 context switching 이 더 자주 일어나게 되면서, 성능 저하가 발생한다. limit 을 걸어놓지 않으면 쓰레드가 무한정 생성되고, 물리적 성능 한계를 넘어서면 서버가 다운될 수 있다. 그래서 Tomcat에서는 Tread Pool 이라는 것을 관리한다. Thread Pool 의 동작 과정은 다음과 같다. 일정 개수의 Thread를 미리 열어놓는다. 새로운 요청이 들어오면, 비어있는 Thread를 할당한다. 서블릿 객체를 통해 ..
2022.08.22 -
사이드 프로젝트 개발 팀 Dope를 만들고 운영하며 작성한 회고록입니다. 더보기 (현재 글) 사이드 프로젝트개발팀을 굴려보자(1) - 팀 빌딩, 목표, 지속가능성, 주제 사이드 프로젝트개발팀을 굴려보자(2) - 협업 시간이 흘러갈수록, 대학교는 학문적인 목표를 가지기 보다는 취업사관학교 또는 학원의 포지션으로 점점 변하는 것 같다. 그렇지만 아직까지도 대학에서 배우는 것은 실무와는 조금 거리가 멀다. 실무에서 사용되는 도구들에 대해서 배우지 않고, 깊게 배우지 못한다. 그렇다고 학생들이 실무에서 사용하는 것을 그대로 따라해 보고, 그 경험을 미리 할 수 없는걸까? 사이드 프로젝트를 굴려보자. 개발팀으로서의 팀의 목표 팀의 목표는 다음과 같다. 실제로 현업에서 사용하는 개발 환경으로 프로덕트 개발 체계적인..
사이드 프로젝트개발팀을 굴려보자(1) - 팀 빌딩, 목표, 지속가능성, 주제사이드 프로젝트 개발 팀 Dope를 만들고 운영하며 작성한 회고록입니다. 더보기 (현재 글) 사이드 프로젝트개발팀을 굴려보자(1) - 팀 빌딩, 목표, 지속가능성, 주제 사이드 프로젝트개발팀을 굴려보자(2) - 협업 시간이 흘러갈수록, 대학교는 학문적인 목표를 가지기 보다는 취업사관학교 또는 학원의 포지션으로 점점 변하는 것 같다. 그렇지만 아직까지도 대학에서 배우는 것은 실무와는 조금 거리가 멀다. 실무에서 사용되는 도구들에 대해서 배우지 않고, 깊게 배우지 못한다. 그렇다고 학생들이 실무에서 사용하는 것을 그대로 따라해 보고, 그 경험을 미리 할 수 없는걸까? 사이드 프로젝트를 굴려보자. 개발팀으로서의 팀의 목표 팀의 목표는 다음과 같다. 실제로 현업에서 사용하는 개발 환경으로 프로덕트 개발 체계적인..
2022.08.16 -
Intro. 실제 프로젝트를 해보니, 예외처리를 하면서 상태코드에 대한 깊은 생각과, 활용법에 대해서 잘 모르고 있다는 생각이 들었다. 실제로 프로젝트에 예외처리와 error response를 적용을 해보려고 하면, 다양한 상태 코드가 제공됨에도 불구하고 제대로 활용하지 못한다. 이렇게 되니까, 클라이언트 쪽에서 요청 에러가 발견 되었을 때, 원인 파악과 조치가 한참 늦어졌다. 이번 포스팅에서 상태코드에 대해서 자세하게 알아보자. 상태 코드란 무엇인가? 상태 코드는, 클라이언트에게 요청에 대한 트랜잭션 결과를 이해할 수 있는 쉬운 방법으로 알려준다. 다음은 위키백과에서 가져온 상태코드의 대략적인 정보이다. 1xx (정보): 요청을 받았으며 프로세스를 계속한다 2xx (성공): 요청을 성공적으로 받았으며 ..
애매한 HTTP 상태코드 정리Intro. 실제 프로젝트를 해보니, 예외처리를 하면서 상태코드에 대한 깊은 생각과, 활용법에 대해서 잘 모르고 있다는 생각이 들었다. 실제로 프로젝트에 예외처리와 error response를 적용을 해보려고 하면, 다양한 상태 코드가 제공됨에도 불구하고 제대로 활용하지 못한다. 이렇게 되니까, 클라이언트 쪽에서 요청 에러가 발견 되었을 때, 원인 파악과 조치가 한참 늦어졌다. 이번 포스팅에서 상태코드에 대해서 자세하게 알아보자. 상태 코드란 무엇인가? 상태 코드는, 클라이언트에게 요청에 대한 트랜잭션 결과를 이해할 수 있는 쉬운 방법으로 알려준다. 다음은 위키백과에서 가져온 상태코드의 대략적인 정보이다. 1xx (정보): 요청을 받았으며 프로세스를 계속한다 2xx (성공): 요청을 성공적으로 받았으며 ..
2022.06.19 -
팀프로젝트 도중, 이것저것 패키지를 설치하다 보니, AWS 프리티어에서 제공하는 용량을 다 써버렸다. 메모리가 1기가라서, 메모리 스왑도 해줘야했고.. 개발 환경을 최대한 심플하게 하기 위해서 총 4개의 서버(프론트, 백, DB, jenkins)를 하나의 ec2 서버에서 돌리고 있었다. 그러다보니 추가적으로 패키지를 더이상 설치할 수 없었고, SSD Usage가 98%까지 갔다왔다.. 용량 확보를 위해 이것저것 찾아보던 중, apt 캐시를 지우라는 팁을 보았는데, "설마 캐시가 그렇게 크겠어?" 라는 생각을 하며 다음 명령어를 쳤다. sudo du -sh /var/cache/apt/archives 이게 왠걸.. 435M를 쓰고 있었다.. 초기 환경 세팅에서, apt 를 사용하여 패키지 설치를 왕창 하다 ..
AWS ec2 / 리눅스 용량 확보 - apt 캐시 삭제팀프로젝트 도중, 이것저것 패키지를 설치하다 보니, AWS 프리티어에서 제공하는 용량을 다 써버렸다. 메모리가 1기가라서, 메모리 스왑도 해줘야했고.. 개발 환경을 최대한 심플하게 하기 위해서 총 4개의 서버(프론트, 백, DB, jenkins)를 하나의 ec2 서버에서 돌리고 있었다. 그러다보니 추가적으로 패키지를 더이상 설치할 수 없었고, SSD Usage가 98%까지 갔다왔다.. 용량 확보를 위해 이것저것 찾아보던 중, apt 캐시를 지우라는 팁을 보았는데, "설마 캐시가 그렇게 크겠어?" 라는 생각을 하며 다음 명령어를 쳤다. sudo du -sh /var/cache/apt/archives 이게 왠걸.. 435M를 쓰고 있었다.. 초기 환경 세팅에서, apt 를 사용하여 패키지 설치를 왕창 하다 ..
2022.05.12