분류 전체보기 14

git의 명령어들은 내부적으로 무슨 일을 할까?

Git이란?Git은 소스코드의 변경 이력을 관리할 수 있도록 해주는 분산 환경 버전 관리 툴이다.버전 관리 툴의 종류로는 크게 로컬형, 중앙관리형, 분산형이 존재하는데 이에 대해서는 링크를 참고하면 좋을것 같다. Git의 버전관리 방식스냅샷을 사용하여 관리한다.커밋 시점에 파일의 변경점만 기록하는게 아닌, 파일의 전체 상태를 기록한다.해당 시점의 파일을 바탕으로 SHA-1 해쉬를 사용해서 기록하고 성능적인 측면을 고려하여 변경이 발생하지 않은 경우 이전에 존재하던 데이터에 대한 링크를 생성해서 관리한다. 파일의 무결성은?해당 파일의 내용과 길이를 바탕으로 SHA-1 해시를 사용해 40자 길이의 문자열을 생성한다.파일 경로에 있는 파일을 바이너리 데이터로 읽은 뒤 {파일크기 \0 내용} 형태로 해시를 계산..

Etc/Git 2025.05.05
이펙티브 코틀린 (TDD, 클린코드 with Kotlin) 8기 - 3,4,5 주차

3주차 미션 회고 - 블랙잭리뷰 1리뷰 2리뷰 3리뷰 4가장 어려우면서도 재밌었던 미션이었다.도메인 용어(?)는 중요하다.블랙잭에는 플레이어의 상태를 나타내는 hit, stay, bust, blackjack 과 같은 개념이 있다.처음 구현할때는 일단 저 용어들을 몰랐고 굳이 저 용어를 사용하지 않더라도 비슷한 의미를 가진 용어를 쓰면 되겠지 라는 생각으로 구현했다. 하지만 리뷰어님이 해당 용어들을 사용하는것을 권장하셨고 이를 다음 작업에서 적용했다.별거 아닌것처럼 보이지만, 해당 도메인에 맞는 용어를 사용함으로써 처음 코드를 보는 사람으로 하여금 더 직관적으로 이해할 수 있게 된다는걸 느꼈다. 현업에서는 협업하는 부서와 함께 도메인 용어들을 미리 정의하고 개발을 진행한다면 훨씬 더 유용할것 같다. 테스..

Etc/NextStep 2025.01.10
이펙티브 코틀린 (TDD, 클린코드 with Kotlin) 8기 - 2주차

2주차 미션 회고 - 로또리뷰 1리뷰 2리뷰 3리뷰 4객체지향 어려운걸?이번 미션을 진행하면서 가장 많이 받았던 피드백은 "A클래스에서 B클래스로 책임을 위임해보는건 어떨까요?" 였다.코드를 작성할때는 분명 잘 나눴다고 생각했는데, 리뷰어님의 피드백을 받고 다시보니 아쉬운 부분들이 눈에 보이기 시작했다.객체지향은 단순히 사이즈가 큰 클래스를 나누고 메서드를 쪼개는 행위가 아니다. "적절한 객체에게 적절한 책임을 부여" 할 수 있어야 한다. 연습을 위한 과제들이기 때문에 이 기간만큼은 조금 과하다고 느껴지더라도 최대한 원칙에 맞춰서 코드를 작성해보고자 한다. - 최상위 함수에서 모든 기능을 구현하고 하나씩 리팩토링을 통해 분리해볼것.- 너무 추상적이라고 느껴지면 정량적인 지표를 바탕으로 해볼것. e.g) ..

Etc/NextStep 2024.12.02
이펙티브 코틀린 (TDD, 클린코드 with Kotlin) 8기 - 1주차

어떻게 시작하게 됐는가?구직을 위해 채용공고를 보면서 느낀점은 자격요건에 Kotlin이 포함된 공고가 작년보다 눈에띄게 많아졌다는 사실이었다.그래서 새롭게 진행하는 사이드 프로젝트는 Kotlin을 써보기로 결정했다. 책을 통해 문법은 알 수 있었지만 보다 코틀린스러운 코드를 짤 수 있었으면 했고 이를 위해서는 경험자들의 리뷰가 있으면 더 좋겠다는 생각을 했다. 마침 NextStep에 이펙티브 코틀린 8기가 열렸길래 바로 신청을 했다. 여러 후기들을 보았을때 비용이 아깝지 않다는 이야기들이 많았고, 이를 통해 더 빠르게 성장할 수 있을것 같았다. 기간은 총 6주 과정이며 주 1회 3시간 가량의 온라인 강의가 진행된다. 이때 강의는 Jason이 해주신다.이외의 시간들은 매주 주어지는 미션 구현하고 실무자들의..

Etc/NextStep 2024.11.22
여러 플랫폼에 대응할 수 있는 OAuth 코드로 개선하기

이전 글에서 SpringSecurity가 OAuth 로그인을 처리하는 과정을 디버깅을 통해 학습했습니다. 학습경험을 바탕으로 식도락 프로젝트의 기존 OAuth 로그인 코드를 개선한 과정에 대해 글을 써보려 합니다. 기존의 문제점 카카오 로그인에 의존적이며 확장에 닫혀있는 코드. 새로운 플랫폼을 지원하도록 확장하기 위해서는 요청을 보내는 클라이언트뿐만 아니라 비즈니스로직이 담긴 서비스 클래스까지 변경이 발생합니다. 또한 추가적으로 작성해야되는 클래스가 너무 많이 필요합니다. Properties 클래스의 주입. 기존의 서비스 코드에서는 카카오api 사용에 필요한 정보를 담은 KakaoProperties 클래스를 직접 주입받아서 사용하고 있었습니다. 즉, 새로운 플랫폼을 지원할때마다 주입받아야하는 클래스가 늘..

