디자이너님도 열일해주시는 우리 프로젝트 ㅎㅎ 기대된다 !!

 

 

1. 어려웠던 부분 

  • WebSoket/WebRTC/Redis/STOMP/SockJs 등 새로 접하는 기술과 개념들을 이해하는게 어려웠다. 스프링을 사용한 예제가 생각보다 많지 않았고, 최대한 github 예제들을 참고하려 했으나 참고한 자료마다 사용이 달라서 실제로 어떻게 동작이 되는지 이해하는데 시간이 걸렸다. 프론트와 맞춰본 후에야 조금 개념이 와닿긴 했지만, 아직 어떤 경우에 사용하고 어떻게 사용해야 성능이 좋은지 공부가 더 필요한 것 같다.
  • 게임 시작 API 구현에 있어서 랜덤으로 카테고리를 선정하고 또다시 같은 카테고리를 갖는 키워드를 랜덤으로 뿌려주는 로직을 설계하는 부분에서 어려움이 있었다. Math.random()을 이용하여 키워드 전체를 조회해서 랜덤으로 키워드 하나를 뽑고 그 키워드에 해당된 카테고리를 인자로 Repository에서 네이티브 쿼리로 rand()를 사용하여 다시 랜덤으로 키워드를 뽑아주는 설계를 했는데, 더 효율적인 코드가 있을 것 같아서 리팩토링할 때 좀 더 생각해 봐야겠다.

 

2. 느낀 점 :

  • 새로운 기술을 도전하는 건 막막하고 어렵지만, 집단 지성으로 팀원들과 같이 공부하고 일단 구현하고 부딪혀보니 길이 조금씩 보이기 시작했다. 할 수 있다는 마음으로 부딪혀보고, 팀원들과 서로 소통하는 과정에서 많은 것을 배울 수 있는 한 주 였다. 하루는 긴데 돌아보면 일주일이 빠르게 지나가 있고, 또 일주일 사이에 나 스스로 많은 성장을 하고 있는 것 같다. 아직 많이 부족하지만, 지금 처럼 조금씩 꾸준히 성장하는 개발자가 되기를 !

 

3. 새로 알게 된 내용 

  • WebSocket vs WebRTC
  • Stomp, SockJS, message brocker (Redis, RabbitMQ), Media Sever (Kurento, Openvidu)
  • querySQL 사용법
  • Kakao - PostMan test 사용법 + kakao developers 설정하는 법
  • 영속성컨텍스트 구조
  • Redis DB 사용법 ( 명령어 )
  • MySQL 램덤 조회 rand() 사용법
  • HashMap 을 Json으로 변환하는 법
  • 그 외 트러블 슈팅 

 

4. 셀프칭찬 : 막막하고 두려운 마음을 극복하고 최대한 할 수 있다는 긍정적인 생각을 되내인 한 주 였다. 생각보다 부족한 사용 예제들 때문에 WebRTC, Openvidu 공식 사이트까지 뒤져가면서 어떤 기술인지 어떻게 사용하는 것인지 찾아보았다. 크게 도움은 되지 않았지만, 이렇게 삽질하면서 공부하고 또 조금씩 성장하는 나를 칭찬한다. 

 

5. 다음주 할 일 : 프론트엔드와 구현된 코드 맞춰보면서 에러 해결하기, 추가기능 구현 백엔드 팀끼리 상의해보고 구현해보기! 


[ 이번주 공부한 부분] 

 

  • 프로젝트 기획에 맞는 API 설계, ERD 설계, 기술멘토링 
  • WebSocket, WebRTC 공부
  • Redis 공부
  • 카카오로그인 / 게임시작 API / 페이징처리 / 검색기능 구현
  • 맡았던 부분 코드 합치기 / 버그수정 / 리팩토링 / 

 

[01] 항해99 마지막, 실전 프로젝트 기획

[38] 트러블 슈팅 : 카카오로그인

[39] 트러블슈팅 : FE와 BE 협업 - 자주 발생했던 오류 정리

[40] 트러블 슈팅 : could not resolve view with name / dispatcherservlet 에러

[07] 1주차 기술멘토링 피드백 정리

 

다들 지쳐있어서 오늘은 팀원들끼리 게임을 달려보았다. 진짜 너무 재밌쟈나 마쟈아냐 마자아냐
덕몽어스 처음 해봤다. 오랜만에 심장뛰었음 ㅎ ...!

 

1. 어려웠던 부분 : 오늘은 아침 일찍 기술멘토링을 받고 궁금했던 부분들이 많이 해소가 되었다. 그러나 문제는 팀원들 모두 너무 지쳐있고, 체력도 많이 떨어진 상태라 집중하기가 너무 힘들었다. 다들 지친상태라 오늘은 쉬는시간도 평소보다 길게 가져보고 같이 게임도 하면서 쉬었다 가는 하루를 보냈다. 항해를 시작한지 62일차가 되었는데, 이런 날도 있어야 하지 않겠냐면서 ㅎㅎ 덕분에 다들 지친 마음을 잘 극복한 것 같다.

 

