코드스테이츠

[회고] Pre-Project, 나도 이제 개발자(진)? 🫡

번잔중 2023. 1. 2. 23:35

Pre-Project가 끝났습니다. 다들 너무 수고 많으셨습니다. ㅎㅎㅎㅎ 저는 요즘 매일 매일의 회의록과 1일 1커밋, 이제는 트위터까지 시작하게 돼서 기록하는 일에 신경을 많이 쓰고 있는데요. 이제 여기 저기 흩어진 기록들을 한 군데로 모아야겠죠? 그래서 작성합니다. Pre-Project 회고입니다!

🤯 Pre-Project

*각 챕터마다 시간 순서로 작성함 

12/19~12/21: 개발 전에 작성할게 이렇게 많았나...?

아무래도 첫 주이다보니 문서 작성할 일이 엄청 많았다. 사용자 요구사항 정의서, 테이블 명세서, ERD 그리고 API 명세서까지 작성해야 했다. 여러 번 수정하다보니 제대로 한게 맞는지 자꾸 확인하게 된다. 설계를 대충하고 넘어가면 개발할 도메인 전체에 영향을 미칠 수 있다고 생각하기 때문에 시간을 많이 쓰더라도 해야한다. API 명세서가 어느정도 됐다고 생각이 들어 프로젝트 파일을 생성해서 각자 맡은 파트의 기본적인 구성만 간단하게 코드로 작성했다.

 

  • Stackoverflow 웹사이트 검색 기능 가능한지 체크하기 → respository 인터페이스에서 containing을 사용하면 검색 기능 구현 가능
  • 공통, 팀별, 커밋 컨벤션 작성
  • 사용자 요구사항 정의서 작성
  • 테이블 명세서 작성
  • ERD 작성
  • API 명세서 작성
  • user, question에서 controller 기본 내용 작성 및 dto, entity, mapper, repository, service 클래스 생성

12/22~12/25: 기능을 호다닥(구토 아님) 구현해보자!

테이블 설계와 API 명세서를 작성하고, 프론트쪽에 API 문서를 빠르게 넘겨줘야 한다는 생각이 컸다. 그래서 마음이 많이 급했다. 하지만 나는 아직 쩌리이기 때문에 너무 빨리 했다간 망할 수도 있다. 내가 맡은 User와 Spring Security 부분을 우선적으로 작성해보려고 한다. 이에 더해 협업 툴을 사용해보기 위해 github에서 제공하는 칸반 보드와 issue, milestone 등을 만들고 템플릿도 만들어서 구성했다. 익숙해지면 생산성에 도움이 될거라 생각한다. 중간에 수정한 부분이 많아서 실제 기능 구현은 23일부터 시작했다.

 

  • label, milestone, Issue Template 추가
  • API명세서에 맞춰서 테이블 명세서, ER 다이어그램 수정
  • Github Project 칸반보드 생성
  • 하드 코딩으로 stub 데이터만 담은 API 생성 시도 → 최종적으로는 Spring REST Docs 생성을 위해 테스팅
  • 프로젝트를 진행하면서 알게된 사실
    1. spring security 의존성을 추가해놓으면 기본 구성으로 Authorization이 활성화되어 암호 키가 생성된다. 이것 때문에 보안 설정 하지도 않았는데, 자꾸 암호 키가 생성되어서 postman으로 API stub 데이터 테스트도 못하고 있었다.
    2. stub 데이터를 넣을 때는 엔티티에 Validation 설정을 빼놓고 하는 것이 잘 돌아간다. Validation 관련 애너테이션을 지우자마자 stub 데이터 테스트가 잘 돌아가는 것을 확인했다.
    3. H2 데이터베이스에서 USER도 예약어라서 수정해줘야 했다. schema에서 빨간 글씨로 나오길래 검색해보니 예약어였다.
  • 지금까지 성공한 기능 ✅
    • 회원가입
    • 로그인: jwt를 이용한 로그인 방식을 사용했다.
    • 회원 정보 수정
    • 회원 정보 조회
    • 전체 회원 조회: 페이지네이션 적용 및 tab을 입력받아서 입력 받은 값에 따라 정렬까지 해주었다.
    • 회원 탈퇴
  • 지금까지 실패한 기능 ❌
    • 비밀번호 찾기: 이메일로 임시 비밀번호를 보내줘야 하는 기능이다. 얘는 그냥 안됩니다... 근데 구글의 정책이 바뀐 것 때문인가 해서 네이버도 해봤는데, 그냥 페이지를 못 읽어옵니다... 블로그를 여기저기 뒤져보다가 회원가입을 성공하고 나서 가능하다고 하는데, 해보진 않았다. 혹시 모르니 한 번 해볼까 싶기도 한데, 정확한 정보는 아닌 것 같다... → 진짜 아니었음

