이번포스팅에서는 나만의 라이브러리를 만들어서 프로젝트에 적용해보도록 하겠다. 사용된 코드는 깃허브에 있습니다! 또한 이미 라이브러리를 완성한 후 적는거라 이미 완성 되어있는 것들은 감안해서 보셨으면 좋겠습니다. 현재 프로젝트에서는 게시글을 쓴 작성자와 해당 게시글에 댓글을 단 유저들한테 푸시메세지를 보내는 로직이 있다. private void send(String token, String nickname) { try { sendPushNotification(token, nickname); } catch (ExecutionException | InterruptedException e) { throw new InvalidNotificationException(); } } sendPushNotification..
문제상황 아래코드는 유저의 pk로 유저 관련 정보를 조회하는 로직이다. 간단하게 id로 유저를 찾은 뒤 DTO로 변환시킨다. 여기서 getUserPort에 집중해보자. @Override public UserResponseDto getUser(Long id) { var user = getUserPort.getUser(id); return userMapper.of(user); } getUserPort는 유저를 들고오는 getUser 메서드를 정의한 인터페이스다. public interface GetUserPort { User getUser(Long id); } getUserPort의 구현체는 다음과 같다. @Override public User getUser(Long id) { return userRepos..
MapStruct는 매핑 코드를 자동으로 해주는 라이브러리이다. 예를 들어 Controller DTO에서 Service DTO로 변환할 때, 또는 ServiceDTO에서 Entity 객체로 변환할 때 매핑 작업을 해준다. 하지만 이렇게 일일이 작업을 하게 되면 오류가 발생할 위험이 있고, 또 무엇보다 귀찮다. MapStruct는 이러한 작업을 자동화 시켜준다. 하지만 잘못 사용하게 되면 아까운 시간을 날릴 수 있다. 문제 상황 아래는 User 엔티티를 UserInfo(ResponseDTO라고 봐도 무방하다.)로 변환하는 로직을 MapStruct를 써서 간단하게 구현한 코드이다. 만약 데이터가 다르다면 아래와 같이 Mapping으로 명시해주어야 한다. @Mapper( componentModel = "spr..
엔티티를 생성할 때 무의식으로 아래와 같은 어노테이션을 박고 시작하는 분들이 있을 것이다. @NoArgsConstructor(access = AccessLevel.PROTECTED) 바로 저번 프로젝트 때만 해도 내가 쓰고 있었기 때문이다. 옛날에는 엔티티를 생성할 때 꼭 붙여준 것 같다. @NoArgsConstructor 어노테이션은 객체의 기본생성자를 자동으로 생성해준다. 즉 원래라면 아래코드를 직접 입력해야 하지만, 어노테이션을 붙이면 자동으로 붙여준다는 의미이다. public Member() { } @NoArgsConstuctor은 속성이 있는데, 그 중 액세스레벨을 설정할 수 있다. 액세스 레벨은 접근제한자이다. 왜 기본생성자의 접근 제한자를 private도, public도 아닌 애매하게 pro..
문제상황 성능 개선에 관심이 생겨서 그동안 안보고 피했던 로그를 보던 중 성능을 저하시키는 쿼리가 나가고 있었다. 바로 로그인을 할 때 알람 엔티티가 조회되는 것이다. 유저와 알람은 1대1 양방향 관계고, 알람이 유저의 pk를 들고 있다. 로그인시 이메일과 비밀번호 확인을 위한 유저 조회 유저조회 쿼리를 날린 후 알람 엔티티 조회한다. 먼저 어느부분에서 알람 조회 쿼리가 날라가는지 알기 위해 어설프지만 로그를 찍어봤다. @Override public TokenResponseDto login(UserLoginRequestDto requestDto) { log.info(">>>>>>>>>1"); User user = getUserPort.getUserByEmail(requestDto.getEmail()); ..
Spring boot에는 .gitignore 파일이 있다. 해당 파일에 숨길 파일경로를 설정해주면 깃허브에 올라갈 때 파일은 올라가지 않는다. 예시로 resources 디렉토리를 설정해보도록 하겠다. .gitignore에서 아래와 같이 적어준다. ### Info ### /src/main/resources/** 시작은 루트경로에서 시작한다. IDE에서 자동완성을 도와주기 때문에 별다른 어려움없이 설정이 가능하다. 그리고 git add를 하기 전에 아래 명령어를 해주자. git rm -r --cached . 그다음 git add를 해주면 된다. git add . 확인해보면, 설정한 디렉토리 안에 있는 모든 파일이 올라가지 않는 것을 볼 수 있다. 깃허브 모습 resources 디렉토리가 없어진 모습
이번 포스팅에서는 조회수가 무한 증가되는 것을 방지하는 방법들을 설명하겠다. 먼저 조회수가 무한 증가가 되는 것이 어떤 말인지 알아보자. 모든 코드는 깃허브에 있습니다. 조회수 무한 증가 조회수가 무한으로 증가된다는 뜻이 무슨 말일까? 원래라면 한 게시글은 하루에 단 하나의 조회수만 올라가야 한다. 내가 2번 봤다고 해서 2번 올라가는 것이 아닌, 사용자마다 하루에 단 한 번만 올라가야 된다. 만약 한 사용자가 한 게시글을 볼 때마다 조회수가 올라간다면 조회수라는 의미가 없어진다. 따라서 게시글을 볼 때마다 무작정 조회수가 올라가는 것을 조회수 무한 증가라고 한다. 아래 코드를 보자. public QuestionResponseDto getQuestion(Long id) { Question question..
이번 포스팅에서는 좋아요 개수 조회 성능을 개선해보도록 하겠다. 모든 내용은 테코블 블로그를 참고하였습니다. 모든 코드는 깃허브에 있습니다. 성능 개선 전 현재 상황은 질문글을 전체 조회할 때 발생하였다. 만약 질문글을 전체 조회할 때 아래와 같은 속성을 응답해야 된다는 요구사항이 왔다고 가정해보자. 질문글 PK 질문글 상태 제목 카테고리 댓글 개수 좋아요 개수 등록한 날짜 UI로 본다면 아래와 같은 모습이다. (예시 사진입니다.) 이 때, 각 질문글은 좋아요 개수를 가져오기 위해 좋아요 테이블과 조인하여 조회한다. 조인하는 이유는 단순히 좋아요만 누르는 것이 아닌 좋아요를 누르고 한번 더 누르면 삭제할 수 있어야 하기 때문이다. 각 질문글을 조회하는 쿼리는 다음과 같다. 나머지는 질문글 테이블에 있는 ..
Postman은 보통 API을 테스트하는 목적으로 많이 사용했었는데, 요즘은 API Docs도 Postman으로 만들고 있다. 그럼 어떻게 Postman에서 API Docs를 만들 수 있는지 알아보자. 먼저 엄청나게 간단한 API를 만들어보겠다. @RestController @RequestMapping("/test") public class TestController { @GetMapping("/v1") public String test() { return "성공"; } } 그리고 서버를 돌리고 Postman에서 왼쪽 상단에 new 버튼(빨간 박스)을 눌러준다. 컬렉션을 선택한다. 선택했으면 자동으로 생성되는데, 이름은 간단하게 테스트라고 하겠다. 이름을 설정한 다음 아래 빨간 박스를 눌러주자. 요청을 ..
벌써 마지막 미션을 받았다. 자소서를 쓴지 며칠 지나지 않은 것 같은데 11월 달은 유독 더 빨리 지나간 것 같이 느껴진다. 그만큼 몰입하면서 성장했다고 생각한다. 이번 포스팅 역시 4주차 미션을 진행하면서 배운 내용과 아쉬운 점에 대해 작성하도록 하겠다. 배운 내용을 말하기 전에 3주차 회고를 보면 아쉬운 점을 작성했는데, 그것을 바탕으로 4주차 때 3가지 목표를 세웠다. MVC 패턴 적용해보기 외부에서 객체를 주입받는 의존성 주입(DI) 구현해보기 테스트하기 좋은 코드로 리팩토링 해보기 위 목표들을 최대한 적용해보려고 노력했고, 그 결과 조금 더 Clean Code에 대해서 알아가고 있는 것 같아 뿌듯했다. 목표를 세워서 해당 목표를 중심으로 구현해보는 것도 좋은 것 같다. MVC 패턴 지난 과제를 ..
- Total
- Today
- Yesterday