2. 느낀 점 : 오늘 6년차 개발자분에게 기술멘토링과 피드백을 받았는데, 덕분에 너무 많은 부분에 도움을 받을 수 있었다. 전반적으로 잘 하고 있는 것 같아서 안심도 되고, 또 수정할 부분을 잘 알려 주셔서 도움이 많이 되었다. 

 

3. 새로 알게 된 내용 : 튜터님의 조언에 따라 다대다 연관관계를 맺을때 중간에 GameStartSet이라는 엔티티를 사용했는데, 이 엔티티에 불필요한 부부을 삭제하고 필요한 부분만 넣어주는 방식으로 변경했다. 그리고 쿼리DSL에서 궁금했던 flush(), clear() 부분도 암묵적으로 자동 처리가 되는 부분이기 때문에, 굳이 명시적으로 써줄 필요가 없었다는 것, 우리의 서비스에는 시그널링 서버를 사용하는게 더 적합할 것 같다 것, Redis메모리 파편화는 자료구조를 잘 활용하면 해결되는 부분이고 사실 메모리 파편화가 그렇게 일어나지 않는 다는 점 등 다양한 궁금증을 해소할 수 있었다.

 

4. 셀프칭찬 (오늘 잘한 일) : log.info()를 사용하여 Redis DB로 필요한 정보를 옮기는 작업을 할 때 정보가 잘 들어가는지 확인 할 수 있었다. 다른 분들이 사용하는 걸 구경만 해봤는데, 오늘은 직접 사용해 봤다. 하루하루 경험치가 늘어가는 것 같아서 뿌듯하다.

 

5. 내일 할 일 : 이번주 진행했던 부분 정리하기 ! 


[오늘 공부한 부분] 

 

- 기술 멘토링 참여

- 피드백 반영해서 수정하기

- Redis DB 반영하기

- 팀원들이랑 화합다지기 ( 게임 데이 )

 

1. 어려웠던 부분 : 오늘은 기능구현엔 크게 어려운 부분은 없었다. 백엔드에선 처음 기획했던 부분 코드구현은 어느정도 마무리 되었고, Redis DB와 연결도 성공한 상태라 내일 있을 기술멘토링에 필요한 부분을 정리한 하루였다. 아직까지 WenSocket과 WebRTC 그리고 미디어서버에 대한 개념이 확실하지 않은 상태라 우리 서비스에 가장 적합한 건 어떤걸까 라는 주제로 많은 대화를 나눠보았다.

 

우리가 가장 궁금한 부분은 최대 4명이 화상채팅을 사용한다고 가정했을 때 시그널링 서버(Mesh)를 사용하는 방법이 좋을지 아니면 OpenVidu 와 같은 미디어 서버를 사용하는 SFU 방식이 좋을지에 대한 내용이었다. 최대한 서버에 부하가 덜 가고 실시간성이 보장되는 Mesh방식을 사용하고 싶은데 클라이언트에 과부하가 얼마나 될지 감이 오질 않아서 이 부분을 내일 멘토링때 여쭤보기로 했다.


Mesh의 경우 다음과 같은 장점과 단점이 있다.

  • 장점
    • 서버의 부하가 적기 때문에 서버 자원이 적게 든다.
    • peer간의 직접 연결로 데이터를 송수신하기 때문에 실시간 성이 보장된다.
  • 단점
    • N:N 혹은 N:M 연결에서 클라이언트의 과부하가 급격하게 증가한다. 

그리고 SFU 는 다음과 같은 장점과 단점이 있다.

  • 장점
    • 데이터가 서버를 거치고 Signaling 서버(P2P 방식)를 사용할 때 보다 느리긴하지만 비슷한 수준의 실시간성을 유지할 수 있다.
    • Signaling 서버를 사용하는 것보다 클라이언트가 받는 부하가 줄어든다.
  • 단점
    • Signaling 서버보다 서버 비용이 증가한다.
    • 대규모 N:M 구조에서는 여전히 클라이언트가 많은 부하를 감당한다.

우리가 준비한 질문들 ↓

