1. 어려웠던 부분 : 오늘은 마지막까지 남겨져있던 프론트와의 작업을 끝내고, 트러블 슈팅을 팀원들과 정리하는 시간을 가졌다. 일주일이라는 시간동안 촉박하게 클론프로젝트를 구현하다보니 그때 그때 에러 처리에만 급급하고 트러블 슈팅을 정리해놓지 않아서 다시 생각해보기가 꽤나 힘들었다. 다음부턴 최대한 노트에 바로바로 메모해두고 그날 트러블슈팅을 당일에 정리하도록 해야겠다.

 

2. 느낀 점 : 힘든 한 주였지만, 걱정했던 것 보다 좋은 결과물이 나와서 뿌듯했다. 프론트엔드분들이 너무 고생이 많았던 한주였는데 끝까지 열심히 해주셔서 감사함을 느꼈다. 다른사람의 열정을 통해 동기부여도 되느 것 같다. 나도 누군가에게 동기부여가 되도록 나태해 지지말고 열심히 해야겠다.

 

3. 새로 알게 된 내용 : 서비스아키텍쳐를 만들어 보면서, 다시한번 클라이언트와 서버간의 통신 방식을 복습할 수 있었다. 그리고 그 과정에 프론트엔드에선 어떤 기술을 사용하는지, 그리고 백엔드에선 어떤 기술을 사용하는지도 정리할 수 있었다. 그리고 다시한번 느끼지만, 깃헙에 리드미작성 정말 중요한 것 같다. 한눈에 들어오게 기능/기술스택/트러블 슈팅을 잘 정리해두면 나중에 포트폴리오로 활용할 때 유용할 것 같다.

 

4. 셀프칭찬 (오늘 잘한 일) : 오늘 클론코딩 발표자료를 위해 리드미작성과 서비스 아키텍쳐 이미지파일 만드는 작업을 진행했다. 코드를 구현하는 것도 중요하지만 그 외 팀에 필요한 작업을 수행하는 것도 중요하지 않을까? 오늘 일인분 하지 않았나 싶다 ! ㅎㅎ 그리고 이번주에 궁금했던 개념들을 정리하는 시간을 가졌다. 궁금한 부분을 놓치지 않고 간단하게라도 정리해보고 넘어가려는 나의 자세 칭찬함 ㅎ

 

5. 내일 할 일 : 실전 프로젝트 발제 / 기획


[오늘 공부한 부분] 

 

[32] 이번주에 궁금했던 부분 정리

 

[32] 이번주에 궁금했던 부분 정리

Optional vs List Optional은 null 또는 값을 감싸서 NPE(NullPointerException)로부터 부담을 줄이기 위해 등장한 Wrapper 클래스이다. Optional은 값을 Wrapping하고 다시 풀고, null 일 경우에는 대체하는 함수를 호출

leejincha.tistory.com

[09] 트러블 슈팅

 

[09] 트러블 슈팅

