본문 바로가기

diary/byromself

대충 2023년 상반기를 반성한다는 내용

 

 

2022년에는 끝을 본 것이 많다. 미루고 미뤘던 학교부터 부트캠프, 끝없을 것 같던 취준 기간까지. 그런 작년의 무게가 너무 무거웠던 건지 당장 2023년은 이제 4월에 접어드는데도 시작을 끊지 못했다. 돌이켜보면 한 게 없지는 않은데 물흐르듯 보내다보니 머릿속에서도 뭐가 다 흘러가버린 거지...... 그래서 헛된 상반기를 보내고 이제라도 반성하는 마음으로 2023년 새해를 맞이하려고 한다.

 


 

그런 의미에서 일단 작성하는 작년 말부터 올해 상반기까지의 기술 회고록

1. MyBatis를 사용해봤다

사실 처음 사용했을 때는 JPA, QueryDsl을 두고 왜 이런 걸 쓰지라는 마음이 있었다. JPA가 익숙하다보니 코드로 바로 구현될 일도 xml로 SQL 쿼리를 작성하고, DAO를 구현해야 한다는 것 자체가 진입 장벽이었다. 하지만 사용하다보니 나름나름 제각각 사용하는 이유가 있다라는 걸 체감하고 있다.

 

  1. 일단, 제일 중요하게는 JPA, QueryDsl로는 bulk insert를 구현할 수가 없다.
    • (PK로 auto increment를 사용할 경우) JPA 스펙 자체가 bulk insert를 지원하지 않는다고 한다. saveAll을 호출해도 bulk insert로 구현이 되지 않고 각각의 insert 쿼리가 발생한다. 실무 전에는 그만큼 다량의 데이터를 한번에 처리할 일이 없어 전혀 고려하지 못했던 부분이다. auto increment 방식의 키 생성을 포기하냐, bulk insert가 필요한 부분에 MyBatis를 사용하냐를 고민해봤을 때 MyBatis를 사용하는 것이 더 합리적라고 (일단은) 느껴진다. (MyBatis 말고도 spring에서 bulk insert를 지원하는 다양한 방법은 있지만 추가적인 공부가 필요하다)
  2. JPA를 통한 작업 시 종종 쿼리문 생성을 확인해주어야 할 필요가 있다. 
    • 이 역시 간단한 토이 프로젝트 수준에서는 고려할 부분이 안 되어 미처 생각하지 못했던 부분이다. JPA는 직접적인 쿼리 작성 없이 named 메서드 사용으로 자동 쿼리가 생성된다는 점에서 편리하다. 하지만 기본적인 쿼리 메서드(save, find, ...)가 아닐 경우 종종 개발자의 실수 또는 착오로 원하지 않은 쿼리가 생성될 수 있으므로 주의해야 한다.
    • 특히 지연 로딩 설정과 관련해서 엔티티 매핑 시 제대로 된 연관 관계와 지연 로딩 설정을 해놓지 않으면 의도와 다르게 매번 다른 엔티티와 join이 일어나는 경우가 있으니 쿼리 성능을 위해 각별한 주의가 필요하다.

2. MyBatis와 JPA를 동시 사용하기 위한 환경을 구성했다

지나고 보니 간단했지만 막상 할 때에는 머리를 부여잡고 진행했던 부분이다. 애초에 단일 JPA만 사용하면 추가적인 환경 구성 (Configuration) 없이 바로 사용할 수 있었기 때문에 따로 설정을 해주어야 한다는 부분부터 좀 막막했었다. Spring이 MyBatis와 JPA를 어떻게 사용하는지 제대로 알고 있지 못했기 때문에 애를 먹은 부분이 가장 컸고, 사실 지금도 명확하게 설명할 수 없다는 게 창피하다 🔨

 

3. QueryDsl도 사용해봤다

MyBatis로 구성된 프로젝트에 JPA를 붙이면서 차차 JPA로 전환을 목표했는데 Spring Data JPA만으로는 작업의 효율성이 생각만큼 나오지 않았다. 특히 join이나 여러가지 조건을 기반으로 데이터에 액세스해야 하는 경우에 그랬다. 그렇다고 다시 MyBatis를 쓰자니 대신 컴파일 타임에 에러 핸들링이 가능한 QueryDsl을 사용하는 게 낫다는 쪽으로 기울었고, 적용했다. QueryDsl 학습과 동시에 구현이 들어가서 코드가 다소 다듬어지지 못한 부분은 있지만 (리팩토링 예정이다) 작동에는 문제 없이 구현 성공했다. 예~

 

4. Spring으로 여러가지 DataSource를 설정해보았다

한 프로젝트에 여러 개의 데이터베이스를 붙일 수 있다는 것 역시 예상치 못했던 부분이다. MSA 관점에서 보나 유지보수 관점에서 보나 권장되지는 않는 설계 같지만, 일단은 요구사항에 맞추어 구현은 해보았다. 개인적으로 현재 프로젝트와 새로운 데이터베이스의 추가적인 결합이 썩 달갑지 않아 추후 API 통신으로 변경할 생각을 가지고 있다.

 

5. Swagger를 사용해봤다

API 문서를 작성하기 위해서 노션이나 워드 같은 문서 툴로 작성하거나 Spring Rest Docs를 사용해봤었다. 문서로 작성하는 경우에는 제일 간단하지만 작성 시 형식이나 변경에 대해서 다소 귀찮은 부분이 있었고, Rest Docs의 경우에는 테스트 코드를 작성해야 한다는 점에서 조금 진입 장벽이 있었지만 그만큼 정확한 문서가 작성된다는 점에서 좋았다.

