소감 수료식을 끝으로 캠프가 공식적으로 마무리되었다. 사실 아쉬움이 굉장히 많은 캠프였다. 스스로한테 가장 그렇고, 캠프 운영 관련해서도 그렇고, 팀원에게 아쉬운적도 있는 캠프였다. 그래도 나름 재밌는 경험이었고, 게더에 접속하지 않는 것은 벌써 적응하긴 했는데, 시원섭섭하긴하다. 내가 더 열심히 했으면 훨씬 더 의미있고 가져갈게 많았을 시간이었지만, 어쨋든 이건 내 탓이고, 졸업하자마자 좋은 부트캠프 잘 마무리해서 좋다. 3개월이 너무 빨리 지나갔다. 모의면접 모의지만 이런 면접경험은 처음이었다. 사실 분위기는 멘토링과 좀 흡사한, 실제 면접보다는 더 부드러운 분위기이지 않을까 조심스럽게 예상해보고 있다. 이력서를 기반으로 대체로 기술적인 부분을 질문주셨다. 간단한 자기소개, SSE와 WebSocket..
이노베이션 캠프
@JsonBackReference @JsonManagedReference 꽤 중요한 어노테이션을 배웠다. 항상 양방향 연관관계를 맺은 엔티티끼리 순환참조되어 json 파싱 오류가 나면 필요없다고 판단되는 쪽에 @JsonIgnore로 해결해왔었는데, 이 순환참조 문제를 위한 어노테이션이 따로 있었음을 알았다. @JsonIgnore는 항상 응답에서 아예 제외되기 때문에 나중에 프로젝트가 확장됨에 따라 부작용이 생길 수 있을 것이다. 사용방법은 간단하다. 일대다 관계라고 하면, 일(부모) 쪽에 @JsonManagedReference를 달고, 다(자식) 쪽에 @JsonBackReference를 달면 끝이다. 이 순환참조 문제가 Member -----------1:N-------------- MemberAchie..
1. 트러블 슈팅 세션 기술용어 습득 -> 개발자 소통 프로젝트 진행하면서 익숙한 부분부터 CS 공부(웹 기술) -> 점차 확장 트러블 슈팅의 각 요소(도입 이유, 문제 상황, 해결 방안, 의견 조율, 의견 결정) 명확히 제시 a를 통해 b의 결과가 나타남 a가 무엇이고(개념), 왜 사용 했는지 b가 무엇이고, a로 인해 b 이외의 부작용은 없는지 테스트한 내역도 있으면 좋음 isolation 터널비전 피하는 전략 페어 프로그래밍 디버깅 시간 정해놓기 팀원과 공유 중간 회고 더 나은 방법은 없었나 최종 회고 2. 파이썬 스케줄러 스프링으로 수익률 계산 로직을 고민하던 중에, 현재 파이썬으로 스케줄러를 이용해 짧은 시간마다 갱신하는 방식이 좋지 않을 수 있겠다는 생각이 들었다 레디스를 활용한 현재가 정보나..
1. @ModelAttribute put 메소드로 처리되었던 프로필 변경을 patch로 변경하는 작업 중 사용한 어노테이션이다 MultipartFile인 프로필 사진이 requestDto에 포함되어있기 때문에 json만 지원하는 @RequestBody는 사용할 수 없었고, 각각의 프로필 요소를 하나하나 @RequestParam 이나 @RequestPart로 하기는 싫었어서 찾아보다가 발견했다 문제는 요청을 받아 서비스 단에서 열어보니 dto의 모든 값이 null로 떴다. 해결은 두가지로 가능 dto에 @NoArgsConstructor가 있다면 @ModelAttribute 내부적으로 setter를 찾아 값을 세팅한다고 한다 따라서 @AllArgsConstructor가 있어도 @NoArgsConstructo..
1. Python APScheduler from apscheduler.schedulers.background import BackgroundScheduler sched = BackgroundScheduler() sched.add_job(메소드명, 'cron', day_of_week='mon-fri', hour='16', id='renew_index') sched.start() while True: time.sleep(1) 내 프로젝트의 경우 지속적으로 백그라운드에서 스케줄링하므로 BackgroundScheduler 사용 BlockScheduler도 있음 어떤 작업을 할지는 add_job()에 메소드 명을 넣거나, 아래와 같이 메소드 위에 어노테이션 붙이기 cron 형식으로 날짜나 요일, 시간 설정함 @s..
1. 몽고db - 스프링 스프링에서 mongodb atlas 연결 1. mongodb atlas 에서 connect my application에서 java와 버전 선택후 url 가져오기 2. mongodb atlas 에서 해당 클러스터 db connection, network connection에서 권한과 ip주소 잘 설정하기 3. 스프링 application.properties 잘 설정 후 나의 경우에는 깃헙 secrets에 잘 업데이트 하고 배포하기 코드 // build.gradle // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb implementation group: 'org...
미루던 til 한번에 몰아쓰기... 1. 지연 로딩 관련 에러 게시글 - 댓글 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.innovation.stockstock.entity.Post.comments, could not initialize proxy - no Session 양방향 1:N 연관관계인 상황에서 모두 지연로딩으로 설정하니 게시글을 통해 댓글을 조회할 때 (게시글 상세조회) 트랜잭션이 끝나고 나서 댓글 프록시 객체가 초기화 시도하여 댓글 정보를 불러오지 못하는 문제가 생김 게시글에서 즉시 로딩 전략을 사용해 바로 가져올 수도 있지만, 대부분의 경우 댓글 정보는 필요가 ..
1. javadoc 6주차때 주석 관련해서 이런 것이 있다는 것을 소개 받아 추후에 공부가 필요할 것 같아 언급 2. gitignore 처음부터 gitignore에 application.properties를 반영하지 않은 상황에서는 깃헙에 계속 업데이트된다 git rm --cached C:/Users/~파일 위치~/src/main/resources/application.properties 해당 파일의 위치를 복사하여 위 명령어를 사용하면 반영됨 같이 작업하는 개발자들에게 필요할 때 gitignore된 파일의 내용을 그때그때마다 공유해주어야 하는 것 같다. 물론 깃 액션을 활용해 배포할 때에는 gitignore을 사용하면 안 될 것이다 3. 구글 로그인 https://maivve.tistory.com/33..
1. ResponseEntity 사용 // 7주차 응답 형식 ResponseEntity.ok().body("200 응답 바디 메세지"); ResponseEntity.badrequest().body("400 응답 바디 메세지"); // body() 안에는 미리 설정했던 ResponseDto나 적절한 String으로된 메세지를 담았다 // JwtAuthenticationEntryPoint class HttpServletResponse response; response.setStatus(400) // 추가 2. Leetcode DFS 589번 class Solution: def preorder(self, root: 'Node') -> List[int]: if root is None: # 예외 처리 return..
프론트와 처음 협업해보고 클론코딩 주차 중에 있다. 미니 프로젝트는 그렇게 만족스럽지 못한 결과물이었지만 배운 점은 꽤 있었다고 생각한다. 프로젝트 설계 단계에서 API 명세서의 중요성을 다시 한번 더 깨달았다. 백 끼리만 협업할 때도 중요했던 부분인데, 프론트까지 이 명세서에서 URL, 변수명, 요청 및 응답 형식 등 통신에 필요한 부분이 많기 때문이다. 기능을 생각하면서 명세서를 잘 작성할수록 이후 과정들이 훨씬 순탄하고, ERD 작성할 때도 더 편하다. 그래도 나 같은 경우는 명세서를 수정할 때마다 챗으로 계속 공유했기 때문에 이 부분은 나름 잘했다고 생각한다. 코드 짜는 부분에 있어서는 크게 어려운 점이 없었지만, 프론트에 대한 이해도가 더 필요하다는 것을 확실히 체감한 주차였던 것 같다. COR..