@Enablejpaauditing 문제 게시글을 수정할 때, CreatedAt/ModifiedAt 값이 null로 반환되는 문제 해결 @Enablejpaauditing 어노테이션 추가 @EnableJpaAuditing @SpringBootApplication public class HanghaebnbApplication { public static void

leejincha.tistory.com

[10] 프로젝트 정리

 

[10] 프로젝트 정리

1. 프로젝트 소개 🏖️ 에어비앤비 웹서비스를 클로닝한 프로젝트 입니다 https://www.youtube.com/watch?v=FwMvImgOa3k 2. 주요 기능 Spring Security, JWT를 이용한 회원가입/로그인 이메일 인증을 통한 로그인

leejincha.tistory.com

 

 

1. 어려웠던 부분 : 백엔드는 거의 기능구현이 완료되서 오늘 패키지를 어떻게 분리하는게 좋을지 팀원들과 논의해보는 시간을 가졌다. 아직 우리가 구현한 서비스의 스코프가 작다보니 계속 사용해오던 계층형 구조를 사용하는게 좋겠다는 생각을 했다. 그러나 한가지 더 고민 됐던 부분은 S3나 이메일 인증, 그리고 카카오로그인과 같은 기능구현들은 따로 패키지를 빼는게 좋을지 고민하게 되었다. 일단 우리는 다음 프로젝트때 코드 재사용과 이해하는데 유용하게 사용하기 위해 common이라는 패키지안데 각각의 기능들을 담은 패키지를 배치하였다. 근데 이게 좋은 방법인지는 잘 모르겠다.

 

2. 느낀 점 : 거의 다 끝났다고 생각했지만, 끝날때까지 끝난게 아니라는 말이 딱 맞다. 프론트엔드와 코드를 합치면서 자잘하게 수정해야할 사항들이 계속 생긴다. 오늘은 비회원 전용 API를 추가로 구현하여 프론트엔드와 맞춰보았다. 그래도 지난주에비해 이런 협업 작업들이 익숙해 지는 것 같다. 그리고 백엔드끼리 서로 구현하는 부분에 발생한 문제들을 같이 고민하고 해결하는 과정이 참 좋은 것 같다. 나중에 회사에 가더라도 이렇게 물어보고 같이 고민할 수 있는 동료가 있으면 좋겠다고 생각했다.

 

3. 새로 알게 된 내용 : 오늘 자잘한 오류중 하나가 LocalDateTime이 원래는 문자열 형태로 반환되었는데, 갑자기 배열 형태로 나타나는 문제였다. 일단 구글링 검색을 통해 @JsonFormat 어노테이션을 사용하여 문자열로 다시 바꿔주긴 했는데, 기술매니저님께 물어보니 어쩌면 배열로 나오는 타입이 프론트엔드에서 처리하기 더 편할 수도 있으니 이 부분은 상황에 맞게 대처하는게 좋다는 피드백을 주셨다.

 

4. 셀프칭찬 (오늘 잘한 일) : 처음으로 패키지 구조에대해 생각해보는 시간을 가졌다. 추가로 자바 언어공부도 진행하였다. 시간에 여유가 있어서 쉬고 싶은 마음도 있었지만, 그 시간을 이용해 자바공부를 진행해 하루를 알차게 보낸 나를 칭찬한다.

 

5. 내일 할 일 : 클론프로젝트 트러블슈팅 정리, 발표 준비, 깃헙 리드미작성, 서비스아키텍쳐 만들기 ! 


[오늘 공부한 부분] 

 

 

[32] JAVA 입출력 스트림

스트림이란? 자바에서 데이터는 스트림(Stream)을 통해 입출력 된다. 스트림이란 단일 방향으로 연속적으로 흘러가는 것을 의미하는데, 데이터가 출발지에서 도착지로 흘러가는 것을 의미한다.

leejincha.tistory.com

 

계층구조 참고 자료  : https://hyeran-story.tistory.com/160

 

스프링 패키지 구조(Spring Package Structure) - 계층형 vs 도메인형

주절주절,,🗣 회사 프로젝트가 기존에는 모두 계층형이었으나, 이번에 한 프로젝트를 전체 리팩토링 하면서 도메인형으로 변경하게 되었다. 이로써 이제 계층형과 도메인형도 혼합되어 존재하

hyeran-story.tistory.com

 

 

1. 어려웠던 부분 : 오늘 메인페이지의 주요 기능들을 프론트엔드와 합쳐보는 작업을 했다. 지난주 경험 덕분에 훨씬 수월하긴 했으나, 역시나 맞춰보면서 수정해야할 부분들이 계속 생겼다. 예를 들면, 좀더 프론트에서 처리하기 쉬운 반환타입으로 코드를 바꿔주는 작업이라 던가, 필요한 API를 추가한다던가 하는 작업이 있었다. 아무래도 빠른 시간 내에 코들르 구현해서 수정해야하다보니 그 부분이 어려웠던 것 같다.

 

2. 느낀 점 : 백지장도 맞들면 낫다, 집단 지성, 이 두 문장을 정말 팀원들가 많이 얘기하는 것 같다. 좋은 팀원들을 만나서 에러가 터질때마다 같이 알아보고 연구하고 어떤게 좋은 방법일지 토론해 보는 시간이 참 좋은 것 같다.

 

3. 새로 알게 된 내용 : 필터링 기능 구현을 Spring JPA Data가 제공하는 쿼리만으론 해결할 수 없어서 @Param과 native query 사용해서 해결을 했다. 팀원들 덕분에 이메일 인증구현이 어떻게 돌아가는지, 필터링 기능은 어떻게 되는지, 그리고 Swagger를 사용하는 법과 사용시 이점을 배울 수 있었다.

 

4. 셀프칭찬 (오늘 잘한 일) : 다른 팀원의 에러를 같이 해결하기위해 열심히 구글링하고 도와준 나를 칭찬한다.

 

5. 내일 할 일 : 코드 전체 리팩토링, 새로운 기능 코드 리뷰, 유의미한데이터 DB에 넣어 놓기, 마지막 프론트랑 합치기 !! 


[오늘 공부한 부분] 

 

[05] Spring 페이징처리 + 키워드 검색기능 구현

 

[05] Spring 페이징처리 + 키워드 검색기능 구현

Controller //숙소 전체 조회 @GetMapping("/rooms") // size '/api/rooms?page=0&size=3' public ResponseEntity getRooms(@AuthenticationPrincipal UserDetailsImpl userDetails, @PageableDefault(sort = "createdAt", direction = Sort.Direction.DESC) Pageable p

leejincha.tistory.com

[06] Spring 이메일 인증 구현

 

[06] Spring 이메일 인증 구현

build.gradle // 이메일 인증을 위한 설정 implementation 'org.springframework.boot:spring-boot-starter-mail' EmailConfig package com.cloneweek.hanghaebnb.util.email; import org.springframework.beans.factory.annotation.Value; import org.springframew

leejincha.tistory.com

[07] Swagger

 

[07] Swagger

Swagger란? API에 대한 정보를 전달하기 위해 일일이 문서화하는 것은 매우 번거로운 작업이다. 매번 Rest API를 개발하고 수정하면서 API문서를 변경하는 것은 개발자의 생산성 또한 떨어뜨린다. Swagg

leejincha.tistory.com

 

 

 

1. 어려웠던 부분 : 코드는 어느정도 구현이 된 상태라 Refactoring 작업을 시작하려했다. Api Rseponse를 사용하여 반환타입을 맞추고 싶었는데, 생각보다 손봐야 할 부분이 많기도 하고, 꼭 지금 코드에 그리고 서비스에 필요한 부분은 아닌 것 같아 구현을 취소하게 되었다. 구현은 어렵지 않아보였는데, 시간상 비효율적인 것 같아 사용을 포기했다. 다음 프로젝트땐 사용해봐야 겠다.

 

2. 느낀 점 : 백엔드 인원이 많아 프론트엔드보다 상대적으로 시간이 많다보니 새로운 기능을 많이 시도해 볼 수 있었다. 오늘은 내가 맡은 추가기능인 검색어 기능을 구현했는데, 직접 구현에 성공해서 뿌듯했다 : ) 

 