12/26~12/28: 이제는 API 문서를 뽑아야해...

기능 구현이 얼마 남지 않았다. 하지만 API 문서를 주말 내로 주려했는데, 그게 불가능했음... 그렇지만 일단 상황 내에서 최선을 다해야 하기에 잠을 줄여가며 코딩을 하고 있다. 구현하지 못한 기능 + API 문서화만 진행하면 배포까지는 금방 올 것이다...

 

  • API를 Spring REST Docs로 만들어주기 위해 테스팅 작업을 진행했다. 중간중간 안되는 부분들이 생기긴 했지만 User쪽은 테스팅이 마무리 됐다. → 친구들이 Swagger 추천해줘서 갈아탔음. 금방 전체적으로 API 문서가 나왔다.
  • 테스팅을 진행할 때는 Spring Security 관련 설정을 없이 진행하는게 좋다. 
  • 비밀번호 찾기 기능 구현 성공 → 이메일 보내는게 안됐는데, 현직 백엔드 개발자의 도움 한 스푼으로 간편하게 해결.
  • UserTag를 추가했다. 연관 관계 매핑 부분이었는데, 실력이 너무 부족함을 느꼈다. JPA 쪽은 정말 계속 학습해야 할 듯...
  • Spring Security는 Swagger에서도 난감했다. JWT로 로그인 기능을 구현하게 되면서 수업에서 배운 코드를 그대로 사용했는데, Swagger는 Controller를 기준으로 생성되기 때문에 어찌 해야할지 난감했다.
  • 친구의 권유로 프로젝트에서 생긴 트러블 슈팅을 트위터에서 하기 시작했다. 그때 그때 간단하게 정리해서 쓸 수 있어 편리하다.
  • 일반 String 같은 변수의 경우 request body에 form-data 형식으로 보낸다. 그래서 @RequestBody 애너테이션을 사용하지 못하는데, 이를 사용하기 위해서는 클래스 객체로 값을 설정해주면 된다.
  • 비밀번호 변경 기능 구현 → 비밀번호 찾기를 하고 비밀번호를 바꿔주는 기능이 없다는 것을 알고 빠르게 추가했다.

12/29~12/30: 남자는 배포가 커야한다.(?)