더보기
  • GameSet에서 발언권이 바뀔 때 마다 DB에 접근을 해야될 것 같은데 속도나 효율성 때문에 Redis를 사용하고자 하는데 방향성이 맞을까요?
  • 한 방에 정답이 최대 4개인데 키워드 리스트를 Json화 시켜서 문자열로 DB에 저장을 했는데 이거를 다시 검증하려고 하면 배열화 시켜야하는 번거로움이 있는데, 조금 더 효율적인 방법이 있을까요?
  • 실무에서 flush / clear를 사용할 일이 별로 없다는데 잘 이해가 안됩니다….ㅠㅠ (데이터를 DB로 보내는 다른 방법: 트랜잭션 commit() / JPQL로 만들어진 Query 실행) → 디엠으로 코드 보내드리기
  • queryDSL 예시를 찾아보던 중에 여러 queryDSL문 생성 후에 마지막에 flush / clear 로 DB에 저장하는 사례가 많았는데, 이 방법이 DB 접근을 최소화하기 위한게 맞을까요?
  • Redis가 메모리 파편화 때문에 생각보다 많은 메모리를 차지하는데, Redis 메모리를 효율적으로 사용하는 방법이 있을까요?
  • WebRTC를 시그널링 서버를 구축하는 방향으로 구현은 성공했는데 최대 4명의 유저간 통신이 이루어지는 저희 서비스에서도 SFU 서버 통신을 고려해야 할까요?

 

2. 느낀 점 : 좋은 팀원들을 만나서 진행도 수월하고, 또 진행되는 프로젝트에 필요한 개념들을 같이 공부하고 의견을 나눌 수 있어서 너무 좋다. 프로젝트를 시작했을 때, 단순히 기능구현에만 집중하지 않고 우리는 개념들을 깊게 파보고 연구해보자고 했었는데 말한대로 다같이 여러 기술들을 공부하면서 진행이 되는 것 같다 : ) 

 

3. 새로 알게 된 내용 : GameStartSet 부분을 Redis DB를 사용해 저장하는 방법을 팀원분을 통해 배울 수 있었다. 내가 구현한 코드에도 내일 적용해 봐야 겠다! 그리고 queryDSL 사용법도 공부했다. 아직 사용해보진 않았지만 대략적인 느낌은 알 수 있었다.

 

4. 셀프칭찬 (오늘 잘한 일) : 새로운 개념을 공부하고 의견을 나눈 하루, 아직 많이 부족하지만 그래도 하루하루 성장하고 있는 것 같다.

 

5. 내일 할 일 : 기술멘토링 / 피드백 받은 부분 수정하기 / 필요한 부분 Redis DB 저장하는 걸로 변경하기 / 코드 전체적으로 리팩토링 (간결화/ 통일화)


[오늘 공부한 부분] 

 

- 코드 주석달기

- 팀원들이랑 게임에 사용될 키워드 DB  채우기 ( 너무 재밌었다 ㅋㅋ 다들 만화 덕후들이었음 )

- 코드 리팩토링

- 게임 API 구현 마무리

 

 

 

오늘따라 젭이 마이 아프네 ^_^;; 계속 튕김당하는 우리들 어리둥절

 

 

1. 어려웠던 부분 : 게임 시작 API 에서 게임 참가자에게 KeywordRepository 에서 랜덤으로 조회된 카테고리에 해당하는 랜덤 키워드를 참여 인원수에 맡게 뿌려주는 부분을 작성해야 했다. 어제 처음 작성한 코드가 너무 길고 하드코드가 되어버린 것 같아 이부분을 queryDSL을 사용해서 좀 더 간결하게 할 수 있을까? 라는 생각에 관련 정보를 찾아봤다. 여러 자료를 찾아보니 아무래도 그냥 native 쿼리를 사용하여 조회하는게 더 좋은 방법일 것 같다는 생각이 들었다. 어찌 저찌 구현은 했는데 코드가 너무 길어져서 더 간결하게 줄일 수 있는 방법이 있는지 연구해봐야 할 것 같다.

다음은 코드 구현 전 작성해본 의사코드 ↓

더보기

<의사코드>

 

// 현재 입장한 게임방의 정보를 가져옴

// 게임 시작은 방장만이 할 수 있음 - 예외처리

// 게임방에 입장한 멤버들 DB(GameRoomMember)에서 가져오기

//게임방의 상태를 start 상태로 업데이트

 

// 멤버들에게 뿌려지게 될 키워드 전체조회 -> 그 중 하나 랜덤 뽑기

// 뽑힌 키워드와 카테고리가 같은 키워드만 모인 어레이리스트만들기

// 만들어진 어레이리스트에 담긴 키워드를 멤버들에게 (랜덤으로) 배당하기

 

// GameStartSet에 해당 방 멤버의 키워드가 어떤 것인지 저장

// StartSet DB에 저장

// 웹소켓으로 방에 참가한 인원 리스트 전달을 위한 리스트 만들기

// 닉네임만 필요하기에 닉네임만 담은 리스트

// 웹소켓으로 전달드릴 content 내용 만들기

// 게임 시작 알림을 방에 구독이 유저들에게 알려줌

 