3. 새로 알게 된 내용 :  Cotaining()을 사용해 키워드 검색 기능을 구현할 수 있다. 자세한 내용은 제일 아랫부분 링크 참조 ! 프로젝트 처음 스코프는 무조건 회원가입을 한 생태에서 진행되는 스코프였는데, 시간이 남아서 비회원일 경우를 생각해 코드를 Refactoring 하는 작업을 했다. 비회원과 회원전용 API를 구현하는 방법은 몇 가지가 있는데 다음과 같다.

  1. API 분리
  2. 토큰 유무정보를 확인한 후 API 접근
  3. 유저정보를 프론트에서 -1 이나 0으로 받아서 비회원임을 판가름하는 방법

 

4. 셀프칭찬 (오늘 잘한 일) : 내가 맡은 부분을 완료하고, 추가로 다른 분이 담당하신 코드를 뜯어보는 시간을 가졌다. 팀으로 프로젝트를 진행하다보니, 내가 맡지 않은 부부은 놓치고 가기 쉬운데 코드 리뷰를 통해 다양한 기능을 공부하는 나를 칭찬한다.

 

5. 내일 할 일 : 프로젝트 자잘한 오류 수정, 프론트엔드와 합쳐보기


[오늘 공부한 부분] 

 

[04] OAuth 2.0 카카오 로그인 구현

 