우리가 선택한 배포 방식은 AWS이다. 물론 나는 EC2 하나밖에 없는 배포가 작은 남자다. 블로그와 유어클래스를 참고해가면서 배포를 따라했다. 결과는? 일단 성공! 근데 Parameter Store로 민감 정보들을 저장해서 사용하려고 하자 문제가 생겼다. 이를 어떻게 해결할지 고민이 된다. 그리고 Swagger API 문서에는 Login을 포함할 수가 없어서 일단 빼고 진행한다. 프로젝트 제출을 얼마 안남기고 배포를 시작하게 돼서 많이 아쉽다...

 

  • EC2 + RDS를 통해 AWS로 배포를 시작했다.
  • Parameter Store에 민감 정보를 저장하고 사용하려는데, 유어클래스에서 배운 내용을 의존성으로 추가하자 SecurityConfiguration에 있는 HttpSecurity가 빨간줄이 그여서 그냥 application.yml에 값을 직접 넣어주고 했다… 아직 해결하지 못해서 답답하다. ㅠㅠ
  • test 했던 내용들을 따로 처리해주지 않다보니 EC2에 올려서 하려니까 잘 안됐다. 그래서 test한 내용을 모두 주석처리하고 올렸다.
  • API 문서에 Login만 들어가지 않아서 Controller로 빼주려고 했지만 너무 코드가 뒤죽박죽이 될 것 같아서 편법을 사용했다. 껍데기만 있는 메서드를 Controller에 만들어두면 Swagger에서는 인식하기 때문에 Swagger에 보이는 값만 설정해주었다. 메인 때는 더 좋은 해결 방안을 얻고 싶다...
  • JWT 등 환경 변수가 충돌나지 않고 사용하는 방법을 찾아야 한다. → env.yml을 통해 해결
  • MySQL 연동
  • 백그라운드 배포까지 성공 → nohup java -jar server-0.0.1-SNAPSHOT.jar &

12/31~1/2: 나는 끝난 줄 알았지...

거의 열흘 간을 방에 처박혀서 모니터만 보니까 정신이 나갈 것 같았다. 그래서 기능 구현과 서버 배포가 끝난 김에 토요일에는 외출을 했다. 그.런.데. 역시나 나가 있으니 난리가 났다. cors 에러가 터지고, userId를 Response에 담아달라는 요청까지 들어왔다. ㅎㅎㅎㅎ 나와 있는데 마음이 편하지가 않았다. 프로젝트 기간에는 뭐 안하는게 맞는건가...

 

  • cors 에러가 생겼다. → 백엔드 쪽에서 해결해야 하는 부분이라고 배워서 열심히 찾아보고 준비는 했는데, 프론트쪽에서 프록시 서버로 해결하겠다고 했다. 다음에는 내가 해봐야겠다.
  • Login은 계속 말썽이다. Response Header나 Body에 userId를 포함해서 보내달라고 해서 코드를 여기저기 봐가면서 겨우 찾아서 설정해주었다. → JWT 기반 Login의 Response Header에 원하는 정보를 추가려면 필터에 구현돼있는 successfulAuthentication을 오버라이드해서 response에 setHeader()로 추가할 수 있다.
    • setHeader(): 값이 있으면 새로운 값으로 대체한다.
    • addHeader(): 값이 있어도 값을 추가한다.
  • BE, FE가 함께 회의록에 각자 바라는 점을 작성하면서 서로에게 피드백을 했다.
  • README.md 파일을 작성했다.

내가 잘했던 것 & 부족했던 것

잘한 점

  • 프로젝트에 몰입해서 열심히 했다. 잠을 평균적으로 3~4시간 정도 밖에 못잤지만 해야하는 것이 많았기에 잠을 줄여서라도 했다. 그 결과 어쨌든 기능 구현은 했다.
  • 필요할 때 도움을 요청했다. 내 평소 학습 습관 중 하나가 웬만큼 모를 때까지는 남한테 질문하지 않는 것인데, 이번 프로젝트를 하면서 그런 것은 버리기로 했다. 잘하지도 못하면서 왜 물어보지도 않는 것인지 나를 되돌아 보면서 느낀 것이다.
  • 상황 공유를 자주 하려고 했다. 내가 push하면 팀원에게 꼭 알려주었다. 나 혼자서 하는 것이 아니기 때문에 상황에 대한 공유는 필수라고 생각한다.
  • 학습 컨텐츠와 구글링을 통해서 문제를 해결해 나갔다. 비록 시간은 좀 오래걸렸더라도 문제가 생길 때마다 포기하지 않고 해결하기 위해 노력했다. 그 결과, 해결하지 못한 것도 있지만 해결한 것도 분명히 많았다.

