본문 바로가기

전체 글105

Springboot With React: 커서 기반 페이징 기법을 통한 댓글 무한 스크롤 구현 들어가기 현재 진행 중인 프로젝트에서는 하나의 게시글에 있는 댓글을 조회할 때, 프론트 단에서 백엔드 단으로 요청을 할 때, 모든 댓글을 한꺼번에 가져오고 있다. 여기서 문제가 하나 있다면, 매우 많은 댓글이 넘어오게 된다면 DB 내에 매우 많은 '랜덤 액세스'가 일어나게 되어 성능적으로 좋지가 않다. 그렇기에 많이 페이징 방식을 사용해서 일부의 데이터를 조금씩 가져와야 한다. 페이징 방식하면 떠오르는 것은 페이지 번호가 있고 원하는 번호를 누르면 해당 번호의 페이지로 넘어가는 방식과 무한 스크롤 방식이 있다. 진행 중인 프로젝트는 모바일 화면에 맞춰서 개발을 하고 있기에 모바일 UI 에 더 익숙한 무한 스크롤 방식으로 댓글 페이징을 진행하고자 한다. 프로젝트에서는 Springboot, Mybatis, .. 2023. 10. 19.
Springboot With Redis: 데이터 Dto 저장, 조회 시 직렬화 문제 및 Enum을 활용한 갱신 들어가기 최근 프로젝트 리펙토링을 진행하면서 성능 향상이라는 부분에 대해 생각을 해보았다. 성능 향상을 이루는 방법은 코드 리펙토링, 쿼리 최적화, 인덱스 사용 등 다양하게 있는데 항상 거론되는 것 중 하나가 캐시(cache)였다. '캐시'하면 떠오르는 것은 Redis라는 것이었고 프로젝트에도 적용해 보자고 생각하여 공부 및 실습을 진행하게 되었다. 그러던 중 패스트 캠퍼스에서 Redis에 대한 강의를 들었는데, 강의 내용을 듣고 관련 코드를 프로젝트에 적용하기 전에 다른 사람들은 어떻게 적용하였는지 궁금함이 생겼다. 그래서 다른 사람들의 코드를 참고하기 위해 인터넷을 뒤지다가 GenericJackson2JsonRedisSerializer()을 적용함에 있어 문제가 있다는 것을 알게 되었다. 이글에서는 .. 2023. 10. 14.
Springboot: redis를 통해 캐시 기능 간단 적용 들어가기 이 글에서는 간단하게 Springboot에 Redis를 적용하여 캐시 기능을 구현하는 과정을 설명할 것이다. Redis에 대한 기본적인 내용은 https://khdscor.tistory.com/98를 참고하길 바란다. springboot with redis 1. RedisTemplate를 통한 cache 사용 우선 간단하게 캐시에 대해서 설명해 보겠다. 캐시(cache)란 데이터를 미리 복사해 놓은 임시 저장소를 의미한다. 사실, 캐시는 꽤나 자주 사용되는 용어이다. 당장에 컴퓨터 저장장치 계층구조만 봐도 캐시라는 용어가 나온다. 이러한 캐시는 성능향상에 큰 이점이 있는데 바로 DB접근을 줄일 수 있는 것이다. redis는 인메모리 DB로 디스크가 아닌 메모리에 데이터를 저장한다. 이러한 red.. 2023. 10. 2.
Redis: In-Memory DB로서 뛰어난 성능 들어가기 항상 프로젝트를 진행할 때면 서버를 정하고 데이터베이스를 연결하고, 외부 API 요청 시 DB로부터 데이터를 가져오는 과정을 밟아 왔다. 데이터베이스로는 mysql을 주로 사용해 왔다. mysql을 사용하는 것만큼 익숙한 것이 캐시라는 것인데 캐시 하면 항상 거론되는 것 중 하나가 redis이다. 데이터베이스는 서버에서 디스크에 접근하여 데이터를 가져오는 것이지만, 캐시는 디스크에 데이터들을 메모리로 옮긴 후, 서버에서 디스크에 접근하는 것 대신에, 메모리 공간에 위치한 캐시에서 데이터를 가져오기 때문에 성능 향상을 이룰 수 있는 방법 중 하나이다. 이 글에서는 이러한 redis에 대해 기본적인 내용들을 작성할 예정이다. Redis란 무엇일까? 1. NoSql 로서의 Redis Redis는 20.. 2023. 9. 24.
springboot(jpa, mybatis) - page 객체 및 커버링 인덱스를 사용해보자! 들어가기 평소 프로젝트를 진행할 때는 페이지 처리를 할 때, 페이지 처리 로직이나 객체를 직접 만들어서 사용했었다. 하지만 최근 Page 객체라는 것이 있고 spring에서 제공하고 있다는 것을 알았다. Page 객체를 사용하면 다음페이지가 있는지, 전체 사이즈가 몇인지, 이전 페이지가 있는지 등 구현하기 귀찮은 여러 메서드들을 제공해 주니 유용하게 사용된다고 한다. 페이지 처리를 하는데 있어 Page 객체를 사용 안 해볼 수는 없기에 직접 사용해 보기로 하였다. 이 글은 페이지 객체를 사용한 경험담을 담고있다. 처음에는 Page 객체니, PageRequest 니 Pagable이니 PageImpl 등 뭔 Page 하나에 관련된 객체가 너무 많아서 어디서부터 접근해야 할지 막막했었다. page처리를 위해 .. 2023. 8. 24.
스프링부트 With Mysql - easyRandom을 통한 bulk Insert 및 Index 적용 이 글은 개인적인 생각을 작성한 것이다. 들어가기 데이터베이스에 대해 공부하다 보면 마주치는 것 중 인덱스라는 것을 들어보았을 것이다. 필자 또한 인덱스라는 개념을 책 및 인터넷을 통해 많이 접하았다. 쿼리 최적화에 대해 공부하면서 인덱스 또한 공부도 하였다. 하지만 인덱스를 통해 충분한 성능을 보기 위해서는 충분한 데이터가 있어야 한다고 들었다. 그래서 데이터가 많지 않으니까 다음에 적용하자~! 라는 핑계로 계속 인덱스를 직접 적용해 보는 것을 미뤘었다. 그러던 중 최근에 EasyRandom을 통한 랜덤한 객체를 수백만 건을 생성해 주는 방법을 접하게 되었다. 지금까지 진행하던 테스트에서는 일일이 값을 집어넣어서 객체를 생성하고 테스트를 진행하였다. EasyRandom은 이런 나에게 매우 매혹적으로 보.. 2023. 8. 3.
springboot service 계층: 인터페이스와 여러 구현체로 구현(공통 메서드 분리) 들어가기 이 글은 개인적인 생각을 포함하여 작성한 글이다. 나는 프로젝트를 할 때 항상 service 계층에 class 하나로만 구현을 하였었다. 하지만 다른 사람들이 한 프로젝트에서는 service 명칭으로 된 interface와 serviceImpl 명칭으로 된 class 구현체로 구현되어 있었다. 이는 디자인 패턴 중 전략 패턴을 적용한 것이라고 할 수 있다. 이게 과연 의미가 있나 싶어서 지금까지 적용하지 않았었는데 마침 리펙토링을 하면서 한번 알아보고 적용해 보기로 하였다. 이 글에서는 impl을 쓰는 이유와 간단 적용, 인터페이스와 여러 구현체일 때 공통 메서드 처리 등을 다룰 예정이다. Service 계층에서 인터페이스와 구현체의 구분은 왜 생긴 것인가? 처음 인터넷에 'spring serv.. 2023. 7. 15.
Java Springboot AOP를 통한 로그 출력(메서드 이름을 활용) 이 글에서는 Springboot 프로젝트를 진행하면서 AOP를 통해 로그 출력을 하는 과정을 담았다. AOP에 대한 개념적인 부분은 별도의 참고 URL로 표기하였고 활용 위주로 작성하였다. 글을 작성하기 전 간단하게 AOP를 통해 로그 처리를 한 소감을 말하자면 정말 말도 안 되게 유용한 기능이라고 생각한다. 처음에는 그냥 메서드마다 로직 사이에 log.info를 추가하기만 하면 되는 것을 뭐 하러 코드까지 늘리면서 다른 AOP 클래스를 생성할까? 하고 의구심이 들었다.하지만 구현해놓고 수정할 일이 있어 메서드를 수정할 때 log출력에 관한 부분은 하나도 신경을 쓰지 않고 메인 로직을 수정할 수 있었다. 이게 AOP를 사용하는 진정한 장점이라는 것을 깨달았다.다음 프로젝트에서도 계속 AOP를 통해 로그처.. 2023. 7. 8.
springboot delete시 DB접근, 쿼리 횟수에 대한 고찰(mybatis, jpa) 이 글은 프로젝트를 진행하면서 delete를 진행 시 mybatis 및 jpa를 사용하였을 때 DB에 접근하는 횟수 및 쿼리 횟수에 대해 비교하여 주관적으로 작성한 글이다. Article 테이블이 DB에 저장되어 있다고 하자. 여기서 Ariticle 하나를 delete 하려고 한다. jpa는 영속성 컨테스트라는 1차 캐시를 가지고 있다. 그렇기에 트랜젝션 안에서 select를 통해 Article 테이블 정보를 객체로 가져오면은 이에 해당하는 정보가 영속성 컨테스트에 저장된다. 그리고 delete를 실행하면 쿼리를 따로 저장해 놓았다가 트랜젝션 종료 시 저장해 놓은 쿼리를 DB에서 전달하여 실행하게 된다. 즉, article를 select하기 위해 DB접근 1회, 쿼리 실행 1회, 트랜젝션이 종료되면 쿼리.. 2023. 6. 24.