2. 느낀 점 : 오늘 디자이너님이 게임 컨셉 몇가지를 보여주시고 어떤 컨셉이 좋은지 투표를 했다. 팀원들 모두 매일 새벽까지 공부하고 구현하느라 피곤할텐데도 유쾌해서 나도 덩달아 재미있게 프로젝트를 즐길 수 있는 것 같다. 앞으로 남은 시간들도 계속 이렇게 유쾌한 분위기가 이어졌으면 좋겠다 : )

 

 

3. 새로 알게 된 내용 : 팀원들과 함께 queryDSL과 Redis를 공부하면서 다시한번 JPA 영속성컨텍스트에 대해 복습할 수 있었다. 이전 기수 선배님들의 코드를 보면서 flush() / clear() 를 명시적으로 적어놓은 코드를 보았는데, 이 부분이 궁금했다. 분명히 이영한 선생님이 실제 현업에서 이렇게 사용하지 않는다고 했는데 왜 굳이 적어놓은 걸까? 라는 의문으로 엔티티매니저를 거쳐 DB까지 이르는 과정을 팀원들과 다시한번 보면서 그 구조를 다시한번 이해할 수 있었다. 그래서 결론은 토요일 튜터님에게 여쭤보기로 ...! ㅋㅋ 

 

4. 셀프칭찬 (오늘 잘한 일) : native 쿼리를 사용하여 기능 구현에 성공한 나를 칭찬한다 ! 물론 팀원들의 도움 덕분에 구현에 성공할 수 있었다! 진짜 많이 배울 수 있어서 감사하다.

 

5. 내일 할 일 : 백엔드 코드 합쳐보고 리팩토링하기, 각자 맡은 부분 코드에 주석달기/ 토요일 피드백에 질문할 것 정리하기 


[오늘 공부한 부분] 

 

 

 

 

 

 

 

 

 

1. 어려웠던 부분 : 오늘 프론트엔드와 웹소캣 연결에 성공했다. 아직 고쳐야할 부분은 있지만, 그래도 5일 만에 뭔가 연결이 됐다는게 너무 감동스러웠다. 근데 중요한 건, 어떻게 왜 연결이 되었는지는 아직도 잘 모르겠다는 것이다 ... ㅎㅎ 백엔드에서는 프론트분이 요청한 대로 값을 전달하기만하고 딱히 한 일이 없는데 일단 연결이 되었다. 어떤 동작 원리로 돌아간 걸까? 일단 사소한 오류가 해결이 되면 구현된 코드를 뜯어보며 다시 공부해야 겠다.

 

 

2. 느낀 점 : 스프링공부를 시작하면서 지금까진 게시판 CRUD 구현만 해보다 처음으로 게임 로직을 짜보게 되었다. 생각보다 어렵지만, 또 생각보다 재미있다. 이게 될까? 라고 생각하고 구현하고 PostMan으로 테스트를 했을 때 원하는 값이 나오는게 신기하다. 백엔드 팀원분들 모두 너무 뚝딱뚝딱 기능 구현을 잘 해 주시고, 내가 막히는 부분을 잘 도와주셔서 덕분에 너무 많이 배운 하루였다.

 

3. 새로 알게 된 내용 :

1. 오늘 팀원분에게 터진 에러를 같이 해결하다 알게된 사실. GameRoonRequestDto 부분 이었는데, 아래와 같이 @AllArgsConstructor 어노테이션만 붙이면 원하는 값에 null값이 들어갔는데, 이 부분에 기본 생성자를 만들어 주는 어노테이션인 @NoArgsConstructor를 추가해주었더니 해결되었다. 예전에 기술매니저님이 보통 Dto에는 두 어노테이션 모두 붙여주신다고 했었는데, 앞으로 오늘과 같은 상황을 대비 그렇게 해야겠다.

 

 

2. 오늘 Redis를 설치하고 처음으로 사용해 보았다. 아직 웹소켓부분 구현이 완성된게 아니라 더 공부해봐야겠지만, 일단 코드부분에 Redis 사용이 추가되어서 그런지 이젠 테스트를 할때 Redis 서버도 같이 실행시켜야 오류없이 돌아간다. 여전히 터미널창을 사용해 명령어로 프로그램을 굴리는건 어렵지만, 그래도 또 하나 새로운 걸 배워서 뿌듯하다.

 

4. 셀프칭찬 (오늘 잘한 일) : 팀원분의 에러를 해결한 나 칭찬한다 ㅎㅎ 그리고 처음으로  Redis 사용을 시도한 오늘의 나 칭찬해애 ~_~

 

5. 내일 할 일 : 게임시작 API 카테고리/키워드 랜덤조회해서 뿌려주는 부분 수정하기! 


[오늘 공부한 부분] 

 

- Redis 설치 / 명령어

- 게임시작 API 키워드 랜덤조회 제외하고 구현 완료

+ Recent posts