부족한 점

  • 학습에 대한 이해도가 떨어지는 부분들이 명확하게 드러났다. 수업 때 따라가지 못했던 부분들이 나에게 약점이 되어 고스란히 돌아왔다. 급하게 참고해보면서 코드를 작성해봤지만 많은 시간을 썼고, API 문서를 빨리 주지 못해 전체 일정이 밀리게 되는 악순환이 생겼다.
  • API 문서가 한 부분이라도 나오면 프론트에 넘겨줘야 한다. 모든 Controller를 담은 API 문서를 넘기려고 하다보니 프론트쪽에서는 할 일이 없다가 갑자기 몰려버렸다.
  • 건강 관리에 소홀했다. 프로젝트 때문이긴 하지만 수면 패턴이 완전히 올빼미가 됐다. 차라리 아침에 일어나서 해야하는데 쉽지가 않다. 
  • 배포와 관련해서 많이 공부가 필요하다. AWS에서 쓸데없이 돈이 나가기도 하고 parameter store에서도 지속적으로 에러가 발생했다. 
  • Spring Security 부분도 동작 방식 파악부터 다시 공부해야 한다. 동작 방식에 대한 이해가 없어서 코드를 보는데도 뭐가 뭔지 이해를 잘 못하고 있다. 나아가 Controller를 이용해서 Login 같은 기능을 구현해보는 연습을 해봐야겠다.

메인 프로젝트 목표 정하기

  • 메인 프로젝트를 진행하면서 시간이 비교적 여유로운 시기, 즉 명세서를 작성하고 회의가 없는 시간에는 Spring 공부를 한다. (기본적인 애너테이션 하나하나부터 Spring Security를 커스텀할 수 있을 정도로 공부하고, JPA까지 완벽하게 이해한다.)
  • Redis, kafka 같은 실제 회사에서 사용하고 있는 기술 스택을 경험해본다.
  • cors 에러를 내가 잡아본다.
  • API 문서를 Controller 단위로 잡아서 나오는 대로 프론트에 넘기는 방식을 통해 전체 개발 기간을 줄여본다.

마무리

사실 처음 개발을 시작하겠다고 마음 먹었을 때는 막연했습니다. 재미가 있을까? 하다가 처음으로 재미를 느낀 순간이 있었습니다. 외부 API를 이용해서 지도를 불러오고, 챗봇을 추가해보고, 문자도 보내보았을 때였는데요. 지금 생각해보니 이것 저것 직접 제 손으로 해보면서 한거라 더 재밌지 않았나 싶습니다.

 

처음으로 API를 사용해서 나한테 보내본 문자 / 3월

 

백문이불여일타, 많은 개발자들이 하는 말입니다. 사실 코드스테이츠를 시작할 때만 해도 단순히 몇 번 따라친다고 내 것이 되는 것일까? 라는 생각도 했습니다. 하지만 프리 프로젝트를 진행하면서 생각이 많이 바뀌었는데요. 필요한 부분에서 학습 컨텐츠를 참고하며 코드를 보니 어떤 내용이었는지가 조금씩 떠오르는 경험을 했습니다. 그 덕분에 이해도를 높이고 제가 필요한 내용만 가져와서 사용할 수 있었습니다. 당연히 시간은 좀 걸렸구요! ㅎㅎ

 

제가 개발을 하면서 재밌다는 감정을 느낄거라고 생각한 적이 없었는데, 요즘은 그렇습니다. 메인 프로젝트에서는 더 재밌어졌으면 좋겠습니다. 남은 한 달 열심히 해서 취업까지 닿고 싶네요! (물론 여러분들도 취업 개박살 내셨으면 좋겠습니다!🧱)


처음에 했어야 하는데 지금이라도 하겠습니다.

새해 복 많이 받으시고, 올해는 원하는 일을 모두 이루는 한 해가 되시길 바라겠습니다.

읽어주셔서 감사합니다.

 

ps. 아 그리고 제 트위터는 찾지 마세요. 여기에서 모습은 없습니다. 😈😈