본문 바로가기

전체 글

(104)
무한 스크롤링을 이용하여 성능 개선하기 🔐 들어가며 안녕하세요! 이번 포스팅에서는 기존 리스트에 무한 스크롤링 방식을 추가하여 성능을 개선한 사례를 소개해드리려고 합니다. 🐤 기존 로직 SELECT * FROM 테이블 WHERE 검색조건 ORDER BY id 기존에 리스트를 가져올 때는 SELECT 된 결괐값들을 모두 가져와서 리스트에 담아서 View 단에서 반복문을 돌려서 뿌리는 방법을 사용하곤 했습니다. 위 사진과 같이 조회한 결괏값이 51,000개가 나오면 51,000개의 결괏값이 모두 리스트에 담겨 뷰에서 51,000개를 반복을 돌리곤 했죠. 그런데 ... 너무 느렸습니다! 안 그래도 하루에 많은 양의 데이터가 쌓이는데 단순 로그성 데이터들을 보려고 몇 초나 기다려야 하는 것은 정말 고된 기다림이였습니다 ... 😱 그래서 어떻게하면 성..
[Spring Boot & intelliJ] lombok cannot find symbol 해결 방법 문제 발생 lombok을 적용해서 코드를 작성했는데 관련 코드에 cannot find symbol 에러가 발생했다. 사실 예전부터 자주 발생하던거였는데 해결 방법을 자꾸 까먹는다 ... 😂 해결 방법 (1) intelliJ 설정 확인 Ctrl + Shift + A - Plugins에서 Lombok plugin이 깔려있는지 확인한다. 깔려있지 않다면 install을 한다. File - Setting - Build, Execution, Deployment에서 Enable annotation processing에 체크 표시가 되어있는지 확인한다. 만약 체크 표시가 안되어있으면 체크 해준 후에 Apply해준다. (2) 의존성 확인 build.gradle dependencies { compile('org.proj..
단위 테스트에 Spring Securiy 인증 관련 어노테이션들 사용하기 🔐 들어가며 안녕하세요! 이번 포스팅에서는 테스트할 때 Spring Security 인증을 할 수 있게 제공되는 어노테이션들을 소개하려고 합니다. 이 포스팅에서 다루는 어노테이션 목록은 다음과 같습니다. @WithMockUser : UserDetail 생성 @WithAnonymousUser : 익명의 유저 생성 @WithUserDetails : UserDetail 조회 👻 의존성 추가 testCompile('org.springframework.security:spring-security-test') testCompile("org.springframework.boot:spring-boot-starter-test") 위 어노테이션들을 사용하기 위해 반드시 필요한 spring security test와, JU..
Git rebase를 사용해서 커밋 정리하기 🔐 들어가며 안녕하세요! 이번 포스팅에서는 PR을 올릴 때, git rebase 기능을 사용해서 커밋을 정리하는 방법에 대해 알아보겠습니다. 이 포스팅에서 다루는 git rebase 명령어는 아래와 같습니다. fixup, squash : 커밋 병합 reword : 커밋 이름 변경 ⏳ rebase 사용 플로우 1. 작업 & PR & 코드리뷰 기본적으로 브랜치를 나누고 해당 브랜치에서 작업을 한 뒤에 작업이 모두 끝나면 PR을 날리게 됩니다. 그 이후에는 코드 리뷰를 받게 되고, 리뷰 받은 건을 수정하고 올리면 사진과 같이 수정 커밋이 남게 됩니다. 이 커밋들 중에 사소한 커밋(ex. 오타 수정, 공백 제거)들은 git rebase를 이용해서 커밋 병합을 하게 되면 아래와 같은 이점이 생깁니다. 중요한 커밋..
주니어 개발자들의 (얕은) 코드리뷰 도입기 🔐 들어가며 안녕하세요! 이번 포스팅에서는 서로 다른 기술 스택을 가진 주니어 개발자 2명이 코드 리뷰를 도입한 경험에 대해 포스팅해보려고 합니다. 만약 글을 읽다가 "어...? 음...? 🤔" 하는 부분은 댓글로 지적해주시면 감사하겠습니다! ❔ 코드리뷰를 도입하게 된 이유 저희 회사는 코드리뷰 문화가 따로 없고, 각자가 짠 코드를 각자 확인하고 Merge Request를 올려 셀프 승인을 하는 방식으로 운영하고 있습니다. 코드리뷰를 하지 않았던 이유는 아래와 같았습니다. 리뷰하는 데 시간이 너무 오래 걸린다. 리뷰를 해줄 만큼 전문적인 지식을 가진 사람이 너무 적다. 코드 리뷰에 익숙한 사람이 없다. 하지만 저(B/E)와 제 동기(F/E)는 코드리뷰에 대한 갈망이 있었고, 서로의 언어에 대한 깊은 이해..
[Spring Boot] POI 여러 CellStyle 사용 시 마지막 셀의 스타일만 적용이 되는 오류 해결방법 TL;DR 하나의 CellStyle에 여러 개의 스타일을 동시에 넣을 수 없기 때문에 따로따로 만들어주는 방법으로 해결했다. 문제 발생 POI를 사용해서 하나의 CellStyle에서 여러 스타일을 사용할 때 마지막 셀의 스타일이 전체에 적용되는 오류가 발생했다. 해결 방법 구글링으로 열심히 뒤져보니 하나의 CellStyle에 여러 개의 스타일을 넣을 수 없었다. 그래서 기존 소스 코드를 보면 Cell cells = rows.createCell(29); // 쿠폰 cells.setCellStyle(style); 이런 식으로 하나의 CellStyle을 계속 재사용하면서 사용했기 때문에 위와 같은 이슈가 발생했던 것이었다. 그렇다고 하나의 row마다 createCellStyle()을 이용해서 만들기에는 Cel..
Spring Boot에서 Custom Valid Annotation 만들기 안녕하세요! 이번 포스팅에서는 Spring Boot에서 Custom Valid Annotation를 적용하는 방법에 대해 알아보겠습니다. 전체 코드는 Github에서 확인이 가능합니다. ✍️ 스프링에서 제공되는 Valid 관련 어노테이션을은 많지만, 가끔 제공해주지 않는 어노테이션을 Valid 처리하고 싶을 때가 있습니다. 예를 들어, Request 받을 때 전화번호 포맷을 확인하고 싶은데, 이와 관련된 Valid 어노테이션은 없습니다. 그렇다면 아래와 같이 구현해야하는 상황이 생기게 됩니다. public class Obj { @NotBlank private String tel; } @RestController public class ValidController { @PostMapping("/valid"..
Spring Boot에서 이벤트 사용하기 안녕하세요! 이번 포스팅에서는 Spring Boot에서 이벤트를 적용하는 방법에 대해 알아보겠습니다. 전체 코드는 Github에서 확인이 가능합니다. ✍️ 📚 개념 정리 & 사전준비 1. 이벤트 Spring Boot에서 이벤트를 적용하는 방법에 대해 들어가기 전에, 이벤트를 왜 써야하는지, 사용하면 좋은 상황에 대해 먼저 소개하겠습니다. 회원가입을 하고 나면 가입 축하 메세지를 전송하는 동시에 쿠폰을 전송하는 서비스가 있다고 가정해보겠습니다. @Service public class RegisterService { @Autowired ApplicationEventPublisher publisher; public void register(String name) { // 회원가입 처리 로직 System.out..