INTRO (친구의 친구랑 놀러 가기!) 친구의 친구와 놀러 다니던 모임이 5명에서 18명이 되어 어느새 커졌다. 카톡으로 참여 신청을 받고, 사진을 관리하고, 일정을 공유하고, 올리는 문서가 많아지면서 관리가 점점 힘들어졌고, 나는 자바 스프링을 다시 공부하면서, 이걸 웹으로 구현해 보자라는 생각을 하게 되어 시작하게 되었다. 구현할 기능들 1) 일정 등록 및 관련 문서 등록(관리자) 2) 일정 확인(사용자) 3) 참여신청(사용자) 4) 로그인 및 회원가입(사용자) 5) 회원가입 승인(관리자) 6) 게시글 작성, 수정, 삭제(사용자) 7) 댓글 작성(사용자, 관리자) 기술 스택(사용 이유) 1) FE ThymeLeaf Template engine - 기존에 사용 경험, 러닝 커브를 줄이기 위해 사용 j..
INTRO 이번 주는 항해의 남은 6주 동안 진행되는 프로젝트의 팀원이 정해지고, 기획을 하는 주였다. 우리 팀은 알고리즘 구현 속도와 정확성으로 경쟁하는 게임을 만들기로 했고 기획을 시작했다. 처음으로 디자이너 분과 프런트, 백엔드 모두 모여서 회의를 하다 보니, 디자이너님께 어떻게 우리가 생각하는 서비스의 모습을 설명드려야 할지 고민을 했다. 회의를 통해 팀원들과 원하는 형태의 와이어프레임을 ppt와 비슷한 테마로 되어있는 웹을 찾아서 정리해서 보내드리는 것으로 프로젝트를 시작했다. 그리고 기획된 내용을 기반으로 플로우 차트를 그리고, 구현에 필요할 라이브러리와 툴을 공부하면서 막혔던 부분을 정리해보았다. 기술적으로 막혔던 부분 [문제] 온라인 컴파일러 API인 Jdoodle API를 공식문서에 있는..
Intro 온라인 컴파일 API인 Jdoodle을 사용하기 위해, json 라이브러리를 찾던 중 보게 된 속도 비교표를 정리해 보았습니다. 1. 라이브러리 후보군 JSON.simple (Yidong Fang) GSON (Google) Jackson (FasterXML) JSONP (Oracle) 2. 후보군을 이용한 비교적 큰 용량의 json 문서의 파싱 속도 벤치마킹 결과 java 어플리케이션 성능평가/ 모니터링 도구를 개발하는 Takipi 에서 공개 [테스트 파일] 큰 파일: 190MB (https://github.com/zeMirco/sf-city-lots-json) 작은 파일: 1KB (http://www.json-generator.com/) ※ AWS c3.large 인스턴스에서 큰 파일은 라이..
1. 발생 오류 및 해결 방법 1. 마켓 컬리 데이터를 위해 jsoup 웹 크롤링으로 데이터를 얻어오려고 했으나 안됨 [원인] 1) jsoup은 정적 페이지만 가능 [해결책] 1) 카테고리는 웹 자체를 저장해서, jsoup으로 크롤링 2) 가져온 카테고리 내용으로, 네이버 쇼핑 검색어 생성 3) 네이버 쇼핑 API 에서 얻어온, 상세정보 페이지를 크롬 드라이버를 이용한 셀레니움으로 크롤링 2. queryDSL을 이용해 comment 조회 시 , cross- join(한쪽 테이블의 모든 행과 다른 테이블의 모든행을 조인) 발생 [원인] 1) 별도의 join 절 선언 없이 where 문에서 바로 연관관계 사용시 , cross Join 발생(내부 구현체(hibernate)특징으로 암묵적으로 cross join..
1. 발생 오류 및 해결방법 1. QueryDSL을 사용하여 일대 다 연관 관계 두 개 컬럼 패치시 오류 발생 이슈 내용(에러코드) : `org.hibernate.loader.MultipleBagFetchException` 해결 방법: `List`는 복수 개의 fetch 가 안됨으로 컬럼 타입 `Set`으로 변경 2. LocalDateTime, json으로 변환 실패 오류 이슈 내용(에러코드)** : `InvalidDefinitionException: Java 8 date/time type java.time.LocalDateTime...` 해결 방법** : java 8 의 date/time은 POJO로 serialize가 될수 없기에 문자열로 변환 response 3. LocalDateTime, json..
Intro 두 번째로 FE 개발자분들과 협업할 수 있는 주였다. 확실히 첫 번째 주에 협업을 하고 난 이후여서 조금 더 FE 분들께 말하는 방법(조금 더 백엔드 부분의 설명을 단순화해서 말씀드리는 것?)이나, 조심해야 하는 부분들을 알아서 그런지, 조금 더 수월 했다. 그리고 저번 주차에 고생했던 CorsConfigurationSource을 사용한 cors 설정 부분과, depreciate 된 WebSecurityConfigurer을 사용하지 않고, 권장 방식인 SecurityFilterChain을 빈으로 등록해서 설정하여 http.build()하여 반환하는 방식을 공부하면서, 로그인 부분을 구현하시는 분께 의견을 제시했고, 이번 프로젝트에 적용하게 되었다. 1. 백엔드로서 고민했던 점 [마켓 컬리 데이..
1. FE 개발자 분들과 첫 협업 이번 주차는 FE 개발자 분들과 협업할 수 있는 주였다. 같이 짤방을 완성해 주는 미니 프로젝트를 설계하고 구현하면서 많은 경험을 할 수 있던 시간이었다. 가장 난관이 되었던 부분은 Cross-origin 관련 설정이었던 것 같다. react의 서버와, spring 서버가 각각 달라서 cors 설정을 해주어야 한다는 것, 그리고, JWT 토큰을 사용하는데 header 설정과 노출 설정을 해주어야 한다는 것을 알 수 있었던 시간이었다. 그리고 이번 주차 프런트 개발자 분들은 좋으신 분이었는지 설계를 하면서 서로 적극적으로 다 해주신다고 하셔서 서로 일을 나누는 데 좋았던 것 같다. 특히 짤 이미지 저장을 s3를 이용해서 서버에서 저장 처리를 했다가 보내 줄 것인지, 프런트..
INTRO 항해 99 5번째 주차 스프링 숙련 주차가 끝났다. 기존에 배운 것들로 간단한 주문 프로그램을 구현하는 주차였다. 이번 주문 프로그램을 구현 하면서, JPA를 사용한 엔티티 연관관계를 표현하는 OneToMany, ManyToOne, ManyToMany, OneToOne을 사용해 각각의 테이블을 설계하면서, 필요한 테이블과의 연관관계를 통해 기존에 id 값만 저장해서 조회하는 것이 아닌, 관계를 통해 조회하는 방식을 사용해 보면서 공부할 수 있는 시간이었다. 이전에도 JPA를 사용하면서 연관 관계 어노테이션을 사용했고, 각 어노테이션의 fetch 타입을 사용해봤었지만, 스프링 부트에서의 사용은 처음이었다. 그래서 lazy와 eager가 정확하게 동작하는지, 확인을 해보았지만 controller에..