상반기를 마무리하면서, 앞으로 새로이 익히거나 보완, 숙련해야 할 내용들에 대해 작성해 보려 한다.
클린 코드
항상 클린한 코드를 작성하기 위해 노력하고 있지만, 평생 공부하고 다듬어야 하는 부분이다. 개발자에게 기본기와 같은 것이기 때문에 길게 강조할 필요도 없다고 생각된다. 보다 가독성 좋고 유지보수가 용이한 코드를 작성하기 위해 부단히 노력할 것이다.
Computer Science
CS에서 개발자에게 가장 중요하다고 생각되는 분야는 컴퓨터 구조, 운영체제, 네트워크, 데이터베이스, 자료구조, 알고리즘의 6가지이며, 추가로 다이어그램 모델링, 디자인 패턴 등의 소프트웨어 공학 설계 기법도 중요성이 높다고 할 수 있다. 익혀야 할 내용이 적은 편은 아니라, 두루두루 공부하긴 했으나 아직 지식이 깊지 못하다.
현재 SQLD 자격증을 취득하고 정보처리기사 2차를 준비하고 있지만(SQLD 시험을 보기 한 달여 전에 정보처리기사 1차 시험을 봤다는 사실을 상기해 보면, 인간적으로 기사 시험의 1, 2차 텀은 너무 길다고 느껴진다), 자격증 자체보다 내가 공부한 것을 검증해 보는 것에 의의를 두고 시험을 치렀다. 시험은 자격증을 위한 것이 아니라 지식과 그 응용을 익히고 확인하기 위해 치르는 것임을 항상 명심해야 할 것이다.
이 역시 개발자의 기본기와 같은 것이므로, 마음을 급하게 먹기보다는 장기간에 걸쳐 꾸준히 공부하겠다는 마음가짐이 필요할 것이다.
REST API
항상 RESTful한 API를 구현하려 노력하고 있지만, 아직 부족한 점이 많다. 특히 Entity에서의 Setter 사용을 지양하고 Builder를 통해 값을 주입하다 보니 PATCH method를 사용할 때의 코드가 다소 지저분해지는 문제가 있다. 더 깔끔한 코드로 리팩토링할 수 있도록 노력 중이다.
REST API는 서비스의 유지보수를 용이하게 하고 높은 확장성을 가지며, 전문성 높은 분업을 가능하게 하기 때문에 중요성이 매우 높다. Thymeleaf를 통해 기본적인 View를 구현하는 것도 나름 재미있지만, 지금은 더욱 RESTful한 API를 구현하는 데 집중해야 할 때인 것 같다.
REST API에 대해서는 예전에 포스팅한 글이 두 개 있다(https://hellmir.tistory.com/entry/REST-API-%ED%8A%B9%EC%A7%95-%EC%A0%95%EB%A6%AChttpsrestfulapinet-%EC%B0%B8%EA%B3%A0, https://hellmir.tistory.com/entry/REST-API%EC%9D%98-URI-%EC%84%A4%EA%B3%84-%EA%B8%B0%EB%B3%B8-%EA%B7%9C%EC%B9%99).
JPA
Spring data JPA를 통해 JPA를 사용하려면 어렵지 않지만, 영속성을 토대로 한 JPA의 작동 원리는 결코 단순하지 않다. 백엔드 개발에서 가장 중요한 부분을 담당하고 있는 것은 데이터베이스의 조작과 관리이므로, 세부사항까지 완벽히 이해할 수 있도록 공부해야 할 것이다.
또한 Query DSL을 더욱 숙련해서 복잡한 Query도 프로그래밍 언어를 통해 원활히 처리할 수 있도록 할 것이다.
NoSQL
분산 데이터베이스 시스템을 통해 대량의 데이터를 효율적으로 처리, 관리하기 위해서는 RDBMS뿐만 아니라 NoSQL DB를 능숙히 다룰 수 있어야 한다. 실무 환경에서는 대량의 데이터를 다루게 될 가능성이 높으므로, 미리 꾸준히 공부할 예정이다.
Spring Security
소프트웨어에서 인증과 보안의 중요성은 강조하면 입이 아플 정도다. 그러나 Spring Security는 난이도가 쉽지 않다. 종합적인 Spring framework의 내용을 다루는 책 여러 권을 통해 공부했다 보니 막상 Spring Security에 대한 지식이 깊지 않다. 그래서 최근 내가 눈여겨보고 있는(실은 이미 구입해 버린) 책은 '스프링 시큐리티 인 액션'이다(https://www.yes24.com/Product/Goods/112200347?pid=123487&cosemkid=go16632223874180356&gclid=CjwKCAjw-vmkBhBMEiwAlrMeF9_w6oX1a2WvqVGn9VNyyBgy3AZ9txHanmk2TFwQaP19bYkSmWvPAhoC7I8QAvD_BwE).
단일 보안 프레임워크에 대한 내용치고는 분량이 적지 않은 편이라, 나름 깊은 학습을 할 수 있을 것으로 생각된다. 현재 구입만 해 두고 우선순위에서 밀려 있었는데, 지금이 그 우선순위를 가져올 때인 것 같다. 어서 읽고, 배우고, 활용하고 싶다.
TDD(Test-Driven Development)
TDD(테스트 주도 개발)은 실패하는 테스트 코드를 먼저 작성하고, 이를 통과하는 최소한의 코드를 작성 후 지속적으로 리팩토링해 나가는 개발 방법론으로서, 이름에서 느껴지는 것과는 다르게 테스트를 위한 것이 아닌 가독성 높고 변경에 유연한 코드 설계를 위해 사용된다. 애초에 테스트 코드의 작성은 TDD를 도입하지 않아도 모든 개발자에게 중요한 사항이기 때문에 굳이 방법론을 통해 강조할 필요가 없다.
장점으로는 버그의 발생 확률을 감소시키고, 유지보수가 용이하며 재사용성이 높은 코드 설계를 할 수 있다는 점이 있다. 단점은 동일한 기능을 개발하는 데 시간을 많이 소모하게 되어 항상 데드라인에 쫓기는 현업에서 적용하기 쉽지 않다는 점이다. 또 다른 단점으로는 그렇게 시간을 더 투자하게 만듦에도 실효성이 아직 완전하게 입증되지 않았다는 것이 있다.
TDD는 개발업계에서의 인기가 무색할 정도로 실효성에 대하여 논란이 많다. 해외뿐만 아니라 국내에서도 TDD의 실효성을 두고 시니어 개발자들 간 논쟁이 많이 있었고, 현재도 이어지고 있는 것으로 알고 있다.
내가 알고 있는 국내에서 유명한 TDD 반대론자로는 매우 인지도 높은 개발자이자 POCU 아카데미를 운영하고 있는 Pope Kim님이 있다. TDD는 개발 실력이 부족한 사람이나 사용하는 것이라고 주장한다. 실제로 실력이 아주 뛰어난 개발자이기 때문에 발언의 영향력이 크게 느껴진다. 여러 발언의 뉘앙스를 보면 TDD에 대해 매우 부정적인 인식을 가지고 있는 것으로 보인다.
반대로 역시 유명한 개발자이자 메가테라를 운영하는 아샬님이나, 우아한 테크코스를 진행하는 박재성님처럼 TDD를 매우 중요하게 다루는 개발자들도 있다. 현재 조영호님의 아주 유명한 책인 '객체지향의 사실과 오해' 책의 스터디를 하고 있는데, 이 책에서도 TDD에 관해 언급되어 있다. 객체지향적인 설계를 하는 데에 있어 유용한 방법론으로 서술되어 있다. 다만 이미 오랫동안 논란이 이어져 왔던 만큼, TDD의 실효성이 명확한 증거로써 증명이 되기는 어려울 것으로 보인다.
하지만 해당 방법론이 유효하지 않을 수 있다고 해서 공부해 보지도 않는 것은 어리석다. 사용할 줄 모르는 것과 사용할 줄 알지만 사용하지 않는 것은 전혀 다르다. 실효성이 있는지 여부에 대해서는 내가 직접 오랜 기간 적용해 본 뒤에 판단을 내려야 할 것이다. TDD를 공부할 계획을 꽤 예전부터 세웠지만, 시간이 부족해서 계속 미뤄지고 있다. 단기간에 익힐 수 있는 기법이 아닌 만큼, 장기적으로 계획하여 공부해야 할 것이다.
클라우드 배포 및 관리
한 두 달 전쯤 읽었던 클라우드 관련 서적에서, 최근 클라우드 개발사들의 경쟁이 치열해져 유망하던 전망이 무색하게 원가우위 전략을 통한 가격 덤핑 경쟁을 하고 있다는 식의 내용을 읽은 기억이 있다. 기반시설인 데이터센터의 구축과 운영에 높은 비용이 소요됨에도 불구하고, 현대 서버 관리에서 워낙 중요성이 대두되는 클라우드인 만큼 많은 사업자가 클라우드 사업에 뛰어든 것으로 보인다. 반대로 얘기하면 소프트웨어 서비스를 제공하는 기업 입장에서 활용도가 매우 높다고 할 수 있다.
실제로 직접 서버를 구축하고 관리하는 데에 인력과 유지비가 많이 들어가기 때문에, 클라우드 서비스를 이용하는 소프트웨어 사업자가 많이 증가한 추세다. 특히 SaaS(Software as a Service)의 경우 클라우드 사업자가 직접 서버를 구축 및 관리하고 그에 따른 책임까지 지기 때문에, 소프트웨어에 대한 지식이 부족한 사업자에게 매우 유용한 서비스라고 생각된다.
이와 같이 클라우드의 존재성이 커지고 있는 만큼, 클라우드 기반 배포와, 가능하다면 대용량 트래픽을 처리하는 경험을 꼭 해 보고 싶다.
CI / CD
CI(Continuous Integration, 지속적 통합), CD(Continuous Deployment, 지속적 배포)는 빠르고 효율적인 소프트웨어 개발 프로세스를 구축하기 위해 내가 최종적으로 목표로 하는 것이다. 이를 안정적으로 하기 위해서는 특정 지식보다 전반적인 개발 실력의 향상이 중요할 것이다. 이를 위해 무엇이든 열심히 공부하고 적용해 보며 꾸준히 발전하는 개발자가 될 수 있도록 노력할 것이다.
'Learning' 카테고리의 다른 글
백엔드 개발자에게 자료구조와 알고리즘 학습이 필요한 이유 (0) | 2023.07.06 |
---|---|
블로그 시작, 백엔드 개발 학습 현황과 향후 계획 (Java, SQL, 코딩테스트, Spring) (0) | 2023.03.07 |