Backend/Spring 2023.06.04
SpringSecurity가 OAuth 로그인을 처리하는 과정 파헤치기

서론 저는 이전에 참여했던 사이드 프로젝트 에서 OAuth 로그인 개발을 담당했습니다. 그리고 이번에 프로젝트 리팩토링을 계획하면서 가장 마음에 안들던 로그인 관련 코드를 개선하기로 결정했습니다. 최초 기획에서는 카카오 로그인만을 사용하기로 했기 때문에 카카오 로그인에 맞게 코드를 작성하였고, 현재 로그인 관련 코드는 카카오 로그인에 종속적인 코드입니다. 때문에 새로운 로그인 방식을 도입하기에도 까다로운 상황이라 이번 기회에 OAuth 로그인 관련 코드를 개선하기로 했습니다. OAuth 관련 클래스들을 추상화하기 위해 고민하던 중 SpringSecurity에서는 어떻게 여러개의 플랫폼에 쉽게 대응할 수 있도록 했는지, 실제 내부 동작은 어떻게 동작하는지 궁금해졌고 그래서 디버깅을 통해 내부 동작을 학습해..

Backend/Spring 2023.03.05
offset과 no offset을 사용한 페이징 성능 차이 분석

서론 최근 진행했던 식도락 프로젝트에서 유저의 피드 목록을 페이징 처리를 하여 제공하는 api를 개발했습니다. 해당 api는 sns 특성상 페이지 단위로 제공하기보다는 무한 스크롤 형식에 최근 작성한 순서로 데이터를 제공해야 했습니다. 페이징 방식을 고민하던 중 offset과 no-offset 방식이 있고 offset 방식을 사용하면 매번 full-scan을 하여 성능적으로 좋지 않다는 것을 알게 되어 개발 당시에는 곧바로 no-offset 방식을 도입하여 개발하였습니다. 하지만 실제로 offset 방식과 no-offset 방식의 성능 차이가 얼마나 나는지 눈으로 확인하기 위해 두가지 방식을 모두 적용하여 성능을 비교해보기로 하였습니다. offset이란? offset 이란 sql에서 조회를 시작할 기준점..

Backend/Database 2023.01.06
Gradle 맛보기

이번에 식도락 프로젝트를 진행하는 과정에서 빌드 시 submodule의 파일들을 복사하는 task를 추가하는 작업을 맡았습니다. 쿠킴의 레퍼런스 덕분에 작업 자체는 수월했지만, gradle에 대해 거의 모르다보니 build와의 의존관계설정을 설정해주지 않아서 동작하지 않았던 경험이 있었습니다. 또한 Jay가 작성한 restdocs 관련 task도 설명없이는 이해하지 못했고 답답함을 느껴 이번 기회에 정리해보았습니다. 빌드란 무엇인가요? 개발자가 만든 애플리케이션을 컴퓨터에서 구동하기 위해서는 변환작업이 필요합니다. Java 애플리케이션의 경우 2가지 단계를 거치게 됩니다. 컴파일 : 소스코드를 바이트코드로 변환 링킹 : 바이트코드를 의존하고 있는 라이브러리들과 함께 하나의 파일로 압축하는 과정 빌드 도구..

Backend/Spring 2022.11.20
Wiremock을 이용한 테스트 작성기

지난 Feign Client 적용기에 이어서 WireMock을 이용한 테스트 경험을 소개합니다. 서론 이번 프로젝트에서는 기능 개발 시 인수테스트, 통합테스트, 단위테스트를 먼저 작성하고 개발을 진행하려고 노력하고 있습니다. 저는 OAuth 로그인 기능을 맡았고 해당 기능에 대한 인수테스트를 작성하는 과정에서 "어떻게하면 외부 api에 대해 실제 상황에 가까운 테스트를 할 수 있을지"에 대해 고민하게 되었습니다. 일반적으로 사용되는 Mockito를 사용하여 테스트를 진행할 수 있었지만 이 방식은 한계가 있다고 느꼈습니다. 외부 api를 사용할때는 http 요청과 응답, 응답값에 대한 역직렬화 과정 등이 발생하는데 Mockito는 단순히 목객체를 주입받아서 메서드를 호출하는 방식으로 동작하기 때문입니다...

Backend/Spring 2022.11.20
FeignClient 적용기

서론 현재 진행하고 있는 식당 리뷰 sns 프로젝트에서 유저 로그인 기능의 구현을 담당하고 있다. 카카오 로그인을 구현하던 중, 카카오에서 제공하는 api에 Http 요청을 보내기 위해서는 클라이언트 객체를 사용해야했고 흔히 알고 있는 RestTemplate과 WebClient를 후보에 두고 고민하고 있었다. 그러던 중 쿠킴의 소개로 Feign Client의 존재를 알게 되었다. 💫 Feign Client란? Feign Client란 Netflix에서 개발한 Http Client다. (HttpClient는 Http 요청을 간편하게 만들어서 보낼 수 있도록 돕는 객체라고 생각하면 될것 같다.) 처음에는 Netflix에서 자체적으로 개발을 진행했지만 현재는 오픈소스로 전환했으며 SpringCloud 프레임워..

Backend/Spring 2022.11.20