본문 바로가기
내일배움캠프/회고록

10월 11일 주특기 플러스 과제 회고

by jhdevtrace 2024. 10. 11.

10월 11일 금요일. 주특기 플러스 주차의 개인 과제를 제출했습니다~

과제 초반 기간에, 개인적인 골칫거리가 생겨버려서, 초반에 공부할 시간이 조금 날아가 버렸습니다. 이번 주 초까지만 해도 필수 과제 구현도 완료되지 않은 상태였습니다. 안타깝고 아쉬운 일이지만, 중간에 있던 10월 9일 한글날 휴일부터, 갑자기 정신이 들더니 열심히 열심히 달려서, 그래도 도전 과제도 조금은 구현할 수 있게 됐습니다. 가장 뒤의 2문제(AWS, 대용량 데이터 처리)가 이번 개인 과제에서 가장 크고 관건인 문제라고 생각했는데, 제출 기간 전에 도전도 못한 것이 정말 안타깝습니다. 그래도 주말에 해설 영상을 보면서 공부할 게 생겨서 나쁘지만은 않은 것 같습니다. 

 

 

과제를 구현하며 있던 일들을 얘기해보자면, 8번, 9번에서 시간이 많이 걸렸습니다. 

1~6번(코드 묘수풀이 + JPQL)은 쉽게 끝났고, 7번(N+1)부터는 형욱 튜터님 JPA 특강을 듣고 진행했습니다. 8번(QueryDSL), 9번(Spring Security)는 처음 써보는 것이라 특강도 보고, 사용법도 익히고, 개념 이해하는 것에 꽤나 시간을 썼습니다. 이해한 개념들은 면접 준비 글을 따로 만들어서 아래에 링크 첨부하겠습니다~ 

 

10번(QueryDSL 검색 기능)은 사용법 익힌 뒤에 해서 그런지, 재밌게 했습니다.

11번(Transaction 심화) 문제는 로그만 찍는 기능으로 만들었는데, 너무 구린내가 나는 것 같아서, 주변 분들에게 내 코드 어떤지 여쭤보고 다녔는데, 다들 구린내가 난다고 했습니다. 그래서 여기 저기 자문을 구한 결과, 내일배움캠프 스프링 6기 최강 아이돌 챌린저 다크나이트 도라에몽 건님께서 도움을 주셔서, 슈퍼 섹시 코드로 바꾸게 됐습니다~

 

우선 기존의 똥내나는 기능은 스샷을 찍어두지 않아서 설명으로 대체하자면,

Log 엔티티 필드 값 : id, createAt, userId

 

딱 여기까지만 만들고, 특정 메서드가 실행될 때마다 무조건 로그가 찍히도록 만들었습니다. 과제 내용에는 알맞게 구현한 것이 맞는데, 이럴 것이면 AOP랑 다를 바가 없었습니다. 존재의 이유가 다른 기능으로 대체해도 하등 상관 없었던 똥내나는 기능을 탈바꿈한 코드~

 

@Transactional
public ManagerSaveResponse saveManager(AuthUser authUser, long todoId, ManagerSaveRequest managerSaveRequest) {
   try {
       // 일정을 만든 유저
       User user = User.fromAuthUser(authUser);
       Todo todo = todoRepository.findById(todoId)
               .orElseThrow(() -> new InvalidRequestException("Todo not found"));

       if (todo.getUser() == null || !ObjectUtils.nullSafeEquals(user.getId(), todo.getUser().getId())) {
           throw new InvalidRequestException("담당자를 등록하려고 하는 유저가 유효하지 않거나, 일정을 만든 유저가 아닙니다.");
       }

       User managerUser = userRepository.findById(managerSaveRequest.getManagerUserId())
               .orElseThrow(() -> new InvalidRequestException("등록하려고 하는 담당자 유저가 존재하지 않습니다."));

       if (ObjectUtils.nullSafeEquals(user.getId(), managerUser.getId())) {
           throw new InvalidRequestException("일정 작성자는 본인을 담당자로 등록할 수 없습니다.");
       }

       Manager newManagerUser = new Manager(managerUser, todo);
       Manager savedManagerUser = managerRepository.save(newManagerUser);

       String message = "save manager Completed";
       logService.managerSaveLog(authUser.getId(), message);

       return new ManagerSaveResponse(
               savedManagerUser.getId(),
               new UserResponse(managerUser.getId(), managerUser.getEmail())
       );
   }
   catch (InvalidRequestException e){
       String message = "save manager failed";
       logService.managerSaveLog(authUser.getId(), message);
        throw e;
   }
}

 

 

바로, 필드 값에 info 필드를 추가하고, 설명(message)을 같이 Log에 저장하는 것입니다!

그리고 try catch 문으로 묶어서, 메서드가 성공적으로 끝나면 return 전에 로그를 남기고, 실패하면 catch에 잡혀서 에러 메시지 응답과 함께, 실패 로그도 남길 수 있습니다.

 

 

 

 

 