[04] OAuth 2.0 카카오 로그인 구현

User Entity 일반 로그인 회원가입 엔티티에 kakaoId 추가 그리고 아래에 카카오로그인과 업데이트에 사용할 생성자도 추가해 준다. UserController kakaoService 의존성 주입 kakao login Controller 부분 UserReposito

leejincha.tistory.com

[05] Spring 페이징처리 + 키워드 검색기능 구현

 

[05] Spring 페이징처리 + 키워드 검색기능 구현

Controller //숙소 전체 조회 @GetMapping("/rooms") // size '/api/rooms?page=0&size=3' public ResponseEntity getRooms(@AuthenticationPrincipal UserDetailsImpl userDetails, @PageableDefault(sort = "createdAt", direction = Sort.Direction.DESC) Pageable p

leejincha.tistory.com

 

 

 

오늘 크리스마스인데 젭인거 실화소니 ...?

 

 

 

1. 어려웠던 부분 : 첫 협업 프로젝트로 프론트엔드 3명, 백엔드 3명이 팀이 되었다. 그런데 프로젝트 시작 후 프론트엔드 두 분이 갑자기 하차하시게 되면서 처음에 기획했던 스코프를 축소해야 하는 상황이 되었다. 어려운 상황 속에서 하는 데까지 협업을 경험할 수 있는 걸로 이번주 목표를 변경했다. 백엔드끼리의 협업은 이미 지난주차에 경험한 터라 크게 어려운 부분이 없었는데, 프론트엔드와 붙이는 과정에서 생각지 못한 에러도 많이 터지고 특히 API명세와 다르게 작성된 코드들 때문에 그 부분을 수정하느라 고생을 많이 했다. 

 

2. 느낀 점 : 어느 분야나 커뮤니케이션이 정말 중요하다는 것을 느낀 한 주 였다. 조금 과하다 싶어도 좋으니 자주 팀 회의를 통해 서로의 작업 상황을 확인하고, 수정된 부분을 바로바로 업데이트하는 게 정말 중요한 것 같다.

 

3. 새로 알게 된 내용 : CORS해결 방법, 프로젝트 기획은 어떻게 진행되어야 하는지 ( 주제선정 - ERD/API - 기능분배 - 합쳐보기 - refactoring - 프론트엔드와 합치기 ... ), 그리고 프론트엔드와 기능별 작업이 완성되는 대로 미리미리 붙이는 작업을 해야 한다는 것을 배운 한 주였다. 

 

4. 이번주 잘한 일 : 이번주에 총 다섯 분이 하차하면서 41명으로 시작했던 b반이 23명이 되었다. 내가 나를 끊임없이 의심하고 다시 멘탈을 잡고 그렇게 끌고 왔던 49일. 항해 99를 시작으로 제로베이스로 시작해 지금까지 살아남은 사람들이 점점 줄어드는 걸 보면서, 이번엔 마음이 진짜 씨게 흔들렸다. 그래서 기술매니저님과 면담을 했다. 답정너지만 잘하고 있다는 말을 듣기 위해 찾아갔다. 스스로 의심이 들 때마다 지난주의 나와 이번주 나를 비교하면서 멘탈을 잘 잡자.

 

5. 다음주 할 일 : 클론 프로젝트 마무리 ( 소셜로그인, 페이징처리 정리하기)


[ 이번주 공부한 부분] 

 

< 미니 프로젝트 >

[01] 프로젝트 기획

[02] S3로 이미지 업로드 / 조회 / 삭제 구현하기

[03] 트러블 슈팅 / 아쉬웠던 부분

 

<JAVA>

[28] JAVA 멀티스레드

[29] JAVA 스레드 제어

[30] JAVA 컬렉션 프레임워크

[31] JAVA LIFO와 FIFO 컬렉션

 

+ Recent posts