1. 어려웠던 부분 : 오늘도 역시나 원인을 명확히 알 수 없는 CORS에러와 https 관련 에러로 골머리를 앓았다. 아무리 에러 메세지를 구글링해보고 이방법 저방법 따라해봐도 잘 해결이 되지 않는다. 결국 배포를 맡은 팀원이 다시 도메인을 파고 배포하는 과정을 반복하기까지 했는데도 해결되지 않았다. http 에서 https로 바꿨을 뿐인데 발생하는 에러가 너무많다. 아부지 정답을 알려죠 .... 내일 있는 기술 멘토링에서 해답을 얻기를 ! 아래는 내일 여쭤볼 질문 사항들이다.

 

 

2. 느낀 점 : 오늘 오랜만에 디자이너님과 디자인 회의를 했다. 오랜만에 숨통트이는 시간이었다. 너무 우리가 원하고 생각한 대로 작업을 잘 해주셔서 감사했다. 디자이너님도 국비로 스프링을 배우고 개발일을 하시다가 UX디자인 쪽으로 전향하셨다고 했는데, 진짜 능력자이신 것 같다. 나도 훗날 기회가 된다면 프론트엔드나 디자인 쪽도 공부해보고 싶다는 생각이 들었다.

 

3. 새로 알게 된 내용 : https로 배포를 할 때 인증서를 발급하는데, 인증서 해당 도메인을 프론트엔드 주소와 백엔드 주소 모두 (2개) 넣어줘야 한다. 그렇지 않으면 계속해서 아래 참조링크와 같은 에러가 발생한다. 

 

4. 셀프칭찬 (오늘 잘한 일) : 하루 종일 에러와의 싸움... 해결된건 거의 없지만 잘 버텼다.

 

5. 내일 할 일 : 기술 멘토링, 피드백 반영해서 수정하기


[오늘 공부한 부분] 

 

[50] 트러블 슈팅 : CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource (allowedOrigins)

 

