로깅? 프로그램 동작 시 발생하는 모든 일을 기록하는 행위다. 모든 일? 기록? 애매모호하다. 모든 일 (최소한의 목적) 서비스 동작 상태 시스템 로딩 HTTP 통신 트랜잭션 DB 요청 의도를 가진 Exception 장애(Exception, Error) I/O Exception NullPointException 의도하지 않은 Exception 로깅은 언제 할까? 나 메이플 직업 추천해줘 같은 질문 같다. 답이 없다는 뜻 프로젝트 성격에 맞게, 팀에 맞게, 로깅 시점은 때에 따라 다르다. 기록 로깅 프레임 워크를 알기전에 쓰던 방식 System.out.println("로깅") System.err.println("로깅 에러") 로깅 프레임 워크 Log4J... Log4J2도 있음 JUL 자바 정식 로깅 프레..
전체 글
꾸준히 성장하는 개발자 WONOW 입니다. 🤗생각보다 많은 사용자가 우리 사이트를 이용해줘서 놀랐다. UI/UX 리뷰 말고 버그나, 성능적인 부분의 리뷰를 원했는데 설문 90%가 UI/UX이다. 근데 참여자 개발자 백엔드 비율은 전체 40% 인데... 왜.... 어쨌든, 기능 추가하면 좋을 거 같다는 의견도 조금 있었다. 버그도 조금 발견했고 요구사항을 말로만 전달했다가 기능 구현을 잊고있었던 부분도 캐치를 할 수 있었다. 생각보다 정말 많이 접속해주고 사람이 많으니까 여러가지 변수가 생겨서 이 부분에 대해 계속해서 캐치를 할 수 있었다. 내가 로컬에서 진행했을때는 사용자들이 이렇게 하겠지? 하면서 예상하며 했었는데, 블랙박스 테스트를 하면서 코드가 어떻게 동작할지 모르고 각종 만들어놓은 기능들을 테스트를 해주니, 진짜 예상하지 못한 부분을 발견해..
프로세스는 실행 중인 프로그램의 인스턴스 쓰레드는 프로세스 내에서 실행되는 작업의 단위입니다. 프로세스는 독립된 메모리 공간을 가지고 서로 간섭 없이 독립적으로 실행됩니다. 쓰레드는 프로세스 내에서 실행되므로 프로세스 내의 쓰레드들은 메모리 공간을 공유하며 상호작용이 간단합니다. 프로세스 간 통신은 복잡하여 운영체제가 제공하는 IPC 기술을 사용해야 합니다. 쓰레드 간 통신은 프로세스 내에서 메모리를 공유하기 때문에 간단하게 이루어질 수 있습니다. 프로세스 생성 및 소멸은 비용이 크며, 자원 소모가 많습니다. 쓰레드 생성 및 소멸은 상대적으로 더 가볍고 빠릅니다. 프로세스는 각자 독립된 메모리 공간을 사용하기 때문에 병렬 실행이 간편합니다. 쓰레드는 프로세스 내에서 공유된 메모리를 사용하므로 동시에 실행..
현재 제작중인 팀프로젝트 스왑스왑 정말 잘 만들고 있다!! 동적 쿼리(제목, 카테고리, 지역) 및 자신이 찜한 게시글 확인 (서브 쿼리) 찜 기능, 커서 기반 페이지네이션 근데 문제가 있었다!! 이러면 사용자 경험이 안좋아지는 것... 그래서 어떻게 할지 하다가 th:if 문을 알게 됐다! 현재 컨트롤러에서는 자신이 찜을 했는지 안했는지 알기 위해서 Member 를 매개변수로 받고 있다. @GetMapping("/posts/{postId}") public String getPost( @PathVariable Long postId, @AuthMember Member member, Model model ) { PostGetResponseDto responseDto = postService.getPost(po..
CORS(Cross Origin Resouces Sharing)는 서버가 웹 브라우저에서 리소스를 로드할 때 다른 오리진을 통해 로드하지 못하게 하는 HTTP 헤더 기반 메커니즘입니다. 프론트엔드 개발 시 프론트엔드 서버를 만들어서 백엔드 서버와 통신할 때 주로 CORS 에러를 마주치는데, 이를 해결하기 위해 프론트엔드에서 프록시 서버를 만들기도 합니다. 💡 Origin이란 무엇일까요? 프로토콜과 호스트 이름, 포트의 조합을 말합니다. https://wonow.com:1515/test에서 Origin은 https://wonow.com:1515 까지가 Origin 입니다. 예를 들어 프론트에서 127.0.0.1:2000 으로 테스팅을 하는데 백엔드 서버는 127.0.0.1:4000 이라면 포트 번호가 다르..
@Override public PostGetResponseDto findPostWithFavorite(Long postId, Member member) { return queryFactory.select( Projections.constructor(PostGetResponseDto.class, post.member.id.as("memberId"), post.member.nickname.as("author"), post.title, post.content, post.category, post.imageUrl, post.viewCnt, post.upCnt, favorite.post.count().as("favoriteCnt"), post.modifiedUpTime, favoriteStatus(member)...