트러블 슈팅 !

 

@AuthenticationPrincipal AuthUser authUser 에서 NullPointerException 발생 문제 : https://jhdevtrace.tistory.com/40

 

@AuthenticationPrincipal AuthUser authUser 에서 NullPointerException 발생 문제

에러 : java.lang.NullPointerException: Cannot invoke "org.example.expert.domain.user.enums.UserRole.name()" because "userRole" is null 플러스 주차의 9. Spring Security 이 문제를 풀고 있었다.결론부터 말하자면,@Auth 어노테이션

jhdevtrace.tistory.com

 

 

 


QueryDsl에서 List<Dto> 방식과 List<Entiry> 방식 : https://jhdevtrace.tistory.com/41

 

QueryDsl에서 List<Dto> 방식과 List<Entiry> 방식

과제 10. QueryDSL 을 사용하여 검색 기능 만들기 중. 저는 처음에 Dto에 담아서 가져올 수 있게 만들었습니다. 하지만 다른 사람들의 코드에서는 Entity를 받은 뒤, Dto에 변환하는 작업을 거치고 있었

jhdevtrace.tistory.com

 

 

 

fetchJoin와 BatchSize를 같이 사용한 경우의 경고문 : https://jhdevtrace.tistory.com/42

 

fetchJoin와 BatchSize를 같이 사용한 경우의 경고문

api를 실행해보면, 에러는 발생하지 않는데, 콘솔창에 어떤 경고 문구가 뜹니다. 이 문제를 발생시킨 코드는 페이지 제일 아래에 첨부!2024-10-09T16:49:57.674+09:00 WARN 21808 --- [spring-plus] [nio-8080-exec-9] or

jhdevtrace.tistory.com

 

 

 

 

기간 검색에서 시작일 또는 종료일이 없을 경우 발생한 문제 개선 : https://jhdevtrace.tistory.com/43

 

기간 검색에서 시작일 또는 종료일이 없을 경우 발생한 문제 개선

제가 처음 구현한 방식에서는 시작일 또는 종료일을 지정하지 않은 경우, 모든 기간의 Todo가 검색되는 일이 생겼습니다.  기간을 둘 다 넣은 경우 : 정상 작동(생성 날짜와 title을 같게 세팅했습

jhdevtrace.tistory.com

 

 

 

면접 대비 개념 정리 !

 

https://jhdevtrace.tistory.com/44

 

JPA에서 Lazy Loading과 Eager Loading의 차이점과 각각의 장단점

지연 로딩 : 엔티티를 조회할 때, 연관된 엔티티를 바로 불러오는 것이 아니라, 실제로 불러와야 되는 시점에 불러오는 방식입니다.장점 : 불필요한 데이터는 불러오지 않기 때문에, 성능 향상과

jhdevtrace.tistory.com

 

 

https://jhdevtrace.tistory.com/45

 

JPA에서 N+1 문제를 해결하기 위한 방법

N+1이란?제가 사용한 스프링의 JPA 프레임워크의 지연 로딩 방식을 사용한 경우에 생기는 성능 문제입니다.발생 원인은, 지연 로딩이 처음에는 연관된 데이터를 가져오지 않다가, 실제로 그 데이

jhdevtrace.tistory.com

 

https://jhdevtrace.tistory.com/46

 

단위 테스트와 통합 테스트의 차이점과 각각의 장단점

단위 테스트는 애플리케이션의 가장 작은 단위(보통 메서드나 클래스)를 개별적으로 테스트하는 방법입니다. 외부 의존성(DB, 외부 서비스 등)을 사용하지 않고, 주로 **모킹(Mock)**을 통해 의존성

jhdevtrace.tistory.com

 

https://jhdevtrace.tistory.com/47

 

QueryDSL을 사용하여 복잡한 동적 쿼리를 작성하는 방법

쿼리DSL : 타입 안정성 있게 쿼리를 작성하여, 복잡한 동적 쿼리를 사용할 수 있는 프레임워크타입 안전성: 쿼리 문자열을 사용하지 않고, 자바 코드 기반으로 쿼리를 작성하여 컴파일 시에 타입

jhdevtrace.tistory.com

 

 

https://jhdevtrace.tistory.com/48

 

트랜잭션

트랜잭션은 데이터베이스에서 여러 작업을 하나의 논리적 단위로 묶어 처리하는 개념입니다.트랜잭션 내 모든 작업이 성공해야만 데이터베이스에 반영되며, 중간에 하나라도 실패하면 전체 작

jhdevtrace.tistory.com

 

 

 

 

'내일배움캠프 > 회고록' 카테고리의 다른 글

9월 11일  (1) 2024.09.12
8월 23일 금요일  (0) 2024.08.26
8월 22일 목요일  (0) 2024.08.23
8월 19일 월요일  (0) 2024.08.20
8월 13일 화요일  (0) 2024.08.14