[50] 트러블 슈팅 : CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource (allowedOr

문제 상황 Front와 협업중에 구매한 도메인을 적용했고 서버에서 데이터를 문제없이 내려주기 위해서 CORS에 해당 도메인을 등록했다. 해당 도메인을 등록하고 나니까 localhost:3000 [즉, 프론트쪽 리

leejincha.tistory.com

[51] 트러블 슈팅 : (WebRTC) Error parsing HTTP request header

 

[51] 트러블 슈팅 : (WebRTC) Error parsing HTTP request header

문제 상황 프론트엔드와 WebRTC를 테스트하는데 계속해서 위와 같은 에러가 떴다. 백엔드 서버는 https:// 를 사용하고 있고, 프론트엔드는 http:// local 서버를 사용하는 상황 채팅방에 클라이언트가

leejincha.tistory.com

트러블 슈팅 : Invalid character found in method name. HTTP method names must be tokens

 

 

1. 어려웠던 부분 : 오늘 https 서버를 배포하고 WebRTC 시그널링이 연결은 됐는데, 게임방나가기 로직에서 문제가 생겼다. 방을 나가도 연결이 제대로 끊기지 않아 남아있는 사람들에게 나간사람의 화면이 계속 보이는 에러가 있었다. 그리고 서버를 https로 바꾼 이후 계속해서 NET::ERR_CERT_COMMON_NAME_INVALID 라는 에러 혹은 403에러가 발생했다. 오늘 해결하진 못했는데 아마 추측하기론 https로 보안 단계를 올리면서 뭔가 안맞아서 발생하는 에러인 것 같다. 

 

2. 느낀 점 : 하나가 해결되면 다른 하나가 터지는 개발의 세계. 그나마 다행인 것은 왠만한 에러들은 구글링을 통해 해결할 수 있다는 것이다. 그런데 구글링을 해도 해결되지 않는 오류는 어떻게 해결해야 할까 ? 구글링을 더 더 더 잘하는 방법이 뭐가 있을까. 요즘 터지는 에러들은 구글 페이지 끝까지 글을 뒤져보고 공식 문서를 찾아봐도 잘 해결이 되지 않는다. 이럴 땐 어떻게 해야하는지, 현업에선 어떻게 해결하는지 궁금하다. 

 

3. 새로 알게 된 내용 : 어제 새롭게 구현한 Redis Token 에 대해 공부했다. 왜 사용하는지, 어떤 한계점이 있는지 그리고 어디에 저장하는게 옳은 것인지 등등 다양한 글을 찾아봤는데, 글마다 토큰을 저장하는 위치가 달라서 많이 혼란스럽다. 일단 구현된 코드는 Redis 스토리지에 저장하는 방식이긴 한데 이 부분을 좀 더 연구해 봐야곘다.

 

4. 셀프칭찬 (오늘 잘한 일) : 나의 시간이 비었을 때 다른 팀원의 에러를 같이 해결하거나 추가적인 공부를 하는 나 자신을 칭찬하려고 한다. 나는 내 방식대로 열심히 공부하고 풀어지지 않도록 노력중이다. 

 

5. 내일 할 일 : 제발 WebRTC가 정상 작동 되기를 ...ㅜ! 


[오늘 공부한 부분] 

 

[49] 트러블 슈팅 : JWT signature does not match locally computed signature

 

[49] 트러블 슈팅 : JWT signature does not match locally computed signature

JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted 에러가 발생되는 경우 → 해당 에러는 토큰 검증시 시간이 만료되거나 key가 변경되어 맞지 않을때 발생되

leejincha.tistory.com

[08] Spring Security + Refresh Token (1)

 

[08] Spring Security + Refresh Token (1)

Access Token의 문제점 사용자의 잦은 로그아웃 경험 현재 진행중인 나몰닭 프로젝트는 Access Token 만을 사용하여 사용자를 인증한다. Access Token 유효 기한인 1시간이 지나면 유저는 로그아웃되고 다

leejincha.tistory.com

 

https://blog.jetbrains.com/ko/blog/2020/09/29/code-with-me-eap-ko/

 

공동 개발을 위한 JetBrains 도구인 Code With Me (EAP)를 만나보세요! | Company Blog

오랫동안 기다려 온, 원격 공동 개발 및 페어 프로그래밍을 위한 도구인 Code With Me의 얼리 액세스 프로그램이 시작되었습니다! Code With Me에 관하여 시작하기 사용 사례 호환성 향후 계획 유용한

blog.jetbrains.com

 

1. 어려웠던 부분 : 백엔드 스코프가 여전히 부족한 것 같아 아래와 같은 추가적인 기능을 계획했다. 

  • CI/CD
  • Refresh Token
  • S3 이미지 업로드
  • 업적 로직

이 중 Refresh Token 기능을 맡았는데, 구글링 해보니 나오는 예제들은 너무 많지만 대부분의 예제들이 MySQL에 토큰을 저장하는 거였고 Redis 스토리지를 활용한 예제는 찾을 수없어서 그 부분을 작성하는데 어려움이 있었다. 다행히 현재 Redis를 담당하고 계신 팀원분이 도와주셔서 해결할 수 있었는데, 공부가 더 필요할 것 같다. 

 

2. 느낀 점 : 프론트엔드와 디자이너분께 부담이 덜 가면서 백엔드의 스코프를 늘릴 수 있는 방법은 결국 인프라 부부을 향상시키는 방향인 것 같다. 그렇다면 지금 이 프로젝트에서 잘 써먹을 수 있는 것들은 뭐가 있을까? 일단 생각나는 키워드는 깃헙액션, 무중단배포, https (이 부분은 프론트엔드도 같이 해야함), 도커사용 ... 등이 있을 것 같다. 이번 프로젝트 덕분에 코딩하는 것 뿐만 아니라 프론트엔드, 디자이너, 백엔드가 서로를 배려하고 적절히 의견을 조율하는 방법을 배울 수 있는 것 같다.

 

3. 새로 알게 된 내용 : 자꾸 Redis를 조회할 때 알아보기 힘든 형태로 깨져서 출력이 되는데, 이를 해결해주는 Redis GUI 프로그램인 Medis가 있다는 것을 알았다. 바로 앱스토어에서 구매하면 $5정도 차감되고, 깃헙에 올라온 오픈소스는 무료인데, 이 오픈소스는 npm이라는 것을 또 설치해야 했다. 너무 번거로워서 찾아보던 중 3조 분이 CrudRepository 라는 것을 이용해 깔끔한 조회화면을 볼 수있다는 사실을 귀뜸해 주셨다. Redis를 맡은 팀원분이 적용해서 보여주셨는데, 정말 신기하게도 바로 깨지지 않는 화면이 나왔다. 

 

4. 셀프칭찬 (오늘 잘한 일) : Rfresh Token 기능 구현을 하루만에 성공했다. 물론 어려운 작업은 아니지만, 그래도 배우지 않은 부분을 구글링과 깃헙 자료를 통해 스스로 구현할 수 있어서 기뻤다 ! 

 

5. 내일 할 일 : 끝나지 않는 WebRTC 해결해 보자  ㅜㅜ ! 팀원 모두 붙어서 해결하는 중 ...


[오늘 공부한 부분] 

 

[05] Hashmap을 JSON으로 변환하는 법

1. JSONObject() JSONObject()를 호출 한 다음 해시 맵을 전달하는 방법 의존성 추가 // build.gradle 의존성 추가 부분 JsonObject implementation group: 'org.json', name: 'json', version: '20090211' import org.json.simple.JSONObject; i

leejincha.tistory.com

[48] 트러블슈팅 : No serializer found for class (Spring Boot) 해결못함 ^_^

 

[48] 트러블슈팅 : No serializer found for class (Spring Boot) 해결못함 ^_^

문제상황 WebRTC를 이용해 프론트엔드와 화상채팅을 구현하는 코드를 작성 중이다. 채팅방에 들어오는 사람마다 session ID를 갖고있는데, 이 세션 아이디를 Redis DB에 저장하는 과정에서 아래와 같

leejincha.tistory.com

[06] Spring Security 인증인가 - 예외 커스텀 핸들링

 

[06] Spring Security 인증인가 - 예외 커스텀 핸들링

이번 포스트는 Custom한 예외처리 (StatusCode)를 이용하여 JWT토큰에 관련된 예외처리를 작성한 부분을 담으려 한다. ExceptionTranslationFilter ExceptionTranslationFilter는 2가지 종류의 예외를 처리 FilterSecurityI

leejincha.tistory.com

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

 

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

1. 사전 준비 ① 노션 : https://www.notion.so/1-882180dd274943b683676575e8aae4dd 1조 기술멘토링 사전노트 코드 컨벤션 www.notion.so ② 준비한 질문 GameSet에서 발언권이 바뀔 때 마다 DB에 접근을 해야될 것 같은

leejincha.tistory.com

 

 

 

1. 어려웠던 부분 : 백엔드는 WebRTC를 제외하고 추가로 잡은 스코프까지 기능구현이 완료된 상태라 오늘부터 같이 WebRTC를 해결해보자는 의견이 나왔다. 그런데 내가 맡았던 부분이 아니라 너무 개념이 부족해서 일단 개념을 다시한번 잡아야 겠다는 생각이 들었다. 오늘은 비교적 여유가 있는 날이라 지난주 부터 정리하고 싶었던 여러 개념들을 블로그에 정리하면서 공부하는 시간을 가져보았다. 여러 참고 자료들을 보면서 공부를 하긴 하는데, 읽으면 이해는 되지만 내 머리에 저장이 되고있는 것 같지는 않아서 어떻게 하면 효율적으로 공부할 수 있을지 고민되는 하루였다.

 

2. 느낀 점 : 오늘 프로젝트의 핵심 기능인 WebRTC가 너무 해결이 안되고 있고, 또 대부분의 예제들이 Spring 이 아닌 Node.js를 사용한 예제 이기 때문에 그 예제를 ChatGPT라는 프로그램을 사용하여 Spring 으로 바꿔보는 시도를 해봤다. 물론 정확한 결과를 주진 않았지만 AI가 얼추 비슷한 코드를 죽죽 써내려 가는것을 보니, 아 이제 개발자 밥그릇도 줄어들겠구나라는 생각이 들었다. 외국어를 전공했더니 구글번역기가 다먹어버리고 ㅎ 개발을 시작했더니 ChatGPT가 등장했다. 긍정적으로 생각하자면, 잘 활용할 수 있는 사람이 된다면 더 효율적인 코딩을 하는 개발자가 될 수 있지 않을까 라는 생각을 했다.

 

3. 새로 알게 된 내용 : 이번 프로젝트에 유난히 Enum을 많이 사용하게 되었는데, 정확한 개념을 몰라서 정리해보는 시간을 가졌다. 그리고 지난주에 두번째 숙제로 받은 Git 과 Github 그리고 Gitflow에 대한 공부를 했다. 내용은 아래 링크 참조 ! 

 

4. 셀프칭찬 (오늘 잘한 일) : 내가 맡은 일을 끝내고 부족한 공부를 하는 나를 칭찬한다. 아직 많이 부족한거 같아서 불안하기도하고, 이번 프로젝트에서 너무 맡은 부분이 적은것 같아 걱정이 되기도 한다. 그렇지만, 이럴수록 전반적인 프로젝트를 심도있게 이해하자는 생각을 했다. 시간이 빌때마다 틈틈히 개념공부를 열심히 해서 어떤 면접 질문에도 잘 대답할 수 있도록 해야지 !  

 

5. 내일 할 일 : 아직도 시그널링 부분에 에러가 많다. 그 부분을 같이 해결해보기, 백엔드에선 추가적인 스코프 계획을 잡기 ! 

 


[오늘 공부한 부분] 

 

ChatGPT !! 엄청나다 !!

 

ChatGPT !! 엄청나다 !!

요즘 노마트코더를 비롯한 개발자들의 유튜브 채널에 자주 등장하는 화제인 ChatGPT! 코드도 작성해주고, 만든 코드를 개선시켜 주기도하고, 다른 언어로 바꿔주는 등 인공지능으로 다양한 서비

leejincha.tistory.com

[45] Git vs Github vs Git Flow

 

[45] Git vs Github vs Git Flow

Git vs GitHub Git Git is a distributed version control system for tracking changes in source code during software development. It is designed for coordinating work among programmers, but it can be used to track changes in any set of files. Its goals includ

leejincha.tistory.com

[02] Redis 설치 및 명령어 정리

 

[02] Redis 설치 및 명령어 정리

Redis 란? Redis 는 Key-Value 형태로 데이터를 관리하는 오픈 소스이다. Redis 는 빠른 속도와 간편한 사용법으로 인해 캐시, 인증 토큰, 세션 관리 등등 여러 용도로 사용되고 있다. Redis는 빠른 속도 대

leejincha.tistory.com

[03] (Spring Boot) WebSocket / WebRTC

 

[03] (Spring Boot) WebSocket / WebRTC

WebSocket 일반적인 클라이언트와 서버의 소통방식은 HTTP/HTTPS 통신을 거친다. 이는 클라이언트가 서버에 요청을 보내면 서버가 요청에대한 응답을 보내주는 구조이다. 실시간으로 채팅을 주고받

leejincha.tistory.com

[04] 카카오 로그인 PostMan 테스트 방법

 

[04] 카카오 로그인 PostMan 테스트 방법

※ 이 게시글은 카카오 로그인 코드가 구현되어 있다는 전제하에 PostMan으로 테스트 하는 방법을 담은 글 입니다 :) 1. 사전 준비 ( kakao developers) https://developers.kakao.com/ 위 사이트 접속 - [내 애플리

leejincha.tistory.com

[46] 트러블 슈팅 : InvaliDataAccessApiUsageException: detached entity passed to persist

 

[46] 트러블 슈팅 : InvaliDataAccessApiUsageException: detached entity passed to persist

문제상황 PostMan으로 게임방 생성하는 API를 테스트하는데 다음과 같은 에러가 발생했다. 회원탈퇴 기능을 추가한 후, 회원이 탈퇴하더라도 피드백 게시판의 글은 그대로 보존하기 위해, 아래와

leejincha.tistory.com

[47] Enum

 

[47] Enum

이번 프로젝트에 WebSocket/Stomp 를 이용해 채팅기능을 구현하면서 프론트에 전달하는 messageType에 Enum을 사용하게 되었다. 내가 구현한 코드부분이 아니기도하고 Enum에 대한 개념이해가 부족해서

leejincha.tistory.com

 

 

 

 

1. 어려웠던 부분 : 지난주 토요일 기술멘토링에서 백엔드 스코프가 비교적 작다는 피드백을 받아서 오늘은 추가적으로 구현해볼 사항을 팀원들과 논의했다. WebRTC와 WebSocket에 대한 개념이 제로일때 스코프를 짰던거라 백엔드 스코프가 작은 줄 몰랐었는데, 프론트엔드에서 대부분 구혀을 맡아준다는 걸 시작을 하고나서야 알게되다보니 멘토님 말씀처럼 수정이 필요한긴 했다. 근데 지금 프론트엔드에서 해야할 부분이 너무 많기 때무에 최대한 프론트엔드분들에게 덜 영향을 줄 수 있는 방향으로 스코프를 확장하고자 했다. 그래서 나온 의견은 

1. 인프라 쪽 확장하기 ( CI/CD, Doker)

2. 모두에게 익숙한 게시판 기능 추가하기 

3. 마이페이지 기능 추가하기 ( 회원탈퇴, 닉네임 변경, 업적 추가)

 

2. 느낀 점 : PostMan으로 백엔드 코드를 테스트 했을 때는 문제가 없더라고 막상 프론트엔드와 붙여봤을때 다양한 에러와 반환값 변경과 같은 수정사항이 생긴다. 프로젝트를 하면서 정말 소통이 중요하다는 것을 하루하루 몸소 느끼고 있다. 의사를 확실히 전달하면서 예쁘게 말하는게 얼마나 중요한지 배우고 있다. 모두 열심히 해주는 팀원들에게 감사하다.

 

3. 새로 알게 된 내용 : 내가 담당한 부분이 비교적 작은편이라 팀원들에게 터지는 에러를 같이 찾아보고 해결해 주고있다. 오늘은 트러블 슈팅 세가지를 정리해 봤는데 (아래 링크 참조) 나의 분량이 작더라도 팀원들에게 터지는 에러를 같이 찾으면서 많은 공부가 되는 것 같다. 그리고 지난주 토요일에 멘토님이 숙제로 내주신 Spring 과 Spring boot 차이점에 대해 공부해 봤다. Spring boot는 개발자가 보다 Spring 프레임 워크를 편리하게 사용하기 위해 확장된 프레임워트라는 사실 ! 나중에 면접을 위해서 각각의 특징을 잘 숙지해놔야 겠다.

 

4. 셀프칭찬 (오늘 잘한 일) : 맡은 부분을 잘 끝내고, 팀원들에게 발생한 에러들을 같이 해결했다. 분량이 작다고 걱정할게 아니라 더 열심히 히 다른사람이 맡은 부분을 공부해야 겠다.

 

5. 내일 할 일 : WebRTC 시그널링 에러 도와서 같이 해결해보기 ! 


[오늘 공부한 부분] 

[41] 트러블 슈팅 : nonuniqueresultexception: query did not return a unique result

 

[41] 트러블 슈팅 : nonuniqueresultexception: query did not return a unique result

문제 : 인텔리제이 콘솔에 다음과 같은 에러 메세지가 떴다 : nonuniqueresultexception: query did not return a unique result 원인 : Database Corruption 가 원인이다. 즉, 이 에러는 DB에서 조회한 결과가 중복이 될 때

leejincha.tistory.com

[42] 트러블 슈팅 : Type definition error

 

[42] 트러블 슈팅 : Type definition error

문제 : 게임방 생성 API test시 Type definition error 발생 원인 : domain 생성자를 인식하지 못해서 생기는 에러, @Builder 어노테이션을 사용하고 있는데 생성자를 만들어주는 부분이 없다면 발생할 수 있

leejincha.tistory.com

[43] 트러블 슈팅 : @RequestMapping의 produces 속성

 

[43] 트러블 슈팅 : @RequestMapping의 produces 속성

문제 프론트엔드의 요청으로 반환값으로 String 타입의 nickname 을 return 하는 상황 PostMan으로 테스트 한 결과, 한글과 띄어쓰기가 모두 ?로 반환되었다. 해결 @RequestMapping의 produces 속성을 이용해 Resp

leejincha.tistory.com

[44] Spring vs Spring boot 차이

 

[44] Spring vs Spring boot 차이

Spring 이란 ? 스프링 프레임워크(Spring Framework)는 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 간단히 스프링(Spring)이라고도 불린다. 동적인 웹 사이트를 개발하기 위한 여러 가지

leejincha.tistory.com

 

+ Recent posts