Swagger는 이번에 처음 사용해보게 됐는데, Rest Doc 기본 문서 형식보다는 직관적으로 API들을 볼 수 있고 http 요청도 바로 보내볼 수 있다는 게 정말 편리했다. (무엇보다 UI가 Rest Docs 기본 UI와 비교할 수 없을 만큼 예쁘다) 하지만 그만큼 실제 코드 상에 바로 설명을 달아줘야 하는 부분이 코드 구현 시 조금 거슬리는 부분이 있었다. 특히 Swagger 설명을 상세하게 적을수록 운영 코드는 더러워져만 갔다......

대안으로 RestDocs에 Swagger UI를 적용한 블로깅을 보기는 했는데 기존 프로젝트에 당장 적용할 순 없었고 다음 프로젝트 혹은 리팩토링 기회를 엿보고 있다.

 

6. SQLite를 Spring과 연동해보았다

단순 SQLite 하나를 연동해봤다면 적지도 않았을 거다. 요구사항이 해괴한 바람에 매번 새로운 SQLite Datasource를 읽고 또 다른 SQLite 파일을 읽고 가공하고, 풀어서 RDB로 저장하고 와중에 또 다시 새로운 SQLite를 생성해서 넘겨주고...... 하는 작업을 Spring으로 구현하기 위해 삽질을 많이 했다. 이만큼 해괴한 요구사항이 어디에 또 있을까, 다시 만날까 싶지만 일단 문서화는 착실하게 해놓았으므로 차차 언젠가 블로깅으로 풀어갈 예정이다. 

 

7. 서버에 대한 지식이 20% 정도 상승했다

20 퍼센트라니 세상에 싶겠지만 애초에 가진 지식이 별로 없었다......  그래도 그치만 킹치만

  • 로컬 데이터베이스 환경을 Docker로 구성해 보았다
  • 서버 규격을 산정해보았다
  • Grafana를 염탐해보았다
  • 서버에 접근해 로그를 확인해 보았다
  • 서버에 접근해 jar를 실행해보았다 (배포!)
  • ...

의 작업을 하면서 얼추 학습을 하긴 했는데 아무래도 원래 부족한 지식이라 부족함을 많이 느끼고 있다. 특히 배포에 있어서는 일단 프로세스 정도만 파악하는 정도라, 앞으로 따로 개인적으로 직접 해보면서 공부하는 시간이 필요할 것 같다. 

 


 

소소한 부분들을 제외하고 기억에 남을 만한 것들을 적어보니 그래도 아직 남은 게 꽤 있다는 게 다행이다. 매번 기록을 해놓았으면 더 자세하게 문제 해결 과정까지 남길 수 있었을 텐데 하는 아쉬움은 있지만 이미 지나간 거 앞으로 잘해보기로 한다. 지나간 것까지 다 하나씩 잡고 가보려면 끝이 없다.

 

 

이제 그런 의미에서 뒤늦게 세워보는 2023년 목표

1. 알고리즘 공부 열심히 하겠습니다

사실 그동안 프로그램 구현하는데 알고리즘이 필요한가요? 코딩 테스트용 아닌가요? 라는 마음이었는데 이제 알고리즘은 구현에도 필수불가결하다는 걸 깨달았다. 당장 이분탐색이랑 다익스트라 같은 알고리즘들은 코드상에 박혀 있고, 그와중에 한구석에선 무지성으로 for문 중첩, 중첩..... 정신이 어지럽다. 레거시에 산재한 이런 코드들을 보다보면 눈물이 나고, 내 이름도 곧 저런 무지성 for문 옆에 박히게 되면 어떡하지 생각하면 심란하고..........

그런 부끄러운 사람이 되지 않고 개멋진 짱짱맨이 되기 위해서 일단 알고리즘 공부 열심히 하겠습니다. 사실 며칠 전까지는 또 마음이 급해서 무지성 bfs, dfs 풀고 있었는데 유형을 외워서 풀려고 하다보니까 조금만 변형되어도 감을 못 잡고 엉뚱한 짓을 하고 있는 나를 발견했고, 그냥 마음 조금 편하게 먹고 시간 넉넉하게 잡아서 기초부터 탄탄하게 쌓아 올리려고 한다.

2. 물론 CS도 소홀히 하지 않겠습니다

CS는 항상 해야지, 배워야지, 읽어야지, 공부해야지, 마음은 먹는데 이게 제일 어렵다. 공부한다고 당장 성과가 눈에 보이는 건 아닌데 어느 순간 모르면 뒤떨어져 있는 게 느껴지고........ 

그냥 제일 간단하고 이룰 수 있는 목표로 세우자면, 올해에 관련 도서 3권 이상 읽겠습니다. 일단 뭐라도 읽고보겠습니다.

3. 테스트 코드 작성하겠습니다

이 친구도 매번 써야지, 써야 되는데, 언제 쓰지의 연속으로 결국 흐지부지 되는 친구로 친해지기가 정말 쉽지 않다........ 일단 목표는 쓰는 것 시작이다. 시작이 반이다. 당장 들어가는 신규 플젝부터는 진짜 치밀하게 쓰려고 한다. 제발요....

4. 리팩토링 틈틈이 하겠습니다

돌아가면 되는 거 아니에요? 지금 잘 되는데 괜히 건드리지 말지, 같은 말은 듣지 않겠다. 

5. 까먹을 만한 건 꼭 블로깅을 하겠다

목적이 블로깅이라기보다는 머리에서 계속 뭐가 빠져나가는 게 문제다. 일단 틀리더라도 써놓으면 나중에 내가 어디가 틀렸구나, 어떻게 생각했구나라는 것을 알 수 있겠지. 맞으면 뿌듯할 거고.

 

5개만 이뤄도 올해는 성공한 한해가 될 것 같다. 나 자신 화이팅 빠야